What computer science knowledge/concepts do Silicon Valley software engineers (Google, Quora, Facebook, Twitter, etc.) use on a daily basis?
-
What are the most useful things to know/learn/practice to be a good developer? Most companies say data structures, algorithms, distributed systems (map reduce), OS/networking on their "careers page." Do you end up using these things, or are there more relevant ones?
-
Answer:
The set of questions people ask is frustratingly disjoint from what's important day-to-day. There are reasons, but I'll try not to get sidetracked. Here's a tiny list of things an engineer should be prepared for. It's 2pm. The release gets cut at noon tomorrow. (Or we could delay, but that would suck more than we'd like.) This piece of code is running way too slow for us to ship it with our names on it. How would you decide what to do? And then how would you do it? Remember that there's still that other feature we were working on. We need to do X. You know our stack and our toolchain. Research the options, then determine the next step and take it. MySQL is seriously melting with this growth. We can't keep doing all these joins. There's a critical bug in production. We're losing velocity. Our crufty code is keeping us from making changes quickly. How did we get here? What would really good abstractions look like? What problem are we really solving, and how do we keep solving it while cleaning up this mess? EventMachine is leaking more than normal. Someone took out Git. There's a crater. Is it ok not to encrypt this? Like, what's the worst that could happen. Right? I think we've been hacked. We've got an interview today. They even mentioned some security experience. What do we ask, and how? What would their answers tell us? For the most part, no one cares if you can make a red-black tree. It's not something you'll be doing. It's just a proxy for a few things that do matter: your ability to solve new problems and a basic knowledge of computer science, and also whether you can write code that compiles and runs. But those are just the basics. They're necessary, but they're not sufficient. What's more important is your understanding: whether you can see the forest for the trees and find your way to where you're going. You don't think in JavaScript or Python but in problems and solutions, on multiple dimensions at once. You know the details are important but they aren't the pointâexcept when they are, and you can tell the difference. You don't do stuff that's clearly bad; consider that a given. You don't leave O(n^2) code turds on the floor or weird recursion time bombs that will blow the stack if n gets bigger than a thousand. But in a http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs for programming, that stuff is on the bottom steps. It's important to keep reaching for the top. The most important question you can ask is "why." What problem does this project solve, and what problems is it made of? Why should I consider Factor A over Consequence B? Why the hell is there a ServletBeanAdapter here? And keep in mind that sometimes it's because an engineer took time to fully understand the problem, examined the upside, noted the risk to his or her own timetable, considered the security concerns, thought about maintainability, sketched out some more powerful solutions, decided not to waste the effort there, and made a call that looked ok when faced with finite time and lots of ambiguity. That's what software engineering is about. You develop judgement and you learn from your mistakes. And that's what no one asks about. Here's where I should say a couple things. First: I'm a "new grad," which means I've interviewed enough that I can't count them on my fingers and toes, but I wouldn't need to grow a lot of extra hands. That leaves me biased in a number of ways. Second: The context is important. If you work on machine learning, you'll definitely need some statistics. For distributed systems, you'll need data structures and concurrency. I don't mean to say that core CS is not important. I'm talking here in generalities, so please don't take them for specifics. In my experience, what people ask is more like this. FizzBuzz variants; easy looping questions. (Because it would be rude to check your pulse.) Counting nodes or levels in some sort of tree. The goal is usually to see if you can think recursively or how you'll try to hack the problem if you don't. I love to harp on these, but honestly they make pretty good screens. Basic questions from an algorithms class. Can you solve a searching problem if you aren't told how? Can you mentally connect the properties of BFS with level-order printing in a binary tree? Data structure questions with a fairly clear right answer. Given some data and a time or space constraint, can you process it a certain way? Can you make a stack with constant-time maxValue()? What structures would you hook together for an LRU cache? A lot of these are just fill-in-the-blank if you know the standard structures' time and space costs, but that's already showing that you know something worth knowing. Sometimes they're just random made-up problems that you probably won't guess in advance. Maybe some weird string manipulation or a twist on a dynamic programming problem. Some companies might ask more mathy stuff like rolling averages or random number generation. And of course there's plenty more. There's a bunch of different lists online that people study with. I just don't think what's in them is the point. The most important thing I have to share, strictly true or not, is that the skills you'll need for interviews are not the skills you'll need at work. If you're interviewing, brush up on your textbook knowledge. Practice your dynamic programming. Go code up a union-find in C. Worry less about what skills you really need and more about the ones you need to demonstrate, because they're different. The standard problems people test you on are proxies for the things they really want. They just have a funny and imperfect way of finding out.
Bulat Bochkariov at Quora Visit the source
Other answers
Build a small real web app you want to use, or mobile app of your own. That's practice. Class pizza-ordering-system projects dont cut it. Skills? Should take you 3-6 months to become fairly proficient / productive / employable, and perhaps an year to build some in-depth knowledge. Choose ONE of the following and become really good at it. Ignore the others. 1. Learn Javascript / Node.js, Mongodb, REST. Build an express.js / mongodb based web site. OR 2. Learn Python, django, mysql. Build a web site using these. OR 3. Learn Objective C, build a small mobile app and deploy to your iPhone (from app store) OR 4. Learn Android APIs, build a small app and deploy to your android phone Concepts you need to know: 1. one programming language (preferably javascript or python today or ObjectiveC / Android Java if targeting mobile), 2. one database (mysql or mongodb today) including SQL, 3. how the web and internet works (basically the lifecycle of what happens from the moment you type a url, and the page appears in the browser). Besides this, you should know just the high level concepts of data structures / algorithms, and things like threading (you will learn more later as you work). If you want to be good, you should also know how computers work. Really great books are - simple and pictorial, and yet detailed and memorable: http://www.amazon.com/How-Computers-Work-9th-Edition/dp/0789736136/ref=sr_1_1?ie=UTF8&qid=1363706520&sr=8-1&keywords=how+computers+work http://www.amazon.com/How-Networks-Work-7th-Edition/dp/0789732327/ref=pd_sim_b_3 http://www.amazon.com/How-Internet-Works-8th-Edition/dp/0789736268/ref=pd_sim_b_2 These books will put you ahead of 90% of engineers out there as far as conceptual understanding goes. Again learn by building a simple real world site / app that you actually expect to use.
Anonymous
All of those things are good, but what's important about them isn't necessarily the nitty-gritty details of how to implement them, but rather the details about knowing which ones to implement when. Knowing how to code a red-black tree isn't important (it's generally a bad idea to do it yourself any ways, the implementation in a good library is almost certainly better than anything you might write,) but being able to look at a problem and determine which data structures or algorithms will best solve your problem is key.
Anonymous
Since the question was specific about computer science knowledge/concepts, i will exclude what are generally/widely regarded as technologies rather than concepts from this answer. That apart it also greatly depends on what kind of product/web site an engineer is working on. For example in my first job for an object oriented database company, we used to deal with all sorts of data structures that were implemented in that product. Also lots of queuing theory, multi-threading & concurrency control algorithms & concepts were implemented natively. Apart from, of course, the actual database, transaction handling and object-oriented concepts that were actually implemented. We even had our own C++ parser builtin, so you have that too! It was a fantastic product and a fabulous experience; the amount of exposure that one got and insight that i gained was incredible especially for a fresher! I am sure the experience would be similar for someone working on an operating system component or a storage manager or a file system. My next job was a product which was higher level application; i didnt need to deal with such a span of computer science concepts since most of what we needed was already being provided by the various libraries and toolkits we were using. But still one needs to be aware of basic data structures, and some algorithms, you didnt need to know how to implement them but you need to know how they would work. My opinion is one, definitely needs to know and know well all the computer science concepts that are generally taught in school. But thats not the end of it, i am sure as you start working you will use different concepts and also need to learn newer ones. The objective of what you may have studied in school is basically to establish a foundation for you to build upon as needed in your career. *let me know if you want to expand or focus some specific stuff, i can update this answer
Rakesh Chella
Yes, everything you mentioned is important. But one can't remember all those all the time. You'll have to remember the basics of all those and know how and where to apply them. There is no point remembering everything and reinventing every time. So, there are only these couple of things which will come handy: Googling - It is not just going to http://google.com and typing a question as you speak. Queries to the search engine should be focused, with as less keywords as possible. Copy+Paste - Most of the algorithms and data structures are available in the net. You should know where to copy from, and where to paste. (You should not be copying a GPL code into your closed source project and end up in trouble later). You should also know how to customize the code to suit your requirements.
Harisha Manchale
Related Q & A:
- What is the difference between a Computer science (A.S.) and Computer Information Systems (A.S?Best solution by Yahoo! Answers
- How many people fly on a daily basis?Best solution by Quora
- What can I do to get a good job with my Bachelors of Science in Computer Science?Best solution by collegexpress.com
- Should I pursue a degree in computer science for software engineering?Best solution by Quora
- What does a medical assistant do on a daily basis?Best solution by Quora
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
For every problem there is a solution! Proved by Solucija.
-
Got an issue and looking for advice?
-
Ask Solucija to search every corner of the Web for help.
-
Get workable solutions and helpful tips in a moment.
Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.