Recently there has been a lot of discussion about the need for ethics courses as part of Computer Science / Software Engineering (or really, any form of engineering) degrees for obvious reasons. While I don't dispute the need for such courses (and indeed, I firmly applaud and welcome the introduction of these as integral parts of the curriculum) experience suggests that we do need to think about how we're presenting such material to students.
Specifically, I have doubts about whether the standard model of "let's just include a course in there to tick that requirement off" is actually the most effective way of doing it. Examples of such courses include "Programming in Matlab", "Ethics", "Security", and to a lesser degree, parts of HCI/Usability/UX. Many of these also carry a bit of added baggage in that they are often designated as "required" courses for a particular degree (more on this later).
From personal experience (and from observing students over many years), topics like this cannot be easily "
compartmentalised" into a "tidy little thing that you think about separately from other things". That is, you can't really say, "Here is the body of knowledge you need to know. Memorise it, and pull it out of a hat when you need it". Instead, true understanding and mastery of such material is actually only achieved by adopting the "
fundamental mindset" involved. For example, a few crude examples of fundamental mindsets for the aforementioned fields are:
*
Security -
Trust no inputs - Treat everything that the "user" inputted as being potentially compromised, and a potential attempted attack.
-
Alternative mindset:
How can I hack/crack this?
*
Ethics -
How could this go wrong in the worst case? Who could get hurt/harmed, how bad would that be, and are there better alternatives that won't cause anyone that sort of trouble?
-
Alternative Summary 1:
Don't be a jerk
-
Alternative Summary 2:
Would you subject yourself and your loved ones to this? Your mother? Your children/future-children/grandkids/great-grandkids?
*
Usability -
Humans are clumsy and stupid
creatures of habit (with limited memories, limited attention spans,
limited physical capabilities, and a whole bunch of other handicaps).
The problem therefore becomes - how do we try to reduce confusion
and/or the potential for things to go wrong so that the bumbling apes
can still get their jobs done.
-
Alternative Summary: Could I still use this thing when drunk, sick, injured, all of the above, and I couldn't look up the code/docs to check what's going on?
*
Programming -
Computers are idiots - They can perform complex operations, lots of them, very very fast. But, you have to precisely tell that what to do, when to do it, and how to do it first.
However, you can only adopt/absorb a fundamental mindset if you spend time developing a new a set of skills and/or adopt new ways of thinking about problems.