What skills, languages, tools, etc. would you suggest someone interested in a career in programming learn?
views:
2547answers:
31Source control. This is a big selling feature in a developer. Be fluent in CVS. SVN, etc.
First start with IF gates, and Loops. These are the building blocks for all programs. Then move onto Object Oriented programming principls and UML modelling because with these skills you will be able to read code and learn.
In terms of languages, VB.NET is easy to pick up because it reads like english and it has a very good IDE that will help you program using intellisense (it predicts the objects you are typeing as you type them)
Here are some basic starting areas:
- Common Programming Patterns (MVC, Bridge, Observer)
- Languages: ASP.NET, PHP
- IDE: Eclipse, Visual Studio
- Regular Expressions
- Unit Testing: nANT, NUnit, JUnit
I would say whatever you can learn. Perhaps different paradigms (functional, OO, procedural, aspect-oriented, etc) would be useful. I would say command-line tools would be helpful.
The book "The Pragmatic Programmer" has a great section on that! If you haven't read it, I would highly suggest that you do. Basically though, stay current with technology. Try and learn a new language every year. Beware of adapting bleeding edge technology. And try many different tools. Don't become too reliant on one technology, cause it might not be the right technology for the job or project.
It depends on what you're looking for. Enjoying yourself while doing your work or making a lot of money? Skills like J2EE are very demanded and thus more worthwhile to get if money is the only concern. Having worked with the JBoss J2EE suite for a year, I can safely say it was the most painful programming experience ever. I can go on and on in a rant about the specifics, but for me in the end it's not worth the extra money.
Maybe there will be some J2EE jockeys to contradict me, but where were they when I hit countless walls and discovered bugs that are still not fixed 1,5 years later?
My advice would be, learn what you like. IMHO the current demand in IT is big enough that you'll find work in whatever you enjoy doing.
Well, I would say it is imperative to learn an imperative language (sorry, couldn't help myself), such as C/C++, Java or C# (something that is "popular" which will help you get a job in the current marketplace, and the specific choice depends on the particular area you want to work in).
Then, I would say you should also have a scripting language under your belt that is strong in OS tasks and regular expressions (Perl, Ruby, etc).
A functional language would also be helpful to improve your problem solving skills and broaden your general programming knowledge (Haskell, F#, Lisp, etc).
It may not be a necessity, but I would also recommend learning a powerful command line style editor like Emacs, as well as a powerful IDE such as Eclipse (substitute whichever particular choice makes sense to you and the languages you use though).
Although not a specific skill or tool, when I am hiring, I look for people who are truly interested in software development. Usually this is demonstrated by their activities outside of school.
It doesn't have to large, or even medium size project. Just simple hacking outside of forced assignments shows a greater interest that someone who is doing things by the numbers to finish their degree and will have a greater chance at being hired that someone who may be technically smarter, but less interested beyond the degree they are earning.
If you want your code to perform well, you might consider learning a thing or two about memory. See What Every Programmer Should Know About Memory. Especially relevant given that multi-cores are going to make memory a scarcer and scarcer resource.
Rather than any specific technology buzzword that will appear on your resume, I think by far the most important skills for a programmer to learn are how to write well, and how to speak in public. These are the skills that will allow you to make a difference in an organization, to persuade others that your plan is best and your point of view is the correct one. These are the skills that will differentiate you from some coder in a developing country who is willing to pound out code for a fraction of your salary.
Are you looking for skills that will look good on your resume and help you get jobs, or are you looking for skills that will help you be a better programmer?
If the main issue is resume-building, then you can do worse than to scan job posting sites and start reading up on what's popular there.
But if what you want is to be a better programmer, then the specific languages don't matter too much. A good programmer can pick up any new language or technique that comes along; it's the core principles and ways of thinking that matter.
To that end, a good way to start is to inventory what you know and what you're comfortable with, and start learning something different. Not different in the "not in the set of things you currently know" sense, but in the "nothing like what you currently know" one.
Mostly know C/C#/Java-style procedural languages? Pick up Scheme, Lisp, or Haskell to get a taste of functional programming. Always done server-side / low-level programming? Pick a neat-sounding GUI toolkit and learn how to use it. Never written a compiler? They're easier than you think; pick up a copy of the Dragon Book and get cracking, or check out LLVM.
You also can't really go wrong with books on algorithms and problem-solving; a solid grasp of algorithms will serve you well in pretty much any programming environment. Introduction to Algorithms and Programming Pearls are both classics for this.
Teaching yourself how to think about problems and adapt to new tools is more important than pretty much any specific tool you could learn; the tools we use now are wildly different than what people relied on ten years ago. Focus too much on specific tools and languages and you're in danger of going the route of the sad Cobol programmer, called out of retirement to fix Y2K problems and then mothballed and never seen again.
- Failure: and this is a big one. If you do not like to fail, then do not start your future in programming. I fail over and over every day. You write some code, compile, fail. Repeat that process until you get it to compile. Then you run your program, fail. Repeat the cycle until it compiles again and then re-test the software.
- Problem Solving: programming is all about solving problems. All of those failures that I mentioned in item 1 above... you have to find solutions to each failure. Every programming task you work on will be a set of problems which need to be overcome.
- Coding Style and Documentation: Work on this from the very beginning. Other programmers will love working with you if they can a) read your code and b) figure out what it is supposed to do. Not only that, but adhering to good coding style and best practices will often prevent a bunch of mistakes and hard to find bugs in your programs.
- Finally, don't be caught up on what language is the hottest or not. Learn a language and learn it well. Learn to solve problems. Learn the concepts of programming. After that it's all semantics.
Here is some further reading material from Alex Iskold which is very good:
Top 10 Concepts That Every Software Engineer Should Know
Hi...
Take a look at http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm for a pretty good "skills matrix". There are no weights given to each category, but it's pretty thorough.
yours, Marcus
The things I look for when reviewing a resume are:
- SCM (Subversion, CVS, Git, Perforce, etc)
- Unit Testing (JUnit, JMock, etc)
- Issue Tracking (Bugzilla, Mantis, etc)
- A diverse set of languages (Java, Lisp, Ruby, PHP, etc)
I think having these basic skill sets lets you know that the potential employee has been around the block a few times. As with all things in an interview, make sure you ask follow up questions because resumes are not always the whole story.
Here are my top few suggestions:
1) Make sure you know how you learn. Do you prefer examples, abstract concepts, learning visually or orally, etc. Chances are you will likely have to learn some technology over your career and this may make it much easier.
2) Understand some basics of software development: Testing, basic data structures like stacks and queues, as well as a methodology or two like Waterfall or Agile, would be another key point.
3) Find your market. Do you like web development, games, databases, neural networks, numerical analysis, embedded systems, mobile devices, scripting or something else? There are lots of different areas one can focus which I'd suggest finding which you'd like to specialize in on as few programmers are good at all of these.
4) Know how to investigate a problem and solve it. This skill may require some work but it can be useful when given a problem that can be solved many ways where some may work better than others. This is also how to get through the part of a job interview where you have a whiteboard and you're asked something that may seem fairly simple that turns out was given vaguely enough to test how well you communicate or do you just assume things that may or may not be true in a hypothetical case.
Learn to write well in the native language of your company (for me that's English). This will help with all the other skills you want (including resume writing!). That includes bug reporting, writing and reading specs and requirements, asking questions, commenting code and any report writing or paperwork you may need to do. In an indirect way, it may also help your coding.
This is important: learn to be concise. Remove all unnecessary words in your writing.
Also, learn to ask questions and seek help, especially in areas that are new to you. If you dither for an hour, that's an hour lost. And that's a shame when it can be prevented.
Spelling and honesty - where I work, we're looking to hire a new business analyst.
If we cannot read the resume due to spelling errors --> Trash it
If we find you're lying on the resume --> Trash it
If we find two people with the same resume --> Bring them both in, present the duplicate resumes and then walk them out of the building. Yes, we did it.
Something on the unusual side, but which could emphasize your writing skills or add some "geek" flavor, layout your resume in LaTeX. Then, add it to your skill matrix. Not only will it make your resume a professional, typeset document, but it emphasizes your creativity and technological curiosity.
Edited to add: Not only useful for the interview, but also as a job skill, can't tell how many times I have relied on LaTeX for documentation purposes.
Problem solving and analytical skills are the most important attributes a developer should have. With those skills, a developer could do anything, learn any language, learn any tool.
Soft skills, such as good verbal/written communications skills, and an ability to interact with colleagues and clients in a professional manner. Of course technical skills are important – but in a race between two job applicants with equal technical capability, the one with better people skills and a better ability to communicate will come out ahead.
Get involved with open source projects. This can give you experience with teamwork, source control, and coding standards.
Look for local user groups in your area you can attend. Showing an interest in participating in the community will show your enthusiasm.
Be prepared to answer questions about everything you mention on your resume. Try to have some real world examples you can speak off about the technologies you mention. Just learning the facts about a technology will not show that you can apply the knowledge.
Jonathan Franzone wrote:
Failure: and this is a big one. If you do not like to fail, then do not start your future in programming. I fail over and over every day. You write some code, compile, fail. Repeat that process until you get it to compile. Then you run your program, fail. Repeat the cycle until it compiles again and then re-test the software.
Holy crap, this is a retarded way to code. How about think about it first so you type it in right the first time?
In summary: Keep up with technology on a daily basis. Set aside time each day to keep up with what's new and what's going on.
When I'm hiring for any IT position, I always ask, "How do you stay current?" Last week, I interviewed three individuals for a support position in one of our remote offices. When I asked this question, two of them fumbled for words and couldn't come up with anything better than their local newspaper's weekly tech column. The third listed his favorite tech blogs. During the technical exam, he asked me if I had tried Google Chrome (which had been released scarcely a week earlier). Guess who got the job?
I also agree with the answers above: communication and analytical skills together with a love for learning will take you a long way.
I think the art of Regular Expressions in themselves embody everything that you must understand and become good at in programming: abstraction, symbolic representation, parsing, pattern recognition, conciseness, recursion and good old analytical skills.
Oisin
Invest time in learning to use your editor of choice effectively.
Know the language you use (and don't use as others suggested), but also know of the libraries and tools available to you. If you are into C++, for instance, you know of boost, sourceforge and freshmeat. Algorithms, data structures etc.
Learn concepts and extend your knowledge (databases, web servers, sysadmin, project management, how to interact with clients and customers, managers etc).
Get a CS degree, and continue to learn by reading in your field, related fields, and business. If you did not catch this technical wave be ready for the next one.
Have some common sense, some social skills, be able to write solid code and be able to get it out to others. It's not being familiar with all the latest buzzwords and all that, it's about knowing what you're working on (some of the best programmers I know are EEs), meaning have a grasp of assembly language, computer architecture. I'm not saying be able to write perfectly optimized assembly that takes into account the clocking of the ALU, I mean know that compilers can do that, and know what your compiler is generating. Many engineers don't know how to find a buggy instruction in a CPU, how an OS is structured, etc. I suppose it all depends on your industry (I've done embedded, systems, HPTC programming), but generally managers are looking for people who can communicate, integrate their stuff, write solid code, work independently, understand what they're working on, and not be completely full of shit.
If you are asking this question, I'm assuming you don't have a career in programming, so I will start with my own question, do you have a degree? If you don't, get one.
If you complete a degree in Computer Science, you won't know everything there is to it, but you will most likely learn the basic skills you need to get started. While you get your degree, do not neglect your programming courses. These days, you will need to learn various languages to be marketable. C++, C#, Java, Python, Ruby, Perl, JavaScript, they are all good. Learn them because each one of them will teach you something new about programming.
Keep up with technology, but don't try to seek every buzz word you hear or read on-line. You will have to learn a lot of things that have been around for decades before you can master any new technology, and the reality is that most of them are just that, a buzz that will disappear as fast as they appeared. Seek the things you find interesting. With them, you will find new skills that you will need to learn.
Do not be affraid to experiment. Many times, finding a good solution to a problem is a matter of experiment with different possibilities.
I can't emphasise enough how important learning your chosen domain is. If you can't converse with the "business" people in their own terms, it doesn't matter how good you are at code, you won't be able to help them.
Don't learn just programming, make sure that you have some knowledge of the domain that you'll be working in too. For example, if you primarily work on business systems (e.g., ERP), a little accounting knowledge goes a long way. If you work in games, things like physics, etc helps.
Definitely resume-writing. Show me a programmmer with solid resume-writing skills, and I'll show you one employed dude.