views:

1154

answers:

17

I know this has probably been asked in one form or fashion, but I wanted to pose it once again within the context of my situation (and probably others here at Stack Overflow).

I made a career change to Software Engineering some time ago without having an undergraduate degree or graduate degree in Computer Science. I've supplemented my undergraduate degree and graduate studies in business with programming courses (VB, Java, C, C#) but never performed academic coursework in the other related disciplines (algorithms, design patterns, discrete math, etc.)...just mostly self-study.

I know there are several of you who have either performed interviews and/or made hiring decisions. Given recent trends in demand, what would you say are the three most essential Computer Science concepts that a developer should have a solid grasp of outside of language syntax?

For example, I've seen blog posts of the "Absolute minimum X that every programmer must know" variety...that's what I'm looking for.

Related questions

The closest ones I could find were "Basic programming/algorithmic concepts" - which was geared towards a true beginner, and "Essential Areas of Knowledge?" I didn't feel was concrete enough.

+6  A: 

Original post:
<post summary of 4 year Computer Science Degree here>

Update:
Wow. 11 up-votes and 7 down-votes! -- You guys have serious issues. (2 switched from - to + ?)

This answer has been playing on my mind so I thought I'd come back and explain myself. I feel the question is asking "please summarise a 4 year full time course in a snappy short answer". The accepted answer has done that.

For the record. I have no problem with people in the IT industry who do not have a Computer Science degree (or similar). There are many people out there smarter than me without degrees.

What I object to, is trivialising of the effort and time I have put into furthering myself in my profession of choice. Something which I came to out of a love for the subject rather than for a quick buck.

Asking me (OK indirectly via Stack Overflow) "please summarise" I think is ridiculous. Would you go ask a car mechanic "so what's should I know about being a mechanic... hmm, engines, steering, brakes, safety.. OK.. thanks". It's pointless. Is that enough to answer a job interview question? "Yeah, I know all about brakes.. they make the car slow down".

I'm not trying to start a Holy War, Flame anyone, or Flame the original question.

Update 2:
Here's what I learnt from 4 years at University.

  • I have a low tolerance for alcohol
  • I love programming
  • I don't like ADA, Cobol, Prolog, Fortran or Lisp
  • Pasta and Tuna is a cheap meal
Dead account
Why the downvote? He's right.
unforgiven3
I think that answers that don't answer the question asked, are voted up way too much. Asking for three is obviously meant for you to prioritize.
abababa22
<summary>sucked</summary> ?
dr. evil
He's being downvoted because we're looking for answers, not a soapbox monologue
Mike Robinson
I think Ian has a good point: the BSCS is not just "3 awesome skillz".
Paul Nathan
@Mike, it's a subjective question. It's like saying "Where is Osama Bin Laden" and not accepting "can't be found" as a location. Note that the excepted answer doesn't answer the question :)
Dead account
@Ian: with all due respects, the intent of my question was not to trivialize or oversimplify the BSCS. I simply wanted to find out what core skills in the contemporary market were most poignant or relevant. I realized that 3 was a little restrictive and that the answers will vary across the spectrum of experience and domain. I appreciate the thoughtful dialogue. Cheers.
Todd
@Todd - no problem. Im just suprised by the up/down voting!
Dead account
+1 to help balance the books...
BenAlabaster
I think people can get a little mean spirited with the downvotes occasionally.
BenAlabaster
At least the down-votes are rated only at -2 whereas the ups are rated +10, so even if you'd hit 0, you'd still have a net gain of 80 points
BobTheBuilder
Im not fussed about the rep points. I think there's a serious BSCS and Non-BSCS divide going on here. As I mention else where, the "answer" doesn't answer the question either :)
Dead account
+2  A: 

Multithreading would be a valuable one. We see developers all the time who really struggle with this kind of code - fundamentally struggle.

