Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.
This thread is getting programming jobs, especially for newbies. That can be lifelong math nerds with CS degrees looking to snag a position with Big Tech, people with no coding experience looking to self-teach, or desperate humanities majors trying to pivot careers into something that pays well. All are welcome under this roof.

Personally, I'm of the CS degree/BigTechCo variety of coding goon, so some of what I write here may be biased towards that experience.

A few definitions that help make the rest of this OP make sense:

Programming:

Wikipedia posted:

Computer programming (often shortened to programming or coding) is the process of designing, writing, testing, debugging / troubleshooting, and maintaining the source code of computer programs.

Computer Science:

Wikipedia posted:

Computer science or computing science (sometimes abbreviated CS) is the study of the theoretical foundations of information and computation and of practical techniques for their implementation and application in computer systems

Note that computer science != programming. College computer science programs invariably teach you to code at some level along the way, but the focus is on more abstract concepts like data structures, algorithms and discrete math, and this is more true the more prestigious the college is. Since CS programs can vary wildly school to school, if you want to know how much of it is applicable to industry, ask someone who goes there, or better yet, someone who used to go there and now works as a programmer.

That said, getting a CS degree is the safest path to becoming a professional software engineer. It provides the most structure and support to learning, and just having a CS degree on your resume is a big boost when you're just entering the work force.

Programmer vs Software Engineer: The distinction here isn't always black and white, but generally the job title of programmer denotes just basic programming duties, whereas the title of software engineer denotes a "higher rank" and being responsible for higher-level aspects of software design. Job postings for software engineers nearly always require a degree in CS (or something related, like CompE or Math), although some companies may waive this requirement if you have sufficient experience. Along the same lines, software architect implies that you're working at an even higher level and are responsible for the overall design, or architecture, of an entire program (or perhaps a very large section of a program if your program is something enormous like, say, Windows).

Other job titles include software developer (dev), which is kind of a catch-all for "writes software" and is often interchangeable with software engineer, and principal engineer, which basically just means EXTRA senior engineer.

I want to work in software development. Should I get a degree in Computer Science?

Quite possibly! This seems to be the most common route into software engineering, but there are a few things to consider:

1. Computer Science degrees can be very difficult (depends on school). They're usually similar to engineering degrees in drop-out rates (many drop-outs seem to go to MIS, which is sort of a hybrid business/CS degree). If you go to a school with a rigorous program, expect to spend long hours studying various algorithms or implementing them.

2. Computer Science involves a lot of math and math-ish concepts. You don't have to be amazing at math, but you have to be at least halfway decent, in college-level terms. For example, you'll probably have to take classes in at least differential/integral calculus, linear algebra, and discrete math (often called discrete structures). Many other classes will involve math-ish concepts like understanding Big-O, which is a measure of how algorithms' running time responds to changes in the size of their inputs.

3. As noted above, there is no guarantee that getting your degree in and of itself will adequately prepare you for real-world programming. Stories abound of CS seniors or even grads that had decent enough GPAs but couldn't code their way out of a wet paper sack (or couldn't code their way through FizzBuzz, an extremely simple but well-known programming test). Even if your school does a good job of this, however, you'll still want outside experience.

If I get a degree in CS, how's the job market? Will I make big bucks?

Yes. Well, maybe. The job market right now for devs is excellent overall, but companies often play the hiring game very safe, by preferring to not hire at all than to hire someone that seems iffy, as bad engineers can cause negative productivity. That said, overall jobs are abundant and salaries are high, as demonstrated by the following large numbers:

code:
Top-Paid Majors for Class of 2013 Bachelor's Degree Graduates, NACE

Major	Average Starting
Salary
Petroleum Engineering	        $97,000
Computer Engineering	        $70,900
Chemical Engineering	        $67,500
Computer Science	            $64,700
Aerospace Engineering	        $64,500
Mechanical Engineering	        $64,500
Electrical Engineering	        $63,000
Engineering Technology	        $61,500
Management Information Systems	$60,700
Logistics/Materials Management	$59,800
:signings:
So according to NACE, CS is in the #4 spot now for new grad starting salaries. Compare that $64,700 to a reported average of $36,553 for humanities majors. Ouch! :negative:

Now anecdotally, it seems like there are simply more jobs about in CS than in other engineering fields (software engineering is definitely growing more). But that's not all!


http://www.drdobbs.com/architecture-and-design/2013-developer-salary-survey/240163580?pgno=1

In addition, the Bureau of Labor Statistics expects strong growth:

quote:

Overall, employment of computer software engineers and computer programmers is projected to increase much faster than the average for all occupations. Job prospects should be best for those with a bachelor's degree and relevant experience.

Employment change. Overall, employment of computer software engineers and computer programmers is projected to increase by 21 percent from 2008 to 2018, much faster than the average for all occupations. This will be the result of rapid growth among computer software engineers, as employment of computer programmers (read: those without degrees, mostly) is expected to decline.

And in even more good news, CareerCast rated software engineer as the third-best job to have overall, beating out, well, everyone except for actuaries and biomedical engineers. Woo!

Ok, I've decided to become/I am a CS major. What do I do now to get one of those sweet, high-paying gigs I've heard so much about?

To maximize your odds of entering the ranks of the good-jobbed, you'll want as many of the following as possible:

1. A good GPA. You want to at least have a 3.0, and 3.5+ is generally seen as very good. Besides demonstrating some level of competence in the art of Computer Science, companies want to know that you aren't lazy, and that even if some classes are boring, you are willing and able to suffer through boring things. Many big companies seem to have a cutoff around 3.0. As you progress in your career, a high GPA's relevance rapidly declines, but early on it's an excellent thing to have on your resume.

2. Outside experience. Companies want to know that you can take initiative and can code without the rigid structure of a class holding your hand the entire way. There are basically five forms this can take:
  • Personal projects: Stuff you do on your own. Whatever interests you the most is probably a good place to start, but if you're utterly lacking in imagination, try googling for tutorials on mobile or web apps. The more useful and complex the things you write are, the better, but anything is still better than nothing.

  • Undergrad research: Labs sometimes need undergrads to do the coding that they don't want to waste their time on. For example, I worked in a lab where they were researching new network protocols for wireless mesh networks, and me and one other undergrad were hired to write a program that displayed different signals graphically in real-time. Talk to your profs about being a codemonkey.

  • (Summer) Internships: You definitely want to do one of these. They're one of the most straightforward ways to get good experience, and pretty much the only way to get experience at a big-name like MS/Google prior to getting an actual job there. Having Google already on on your resume when you're looking for your first real job? Awesome. Companies will be looking for junior internship applicants in both fall and winter/spring semesters. Some companies also will take sophomore interns, although this isn't nearly as common. In addition to the experience, expect to get paid quite well (the big-names pay $25-35/hour, others will probably be around $15-20/hour) and to foreverafter be insufferably smug around people who did unpaid internships.

  • Co-ops/part-time jobs: You can try applying at local companies to see if they hire students for part-time work. Also, schools themselves often need cheap student developers for webpages and whatnot. This is obviously a good way to get real-world experience, just keep in mind that most companies will want around 20 hours per week. This can easily be stretching it if you're taking a full load of classes; try not to ruin your GPA while doing this.

  • Open-source projects: These projects are always looking for contributors, and saying you helped with one (and being able to explain how you helped) can give you serious nerd cred. A word of warning, however: diving into a large codebase without a mentor that you can easily ask questions of is an incredibly difficult task. If you're still a newbie, try to stick to smaller projects.

