Advances in parallel computing mean Internet traffic can be monitored in real time and illicit activity automatically detected. Single-chip autonomous motes with wireless communications and environmental sensors can be scattered in a natural or medical environment. Routine sequencing of individual’s genetic code will soon be commercially viable and will require new software applications to support it. How are software engineers to understand the social and ethical challenges of such advances?
In the last 15 years, the environment and practice of software engineering has changed radically. Commercial applications are mostly Web-based, often globally accessible and subject to emergent and unexpected effects arising from their use on a global scale. Not only are the products different, but the practice is different. Agile methods dominate. Rapid systems delivery and continuous contact with the client is expected. Software engineers have to engage with increasingly complex social and ethical environments.
And yet, currently, the only support we can offer the software engineer is a code of ethics, which is 15 years old, parochial in its scope, and often obvious in its content. It recommends behavior such as having good documentation, rejecting bribery, and refraining from the use of illegal software. Its orientation is primarily negative and deals with injunctions that most practitioners would subscribe to anyhow.1
The developing nature of software engineering requires not a revision of an ailing code but a revolution in ethical thinking that acknowledges the purpose and practice of software engineering. Computer systems are designed and implemented to support human purposeful activity. Whether the software is concerned with student enrollment, customer relationship management, or hospital administration, its success lies in the extent to which it enables others to engage in activities directed toward a goal. The software engineer is a service provider, supporting the processes and activities that result in human flourishing.
Hence the moral behavior underpinning the practice of software engineering requires, firstly, an ethics of service, focusing on the relationship with the client, the client’s employees and customers. Secondly, the software engineer must be concerned about the ethics of the client. The closer relationship of IT with the client and the user demands a more active involvement with the ethical environment within which the software operates.
A service-oriented, client-oriented software engineering ethics requires outward-looking engagement with complex social and moral climates. How is this to be achieved when the comfort and certainty of codes cannot be relied upon? What is the alternative and how can software engineers become reflective practitioners?
Service Ethics
A service-oriented ethics will focus on relationships and the complex network of social interactions that is the social context of the software. How does the outsourcer relate to the client? Who are the ultimate users of the software? How do those users relate to others involved in the purposeful activity that is supported by the software? A customer relationship management system, for example, serves the purposeful activity of the managers, service staff, and customers of a business. Ethical issues may arise from the complex social environment, the culture, the business practice, and the customer expectations. This social complexity will defeat any code of conduct. We cannot engage in ethics at arms length, nor conduct relationships by remembering reams of rules.
A service-oriented ethics is a matter of character not codes. We develop character through practice that enables us to reflect on complex development environments and sensitively identify and tackle most ethical issues that arise. Character is expressed in virtues such as courage, patience, honesty, and empathy. For example, patience is developed through practice in a situation where communication with the client is slow and time is needed to understand what the client wants. Courage is developed through standing up to unreasonable demands, and raising uncomfortable issues about how software will affect users. The virtue of honesty must be practiced so that we do not overpromise and are transparent about the limitations of the systems we build. The characteristic of humility will help the software engineer to listen sensitively to the client but not assume the client knows better.
But whether we, as software engineers, are prepared to engage in character development rather than rule adherence will depend on our own motivation. We must reflect on our own goals. What is driving us? What meaning do we apply to the work we do? Is our work just driven by a focus on the technology we use? Are we just concerned with earning money?
If we are driven by external goods in terms of financial rewards or technical advancement, there may be little motivation to engage with ethical concerns. But a shift toward internal rewards may encourage us to reflect on our goals in our professional life. An emphasis on internal rewards will come from looking outward and considering our connection with community—local and global—and finding fulfillment in our contribution to human flourishing.
Domain Ethics
At the heart of a service ethics is the development of empathy—the virtue of putting ourselves in other’s shoes, of learning about their environment and concerns. This requires immersion in the client’s world, and seeing ourselves not as technicians, but as servants of human purposeful activity developing an ethics-in-use. To do this we must understand the moral climate of the client: the ethical issues involved in the practice of medicine, of nursing, of computer gaming, of accountancy, of energy provision. We cannot assume our own professional codes of conduct are adequate or even relevant to the areas we are serving.
The software needs to support the moral environment within which the client works, not the moral climate of the software engineer. The value and benefits of the software are obtained when it is used in the client’s environment. That is not to say we do not question the ethical framework of the client, or offer suggestions for improvement. But how can we comment on something we have not engaged with or understood? Although some of the ethical situations faced by our clients will be foreign to us, this does not mean we should not pursue an understanding of our client’s predicaments that will enable us to deliver more ethically sensitive and appropriate software.
Having understood the issues in the domain of practice, does the software engineer learn another code of conduct or retreat to his own better-rehearsed software engineering code of conduct? Attempts to apply the client’s domain’s code of ethics may require an immersion in a culture and practice that is impracticable for the software engineering.
How can software engineers become reflective practitioners?
However, both software engineers and their clients develop characteristic virtues through practice that influence and inform their decision making when faced with ethical choices. Fundamental virtues such as patience, kindness, compassion, and empathy are common to all areas of human practice. That is not to say that new virtues, relevant to the client’s practice, will not be recognized and applied as we learn about the client.
So the development of our own moral characteristics through the learning and practice of virtues will grow closer connections with the client and their activity. And combined with a knowledge of the ethical difficulties encountered by the client will help us to sympathize with the client and at the least avoid writing crass moral assumptions into our software that are culturally foreign and morally jarring.
The Way Forward
So how are we to do this? The danger is we replace a catalogue of rules with a catalogue of virtues. An understanding of the idea of virtues, the importance of character and the relation to actions is important. Studying the virtue of courage will help us identify when courage is needed, when we need to overcome fear and selfish concerns to stand up for a client, to point out an ethical malfunction, or to whistle-blow. It will also enable us to understand the boundaries, to tell the difference between considered courage and rash foolishness. A skills-based approach such as that advocated by Huff et al.2,3 is helpful, but we do not want to descend into debates about hierarchies of virtues or taxonomic exercises. We must look inward, outward, and all around.
Inward reflection on who we are, what our drives us, what we consider important, will help us become aware of the social and ethical assumptions we make and take for granted. What we consider good and bad behavior will affect how we respond to social situations and ethical dilemmas.
Outward engagement with the world in which the software acts will help the software engineer develop empathy and a feeling for the ethical climate in which the software runs. Familiarity with the technical issues associated with the field of application is extended to the ethical issues. Outward engagement will involve searching for examples of good practice, involvement with mentors and others who model virtues, and creating narratives about the service we engage in and the purposeful activity we support.
We must understand the nature of the domains we engage with and the facts concerning the ethical problems associated with them.
All-around vision will involve learning to connect with issues that matter to people. The software engineer who spends all his time buried in Python manuals and playing Call of Duty 4 is hardly likely to develop wisdom and ethical understanding. Software engineers should be encouraged to connect with the wider world. Reading the literature of the great religions, modern and ancient authors, engaging in political debate, reading about advances in science and global problems will help develop all-around vision.
A set of static rules should be replaced by a dynamic process. Starting by learning about the ethical problems and difficulties the client faces, we move on to consider what character traits, what virtues would be important in this domain. We can then look for examples and stories of expressions of those virtues in that domain or others. An emphasis on narratives will lead us to ask what would a virtuous person do?
We can then reflect on the implications for software engineering and improve the design of the product and the delivery of the service accordingly. Such a process enables us to practice, learn from that practice, and grow in wisdom.
Conclusion
The software engineer who considers himself only a technician, who rejects social and ethical engagement, claiming "it’s a matter for lawyers and doctors" is a destructive force and a burden on the client. We should consider software engineering as a communicative art where engagement with the client is at its heart and an understanding of the tasks, goals, and moral concerns of the client leads to the development of software that is appropriate to the client’s needs.
But we cannot expect a written code to be the prime motivator of professional moral character any more than a written constitution guarantees good government. Indeed the written code of ethics may lead to complacency, ignorance, and the neglecting of moral reflection. Codes of ethics can provide a smokescreen for deserting personal responsibility.
Hence we must understand the nature of the domains we engage with and the facts concerning ethical problems associated with them. And we must develop virtues that will help us to use our understanding of the application domain in making ethical decisions. The nature of the domains we engage in will change, but the human characteristics we need such as empathy, patience, honesty, compassion will not change.
Rules can be learned and forgotten quickly, becoming a virtuous software engineer takes time and practice. Wisdom develops over a lifetime.
Join the Discussion (0)
Become a Member or Sign In to Post a Comment