dommer
+1; concurrent programming in general trips people up, and unfortunately for them, it's only going to increase in adoption and popularity in the next decade; adopting elements of alternate paradigms (e.g. declarative paradigms) will help here, but the fundamental understanding is still necessary
Rob
I've yet to see a CS course that actually really deals with this. Most of them don't seem to go far beyond the syntax and glossy overview
BobTheBuilder
+3  A: 
  • Pointers
  • Recursion
  • The Big O notation

(Though truly "3" is a number far too low)

Vilx-
+1  A: 

I would certainly look at a person's problem solving ability, acquaintance with commonly used algorithms, and with databases being used in most of the applications - knowledge on databases should be handy.

With all these inputs I guess a person should be able to pick up on most of the programing languages and can be taken aboard.

Here I'm not taking into account the HR aspects of hiring :-)

cheers

Andriyev
+3  A: 

Hard to pick only three, but here's one list:

  • Data structures
  • Algorithms
  • Concurrency

If we are allowed to be more broad and not just list programming skills, I'd add:

  • Communication skill
  • Technical writing
abababa22
+2  A: 

How to deal with managers :)

Konrad
They didn't teach you that in college did they?
Dead account
+3  A: 

Why to restrict at 3 ? Learn concepts like:

  • Data Structure
  • Algorithms
  • Operating system concepts
  • Finite automata
  • OOPS concepts
  • Networking concepts
  • Database concepts ...

EDIT : Have a look at the similar post in SO here. What Computer Science concepts should I know?

aJ
@ aJ: thanks for the link.
Todd
why down vote? Anything missing, pls suggest!
aJ
I hate when people downvote without explaining why.
rtperson
+11  A: 
  • OO Concepts
  • Design Methodolgies to back up your coding
  • Common Sense
kevchadders
+1 for 'common sense', a very rare commodity ;-)
Treb
Which books did you read when learning common sense?
Dead account
@Treb "Common sense" by definition is "common". So if what you think is "common sense" is rare, then it is not "common sense" anymore.
Unknown
@Unknown - http://recluse.me/wp-content/uploads/2008/02/common_sense_god_damn_super_power.jpg
ldigas
+4  A: 

It has been my experience that the majority of the most valuable design principles/concepts are really hard to get from academia, mostly because the cource works tends to focus more on algorithms than on design.

  1. OO Concepts - Inheritance, Interfaces, loosely coupling, dependency injection, etc.
  2. Code Maintainability - the ability to write well documented maintainable code
  3. Passion - The desire to learn
Bob The Janitor
To add to this, design really comes from creativity which is something that either you have, or you don't. You can only inspire/hone creativity in someone that has the ability to be creative.
BenAlabaster
+22  A: 

I've pretty much gone through the whole cycle of hiring, training and even firing developers, and I can say that it is a HUGE deal if you can bring in someone who can hit the ground running without training.

Unfortunately, most CS degrees (including mine) really don't provide that for the common programmer in a corporate IT environment. In college you have to learn about how to rebalance an AVL tree, or how to validate a language L for a specific Turing machine. Or even whether your database is BCNF. These are skills rarely used at a business.

Here's my quick list of skills I look for: (FYI we are mostly an ASP.Net shop)

1 - Database design. Create tables, views, stored procedures, primary & foreign keys, CRUD queries, inner & outer joins, basic normalization. Don't need to be a master, just know how to do the basics without me holding your hand.

2 - OOP. If I talk to you about creating an instance of a class, don't give me a blank look. Know how to create assemblies and reference them in projects. You may never have to create a linked list, but at least understand the basic constructors, methods and properties.

3 - System administration. PCs, servers, server software (IIS, SQL, Active Directory), networking. Know how to set up and troubleshoot PCs and servers so you can work with users and admins to solve problems.

4 - Office & people skills. We are so lean at our company that all of our developers have to also be their own project managers. Be able to help people create design specs and powerpoint workflows, be able to get up in front of 100+ people and demo your application on a big screen.

Really that's about it.

I know there are jobs out there that require you to actually use the stuff they teach you in college, but I sincerely believe that 90% of the jobs out there can be done WELL with the above 4. It held true with the people we hired.