3. Technical Interviewing Skills: At the very least, you need to know how to code on the fly on a white board/piece of paper, as well as the most common data structures and algorithms, along with their running times for different operations. You should also understand complexity/Big-O in general so that you can analyze whatever algorithm/data structure an interviewer asks you to write. A whole book could be written about interviews; in fact, there has!

  • Big companies tend to be language-agnostic for interviews. Any language that isn't obscure should be more or less fine. Safest bets are the major general purpose programming languages: C++, Java, and C#. Smaller companies may want you to code in a particular language that they use.

  • Questions most commonly have to do with data structures and algorithms, although you'll also get questions involving design, debugging, testing, multi-threaded code, and pointers.

  • Practice, practice, practice, practice. Practice. Code in a plain text editor, code on a whiteboard, code with experienced friends and acquaintances playing the role of mock interviewer on the phone and in-person. Interview coding is very different from normal coding, so it must be practiced independently. If you normally code in an IDE, coding without the benefit of that handholding will be a shock, so make sure you practice in something that doesn't do autocomplete.

  • For the data structure/algorithm ones, there's usually a really obvious brute-force solution that either has a terrible running time or memory requirements, and then one or two more elegant solutions that will take a while to get, so don't be surprised if you don't immediately know a really good answer. What I do is immediately explain the obvious, dumb answer and why it's dumb, then start talking through the problem. Interviewers are more interested in your thought process than just how quickly you get a solution, so talk them through it.

    Occasionally you may get a question where there will be no final good answer, because the interviewer just wants to see you struggle and work through a problem that has no good solution. Those dicks.

  • Make sure you understand the design specs completely before you start to code; many interviewers will intentionally state the initial problem in an ambiguous way to see how you respond. If anything is ambiguous, ask the interviewer.

    For example, if the code is being used internally, you may be able to assume that the parameters coming in are valid, or at least aren't null or something like that, whereas if it's an externally-facing API, you almost certainly wouldn't be able to assume that and would have to check the parameters at the start of a function to make sure they aren't broken. Think and ask about constraints (e.g. is memory or disk space an issue?) and expectations (e.g. will the calling function expect me to return null OR throw an exception when the input is bad?).

  • Handle the edge cases. Some people code the general case first, then handle the edge cases based on what it looks like the general case can't handle. Some people code the edge cases first so that they don't have to worry about them while coding the general case. Either way, let your interview know what you're doing and why. Whenever possible you want to bring up the edge cases in some form before they do.

Here's an actual question taken from an interview I did with Microsoft:

quote:

Parameters: array of objects, an integer 'n'. Randomly select 'n' objects from the array to return. No repeats. You can assume 'n' is a valid number.

Obvious, really dumb answer: Keep a set of all object indices chosen so far. Randomly generate a number between 0 and arraysize-1. If the index is not in the set already, put the object from that index into whatever data structure you're using to return values, and put the index into the set. If the index IS in the set already, choose another number until it isn't. Repeat 'n' times, then return the array.
This answer is really dumb because: If 'n' is close to the size of the array, the running time will be horrible. Imagine if an array of 1000 objects comes in and 'n' is 999. By the time you get to the 900s, most of the random integers you're generating will be numbers you've already chosen before, so you'll have to generate many random ints for each valid 'hit'. Theoretically, the worst-case running time is infinite because there's no guarantee of finishing; for practical concerns, it's just really really bad (looks like it might be O(n!) but I'm not certain).

Obvious, dumb answer: Randomly generate a number between 0 and arraysize-1. Pull out the selected object and put it into a different data structure. Create a new array without that object. Repeat 'n' times, then return.
This answer is dumb because: Creating a new array is a linear (O(n)) operation. Since this algorithm has us repeating 'n' times, the total running time is quadratic, or O(n^2). This isn't nearly as bad as the first solution, but it's still not good.

Less obvious, elegant answer: Randomly generate a number between 0 and arraysize-1. Pull out the selected object and put it into a different data structure. Have the spot at the selected index now contain the object at arraysize-1, then assume the array size has gone down (keep track of it in a variable). Repeat 'n' times.
Why it's smart: This solution deals with the 'gap problem' of the second solution by just plugging it with whatever was in the last spot. Thus, the gap is filled in constant, or O(1), time, instead of linear time. This means that the total running time is just O(n), since we are doing a constant operation 'n' times.

4. "Soft" Interview Skills: Unfortunately, this has nothing to do with having a round, squishy belly, and everything to do with people/social skills. Companies don't want a hardcore neckbeard who can't communicate or get along with others. You don't have to be incredibly charming either, but there's a baseline of stuff you should do like smile, act confident without sounding arrogant, speak clearly and coherently, etc.

Many software companies are ok with dressing casually in interviews, but keep in mind there's a difference between dressing casually and dressing like a slob. Wearing jeans is fine at many companies, as long as said jeans do not have cheetos stains all over them. Check with [the recruiter/someone who works there/someone who works in a similar company] about expected dress. A safe rule of thumb is go a half-step or step above whatever people normally wear to work there. For example, interviewing at Google where people usually wear jeans and a t-shirt, I wore nice jeans, a t-shirt, and a nice collared sweater.

Another part of this are behavioral questions. Most companies will have questions like, "Tell me about a time where you had a deadline that you didn't think you'd be able to meet, and how you dealt with it," and "Tell me about a time you had a problem with a teammate, and how you resolved it." Questions about a particularly nasty bug that you fixed also seem to be common. For more examples of both behavioral and technical interview questions, go to glassdoor.com and search for well-known software companies, then go to the Interviews section for them, like so: http://www.glassdoor.com/Interview/Microsoft-Interview-Questions-E1651.htm

How do I apply for internships/jobs?

Probably the best way through recruiting events at your school. My college does technical career fairs in fall and winter semesters where only smarty-pants math/science companies and majors are allowed. Handing out your resume at these and asking them about procedure (these days they usually ask you to also apply online, but maybe through a different website than the general public one) is a good idea.

For companies that don't recruit at your school, go to their website, they usually have a section specifically for university recruiting; you can try googling "[Company name] internships" or "[Company name] university recruiting" or something along those lines if their main website is proving difficult to navigate. You won't get responses from the majority of these unless you're super-amazing, but it's worth a shot; in fact, the offer I accepted my senior year was from a company that wasn't recruiting at my school, I just applied online.

These job requirements are intense! Guess I'm not good enough...

Skandranon posted:

All job requirements are 'wish lists', very similar to the ones children make for Christmas.
Don't be afraid of applying if you think you're at least roughly what the position is aiming for.

When should I start applying for jobs?

If you're graduating at the normal time in late spring/early summer (May/June), you can start applying to large companies (especially large tech companies) in the preceding fall semester. These companies generally want to pick off promising new college grads earlier so that their competitors can't get them, as there's a perpetual bidding war for the most talented new developers.

Generally, smaller companies won't hire that far ahead of time, but it obviously depends on the specific company. Try calling and asking around your area for local companies, I guarantee no one will bite your head off. Definitely want to start trying at least a few months before graduation.

IF YOU WAIT UNTIL YOU GRADUATE TO LOOK FOR JOBS YOU'RE AN IDIOT! DO NOT DO THIS.

Exactly how much money we talking about here?

