I recently got into a very interesting discussion with a new coworker whom just got hired at my company, and before that, graduated with a computer science degree from a local university.
We sit next to each other, so we often chat about anything that pops into our brains.
Out of the blue, she said something to the effect that her computer science degree hasn’t prepared her for the realities of working as a professional software developer outside of the academic environment.
Her comment really piqued my interest about computer science in general. A lot of software developers graduate with a formal bachelor of science degree in computer science to kick start their IT careers.
But many do not.
Programming software for a living was the furthest thing from my mind in college, when I was awarded my bachelor of arts degree in English Literature. I had my career aspirations set to something in Journalism or the field of copywriting.
Yet like the old saying goes, life often takes you in directions you never expected.
In the back of my mind, I always wondered if my career would have been any different, had I chosen an actual computer science degree in college.
As my coworker and I continued our discussion, I started asking what kind of things did he computer science degree not prepare her for.
In effect, her answer revolved around “practically everything”, which genuinely surprised me.
When I prodded her for more information, my coworker basically concluded that even in this day & age, the computer science curriculum has many gaps that leave graduating students with missing skills and knowledge that a software developer needs to possess, in order to succeed in today’s work environment.
I continued probing deeper into what specifically she felt those gaps were, and discovered three general categories.
- The technology stack
- Development methodologies
- Soft skills
I began by asking my coworker exactly what kind of programming languages and technical topics she was required to take for her degree.
For starters, my coworker said she had to learn C and C++, and assembly language.
I was truly surprised by this answer.
There’s absolutely nothing wrong with C and C++. I’ve blogged about these computer programming languages in the past, and they definitely deserve their place in computer science as important cornerstones for modern software development.
But that being said, those languages are getting positively ANCIENT. The C programming language was invented back in 1972 (which just so happens to be the same age as myself, so it MUST be ancient!)
I often state that technology moves at a breakneck pace. So in terms of computer years, a programming language like C that came out in the early 1970s is positively JURASSIC!
There’s been a lot of water under the bridge in the programming technology scene, since C came out.
A lot of new programming paradigms and concepts have come out since then, which the C language itself would simply find it impossible to accommodate.
For starters, the concept of object oriented programming is absolutely impossible to implement out of the box, by programming in C.
Object oriented programming, in a nutshell, is combining and encapsulating data structures and the code to use those structures, in a self contained container of code called an “object”.
However, the standard C language has no concept of objects. The closest you can get to object oriented programming in C is by creating SEPARATE data structures and functions that act on each other.
C++ came out after C, as part of the first generation computer programming languages that supported the concept of object oriented programming.
However, in my humble opinion, C++ is not the easiest programming language with which to learn object oriented programming. I find the specific syntax and general readability of C++ code very challenging.
My coworker also mentioned being required to learn assembly language, as part of her required CS degree curriculum.
Assembly language syntax is incredibly hard to read and understand. You are barely just one step above needing to communicate with a computer in its native “tongue”, which is binary language.
Binary language, consists of exactly TWO entities.
1 and 0.
Binary computer language is basically giant strings of 1s and 0s. To this day, every computer and electronic device on the planet requires the binary language to do its job.
The very concept of computer programming languages came about, because we puny humans don’t think in terms of 1s and 0s. The very earliest computers in the 20th century could ONLY be programmed in binary language, which meant the human programmers in charge of those machines had to program in 1s and 0s as well!
It didn’t take long for those same human programmers to conclude it wasn’t fun to have to communicate with computers at the binary language level.
So assembly language came about to make it a LITTLE easier for human programmers to write computer code.
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
msg db ‘Hello, world!’,0xa ;our dear string
len equ $ – msg
A little better, right? But you still needed to be intimately familiar at a very low level on how computer processed information.
Over time, newer computer languages came about that more resembled human languages and words, which we humans find much easier to understand and process. With the magic of COMPILERS, they translate human readable computer code back down to the native binary language of computers.
It’s simply not necessary in today’s world for most computer programmers to ever require programming at such a low level like assembly language. We have the luxury of modern computer languages and compilers that make writing code much much easier to comprehend.
So the fact that she was still required to understand assembly language for her degree was quite puzzling to me.
Don’t get me wrong. Understanding how a computer processes digital information at such a low level isn’t wasted knowledge.
I’m not a car mechanic. I really only know a few basic vehicle maintenance concepts like changing a tire and the oil for my engine.
But if my “Check Engine” light suddenly flickered on my car dashboard, I wouldn’t have the first clue as to how to diagnose and fix the problem. I would need to go to my nearest car dealership service center and PAY for them to figure out what’s gone wrong and more importantly, to FIX it.
As anyone can attest, the biggest expense in a car repair bill isn’t the actual replacement parts that may be needed to fix the problem. You can rest assured that whatever car parts that are needed, have a healthy profit margin markup.
But the BIGGEST expense is the human labor required to fix your car problem. You are paying for someone else’s expertise and time and effort.
In a similar way, having the low level knowhow and expertise on how a computer operates at the lowest level of assembly language could help enhance a software developer’s knowledge of debugging computer programs.
But that said, our modern compiler tools pack enough powerful features that it’s usually not necessary to dip down at the assembly language level to fix issues.
I’ve personally NEVER had the need to ever debug a computer program at such a low level. My compiler has more than enough debugging and diagnostic tools to find and fix pretty much any kind of software bug.
From a development methodology perspective, I asked my coworker if she was required to learn about any sort of modern software development methodologies.
It’s pretty much a given that any company or organization these days absolutely requires a software developer to have experience in the Agile and/or Scrum development methodologies.
In a nutshell, agile development methodology revolves around the concept of iterative software development … building software a little at a time, and showing and demonstrating the partial functionality to the business customer and stakeholders.
Before agile development, software was built around waterfall development methodology. It required a complete project spec and requirements before a single line of code could be written.
Agile came about to address shortcomings in waterfall methodology, specifically the ability to make successful project course corrections when software project requirements changed, which waterfall development has difficulty dealing with.
My coworker told me that she wasn’t aware of any required courses or even optional electives that taught the concept of agile or scrum. She pretty much had to learn on the job.
The last concept which she confirmed was missing in any of her courses and assignments was the practice of soft skills.
I define soft skills as any sort of non technical skill that a software development needs to possess to be successful on a software development team.
The ability to work in a team environment. The ability to work with other coworkers. To work successful with management. To be able to make successful product demos and presentations. To show leadership skills.
Soft skills are just as important, if not MORE important than the technical skills. They get you noticed. And getting noticed and recognized for your efforts, is absolutely crucial if your desire is to move up in rank within an organization.
In conclusion, my coworker basically admitted that it was on the job experience that helped her fill these gaps that her computer science curriculum didn’t cover.
I hope that higher education institutions will eventually recognize these gaps. I have a suspicion they already are well aware of this problem, from a financial perspective, with the rise and popularity of coding bootcamps.
These bootcamps seems to be much more up to date and offer a very condensed and intensive program of getting a person more up to speed with today’s latest technical stacks and methodologies. Some bootcamps even offer guarantees for job placement after successfully completing their course, or give a money back refund!
Like the Bob Dylan song goes, the times, they are a changing…