Computer Science

Creativity, Computer Science, and God

Mar. 06, 2017

Recently, a shepherd from my congregation challenged me with the following question:

“As a creative person, how does God’s work as creator inform your theology?”

As an academic trained in the field of computer science (CS), I was initially surprised (and flattered) to be considered a creative professional. Typically computer science is seen as an analytical field focusing on abstract mathematical theory and technical software development issues. Creativity, however, is definitely an essential component of computer science in general and software design specifically. Great algorithm design and elegant implementation are both results of joyful creativity.

complex code listing

Fred Brooks, a pioneer in CS and winner of the field’s highest award, the Turing Award, explained the allure of programming in terms of creative outlet. “As the child delights in his mud pie, so the adult enjoys building things, especially things of his own design” (The Mythical Man-Month). In fact, Brooks traced the source of this creative joy to a Divine Creator. “I think this delight must be an image of God’s delight in making things, a delight shown in the distinctness and newness of each leaf and each snowflake” (The Mythical Man-Month).

 

Norris’ Number and Its Implications

As I thought about how creativity exists within the context of CS, three characteristics in particular emerged. The first two are related to an interesting rule of thumb noted by Clift Norris, called Norris’ Number by colleague John D. Cook. This so-called fundamental constant is the average amount of code an untrained programmer can write before he hits a complexity wall. Norris estimates it to be about 1500 lines of code. According to this observation, a program beyond this size becomes so “tangled that the author cannot debug or modify it without herculean effort” (John D. Cook). 

 

Consequently, one of the primary concerns in software design and creation is the design of design. Professional developers aren’t just interested in writing code, but in writing code well, designing software systems that can be maintained and improved in the future. Meta-design (i.e., design of design) is a significant focus across the field of CS. This is seen in the efforts to build layers of abstraction that remove many of the low-level complexities from the mind of the designer and allow higher-level problems to be solved without “herculean effort.” Layered architectures are fundamental, for instance, in computer architecture and computer networks.

Lawrence Kesteloot, an experienced software engineer, has noted that Norris’ Numbers may exist at subsequent orders of magnitude beyond the initial 1500 lines of code (i.e., 20,000, 200,000, 2,000,000 lines of code) for more highly trained programmers. Kesteloot suggests that programmers reach a wall around each of these milestones that requires different meta-design approaches in order to progress. On his blog, he describes his experience working for DreamWorks in his first job out of college in the early 1990s.

“At DreamWorks we had 950 programs for animators to use, and a line count showed that the larger ones all hovered around 20,000 to 25,000 lines. Beyond that it was just too much effort to add features.”

Later in his career he developed a larger tool that was around 200,000 lines of code, and he notes that with a codebase of this size his team had to change their approach to programming to successfully deliver a product of this scale. At each of these successive complexity levels, the need for a new design paradigm arose.  

 

Vision and Decisions

Most interesting, though, is Kesteloot’s advice on what is required to move past the walls: “Breaking through these walls means making different trade-offs, and specifically it means making a decision that seems to make less sense in the short term but will help later.” The creative process in software development requires a vision for the future and often necessitates unintuitive choices for the short term. Creativity in large scale systems demands vision and unexpected design decisions. 

Like many people of faith, I’m often troubled by some of the design decisions of my Creator, but this insight from the field of computer science is comforting. If unintuitive choices are needed in software systems, certainly they will also be required in a system on the scale of our universe. I believe that He has the vision to skillfully make these counterintuitive choices. Having often been overwhelmed by the complexity of a software system, I am thankful for a Designer who can keep up with all the interrelated complexities of our world without hitting walls. 

 

What Every Programmer Needs

The last insight into creativity that I have taken from my experiences as a software developer relates to an essential personality trait that every programmer needs. This quality isn't related to technical prowess or mathematical ability. A critical characteristic that every successful programmer must have is tenacity.

Most of the time spent developing software isn't spent writing code, but debugging it. Rarely does software do exactly what we intended when we created it. Developers must tenaciously pursue solutions, pushing through frustration to finally discover the problem in their code and fix it. Software creatives will fail without a mental and emotional tenacity for finding solutions when it seems the program refuses to cooperate. Creativity in CS requires a relentless tenacity.

The Creator understands the frustration of having His creation refuse to act in the ways He intended. And He demonstrates His tenacity through a relentless grace. He tenaciously pursues us even when we’re behaving completely contrary to His designs for our lives. When I remember the hours of my life I have spent pouring over code trying to find the line of code that contains the error, I am reminded of His relentless pursuit of me and His loving patience with me (and my "bugs").