Glassdoor.com is awesome for this. Starting salaries for the big-names seem to mostly be in the 80s through the low 100s, although keep in mind that we're talking the most prestigious companies in high cost-of-living areas. It's also possible you'll get some sort of signing bonus in cash, and some stock; these will have time restrictions attached to them. For smaller places, it's going to be more random, and probably less (with some exceptions; if you get hired at some boutique hedge fund you may be making bigtime money), although the bidding wars at the big names have a pulling effect on everyone else too, so be thankful Facebook gives out 100k signing bonuses to former interns who sign with them.

I got an offer what do I dewwwww??

Congrats, you've escaped the Gen Y Curse. You should try negotiating, although as a new college grad your leverage is small (some would say nonexistent). Still, it's probably worth a shot, especially if you have multiple offers. If you're still waiting on other companies for interviews/offers, try to play for time. Most companies should be understanding. Here's a good guide to negotiating for engineer-types: http://www.kalzumeus.com/2012/01/23/salary-negotiation/

Wait so do I have to actually know about Big-O and algorithms or can I toss that knowledge in the trash bin once I'm done with classes?

Otto Skorzeny posted:

This varies so much from company to company that it's difficult or impossible to generalize like this. Companies that work in middleware may have the luxury to be able to take anyone who can coax eclipse into compiling their code, whereas companies working on eg. high-performance databases need people with solid CS fundamentals, even especially if the company is small and there's no where for a coder to hide, so to speak. Jobs writing firmware or whatever will have their own set of fundamentals with regards to concurrency hazards and intimate hardware knowledge that they need to interview somewhat rigorously for, people working on game engines need to know a fair amount about efficiency all the way up and down the stack, and so on and so forth.

I would furthermore posit that 'companies that make CRUD apps in java and python' are an especially bad place to extrapolate from to cover the entire set of companies hiring from CS and related disciplines (not that this is necessarily what you were doing).

In summary, knowledge of CS fundamentals may be a necessary condition for employment depending on what sort of work you want to do.
So basically it depends on the industry and company.

But what if I'm not a sheeple and don't want to/didn't follow the standard CS degree path right out of high school? Is there hope for me?

Yes! There are many paths to salvation, my son. They fall into a few different categories (see the Appendix for more links):

Degrees: If you already have a bachelor's degree in something else, you can get often still get a master's in CS. This usually requires you to take some preliminary classes before you can start the grad program proper; for example, BYU's program says this:

quote:

Provisionally admitted students must either take or have taken the equivalent of CS 124, 142, 235, 236, 240, 252, any three CS courses beyond the 200-level (except 404), any two math courses beyond Math 113, and either an additional CS course beyond the 200-level (except 404) or an additional math course beyond Math 113.
There are sometimes even online versions of this kind of degree you can do. For example, Oregon State has a program for a BS in CS for people who already have one bachelor's that can be completed in as little as one year: http://ecampus.oregonstate.edu/online-degrees/undergraduate/computer-science/

A forewarning, though: to some, these types of degrees have a stigma precisely because they are most often used by programmers who come 'late to the game', so to speak.

Bootcamps: These are intensive programming courses that usually last somewhere in the 2-3 month range, and the bootcamp will be pretty much your entire life during that time. The most well-known ones have gotten some positive press, and some even guarantee a job or your money back, but as a whole they're relatively new and it's hard to say anything concrete about them. Personally I think there's a lot of potential here, but I'd also be very careful about researching them if you're interested in participating in one.

Self-teaching: Online tutorials, books, reading forums and stackoverflow, and the newest addition to this area, free online classes ala Coursera or Udacity. These things take the least upfront investment, especially in terms of money, but can still lead to developing marketable skills, and the sheer amount of resources you can draw from to learn programming is immense.

The main drawback is that you need to be very self-motivated; in practice, most people who go this route don't make it very far (e.g. the average completion rate for MOOCs is tiny). Turns out learning a difficult subject without real live humans to get help from is hard! Those who go this route will also really need to go out of their way to prove they actually learned enough to be useful. A portfolio of sorts is pretty much required.

Reading Hacker News is a good idea for all types of developers, as it's basically the news site for programmers, but it's particularly necessary for people who are self-teaching since you won't have IRL contacts telling you about cool new stuff. Of course you can't read every single article that pops up there, but keeping tabs on it and doing a fair amount of reading about different languages, technologies, ways to prep for interviews, etc. is an excellent idea.

Oh, and remember:

down with slavery posted:

The idea of holding a "career" where you get raises that will compete with what you can get shopping around is long gone. They'd rather pay you poo poo for as long as possible and get their moneys worth than invest in to you long term.
Sad but mostly true. Be psychologically prepared to receive your pittance of a raise and then look around for greener pastures.

Cicero fucked around with this message at 21:08 on Sep 21, 2015

Adbot
ADBOT LOVES YOU

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.
- APPENDIX -

