If you are in the IT industry, you have seen these job titles and terms used by companies to refer to the person who engages in software creation, especially in the first role of a fresh hire or a novice engineer.
While they broadly refer to the same set of roles and responsibilities, I think they do refer to varying expectations about the results produced by the individual. They also pose a serious question: are we clear and consistent about what we need from these individuals? An equally serious question is: are these individuals skilled enough to meet these needs?
Let’s list down a few of these and see what they mean, literally. Some of these are official titles, and others are unofficial references:
- Software Engineer: Someone who engages in ‘engineering’ software. Wikipedia defines engineering as “the practice of using natural science, mathematics, and the engineering design process to solve technical problems, increase efficiency and productivity, and improve systems.” Thus, a Software Engineer is expected to apply science and software engineering processes to solve problems and produce software.
- Software Design Engineer: Using the above definition, a Software Design Engineer can be considered as an individual who applies engineering skills to produce the design of the software. This implicitly includes the implementation of that design as well but keeps a strong focus on the design of the software.
- Software Developer: This refers to someone who ‘develops’ the software, which is different from engineering the software. Among many meanings of the word ‘develop’, the one most appropriate here is to ‘invent, bring something new into existence’ (Cambridge Dictionary) – a software developer is expected to create new software in some (unspecified) way. Note that this is different from engineering which specifies the process of creation as well.
- Coder: This refers to someone who codes. Practically, code and program are used synonymously in IT. However, in a literal meaning, code means to encode something – in this case, encode an idea, or a design into a code that the computer understands.
- Programmer: The difference between programming and coding is that programming includes the planning and other activities required to do the coding. A crude analogy will be building a wall, vs. laying bricks.
You will also find a large number of specialized titles where Software has been replaced with a specific technology or product that this individual is supposed to work (and probably has experience in). For example, Python developer, web developer, Front-end developer, etc.
So what skills are required to justify each of these titles?
Again, we can decipher them from their names:
- Coding: This requires the ability to write code in one or more programming languages. Note that writing means writing correct code, thus including troubleshooting activities as well. Usually, this is something a student can learn after their first year of CS/Engineering education. Introduction to XX (insert your favorite programming language) is the typical semester-long course that suffices.
- Programming: Usually taught through courses like algorithms and data structures, this requires the ability to plan various aspects of coding – data structures, efficient algorithms, memory management, etc. and experience in computational problem-solving. Usually, students learn this by the time their second year ends.
- Developing: This requires taking a large or complex problem and solving it by creating software for it. This requires designing, developing, and deploying the solution, usually by decomposing the large problems into smaller ones, whose solutions can be programmed. Getting exposed to software that solves complex problems (operating systems, compilers, open source software, etc.) and experiencing such problem-solving first-hand are the ways to achieve this skill. This is where most students struggle, ideally, they should achieve this level by the time the third year ends.
- Engineering: This requires learning specialized skills for problem-solving and specific design processes relevant to software engineering. The students also need to do abstract thinking, leverage knowledge from multiple disciplines, and develop their procedures and processes to achieve predictability and consistency in their software development activities. This is also where most students struggle, ideally, they should achieve this level by the time they graduate after completing four years.
The first two in this list (Coding and Programming) are pure technical skills and can be used in multiple contexts. People trained in these and who gain deep hands-on experience (through internship, apprenticeship, and work experience) will become experts at specific practices and techniques that make them productive when they code or program. In engineering parlance, they will become good technicians.
The last two in the list (Developing and Engineering) are higher-order skills that are acquired once proficiency in technical skills is gained. These equip the students to solve ambiguous problems and provide long-term solutions. They are the actual engineers because they craft and engineer a solution given a vague problem definition.
The reality of engineering colleges in India is that they are not producing engineers; the students fail to acquire those higher-order skills in their last two years of college. They do a better job of producing technicians. However, these technicians are novices since they do not get enough hands-on experience during college and so need to be trained and given experience after college.
Since the students graduate from a four-year degree program, they claim to be engineers, look for jobs that have engineering in their title, and then feel miserable when they get offered the salary of a technician.
The way IT has been hyped up in India as a dream job for most youngsters, a technician role or salary makes them (and the society around them) upset. This also makes them deprioritize looking for entry-level jobs at small companies (which require technicians most of the time) and lose the opportunity to become a good technician and set themselves on the path to becoming a good engineer.
I think there is something to the name. A degree name serves as an important signal of expected skill level, hence a degree that inflates the true skill level of a student does immense harm to the student as well as the talent ecosystem.
Being a software technician or a programmer is a good skill to acquire, and globally some courses acknowledge this difference and focus on them (see Ontario College diploma in Computer Programming, or Waterloo diploma for Software Engineering Technician). However, in India, a four-year engineering degree is so widely available that even a similar diploma course (CDAC PG Diploma In Advanced Computing) requires a graduate engineering degree.
As the Ministry of Education defined and rolled out multiple entries and exits in undergraduate programs, there is hope that we can see an emergence of focus on skill-based programs and students opting to acquire skills, as opposed to degrees.
If you are a student in one of these colleges, review how you are prioritizing your skill acquisition and manage the rest of your time in the college judiciously. If you are the parent of such a student, definitely have a conversation with your ward about this!
Leave a Reply