On March 22nd I gave a presentation to ASU's Software Developers Association which I called "What My Professors Didn't Teach Me - Developer Skills: What They Are, Why They're Important and What You Should Know About Them". The presentation provided an overview on seven different "developer skills" that I believe are necessary to succeed as a professional software developer. I define "developer skills" as those aptitudes between the "hard" technical skills of programming / hacking and the "soft" interpersonal skills of teamwork and communication. They are the things that a developer needs to know to succeed at his job outside of actually building software.
Over the next several weeks I will be writing a post on each of these proficiencies; each post will describe what the developer skill is, why I consider it to be necessary knowledge for the workplace, and what specific things you should learn. I plan to have links to tutorials or other websites that you can use to follow up.
The posts will be as follows:
Part 0: Introduction
Part 1: Version Control
Part 2: Ticketing Software
Part 3: Multi-Branch Development Workflow
Part 4: Libraries and Package Managers
Part 5: Working with Remote Computers
Part 6: Communication Between Software
Part 7: Securing Your Communication
For the first (zeroth) post, let's go over what I mean by "developer skill." From my point of view, there are three types of aptitudes in this world (at least pertaining to software developers):
- Technical Skills:
These are "hard skills" - programming, mathematics, formal logic, information theory, etc. These are the sorts of things that usually require some authority to properly teach - either through a formal class at school, or through learning from a book or an online course. In my opinion, the most valid reason for a person to go to college for a programming-centric degree is to benefit from the selection and collation of technical skill education that the college environment provides.
- Soft Skills:
These may simply be described as the ability to communicate and work with another individual - or a set of individuals - productively and without conflict. These skills that are required in every job, not just software development. They include communication, negotiation, persuasion, cooperation and teamwork, and conflict resolution, among many others. In contrast to technical skills, these skills are not taught by some authority - humans pick these up naturally by interacting with other people over time. Very often, these develop naturally "on the job".
- Developer Skills:
I define "developer skills", broadly, as those skills that are necessary to one's career as a software developer, but don't really fall into either the "technical skills" or the "soft skills" category. They almost always involve the use of technology, so they're not really soft skills - but they are about using technology in the context of working with other people, and so they aren't really technical skills either. As another contrast to technical skills, you won't - perhaps, can't - learn these in the classroom.
What are they? They're things like project management skills - how you use technology divide up work and communicate with other people about it. How you manage your code. They also include general awareness of certain major topics within software development, like security and communication between two computers, or two programs. If you want a full list (or at least, as full as I could make it without getting too deep into the weeds), see the list of posts I'll be making up above.
Why Do We Need Developer Skills?
My motivation to give the presentation - and to write these posts - is that I was not taught these skills in school, and yet they were highly important to my actual day-to-day work once I was hired. I had to figure them out for myself, and because I started from zero, it took almost a full year for me to get up to speed enough to work at a professional level. In this regard I was very lucky to have been hired in the first place! I am not confident I would be able to get a job today, had I the same resume I started out with them.
Going into the professional world without these skills was a waste of both my time, and my employer's time. Time is the most valuable resource in the world - it's the only thing we're not getting any more of - so I want to help others not waste as much time as I did.
Why Don't We Teach Developer Skills?
So if these skills are so important, why aren't they being taught in the classroom?
I don't think it's the school's fault, at least not insofar as they're working within their established system. It's the system itself that's to blame. Developer skills aren't really something that you can be graded on. They're not about what you produce - they're about how you organize what you produce. How you work with other people when producing. Furthermore, developer skills all work towards the implicit assumption that the thing we're producing will be used, and will have longevity - the skills are there to help maintain the software we're building for the long term.
Your average student has no reason to set up a Dev, QA and Prod branch for his assignment, since the assignment isn't actually live anywhere. The student doesn't have much of a reason to set up version control either - usually he's working by himself, and he tends to do solo work even if he's on a team. School teams are nothing like real teams, after all - in real life, you will generally be fired if you don't pull your weight. In school, you'll generally get an easy A.
I will say that some of the skills I'll be writing about were attempted to be taught in college, but those are the exceptions that prove the rule - they weren't taught effectively (I certainly didn't absorb them) and either way, the subset that were in fact taught were only taught in a single class, that was expressly dedicated to providing these skills. Seeing as these developer skills are only useful in the context of real work, the lessons simply didn't take. I and many of my classmates remembered that as one of the worst classes in our entire degree program.
I hope that I've now established what developer skills are, why they're important, and why you're not likely to learn them in school. My recommendation - and this is why I'm writing these posts - is that you make some time each week to teach yourself one of these skills. They're not terribly hard - most can probably be picked up in a week. But it's your responsibility to learn them. If you learn all seven, I believe that it will highly benefit you, will help you get a job (these skills are all great resume items) and will make you a better worker once you are hired.
That's the end of the introduction. The next post will be the first skill - version control.