Mxyzptlk
I think you 90% estimate is too low - it's more like 98%
Treb
I'd say it's above 90% in the real world too...I've yet to find a job that required much of my CS studies.
BenAlabaster
+1. I Agree with everything. It's Computer Science, not Computer Engineering. The work places hires Engineers.
Dead account
Yes, yes, yes, dear god, a thousand times YES! (I've been on the Herbal Essences again...)
Rob
I have to say that over the years though, I've come to appreciate companies that have I.T. depts maintain systems so I don't have to waste already precious time maintaining my own though. That can really cut into development time.
BenAlabaster
Maybe I'm just blissfully unaware of what 90% of programming jobs are like, but I have a hard time believing that I could be a good programmer without at least a basic understanding of data structures, algorithms, computational complexity, and other concepts that I learned about in school. I'm not saying you need to go to school to learn these -- I'm just saying that I think school has value.
Steve S
Database design, I'm not so sure about that, at the very least it shouldn't be top 1
Ion Todirel
+1  A: 
  • data structures, algorithms and Big O Notation
  • more than one programming paradigm (OOP, functional, etc)
  • use your common sense, in order to avoiding buzzword-driven-design
dfa
+7  A: 

From my computer science course, I would say there's not an awful lot that I use in my professional life, the things that are of probably most importance are:

  • Debugging skills.
  • Discipline - The discipline to meet my deadlines even though sometimes I'd rather be at the pub with my friends or generally goofing off and the discipline to study things that may not always be interesting to me but that I know are important in the completion of my every day tasks.
  • Research skills. If you don't have the answer to hand, can you quickly locate the necessary information to complete the task.

Then you get your every day skills which while still important should really be second nature at this point, you should be able to do them without thinking about them or with very little need for thought at least:

  • Database design
  • Algorithm analysis
  • OOP Concepts

And of course things that should come naturally, or maybe with a little work, some things of course, cannot be taught but can only be honed or molded:

  • Creativity/Ingenuity
  • Raw talent
  • Common Sense

Those things aside, very little of the detail of my course seems relevant these days. Especially given that the technology has moved so far since then...and really most of the other skills I use everyday were learned on the job, learned as a byproduct of doing my job or as a matter of personal interest.

One other thing I've found out during the course of my career [although not particularly relevant]:

Despite the potential pitfalls of having an I.T. support department maintain my system and the occasional bickering of them not wanting to relinquish administrative priveleges to developers, I far prefer working for a company that maintains my system for me than having to take care of it myself as when it breaks, I don't have to waste hours fixing it, I can instead just work on another machine while they fix it for me.

BenAlabaster
+1 good answer but too far down the list :)
Dead account
+2  A: 
  • Abstraction
  • Indirection
  • Humility
Rob
+1  A: 

Writing readable, maintainable code.

I'm not talking about appropriate selection of algorithms or class design (although that's important) as much as I am talking about good variable names, appropriate if statements that read correctly -- refactoring a messy condition into a boolean method if necessary -- and appropriate use of named constants to make the codebase readable.

chris
+1  A: 
  • Immutability - even in imperative languages
  • Concurrency
  • OOP
Zifre
+2  A: 

Last year at CMU I was a TA for a "CS for practicing engineers" course, aimed at MS students who have programming experience but no computer science background whatsoever.

I'm pasting our topic list below:

  • Course Intro and History of Computer Science
  • Algorithmics concepts, correctness and efficiency
  • Automata, Formal Languages, and Computability
  • Data structures
  • Common algorithms: sorting, searching, dynamic and geedy
  • Concurrency
  • Operating systems overview
  • Compilers overview
  • Networking overview
  • Databases from a discrete math perspective.

I would personally say that in addition to algorithms/data structures, which you may know by now, automata and computability are probably the most important topics. I also think that databases from a discrete math perspective (for example, tuples) is something that is useful to know. Other things you may have picked up on the way.

Uri
A: 
  • Assignment.
  • Pointers.
  • Recursion.

Just please not OOP :(.

chpwn