Useful Resources (includes inline links from above)

    Practice practice practice

  • Talentbuddy - a bunch of interview-esque programming challenges
  • Project Euler - a series of challenging math/CS problems that starts easy and gets hard
  • CareerCup - the company that makes "Cracking the Coding Interview"
  • Topcoder - a site about programming competitions
  • CoderByte - Small programming challenges organized into 3 difficulty bands
  • CodeKata - A popular series of programming exercises

    Interview prep

  • ABC: Always Be Coding -- How to Land an Engineering Job. - A guide to becoming an expert coding interviewee
  • Get that job at Google - How to get a job at Google or similar companies
  • Choosing a Programming Language for Interviews - How to pick a language to use for interviews
  • FizzBuzz: A Classic Programming Test - The quintessential programming test. Note that many CS upperclassmen or even new grads are somehow incapable of solving this in an interview context.
  • Big O Cheat Sheet - A quick review sheet of Big O for common data structures and algorithms
  • Big O in Plain English - A useful beginner's summary of Big O for those of you without a formal CS education.
  • Glassdoor: Interviews - Anonymous user data on interviews with different companies

    Interviewing Books

  • The Algorithm Design Manual - The gold standard in learning how to construct algorithms.
  • Cracking the Coding Interview - This is the primary recommended book for interview preparation. An older, smaller edition is available as a free pdf
  • Elements of Programming Interviews - Kind of like "Cracking the Coding Interview: Advanced Edition"; doesn't talk as much about the interview process, but has more depth and breadth in its technical problems to work through.
  • Programming Interviews Exposed - The previous recommended interview prep book

    Negotiation

  • Glassdoor: Salaries - Aggregated user data for job salaries
  • Salar.ly - Salary data from H1B Visas
  • Salary Negotiation for Engineers - A guide for negotiating
  • Salary negotiation when you have no leverage - A guide for negotiating when your position is weak
  • The Open Guide to Equity Compensation - A pretty exhaustive guide to stock options/grants hosted on Github.

    Bootcamps

  • Bootcamps.in - A bootcamp listing
  • Programming Bootcamps - Quora questions about bootcamps

    Online courses

  • Codecademy - Courses based on simple, interactive exercises in the browser
  • Coursera - More traditional feeling online classes that follow a college-esque schedule
  • Udacity - Kind of in between Codecademy and Coursera, no set schedule
  • edX - As far as I can tell, Coursera's less popular brother
  • Udemy - Like Udacity, but way more courses and costs money

    Degrees

  • Oregon State Online CS Post-bacc second bachelor's - Can be done in 1, 2, or 3 years
  • Master's of Applied CS, University of West Georgia - Doghouse sez:

    quote:

    It's great so far, very challenging. It's 2 years, including summers, all online, no prereqs, and relatively inexpensive.
  • Master's in CS, University of Rochester - Coca Koala sez:

    quote:

    I just completed a MsC in CS at the University of Rochester, in upstate NY. My previous CS experience was an intro Java class, and a course on discrete mathematics. So I knew the basics of programming, the basics of computational theory, etc, but literally the most complicated data structure I knew about going into the program was an array; I was essentially starting from Ground Zero.

    I focused on Systems for my degree, but I could have also focused on theory, AI, robotics, HCI, or a few other concentrations. My advisor was great and very supportive, as was the rest of the faculty.

    The degree is 30 credits minimum, and I completed it in three semesters plus the summer class. Other people who entered the program at the same time as I did expanded their Program of Study out to four semesters, which obviously would have eased my workload a bit.

    Terminal masters get a lot of flack for basically being the product of degree mills, but I'm currently happily employed in the Bay area, and I can directly attribute that to the stuff I learned in getting my degree.
  • Master's in CS, Stevens Institute of Technology - Good Will Hrunting sez:

    quote:

    After realizing that I was miserable being a corporate police officer, I looked for a local school to supplement the CS core courses I had taken in undergrad (Information Systems major). At the time I was just messing around with JavaScript and PHP, and planned on going to school to learn more about web programming.

    Eventually I found Stevens Institute of Technology in New Jersey. They require CS core courses, but are pretty good about accepting equivalent versions from other schools. There are a ton of courses offered and some even have online versions. Most of them were really great and involved hands-on, practical projects. Some were bad, but I was so interested in them I was okay with spending the time outside of class and harassing my teachers with any questions I had. (If you are interested in this program, PM me and I'll gladly pick out exactly what you should take).

    I got enough of a background from that coursework to land the job I'm starting now. While I'm obviously not making as much as major tech companies pay, I'm getting compensated pretty well for my career path and they're giving me tons of room to grow. It was a pretty expensive school, but one of the less picky programs in the area as far as prerequisites go.

    Feel free to pm the relevant goons if you want some more insight into their degrees.

Example Resumes
(Disclaimer: these resumes are decent or better, but not perfect. You can ask about resume help in this thread, but you may also want to consider consulting an expert like that resume guy)

USSMICHELLEBACHMAN: PDF
Cicero: PDF, DOCX (note that Dropbox's doc viewer doesn't handle docx too well)
Someone's fiance: PDF, DOCX
astr0man: PDF, LaTeX
aBagorn: PDF

Random Resume Tips
  • Your resume should be attractive. Often goons will post resumes here that make me want to throw up. I get the impression that some think that only the content matters. No! You want it to look nice too. Nice and professional. Look at the example resumes for ideas.
  • Don't use Times New Roman. There are plenty of non-terrible fonts around.
  • Use indentation. I mean c'mon, we're programmers. We know how to indent subsections of things. You don't have to go completely overboard and have like 5 levels, but you definitely don't want 1.
  • Don't use more than one kind of bullet point. It looks awkward.
  • Be specific without being wordy. "Developed a program in Java" is bad, but so is spending three paragraphs on text on how you developed it. Better is "Developed an Android app with a Google App Engine backend that helps bloggers connect with their Facebook fans." (you'd also probably want a sentence or two about 'support' development tasks like how you wrote unit tests for it)
  • Leave out skills that either no one cares about or everyone expects a programmer to have, like Word or Powerpoint.
  • Don't go over one page when you're still a junior-level developer (DISCLAIMER: May not apply to places that are not the US). Once you have more than a few years experience, you can start thinking about whether a second page is necessary to contain your many glorious accomplishments.

*** Goon Mentors ***

Helpful goons that can help you out, because let's face it Timmy, you're desperate. PM them to seek their guidance (click the usernames).

listed in thread postcount descending order

"Ithaqua posted:

Experience: .NET/C# development, all things ALM (SCM, Agile, DevOps), TDD, unit testing, former interviewer
Ask me about : All of the above! I've done several .NET-centric mock interviews, helped people get started with TDD and unit testing, and done code reviews.
Location: NYC metro area

"Cicero posted:

Experience: Google, Amazon, Goldman Sachs (internship), Java, Android
Helps with: Phone screens, resumes, anecdotes, pretty much anything
Location: Silicon Valley; Previously Seattle, a bit of NYC

"shrughes posted:

Experience: LaTeX, C, C++ (NOT C/C++, that's not a language!), LaTeX
Ask me about : the LaTeX master race, how to get into a good rhythm of alternately giving good advice and pissing everyone else off, doing real programming, emacs (the only true editor), hardcore database stuff
Location: The only worthwhile area for coders to live in: SF Bay Area

"Strong Sauce posted:

Experience: Worked at a big corporation and two startups. Javascript, Ruby, Backend Web Development
Helps with: Resumes, anecdotes, salary
Location: San Francisco. Previously Los Angeles, Orange County, Dublin (Ireland)

"bonds0097 posted:

Experience: Automation, Security, Java, Android
Helps with: Resumes, interviews, work situations/anecdotes.
Location: State College, PA (I work remote)

"pr0zac posted:

Experience: Facebook, Y-Combinator, Apple, Python, C++, C, Ruby
Helps with: Phone screen/interview prep (I interview people regularly and have opinions® about it), startup related ?s, anything else, terrible for resume help
Location: San Francisco

You can also access LIVE synchronous gooncoder chat right here.

Data structures and algorithms for interviews

You should know the basics of: linked lists in their various forms (singly-linked, doubly-linked, stacks, queues, deques), arrays and array-based lists, trees (particularly binary search trees), graphs, sets, maps/hashes/dictionaries (these all mean the same thing), and hashtables.

As far as algorithms you should know offhand, sorts are the most common one. You should know a couple simple O(n^2) sorts like bubble/insertion/selection, and the major average-case O(nlogn) sorts: heapsort, mergesort, quicksort. ESPECIALLY quicksort.

How can you come to know these things? Implement them all in your language of choice. Then google around for problems that use them, and code up solutions. Look at the Big O Cheat Sheet when you need a bit of review.

Cicero fucked around with this message at 07:18 on Jan 13, 2016

Professor Science
Mar 8, 2006
diplodocus + mortarboard = party
I interview a lot of new college grads, so let me offer one little piece of advice about interviewing and resumes.

Don't overestimate what you know. Admitting that you don't know something can be a good thing.

I'll look at someone's resume, and it'll list obvious things like C or C++ as well as less-obvious libraries a lot of the time. If I ask you to rate your ability to write language X on a scale from 1 to 10, you should probably not pick above seven. If you say "oh, I'm an eight or a nine" and then you don't ace my coding question, guess what? You fail. If you say "well, I've used it in some classes, but it's not my primary language, so five," and you do the same thing? Well, were you on the right track in terms of ideas? That might be something I can work with later on.

I never expect new graduates to show up on day 1 and be awesome by day 5 or something like that. On my team, there's going to be at least a month before they can go off and fix bugs without a lot of hand holding (big project, lots of code, lots of nuanced code that interacts with very particular systems, lots of overall organization to learn), and probably three months after that before I can say "go forth and implement this new major feature!" It's okay if you don't know something! We can teach you! What we can't teach you is to not be too scared to admit your shortcomings, and when somebody does that, things get screwed up.

kimbo305
Jun 9, 2007

actually, yeah, I am a little mad

Cicero posted:

- Make sure you understand the design specs completely before you start to code. If anything is ambiguous, ask the interviewer. For example, if the code is being used internally, you may be able to assume that the parameters coming in are valid, or at least aren't null or something like that, whereas if it's an externally-facing API, you almost certainly wouldn't be able to assume that and would have to check the parameters at the start of a function to make sure they aren't broken.

Don't feel awkward about really being anal and getting all the details from the interviewer, and not just specs, but criteria for scoring your answers, too. If it's coding on the board question, some folks won't care how sloppy your syntax is, while others will want to be able to type what you write and run the program. Some don't care what you name your methods and variables, and others will expect you to explain them. If you don't ask what they want, you might to a good job up to your own standards, but not theirs. I once spent more than 10 minutes coding up a balanced binary tree only to have the guy say, "ok, but we can just assume we have that structure available to us."

Another tip I thought of -- if you're being interviewed by multiple people, even if they're from the same team, you should try to ask each person the same set of questions when they ask, "do you have any questions for me?"
The natural tendency is to get all that info from the first person and to not bother with later interviewers. But doing that might make you look a bit like a drone and not that interested or curious about the job/team. When the the interviewers convene to talk about you, everyone but the first guy might only be able to comment on your technical skills, as opposed to what kind of person you are and what you're looking for.
If you want to mix it up, keep a list of your questions and only ask each interviewer some of the questions.

edited for clarity.

kimbo305 fucked around with this message at 06:34 on Dec 28, 2010

ancient lobster
Mar 5, 2008
CS major here, graduating next December. The op was a good read, and the other advice so far is also helpful--especially as I get ready for a busy year.

I'm doing OK in most of the areas mentioned, but I need/want to be more involved in personal projects. I've been learning to code in C++ and Java--and I've been learning about things like algorithm efficiency and, yes, linked lists--but I still don't feel like I have a good grasp on how these languages are actually used.

I've read that C++ can be used/has been used to program operating systems. Obviously, I'm not going to write an OS. So how can I find out how to bridge the gap, to find ways to apply what I know toward reasonable/interesting projects? For example, I taught myself HTML in high school just by making a bunch of web pages. That was pretty straightforward because I knew that HTML was for making web pages.

Or if C++ and Java aren't practical for smaller projects, would it be better to look into other languages like Python?

tef
May 30, 2004

-> some l-system crap ->

Cicero posted:

Here's an actual question taken from a recent interview I did with a big-name software company:

shuffle the list :v:

wcagizmo
Oct 28, 2008

HEH, HEH, HEH.
This is a wonderful thread. I'm a Junior at my university with my major as Computer Science. I'm actually intending to transfer to another school with a better Engineering department to get another Bachelor's degree in Computer Engineering. This thread really gives us students and soon to be graduates an idea of where we should go post-education. Thanks! :D

Lumpy
Apr 26, 2002

La! La! La! Laaaa!



College Slice
An addition to your "Outside Experience" list: Contribute to (or start) an open source project.

Very cool thread, by the way.

Geno
Apr 26, 2004
STUPID
DICK
Already stated but I can't stress how important internships have been to me. I just graduated in June with a degree in CS and work at a big company as a Software Engineer.

My first internship was for a small consulting company who told me their aim was for me to intern there for my sophomore summer and junior summer and then hire me right after college. Pretty nice to hear when you are a sophomore in college. Unfortunately, the company went into the shitter so I couldn't go back. I didn't really learn much but being around those types of people and being in that environment was tremendous.

My second internship was for the company I work in now. Since it was for a big company, there are always job hirings within the company and you can e-mail whomever is hiring directly and pretty much be first in line at interviews.

Lurchington
Jan 2, 2003

Forums Dragoon
i thought it was a good first post, figured I'd share a bit of my experience.

Graduated with a degree in Computer Engineering in '05. At my school there was a large overlap between Computer Science and Computer Engineering. You could take the exact same coursework and get either degree depending on the electives:

CS took computer graphics, databases, user interfaces, statistics
CE took 3-4 circuits/electrical classes and a second year of physics (electricity/magnetism)

As far as I remember through '05, I don't think ABET (the only accreditation body I'd really heard of) covered computer science programs, and that, and amongst other things made it so there were a lot more internships and scholarships for 'engineers' that hit Comp E and not Comp Sci. ABET does cover computer science now, but I think there's a certain amount of inertia that keeps people from considering CS a 'real' engineering degree.

I got an internship with the government my sophomore year that was only available to 'engineers' and that's what started my career off.

Now, there's not much software development to be done as a government civilian (not contractor) because the mission then and now is really more supervising contractors who are doing the work*.

That means I got a lot of project management experience combined with my own development projects and the work I put in on my own time put me in a good spot to leave the government and get a job I'm really happy about in a mid-size development shop that uses both the project management and development skills, which is nice.

Take-aways from my perspective:
  • as everyone says, your portfolio as a developer is the best way (aside from connections) to a development job
  • if you're starting out, it's worth considering that there's a lot of things (jobs/internships/scholarships/programs) for 'engineers' and it's nice having the word 'engineer' in the degree. Especially if you get the same foundations as computer science.
  • If you go government, it's probably more money than you can get at an 'average' entry-level, but after about 5 years, I've found you need to leave (with some project management experience and hopefully a security clearance), or be prepared to be straight-management, and unfortunately not the kind of management that transfers well outside the fancy military-industrial-complex world.

* there are government science and research installations out there, but it's rare and not that dissimilar from academic research. The customer is whoever wants to read your paper or give you grant money.

Lurchington fucked around with this message at 23:24 on Dec 28, 2010

necrobobsledder
Mar 21, 2005
Lay down your soul to the gods rock 'n roll
Nap Ghost
I'll add that if you have the capacity / ability to get a job with one of the major software companies (MS, Google, Amazon, etc.) you shouldn't even consider government if pay is a primary consideration. If you've got a bunch of degrees under your belt and have been turned down by a bunch of these companies, then you probably have a good shot there. Also, most actual coding work (in defense) is done through contractors really, and the pay (and oftentimes benefits) are better as contractors than as a government employee.

Contrary to popular belief, government is not quite the holy grail of benefits it used to be anymore. Compared to general private sector, it's surely better, but for most highly skilled technical workers (aside from academicians actually - academia is loving hard, period) you're better off going to a contractor rather than full-on government. Almost every talented technical person I know that was in government is now a contractor. Also, the recent federal salary freeze that went into effect is probably a grim thing to hear.

Grey_Area
Dec 21, 2006
Grey Area
I'm not sure how many people here are based in the UK, but hopefully a few (or at least greater than none) will have useful information.

I'm nearing the end of a maths PhD (in recursion theory; despite the name, the topic has no direct relevance to anything in computer science) and have very little programming experience - just a couple of simple pieces of coursework as an undergrad and an eight week summer job, again while I was an undergrad. However, I've decided that I'd like to work in software development. Does anyone have any suggestions for companies that employ software developers and don't require programming expertise. The company I did a summer job at had a great looking grad scheme but I cunningly cocked up the interviews/tests there. IBM appear to also have a program which doesn't require you to be able to code (and offers a bonus to people with PhDs, which is nice), but aren't currently hiring programmers. I'd ideally like to work on stuff with a fairly heavy theoretical component as well as pure coding, but mainly I'm looking for UK based employers who:

1. Accept grads for software development jobs who have very little programming experience.
2. Put serious effort into training and development for their grads.

I'm currently working through Nisan and Schocken's "The Elements of Computing Systems" to learn more about how computers work and to get a little more programming experience (the book guides you through building a computer from scratch; I'm currently writing a virtual machine for their simple 16 bit architecture and will eventually write an operating systems and a compiler for a high-level language). I'm also planning on reading a few textbooks on algorithms and programming over the next few months and writing some simple code, but I'm obviously not going to be anywhere near proficient enough to get a job somewhere that requires you to be able to program off the bat. I have good degrees, so I think I'd at least have a shot at competitive/high prestige jobs as long as they don't require previous experience.

Any suggestions of companies to look at or things to do/read before I finish my PhD would be greatly appreciated. Thanks!

Grey_Area fucked around with this message at 19:31 on Dec 30, 2010

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

Lumpy posted:

An addition to your "Outside Experience" list: Contribute to (or start) an open source project.

Very cool thread, by the way.
Added this to the OP, created an Appendix in the second post.

I considered adding stuff for a couple other posts to the OP, but it seems like if I just added every single piece of posted good advice to it that'd be kind of silly. I dunno, maybe I'll change my mind. If anyone thinks I should add something to the OP and says so specifically though I'll probably do it.

Grey_Area posted:

Math PhD stuff
I don't know a whole lot about your situation, but I do know that many of the bigger software companies have research arms, for example: Microsoft, IBM, Google. And I know Microsoft's requires a PhD; I'd imagine it'd at least be a big plus at other places, if not a requirement. In fact, I just looked at Microsoft Research's site and they have a Cambridge location. However, I'd imagine that they'd still want you to have at least a moderate level of coding ability, as well as have decent, specific experience in some sort of computer science field (as opposed to "I am good at theory/algorithms in general").

tef
May 30, 2004

-> some l-system crap ->

Grey_Area posted:

I'm not sure how many people here are based in the UK, but hopefully a few (or at least greater than none) will have useful information.

:britain:

there are quite a few here (and fwiw, a surprising amount in edinburgh)

quote:

I'm nearing the end of a maths PhD and have very little programming experience - just a couple of simple pieces of coursework as an undergrad and an eight week summer job, again while I was an undergrad.

I'd ideally like to work on stuff with a fairly heavy theoretical component as well as pure coding, but mainly I'm looking for UK based employers who:

1. Accept grads for software development jobs who have very little programming experience.
2. Put serious effort into training and development for their grads.

So i'm looking to get started in an industry with very little relevant experience, work, or qualifications. Know anyone who is willing to train me and pay me for it?


quote:

I have good degrees, so I think I'd at least have a shot at competitive/high prestige jobs as long as they don't require previous experience.

It gets you an interview but not much further. Having a phd makes you overqualified for many jobs and many companies (in my experience) are hesitant to hire someone is too smart for the role. For some reason employers think Phds make people very employable, and subsequently you'll be seen as a flight risk.

A phd will only open doors for you, it won't land you a job by default, especially if they would have to train you for the role.

I think you're being naïve - the notion of a 'competitive/high prestige jobs as long as they don't require previous experience' feels like quite an oxymoron.

quote:

Any suggestions of companies to look at or things to do/read before I finish my PhD would be greatly appreciated. Thanks!

Get a portfolio together. Work out what sort of programming you want to do, and work on relevant examples. You won't get anywhere without a targeted approach.

I'd avoid systems and application programming and focus on more niche areas where your heavy maths experience would pay off or at least give you a head start.

For example:

high performance computing
numerical computation/simulation
trades/quant or financial stuff

Here, having some academic background or heavy pure math/analysis is a boon.

Grey_Area
Dec 21, 2006
Grey Area
Ok, thanks. I'm not sure I'm being particularly naive. The one job I applied for seemed ideal, but like I said I failed the technical tests. I put it down to excessive stress, but even if it was incompetence or stupidity I got to the last round of interviews so at least had a reasonable shot at getting the job. And that started you on £30k with really good benefits and required no experience at all. And IBM also require no experience for software development jobs, while paying a bonus to people with PhDs in any mathsy/engineering subject. I was hoping there might be other companies with similar starting positions.

Grey_Area fucked around with this message at 23:34 on Dec 30, 2010

tef
May 30, 2004

-> some l-system crap ->
I've seen people who don't know what they are doing being employed, but they normally have experience in working in another job.

tef
May 30, 2004

-> some l-system crap ->

Grey_Area posted:

I got to the last round of interviews so at least had a reasonable shot at getting the job.

A reasonable shot would involve not failing interviews :eng101:

Grey_Area
Dec 21, 2006
Grey Area
A reasonable shot in that I got through the first day of tests/interviews and was invited back to the second round, and would have gotten the job if I'd performed better on the technical-but-not-programming-related tests. My point was just that they didn't care at all about having any programming experience. I thought there might be other similar jobs. From your extremely helpful sarcasm, you must think otherwise.

Edit: You did suggest high performance computing and avoiding application programming, so thanks. I was just miffed at your "you're an idiot, no such jobs exist" when clearly some such jobs exist and I was just hoping to find more.

Grey_Area fucked around with this message at 23:45 on Dec 30, 2010

tef
May 30, 2004

-> some l-system crap ->
Luck and networking have frequently more to do with employment success.

I think your idealism is misplaced (you will have to learn more, or get paid less -- pick one) - although in the niches I mentioned above it isn't always the case, but they are few and far between by comparison.

And the example you cling to, actually demonstrates that you can't get these sorts of jobs because you don't have the technical knowledge to get past the interviews :v:

tef fucked around with this message at 01:05 on Dec 31, 2010

Grey_Area
Dec 21, 2006
Grey Area

tef posted:

Luck and networking have frequently more to do with employment success.

I think your idealism is misplaced (you will have to learn more, or get paid less -- pick one) - although in the niches I mentioned above it isn't always the case, but they are few and far between by comparison.

And the example you cling to, actually demonstrates that you can't get these sorts of jobs because you don't have the technical knowledge to get past the interviews :v:

Yeah, that's fair enough. The "technical tests" assumed no specific knowledge of anything related to computers, so that's not why I failed them. I intend to learn more, but I'm not going to be able to learn a massive amount in three months while simultaneously writing up a PhD. I'm not that bothered about getting paid a lot, but I assumed low paying jobs would involve lots of drone work and little development. I'd be happy to be proved wrong, though. I guess "nah, you're hosed" might be good advice, but I'll keep looking for now.

Grey_Area fucked around with this message at 01:45 on Dec 31, 2010

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

Grey_Area posted:

Ok, thanks. I'm not sure I'm being particularly naive. The one job I applied for seemed ideal, but like I said I failed the technical tests. I put it down to excessive stress, but even if it was incompetence or stupidity I got to the last round of interviews so at least had a reasonable shot at getting the job. And that started you on £30k with really good benefits and required no experience at all. And IBM also require no experience for software development jobs, while paying a bonus to people with PhDs in any mathsy/engineering subject. I was hoping there might be other companies with similar starting positions.
Is £30k a good salary there? Seems pretty low to me for a Math PhD (apparently it's equivalent to ~$46k), but maybe it's different in the UK?

Grey_Area posted:

Yeah, that's fair enough. The "technical tests" assumed no specific knowledge of anything related to computers, so that's not why I failed them. I intend to learn more, but I'm not going to be able to learn a massive amount in three months while simultaneously writing up a PhD. I'm not that bothered about getting paid a lot, but I assumed low paying jobs would involve lots of drone work and little development. I'd be happy to be proved wrong, though. I guess "nah, you're hosed" might be good advice, but I'll keep looking for now.
If you really almost made it all the way through, by all means, continue. You'd definitely be opening a lot of doors if you had some more coding ability, though.

EDIT: Since you're a math PhD, You might also want to ask around about jobs in the grad school megathread in SAP.

tef
May 30, 2004

-> some l-system crap ->
I've seen graduate jobs as low as £15k. 30k is a pretty good starting salary.

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

tef posted:

I've seen graduate jobs as low as £15k. 30k is a pretty good starting salary.
Interesting. Is there something significantly different with the UK's economy that causes starting salaries to be lower than in the US? Payscale seems to have Math PhDs making somewhat more in the US even in academia, and industry jobs are generally known for paying much more.

Grey_Area, ever considered moving to the states? :)

tef
May 30, 2004

-> some l-system crap ->
Might be things like universal healthcare and different taxation

frightened goat
Aug 9, 2003

If your goat doesn't look like this then you are doing something wrong
I'm about to get an applied math degree with a decent GPA from a pretty reputable school and I can program pretty well (I would guess just as well as most CS majors here, fwiw) plus I have a couple of small projects under my belt. Let's say I want to apply to programming jobs -- how should I best leverage (god, I hate that word) my math degree? I understand that math skills aren't really that important for most programming jobs, but there's probably a couple of niches mentioned in this thread out there like numerical analysis/simulation, which I've done lots of, as well as high performance computing etc., where they could come in useful. Any suggestions?

Also, are there any good books/textbooks/resources out there that I can read up on to fill in the gaps in my CS knowledge, plus not come off as a relative schmuck in interviews?

frightened goat fucked around with this message at 10:25 on Dec 31, 2010

shodanjr_gr
Nov 20, 2007
In, the spirit of the thread, I recently got a summer internship at Microsoft, so if anyone has questions about the interview process, feel free to ask.

Jick Magger
Dec 27, 2005
Grimey Drawer
This thread could not have come at a better time. I just graduated with a CS degree, and I'm going through the process of getting me resume spruced up. I'm absolutely terrified, but excited because I'll (hopefully) get to do something besides IT crap now.

In the OP you mention knowing how to analyze run-times and similar things for algorithms. My algorithm analysis class was taught by a mumbling Chinese man who couldn't speak English to save his life (the class started with 5 people, ended with me and one other guy :C) So needless to say, I never REALLY learned much about the subject.
Where could I brush up on that?
And, how important is it really to an interview? (I guess that depends on the company)

wolffenstein
Aug 2, 2002
 
Pork Pro

shodanjr_gr posted:

In, the spirit of the thread, I recently got a summer internship at Microsoft, so if anyone has questions about the interview process, feel free to ask.
Are MS interviews as bad as the rumors say?

Karanth
Dec 25, 2003
I need to finish Xenogears sometime, damn it.

Jick Magger posted:

This thread could not have come at a better time. I just graduated with a CS degree, and I'm going through the process of getting me resume spruced up. I'm absolutely terrified, but excited because I'll (hopefully) get to do something besides IT crap now.

In the OP you mention knowing how to analyze run-times and similar things for algorithms. My algorithm analysis class was taught by a mumbling Chinese man who couldn't speak English to save his life (the class started with 5 people, ended with me and one other guy :C) So needless to say, I never REALLY learned much about the subject.
Where could I brush up on that?
And, how important is it really to an interview? (I guess that depends on the company)

Books are your friend. Cormen, et al. is usually the standard for algorithms classes ( http://www.amazon.com/Introduction-Algorithms-Third-Thomas-Cormen/dp/0262033844/ ) but I also liked this one and found it explained some things more clearly: ( http://www.amazon.com/Algorithm-Design-Foundations-Analysis-Internet/dp/0471383651/ )

Grey_Area
Dec 21, 2006
Grey Area

Cicero posted:

Grey_Area, ever considered moving to the states? :)

Vaguely, but never seriously. I suppose it's worth looking at properly. Thanks for the advice, everyone.

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

Jick Magger posted:

This thread could not have come at a better time. I just graduated with a CS degree, and I'm going through the process of getting me resume spruced up. I'm absolutely terrified, but excited because I'll (hopefully) get to do something besides IT crap now.

In the OP you mention knowing how to analyze run-times and similar things for algorithms. My algorithm analysis class was taught by a mumbling Chinese man who couldn't speak English to save his life (the class started with 5 people, ended with me and one other guy :C) So needless to say, I never REALLY learned much about the subject.
Where could I brush up on that?
Big-O is a pretty basic/fundamental CS concept, so if you google it I'm sure you can find a bajillion different explanations of the subject. If I were you I'd look at Wikipedia and the CS websites of well-known colleges.

quote:

And, how important is it really to an interview? (I guess that depends on the company)
Big-O complexity is probably the most fundamental thing to understand for interviews besides just being able to code in general. I believe it's come up in the vast majority of interview questions I've had. Luckily the basic idea is actually very simple, so it shouldn't be difficult to teach yourself. Here's a super simple example:
code:
public void doSomething(int[] arr)
{
    int n = arr.length;
    for (int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            // some simple array operation happens here
        }
    }
}
What's the Big-O complexity/running time of the above method? Answer: O(n^2), aka quadratic running time. But why?
Explanation of answer: The outer loop obviously executes 'n' times. For each time the outer loop executes, the inner loop ALSO executes 'n' times. So if 'n' was 5, when i = 0 in the outer loop, the inner loop will execute with j = 0, j = 1, j = 2, j = 3, and j = 4. Then when i = 1 in the outer loop, the inner loop will again execute 5 times. And so on for i = 2, i = 3, and i = 4. So total running time with 'n' = 5 is (5 * 5).

As 'n', the length of the array, gets larger, the running time of the method will increase quadratically. If the size of the array doubles, the running time will increase fourfold. If it triples, the running time will increase ninefold.

tef posted:

Might be things like universal healthcare and different taxation
I was assuming these salaries were pre-tax, since that's how people report them in the US. If you're talking post-tax salaries then that's a totally different story.

wolffenstein posted:

Are MS interviews as bad as the rumors say?
The ones I had were pretty much the same as at other companies. Couple of regular data structure/algorithm questions, one game theory algorithm question, one multi-threaded code question from a super-smart PhD guy. I did fine except for the last one, I need to brush up on control structures. Still got an offer, though. :)

frightened goat posted:

Also, are there any good books/textbooks/resources out there that I can read up on to fill in the gaps in my CS knowledge, plus not come off as a relative schmuck in interviews?
The interviewing book itself is probably a good resource. Obviously it's not comprehensive but it should help you understand what things companies expect you to know, and thereby lead you to other sources.

Cicero fucked around with this message at 00:41 on Jan 1, 2011

shrughes
Oct 11, 2008

(call/cc call/cc)

Cicero posted:

Here's a super simple example:
code:
public void doSomething(int[] arr)
{
    int n = arr.length;
    for (int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            // some simple array operation happens here
        }
    }
}
What's the Big-O complexity/running time of the above method?
It's O(n^3), right?

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

shrughes posted:

It's O(n^3), right?
No. As I posted in the spoilered answer, it's O(n^2). Why do you think it's O(n^3)?

shrughes
Oct 11, 2008

(call/cc call/cc)

Cicero posted:

No. As I posted in the spoilered answer, it's O(n^2). Why do you think it's O(n^3)?

Because there exists a number x such for n > 0, for all inputs of length n, the running time is less than or equal to x*n^3?

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

shrughes posted:

Because there exists a number x such for n > 0, for all inputs of length n, the running time is less than or equal to x*n^3?
I think that statement is true, but wouldn't it also be true for x*n^2? When I said that the array operation was simple I was trying to imply that it would be a constant time operation, so with a double loop around it, the whole method should just be quadratic. You have me second-guessing myself here but I really don't see where you're coming from.

shrughes
Oct 11, 2008

(call/cc call/cc)

Cicero posted:

You have me second-guessing myself here but I really don't see where you're coming from.

I am simply sperging about the meaning of big O notation. Any function that is O(n^2) is also O(n^3).

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.

shrughes posted:

I am simply sperging about the meaning of big O notation. Any function that is O(n^2) is also O(n^3).
Ok, I guess. Generally when people are talking about the Big-O running time they mean the lowest valid running time.

kimbo305
Jun 9, 2007

actually, yeah, I am a little mad

Cicero posted:

Ok, I guess. Generally when people are talking about the Big-O running time they mean the lowest valid running time.

The lowest worst-case running time, right?

In my experience, most run-time analysis is done as a spot check, like after you devise an algorithm, the interviewer will ask as a quick check what the running time is. It should be obvious after you just implemented it. For entry level jobs, I feel like programmers and engineers (ones that I'd want to hire, anyway) will rarely struggle to find the obvious right choices for data structures or run times. Hmm, I guess what I mean is, I think I'd expect most people to use hashmaps over lists where appropriate. That's not the part of programming that presents a challenge most of the time. That said, if someone asks you the run time of the level of program that comes up in an interview, you should be able to do it fairly naturally. Which should come with enough programming under your belt. Granted that's maybe a catch 22 when you're going for your first programming job.

The vast majority of interview questions will involve loops, search, sorting, recursion, and dynamic programming. I'd say you can quickly build an intuitive sense of run times for the first 4, and from there it should be easy to arrive at the correct run time for algorithms that are composites of those.

unixbeard
Dec 29, 2004

I've done a lot of interviews and hired a lot of people for technical roles so I thought I would throw in some stuff from the point of view of a hirer in the private sector, not so much fresh grads but more people with 2-5 years experience.

It is important to remember that if you are interviewing there is a specific job that needs to be done. We have code to be written and we are trying to find the person best suited for the task. Most jobs are not incredibly technically difficult which means it is rare we need to hire someone to come up with a completely new paradigm for something never attempted before. Most often there is just a bunch of stuff that needs to get done, and you don't need to be Einstein.

Getting something done in any organisation is a function of competency and the ability to work with others. I will ask you a series of technical questions to gauge your level of competency, and based on your answers and other leading questions I will try to assess your ability to play well with others. I will also try and work out what you want from the job, career goals, specific interests as they will have a bearing on how I manage you day to day, and if you will "fit" with the existing team members.

Ultimately there is no way of knowing if you are competent or will fit in with the organisation and team until you start working, so I am going to go with the person who seems like the best bet and hope for the best.

The easiest way to prove your competency is to have actual proof. If I need a C# developer and you can show me a list of c# projects you have worked on and your blog about C# programming, it is a reasonable bet that you are going to be competent. Some people know a lot but are very sloppy and lack attention to detail, but this is hard to ascertain from an interview and short technical questionnaire. If you can show a history of successful projects under your belt +1 to you as you can get stuff done without it turning into a complete shitpile.

If you're still in college work on open source projects. It is a great way to get experience and most people who work on open source are passionate about what they do and write exemplary code. Take a look through the code base of OpenBSD, it is immaculate. In most jobs you will be working with an existing code base, probably quite messy in places and probably not documented as best it could be. Having the ability to take a bunch of source code, figure out what it does and make some meaningful contribution is something that is very hard at first and takes practice. Get the source to apache, build it, run it, add some printf's, keep reading the source it till it makes sense then fix a few bugs. Maybe it is not a huge deal in the big scheme of things but it shows that you are smart enough to get yourself to that level.

The second thing I will ask you about some scenarios and how you would respond. For instance "The customer disagrees with how a feature has been implemented, even though that is what the BA documented, what would you do?" or "It becomes clear that a colleague has been introducing bugs because they have not done basic testing of their code, what would you do?"

I don't really care what your answers are but I am looking for a few things:

1) The ability to understand that two people can have differing opinions and that both are likely valid. If you just want to sperg out and throw your hands in the air it is unlikely you will be effective in getting things done. Also I like to ask about things you dont like, and then ask you the good things about them. So if you say you think PHP is arse I will ask you to explain why, and then get you to explain why it is so popular. Again I am not so much interested in the specific reasons, but I will see how you communicate technical concepts and if you can be objective in your reasoning.

2) The ability to act in a collegial and professional manner, at least most of the time. Often work has to be done to a deadline, and often you don't have the ideal set of resources. No one will be happy with that situation but I want people who can accept it and work within the constraints and still be successful. If you're going to be whining cause the dba is an idiot or the customer is an idiot I can't really help with that and we have to work with it. Otherwise it creates an unpleasant work environment for everyone.

On the subject of PhD's, I have two guys with Doctorates reporting to me. I have noticed that they place a great deal of weight in being "smart". I think it is a product of the environment of academia, where obviously being smart is really important. This can have an impact on their ability to work with others. I really don't want to generalise but they can have a tendency to think that they are really smart and that they are right. And they usually are right, but in this environment being right isn't as important as getting things done. It comes back to people having differing opinions, and usually both have their merits. You need to be able to ascertain what the other parties are after, and work out a way forward that meets their objectives. At the end of the day I am hiring people cause I need stuff done. If you're going to scoff at other people or teams it will just make it harder.

Now not all PhD's are like this at all. It is just important to realise that if you are moving from academia to the private sector, the drivers differ which means the way the way people interact and operate differ, so treat it like you're at a party where you don't know anyone and tread lightly until you feel you have it sussed out.

3) A degree of enthusiasm and engagement. This is not a show stopper but it is always nice. It is great to work with people who are passionate about what they do. Ask questions about the organisation, what are its goals, what are the teams goals and how do they fit in the bigger picture of the organisational goals. Be interested in the company and the other team members, ask about their backgrounds are and what they like about the organisation. Go to conferences and special interest groups, read peoples blogs, be engaged with the wider technical community of whatever area you are in.

