An Examination of the Computer Programming Industry

Philosophy of Language - December 2004

It is a constant fascination of my mine to relate my love of philosophy with the other love of my life, computer science. I have had the opportunity to receive advanced education on both of these fields. In philosophy, Ludwig Wittgenstein is, without a doubt, one of my favorite philosophers. His early and late works manifest a genius that is one of a kind. His late work in the Philosophical Investigations, which shifted him from logical atomism to pragmatism, is of great interest to me. In this paper, I would like to examine the parallelism in the contextualism found in his late work and the contextualism found in computer languages. An important question that will emerge here is whether a computer language can have meaning apart from context and usage. If context and usage is critical in a computer language, another question will be how there can be universal concepts in computer programming amidst the contextualism.

In the Philosophical Investigations, Wittgenstein works to rebut his earlier insistence that words should strictly correspond to factual states of affairs. Wittgenstein argues that logical atomism is not the correct model to view language. He proposes what he calls “language games”. Language was to be seen as a game in which understanding and coherency are determined according to how a game is played. The meaning of words and propositions is not some grand, inherent feature of the world. Meaning for Wittgenstein is now usage and context. Take for example the statement “Bjarne Stoustrup did an amazing thing when he created the C++ language.” Even though the word “amazing” here might have some vagueness in it, if this statement was spoken in a computer programming conference, every listener will understand exactly what the statement means. After hearing me say this, a listener would not push me to define what I mean by amazing. Within the language game of computer programming, there is an understanding that C++ is one of the most powerful programming languages in the history of computer science. The word “amazing” can indeed be very vague if used outside of context. If I yelled out “Amazing!” in front of strangers, they would be dumbfounded as to what I mean by this statement. Within a language game, however, meaning is made evident. For Wittgenstein, vagueness of a word is perfectly acceptable because context and usage within a language game elucidates the point of a sentence.

Notice the grand contrast of this latter position to Wittgenstein’s earlier logical atomism. In the Philosophical Investigations, Wittgenstein threw away the confining nature of linguistic reduction. Now the bounds of language are only found in its context and usage. This pragmatic push provides the advantage of opening up rational communication to all sorts of discourse. It gives meaning and understanding a much greater scope. In this venue, people can talk freely with some vagueness as long as the words are put into a context that elucidates the person’s ideas. This expanded linguistic scope extends to physics, chemistry, biology, psychology, religion, and so many other discourses. This expanded scope of discourse is a significant advantage found in Wittgenstein’s later work and is completely missing from his earlier work.

Given this background of Wittgenstein’s later pragmatic work, we can now examine the parallelism found in the area of computer programming languages. To begin, let us examine the following line of code:


person.setName("Kogler");

If nothing more is given to the programmer after this one line of code, no amount of experience will allow the programmer to understand what is happening in this case. The code is completely vague. The computer programmer will not even be able to tell you with certainty what programming language was used to write this line of code. The poignancy of contextualism is very evident here. If I tell the programmer that I used the C# language to write this line of code, I now have this interest. If he is skilled in the C# language, he will know that person is not a meaningful word in that language. Therefore, it must be a custom-made object. If he understands the concept of object-oriented programming, he will realize that the dot (.) after person indicates that person is an object derived from a parent class. His experience in the language will also allow him to figure out that setName is a method found in the parent class, and “Kogler” is the parameter passed to that method. Notice how much knowledge was realize with just the background of what language was used and how object-oriented programming works. At this point, I can now tell the programmer to take the code above and turn it into an object-oriented program that sets the name of the person object to “Kogler” and outputs that name in the screen. The programmer should come up with something similar to the code below.


private void Page_Load(object sender, System.EventArgs e)
{
	Person person = new Person();
	person.setName("Kogler");
			
	Response.Write(person.getName() + " is an excellent professor!");
}

public class Person
{
	private String strName;

	public void setName(String strNamePassed)
	{
		strName = strNamePassed;
	}

	public String getName()
	{
		return strName;
	}
}

Once compiled and executed, the program above will output “Kogler is an excellent professor!” It cannot be stressed enough how important context and usage is in computer programming. Snippets of code not placed in context are meaningless even to the most seasoned programmers. The parallelism here with Wittgenstein’s late work is evident.

An important question that needs to be asked at this point is how there can be universal propositions if meaning is solely derived from context and usage. If computer programming code is meaningless outside of context, then how can there be concepts in this field that are just taken as Gospel truth? In other words, how can universal statements be reconciled with contextualism?

Notice in the program above that the C# language has its own way of creating a class and instantiating that class into the person object. Within this language game, programmers refer to this method as “object instantiation”. Object instantiation happens when a program takes on the methods and properties of a class. In the code above, the Person class was instantiated inside the Page_Load event. The code above is a good example of instantiation, but the way instantiation takes place is different from language to language. For example, the code below does exactly what the code above does, except the one below I wrote using a language called VB.NET.


Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
	Handles MyBase.Load
	
	Dim person As New Person
	person.setName("Kogler")

	Response.Write(person.getName() & " is an excellent professor!")
End Sub

Public Class Person
	Dim strName As String

	Public Sub setName(ByVal strNamePassed As String)
		strName = strNamePassed
	End Sub

	Public Function getName() As String
		Return strName
	End Function
End Class

What a difference! The syntaxes used to create the program differ greatly from each other. The difference is large enough that C# and VB.NET may just be considered almost two separate language games. There are those who believe that C# is the superior language, and there are those who believe otherwise. As an example, as the chief computer programmer of our company, I recently made the case for the company to choose C# over VB.NET.

Now given these two differing language games, how can universal concepts develop? Notice that even though object instantiation was implemented differently in each language, there is still a common denominator in this case – namely object instantiation itself! The concept of instantiation pervades through the walls dividing C# disciples from VB.NET disciples. People from both sides do agree that creating classes and instantiating those classes in a program is good programming style. The use of instantiation in object-oriented programming is now very much accepted as Gospel truth in the programming world. How is this possible given the differing context within each language game?

Very simply, a commonality is found between the two camps. C# and VB.NET programmers quibble about syntax. Nevertheless, a shared goal is found between these groups of people. This shared goal is a very general one. The goal is to constantly find ways to improve the quality of life of people. The goal may sound corny, but this really is the entire motive of the computer programming industry. Computer programmers don't write software just to be cool. They do it to allow businesses, universities, churches, and other organizations to run more efficiently. Programmers are constantly looking for ways to design better programs so that the people those programs serve may receive bigger and greater benefits. I, for example, have persuaded my company to adopt C# as our main programming language. My motive behind this is the belief that C# will allow me and the other programmers to produce for our customers applications that are more powerful and more scalable. Continuing with the language game example above, this motive to improve the quality of life of people is shared by those in the C# language game and those in the VB.NET language game. This is the reason why both camps take object instantiation and object-oriented programming as Gospel truth. There is a general agreement in the computer programming field that the object-oriented style of programming is the most efficient and the most scalable style. Except for a few “heretics”, object-oriented programming is universally accepted in the field. This style is considered a “cross-cultural truth” in the midst of the different types of cultures found in the programming field.

In summary, this paper has examined the parallelism between Ludwig Wittgenstein's later work and computer languages. We have seen that in human languages and in computer languages, context and usage are the determinants of meaningfulness. Without context, yelling out “Amazing!” to strangers or writing person.setName("Kogler"); in a computer are void of meaning. Furthermore, I explained here how “truths” that transcend language game barriers can exist. In the discussion of computer programming, I have argued that programmers are motivated by the goal to improve the quality of life of other people. This motivation gives birth to styles of programming that are embraced as universal truths.


View the code to this page


Contact My Company