Can anyone who is a coder for pay on my LJ list (or of it) Give me their top 10-15 required skills needed to succeed as a software engineer?
I am working on a school assignment in which I need to define some goals for a "Career" besides my own - and Software engineering is pretty much where I want to be going, and thus what I have to interview to define, for purposes of this paper.
So if you can, drop me a list of skills (learnable by education, rather than Jedi magic or long-term experience if possible) that makes for a successful coder-for-pay. General stuff is OK, perhaps better than more specific stuff - you dont need version numbers.
I am working on a school assignment in which I need to define some goals for a "Career" besides my own - and Software engineering is pretty much where I want to be going, and thus what I have to interview to define, for purposes of this paper.
So if you can, drop me a list of skills (learnable by education, rather than Jedi magic or long-term experience if possible) that makes for a successful coder-for-pay. General stuff is OK, perhaps better than more specific stuff - you dont need version numbers.
Tags:
From:
no subject
Math skills! Not necessarily calculus. Discrete math is far more useful to a coder. Discrete mathematics contains most of the basics needed to understand how to optimize code. As well, discrete mathematics usually emphasizes proofs. Proofs are useful because they manage to combine logic skills with creativity to find solutions to problems - something that is at the core of coding.
Another advantage of math is that it is all problem solving. Problem solving is less important in writing code than in debugging code. The big difference between a CS program and the real world is that in the real-world, you spend all your time debugging, whereas in university, debugging is barely touched upon. It's stupid just how much debugging is ignored. There should be books and courses and tons of theory on debugging, but there's nothing. Nobody likes it, so everybody tries to ignore it as much as possible. Unfortunately, it's extremely important.
Operating systems. If you code long enough, the OS will become very important. I've spent my entire career working on Solaris. As a result, I know a lot about the guts of Solaris, and when it comes to coding, I can work pretty deep within the OS. Move me to a Windows box though, and I'm screwed. I can't go any deeper than Java (which is OS independent on purpose, but it sucks as a language if you want to do anything optimized or fancy.)
Communication skills. It's not enough to understand a problem, but you have to be able to explain it to others. You also need to explain it to a variety of audiences. For example, if I hit a bug, I need to be able to give a detailed enough explanation that another developer can fix it in a different release. I also need to be able to explain it well enough for my manager and my project manager to understand, and they really don't care about the details of the problem - they care about other things like what the problem impacts, and how much effort it will take to fix.
Software analysis and design is useful for those time when you aren't debugging but you are actually creating code fresh. In reality, most feature work is work on top of existing work. It's rare you start from a blank page. For that, being able to understand existing system is critical. Most software design and analysis though seems to assume you are starting from nothing. (Another way that a CS program deviates from the real world.)
If you do any object-oriented programming, it is important to understand object-oriented design. Design patterns can be extremely useful, and they show the power of OO design. It is also important to know the major design patterns because they have become part of the lingo. When someone tells you to give them a Facade, you need to know what they are saying.
A basic understanding of business is useful. A coder is never completely in isolation. You are always embedded within a business. It can be useful to understand what is happening around you just to understand your environment better, and ward off insanity. I keep thinking of taking a basic Administration and maybe a basic Accounting course just to understand better the nonsense the spews out of mouths of executives. (As well, it is useful to keep up with management fads. If they aren't sending you to learn the seven habits of highly effective people, they'll be sending you to figure out who moved your cheese. It's all horribly tedious, but it is useful to know. Reading Dilbert is usually enough to keep up on this though.)
Actually, reading Dilbert is essential. Dilbert nails the entire experience.
If I think of more, I'll post again. So far, this has all been stream-of-consciousness.
From:
no subject
smart
gets things done
a lot of people have one without the other, and it just doesn't work.
apart from that, i'd say
* being excited by new things, because you always have to learn new technologies and keep up with what's going on
* business sense -- because some understanding of economics will keep you working for pets.com, or whatever the web 2.0 version of that is
* people skills: this is pretty surprising, but most people have such crap people skills in it, that if you have any at all, it will really help you
* communication skills, as the person above said, you always have to be explaining things: design, how things work, making proposals for what to do -- so to be good at writing, arguing, giving presentations is important
* being able to talk to people on different levels: other techies, your boss, non-techies, customers -- to be able to pitch what you're saying to a specific audience is really helpful.
From:
no subject
Debugging. I swear, the first year of a new programmer's career is primarily spent learning how to debug properly -- and then the rest of your career is spent learning how to do it better. Even when you're writing new code, being able to architect things is great but when you inevitably make mistakes, if you don't know how to track 'em down your architecture skills are useless. Learn how to debug in every development environment you can get your grubby little paws on, and if you know where you're likely to spend your career (e.g. in Windows) learn everything you can about the debugger you're going to spend most of your time with. It's really shameful that debugging is ignored as a serious topic in university CS classes... For actual Software Engineering, it's an absolute travesty that they don't have at least two classes on the topic.
Business skills. Nothing a programmer does -- even open-source stuff -- is done in isolation. There's got to be a reason to do something. Knowing when and where to spend your effort is critical if you want to be successful in the long term. I don't mean that you should complement a CS degree with an MBA or anything, but a basic understanding of how business works is very, very helpful in understanding what the actualy requirements are.
Ooh, there's a new one. Requirements gathering. It's great to be able to build what you're told, but half of the time what you're told to build isn't actually what the person telling you things really wants. The better you understand the real requirements, the better of a solution you can provide.
Communications skills. Technical documentation, training skills, even simply knowing how to properly comment your code... All of these things are critical, even if only to reduce your workload from stupid support questions later. ;-) And on a more general level, even the most isolated programmer spends a lot of time working with other programmers at the very least, and most of us spend a lot of time dealing with people outside of the department. Being able to communicate clearly and efficiently is critical to real-world success.
That's it for now... Hope that helps!