For better or for worse being smart is a commodity, and technical skill is a commodity. There are plenty of smart people in this world, and plenty of people who know C#. If you take anyone you admire or who is famous it is usually on the back of stuff they got done along the way. Being able to get things done, to deliver, is something you need to cultivate.

So to sum up:
Be good at what you do and be able to prove it. Understand you are being hired for a specific task, so we want the person best able to complete that task, which includes working with others.
Be able to get on with others, keep an open mind and be flexible.
Ideally, be doing something you're passionate about or at least enjoy on some level.

Adbot
ADBOT LOVES YOU

shodanjr_gr
Nov 20, 2007

wolffenstein posted:

Are MS interviews as bad as the rumors say?

I personally loved the experience. It was very casual. You get interviewed by developers themselves, not some HR crew, at their offices (and over lunch with one of the guys).

Really nice people and most of them were just brilliant!

The key is (as with most professional interviews I guess, although I have nothing else to compare against) that you actually TALK and discuss the problem at hand extensively before and while you are tackling it. The impression that I got was that if you fail a tough question, you can still be very much in the running if you've put across the impression that you actually know HOW to tackle problems, rather than memorize and recall solutions from memory.

Plus discussing the problem and probing about potential issues will help the interviewer realize that you can be a team player and not some gun-ho pro-coder guy who just works by himself and can't socialize.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply