6
$\begingroup$

What skills should we strive to foster in our students that will make them good software developers in the future? They are in our classes to learn coding skills, but what else do they need? Collaboration skills? Time management? Tenacity? Curiosity? Persistence? Some skills are needful in any career path, and we cannot emphasize them all. On which should we concentrate? How can we do this efficiently and effectively?

We are charged with educating the next generation. I'd like to make sure I do my students the service of not only making them good programmers, but also preparing them for the workplace, specifically as Computer Scientists, if that is what they desire.

So, what makes a good programmer?

$\endgroup$
1
  • $\begingroup$ If you are asking about personality traits, I'd say curiosity is the best. Why does this do that? How can I make it do this other thing? What happens when I change this? If you are looking for a skills list, the answer that ctrl-alt-delor provided is a good start $\endgroup$
    – ivanivan
    Mar 17, 2018 at 16:18

5 Answers 5

8
$\begingroup$

I don't think this question can be answered in any meaningful way. There isn't a finite list of skills that you need to be a programmer, or that make you a better programmer.

Computer science is a huge field encompassing just about every job you can imagine, and each of those jobs requires a different skillset. No matter what your interests are, chances are you can find a place for yourself in the industry somewhere.

Skills that make one person a good programmer won't necessarily benefit another programmer. One programming job might require an artistic background, whereas another job might require a mathematics background, or a managerial background.

The best answer to this question is going to be very broad.

So, what makes a good programmer?

The ability to learn. Most programming is not actually writing code. Most programming is reading tutorials, running example code, and looking stuff up in documentation. Programming is more of a craft than people realize.

The ability to break things down into smaller pieces. Again, programmers don't sit down to code as soon as they're given a task. They have to spend a significant amount of time breaking the task down into smaller steps, and then taking those steps on one at a time.

The ability to ask questions. This might mean looking stuff up in the documentation, or on Google, or on Stack Overflow. It might mean asking a colleage or even a rubber duck.

The best software teams are comprised of a bunch of different people from a bunch of different backgrounds, with a bunch of different skills. Instead of trying to focus on a particular set of skills your students need, I'd recommend looking at the skills your students already have and helping them explore those skills in a computer science setting. Have a student who likes art? Cool, teach them about creative coding. Have a student interested in statistics? Teach them about data visualization. Have a student interested in mechanics? Teach them about robotics.

Don't ask what skills you need for computer science; ask what computer science you can do with your skills.

$\endgroup$
1
  • 1
    $\begingroup$ Talk about inversion of control .. excellent answer! $\endgroup$
    – pojo-guy
    Mar 17, 2018 at 0:46
4
$\begingroup$

I am answering from the perspective of a recently retired software engineer who worked in a number of Silicon Valley companies from small startups to large corporations with thousands of engineers all over the world.

The question seems very broad. I will narrow it down to the one non-programming class in high school that had the biggest positive impact on my professional career. That class was "English Composition".

The ability to both request and provide information in a clear and concise manner is extremely valuable for working efficiently in an engineering environment. Worked demonstrations of this – positive as well as negative – can be found among the questions and answers on our companion site Stackoverflow.

In a global work environment that spans many time zones, and where synchronous communication is frequently just not feasible, these writing skills already come into play when dealing with the numerous daily emails. It extends further to internal memos, design documentation, and quite possibly published articles.

Over the years I expanded on the skills that I acquired in that high-school class, for example by adding the element of cultural awareness. I learned the hard way that idiomatic expressions such as "right on the money" or "out in left field" can be quite confusing when writing for a global audience which often includes many non-native speakers of English.

$\endgroup$
2
$\begingroup$

As well as those (what are sometime referred to as soft) skills. I would say that there are other skills that are needed to be a good programmer. Not all of these would I expect to see in a graduate. However I would expect to see some.

  • Gnu/Linux / Unix skills.
  • Revision control.
  • Agile.
  • Software Project management (most project management courses teach logistics, Software Project management is not logistics).
  • Unit testing.
  • Functional testing.
  • Automation: testing, build, deployment, code generators (DSLs), …
  • Design by contract.
  • Pattern (not just GOF).
$\endgroup$
3
  • $\begingroup$ This other question may also be relevant cseducators.stackexchange.com/q/2787/204 $\endgroup$ Mar 15, 2018 at 20:45
  • $\begingroup$ @CAD you dredged up some bad memories there, because when I graduated and went to work, my weakest skills were in revision control, unit testing, and batch file syntax (DOS). Revision control we didn't even use, our builds weren't long enough to need batch files, and unit testing was something usually skipped in the heat of "getting it working". I was mortified to learn that I didn't know so much! And remembering those feelings of being "let down" by my instructors - why didn't they tell me? - inspires me to make sure I incorporate these things - or at least mention them - in my coursework. $\endgroup$
    – Java Jive
    Mar 16, 2018 at 14:00
  • $\begingroup$ Comments are not for extended discussion; this conversation has been moved to chat. $\endgroup$
    – thesecretmaster
    Mar 22, 2018 at 0:53
0
$\begingroup$

I think that all of your suggested items are needed and some are difficult to teach other than by example. But let me focus on one aspect, especially, that can be taught.

A good programmer needs a variety of strategies for getting their own questions answered and the desire to get them answered quickly. This means that you cannot be their sole source of information. If you teach at least part of the time in a lab situation, or with a projected computer screen image you can demonstrate how you use, google, wikipedia, language documentation, StackOverflow, etc. in answering questions.

If a "what does ... do" question arises, you can quickly write a code fragment that illustrates it, giving them the hint that they can do that too. You could even make an assignment to have students write short code fragments to illustrate an idea.

But some answers can also come from people, especially their peers. This is one reason for encourage pairing and teamwork. It isn't the answers themselves that are the key here, but the strategy for quickly finding the answers. And, since writing isn't one of your suggestions, but is important to any professional, you could have students who answer questions for others, write the answers up. I used to use a wiki for this purpose. Over time, it became a valuable resource in itself. Mailing lists to which every student can ask and answer questions also help. Also, being helpful to others is a valuable skill as well, so this helps with that, also.

Programming assignments could possibly be accompanied by footnotes that reference relevant online (or book) material to show how their code is related to what has been done by others.

You can probably think of other strategies, but don't keep them to yourself. Be sure that you demonstrate them and have the students utilize them with some evidence that they can do so on their own.

$\endgroup$
0
$\begingroup$

Being creative, ability to 'think outside the box', and an almost obsessive attention to detail. They are the non-programming skills I would want in a programmer. Oh, and incredible amount of patience! Lets face it, compiling can take time.

$\endgroup$
1
  • $\begingroup$ I am not sure why this was down voted since I came to post the above. The above mentioned qualities are essential for any programmer who is serious about taking their game to the next level. Especially the patience part is mandatory. $\endgroup$
    – Jay
    Mar 24, 2018 at 6:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.