4+ 1 Thinking Skills for Competent
Software Engineers

https://www.google.com/imgres?imgurl=https%3A%2F%2Fi.imgur.com%2FS3cpvak.jpg&imgrefurl=https%3A%2F%2Fimgur.com%2Fgallery%2F21

A turning point in my teaching career

was the year 2003. By that time, I had established myself as an undergraduate teacher with 12 years of teaching experience and looking forward to improving my academic qualification with the PhD program.

I was attending the two-months-long preparatory programme at IIT-Bombay. The purpose of the program was to meet a prospective PhD guide and decide the broad area for research.

On one particular day, my PhD advisor, Prof. R K Joshi, asked me to join his class on Distributed Systems. He was teaching this course to undergraduate and post-graduate students. I attended the lecture with the enthusiasm of a newly recruited PhD candidate.

That was one of the most memorable lectures I attended because it shattered my age-old beliefs about classroom teaching. Up to that moment, I used to believe that students’ minds are empty vessels. As a teacher, I need to fill it with packets of information.

He was teaching the concept of Stub in Remote Procedure Call on that particular day. The programming element called Stub is responsible for handling communication between two remote programs. He was expecting the students to be able to implement the Stub.

He was continuously probing students with questions. His waiting posture with folded arms was intimidating to most of us. But, there was not a single moment of silence. His questions were leading to discussions and ultimately the solution he was expecting.

That lecture was the perfect example of how to engage students in critical thinking. It has also motivated me to reflect on the role of thinking to learn new concepts. The question: Are there any other kinds of thinking skills apart from critical thinking? have been intriguing to me forever.

The 4+1 Skills for a Competent Software Engineer

Over the last six years, I have been trying to shortlist a set of thinking skills essential to survive in this highly demanding software profession, which is driven by uncertain futuristic technologies.

Software Engineers form a major chunk (approx 6%) of the global workforce that influence our routine activities like shopping, watching movies, and selecting hotels for our favourite tourist spot. Hence, identifying such thinking skills is essential to have better applications for us.

My listing includes five skills namely (i) Computational Thinking, (ii) Probabilistic Thinking, (iii) Systemic Thinking, (iv) Ontological Thinking and Critical Thinking.

By taking inspiration from Phillipe Kruchten who specified The 4+1 View Model of Architecture to describe an information system, I would like to call these thinking skills by the name of The 4+1 Skills for Competent Software Engineers.

Here, the Critical Thinking skill is deliberately separated out to highlight its generic nature. I believe the other four skills are specialized skills most relevant to Software Engineers.

  1. Critical Thinking Critical thinking is a method of investigation involving the analysis of known information leading to a valid conclusion. Rigorous questioning is commonly used to engage oneself in critical thinking. It facilitates problem-solving and effective communication.
  2. Computational Thinking Computational thinking is a method to specify a computer-based solution to a problem. It involves identifying appropriate programming abstractions such as iteration, task decomposition, and data types to solve a problem. It is becoming as primitive thinking skills like literacy and numeracy.
  3. Ontological Thinking In the context of an information system, an ontology is a tool to manage knowledge. Ontology, in its broadest sense, provides a set of categories to classify observed phenomena in reality. These categories are useful to represent, relate and reason about many physical and social constructs. Ontological thinking develops insights about new knowledge by establishing associations with existing knowledge.
  4. Probabilistic Thinking Probabilistic thinking is about listing out various possibilities of events that may happen in future and associating them a degree of occurrences. This kind of thinking facilitates decision making, the reasoning for causality among events, diagnosing about system’s failure and analysing the impact of an event on a system. This kind of thinking is becoming an essential tool to build intelligent systems.
  5. Systemic Thinking Most modern information system involves a large number of components interconnected in a complex way. Part-Wise reasoning of such systems fails to grasp the emergent properties which occur through interactions between components. The systemic thinking is useful to describe such complex systems through multiple views.

It is not my claim that this list is complete, exhaustive, and unique backed by rigorous empirical research. Rather, it is my choice evolved through literature survey on thinking and effective teaching and self-validated against the professional growth of my students which I observed during my teaching career of about 30 years.

It is also true that a person possessing these thinking skills may be aware or unaware of its possession. Likewise, a teacher may intentionally or unintentionally cultivate these thinking skills among his/her students.

One good thing about these 4+1 skills is that they can be taught and learnt. A more effective teacher can cultivate these skills through highly stimulating discussion as observed in Prof. Joshi’s classroom. Moreover, a self-motivated learner can acquire these skills through extensive reading and purposefully aligning his/her thought process to one particular kind of thinking.

Arvind is a Professor of Computer Engineering in Dr. Babasaheb Ambedkar Technological University Lonere India.