Category Archives: Week 8

Coding and scaling


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Diving into Python with Code academy was a great complement to the Introduction to Computing by Evans. Having never really done any coding, except for formatting of early blogs, I was surprised to see how I could immediately draw connections between coding and my work.

As a Technology Change Management consultant, I frequently work with software developers who are building or modifying systems, engaging with them through scrum meetings where they talk about the time it will take to complete this feature or that. I assumed that getting a bit more insight into coding would help me better understand those meetings and the challenges they were facing. While this is certainly true, I also found the concepts around process, efficiency, and replication at scale to be very applicable to the tasks I complete.

One of my primary functions is to interview employees of my client about their work and draw out process maps for every aspect of their jobs. Some of these processes are very simple, almost perfectly linear with only one or two forks. However, some are very complex with multiple points requiring decision making by one or more parties before the process can continue forward. To date I have been looking for efficiencies and opportunities using just my intuition, trying to place myself in their shoes and think of the most efficient way to get the work done. While reading Evans Introduction, I realized that designers of computers and software fundamentally ask the same two questions I do of the problems they face:

How much information can it process?

How fast can it process?

I see that if I dive further into the concepts of computing and coding, learning what are the fundamental challenges with coding that can eat up time, I can apply these same concepts to processes of job functions. Instead of simply removing stages, I can rework them entirely to facilitate increased speed and volume of work. Additionally, the ideal of any of the processes I work on is the ability to scale them significantly while using the same number of human resources. The focus on designing for future scalability is also something that I could use coding training to develop.

Breaking the Technological Wall with Python


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Starting to learn python was interesting because it demonstrated how easy it is for users to become a part of technology. It also highlighted how users can easily rely on technology without learning how it works. This revelation goes beyond modern technology but is also applicable in other industries like fashion and farming. Part of this lack of interest in learning computing may be due to the historical definitions and roles of computers, as well as, a potential trend in technological development that distances people from the process. Prior to the technological development of computers, humans who performed a variety of mathematics to solve problems and were called computers. As the world advanced into World War II and the development of analog computers remained relatively stagnant, the “computing” role of humans became tangental to the final output. Prior to this, humans were almost solely relied on for the output of computing and expected to complete these processes manually. This distancing of human involvement can also clearly be seen in the industrial revolution for  both the fashion and farming industries.As technology advances, it seems that most people accept the distance between the input of raw materials and problems, and the output of clothing, food and solutions. History shows that this technological wall is permeable for those who are naturally curious and for those who are forced to break through the wall to improve their livelihoods. ( Campbell- Kelly, 2009)

Image result for industrial revolution

Image result for human computers

It is interesting to note that popular culture tends to focus on the process of an industry once problems become wide spread and impact many lives. Wings quote, “Computational thinking will be a reality when it is so integral to human endeavors it disappears as an explicit philosophy.”, is pertinent because it is a simple truth( Wing 2006). The command “print” is already somewhat universal, proving that the terminology used in computational thinking and language processing is not alien. Even the seven principles of computing, which at face value seem extremely complex are actually simple to understand, once a user becomes an active participant in the technological process. Similarly to Big Farming and Fast Fashion, computational thinking is already integrated into the lives of most Americans, and many people around the world. As these industries permeate everyday lives and issues like ethics in farming, sustainable fashion and privacy in technology become widespread, more and more people want to understand “how the sausage is made”. When people begin to dissect the industries operations, consumers begin to take back agency and can begin to facilitate change.

The phenomenon of the technological wall was really apparent to me as I was progressing through the Code Academy sessions, because it demonstrated that a lot of the perceived complexity of computing is simple.Becoming a participator in technology helps to reveal the smoke and mirrors of language processing and computational thinking, it also starts to turn the “magic” of technology into an accessible tool for change.

 

Martin Campbell-Kelly, “Origin of Computing.” Scientific American 301, no. 3 (September 2009): 62–69.

Jeannette Wing, “Computational Thinking.” Communications of the ACM 49, no. 3 (March 2006): 33–35.

Peter J. Denning and Craig H. Martell. Great Principles of Computing. Cambridge, MA: The MIT Press, 2015, chapters 4, 5, 6.

Computational Thinking as a Means to Connect with My Future Self


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

When I first learned to code, I felt a slight shift in the way I viewed the world. I began to break the big problems and projects in my life into minute, almost modular, tasks. The way in which I solved problems didn’t drastically change, but the attitude and approach I had in facing a problem was completely refreshed. Learning to program — which mostly involves breaking down a large task into a system of smaller tasks that amalgamate to accomplish a large goal — enlightened me to the fact that virtually any problem can be broken down in a similar manner.

This realization seems pretty elementary, but this new way of deconstructive thinking opened up an entirely new way for me to approach almost every aspect of my life. Suddenly, giant goals didn’t seem like insurmountable tasks, but rather algorithms that I had yet to deconstruct and program step-by-step. In a way, I was able to more easily picture desired results of my future thanks to the simple power of Boolean logic. For example, everyone knows that to achieve a desired outcome, you have to work to achieve it. But, with my brain beginning to adopt computational thinking patterns, I was able to use if-then patterns to connect with my future self.

Now, instead of just feeling hopeless or powerless in the face of a predetermined future, I had agency to do something about it. If I wanted to get back in cross country shape, then I needed to start training again. Perhaps, I’m being a bit hyperbolic in the degree to which adopting computational thinking patterns opened my eyes, but rather, I was really able to internalize and act on these realizations with the power of computational thinking. I knew all along that I had the ability to change my future and accomplish large goals, but computational thinking gave me the toolbox to do this efficiently. Computational thinking helped me to “de- black box” problems in my life and view them as modular, familiar components.

Week-8 Reading Response


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

“Understanding computing illuminates deep insights and questions into the nature of our minds, our culture, and our universe.”  –Davis Evans

To be honest, I was once one of those who think that computers are technical and lonely. When I was a kid, computers were already designed with fancy interfaces. Kids took all the procedures happens on computers for granted without asking why when you push this button, the game would begin. Its language—how we communicate with computers—is completely foreign to us. Now we know it is because of the beauty of black-boxing. “Computing thinking is using abstraction and decomposition when attacking a large complex task or designing a large complex system”. Wing highlights a lot the concept of abstraction which is actually omnipresent in our daily life. I am now learning Spanish and when I memorize conjugations (pic) of verbs, I am actually practicing my pattern recognition skills. When I try to make sentences, I am following a sequence of grammar commands. Every step I feel like I am analogizing some grammar principles from my mother language or English. It’s all about abstracting the pattern or models from those unfamiliar combinations of symbol.

Example of regular conjugation

Example of irregular conjugation

Learning a language can be the process of following procedures and decoding the arcane symbols. It seems to have nothing to do with computers, but it somehow reflects “abstraction”. Learning something new is about how we process information—how we interpret it, how we generalize it, how we analyze it, and how we conclude it. And computer science is exactly the study of information process. Clearly, computing thinking is a fundamental skill for everyone.

As for natural language, itself is imprecise and ambiguous. It requires learners to be familiar with many unstated assumptions like many verbs conjugate irregularly without a reason. For learners whose mother tongue is from a totally different language system, merely following the description of procedures step by step in grammar books is far from enough, even though authors tried their best to make it precise and detailed. Natural languages are just inherently ambiguous. That’s why we need a more reliable language to describe those procedures, which could be understood and shared by every human being without common sense and assumptions. Back to last class, we’ve learned that information is not entirely equal to abstract knowledge as we thought. It can be quantified. It is something we can measure as its primary unit is a bit and linked to a binary question. The algorithm is a mechanical way to eventually guarantee the process of dealing with information. Taking the Python course in Codecademy is much more interesting than I thought. It is a beginner-friendly language which is succinct and clear enough to imitate/analogize. Learning Python also brings me a sense of achievement for I am not feeling like a passive user of this everyday little black box but an active participant who could speak to the computer. The computer is neither magic nor complicated. It just happened really fast. And it is for everyone.

 

Wing points out that two main messages need to be sent to the audience, one of which said that one can major in computer science and do anything, even arts. This reminds me of a post-modern literature group—Oulipo, which means Ouvroir de Litterature Potentielle or workshop of potential literature, founded by writers, mathematicians, engineers, etc.. Simply put, that is what’s going to happen when a bunch of computing/math major students decide to write poems. But hopefully, it was not a disaster. It turned out to be an experimental practice in post-modern literature history and even raised a new possibility of future poem production. The biggest feature of this literature group lies in the application of mathematical constraints in poem production. Although poetry and mathematics often seem to be incompatible areas of study, the philosophy of Oulipo seeks to connect them. Oulipian believe some structure and type of form should be set before writing, like using the thoughts of modular arithmetic, combinatorics, graph theory, etc.. Here is a famous Oulipian constraint: N+7. This constraint is to replace each substantive noun in a text with the seventh one following it in a dictionary. I use The N+7 Machine to generate 15 different texts. The original source is my favorite quote from Huxley’s Brave New World: “But I don’t want comfort. I want God, I want poetry, I want real danger, I want freedom, I want goodness. I want sin.” And the results look super awesome:

Does it look like strings of “literature” code that follow certain patterns?

Oulipo uncovers the potentiality of literature, by setting constraints. It somehow underlies the philosophy of computing thinking. Or it’s sound to claim that computing thinking is naturally embedded in everything that relates to the human mind and culture.

Credits:

David Evans, Introduction to Computing: Explorations in Language, Logic, and Machines. Oct. 2011 edition.

Martin Campbell-Kelly, “Origin of Computing.” Scientific American 301, no. 3 (September 2009): 62–69.

Jeannette Wing, “Computational Thinking.” Communications of the ACM 49, no. 3 (March 2006): 33–35.

Computational thinking in Pantone


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

ZIJING LIU

CodeAcademy is friendly for someone like me who have no coding experience to get exposed to Python. Actually, I first started learning Python in the “guWeCode” coding studio in Georgetown. After successfully running the first program “Hello World!”, I was shocked. I mean, that’s it? I just typed in “print “Hello World!” ”. I thought programming would be far more complicated. Yet continue learning Python as well as computational thinking this week, I realized that this is what computer language should be. It ought to be direct and simple as it is. Computers are dull and boring; humans are clever and imaginative. We humans make computers exciting. (Wing, P.35) Computational thinking does not require us to think like a computer–computer knows nothing but executes human orders–instead, it requires us to think like a human, using abstraction to solve problems, which is a necessary capability that everyone from every field should qualify with.

Figure 1  simple programs I wrote with Python

Speaking of the implication of computational thinking in our daily life, the first thing comes to my mind is Pantone–the worldwide authoritative company known for researching and developing colors. We might think color is something we cannot quantify, which was true. The problems confuse people for decades lie in: How to convey the exact color? How to identify colors with slight differences that even human eyes cannot distinguish? Is there any universal standard of color? Pantone did it by applying computational thinking.

Figure 2  Pantone colors from a blue color I randomly chose

(Source: https://www.pantone.com/)

As we all know, all colors can be produced by three primary colors–red, green, blue. Each color is a unique combination of primary colors. Pantone “code” every color with unique symbols–each color can be represented by a combination of numbers and letters. Even if there is only a slight difference between two colors, their codes are different. The essence of computational thinking here is that Pantone abstracts non-figurative color to figurative symbols and builds a standard color system.

With the universal color standard system, we are capable of doing far more things than we were in the past. Each individual and institutions are able to create their own color, to brand, etc. For instance, Georgetown University used Pantone Color Standard to set up two official colors, Georgetown Blue (Pantone 282) and Gray (Pantone Cool Gray 10). Also, designers can customize and save particular colors more accurately in Photoshop and InDesign and other Adobe software, which really solves a lot of problems.

Figure 3 Georgetown colors (Source: https://visualidentity.georgetown.edu/colors)

Figure 4  A screenshot of InDesign: colors can be “coded”

References

Jeannette Wing, “Computational Thinking.” Communications of the ACM 49, no. 3 (March 2006): 33–35.

Peter J. Denning and Craig H. Martell. Great Principles of Computing. Cambridge, MA: The MIT Press, 2015, chapters 4, 5, 6.

David Evans, Introduction to Computing: Explorations in Language, Logic, and Machines. Oct. 2011 edition.

Weekly Writing for Week 8


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Banruo Xiao

Looking through the history of computing, I feel that each development follows with a human need at that time. The process of data input and output is just a way to transmit signals through the circuits and bytes and to spread the information to everyone who can access to it. Computer, in this case, is no more than a book. The only difference is we all can interactively make some changes.

GitHub is a really interesting website. On the one hand, it is a production of a programming language and computation. On the other hand, it is a platform bringing developers together to work on the code (open sources). The finalized work (the information in a representation of symbol sequence that everyone can read it) and the raw data (the details of the way developers transmitting the data) appear in the same page.

The website visitors can directly see the process of a complete project in the web-page. However, they can acquire the needed information because the design of the website leads them to the results through texts, graphics and a search bar. If the whole web-page is full of code without computation, even developers (the main target of GitHub) might hardly decode it. Therefore, computation has its unique significance which is helping users to understand the symbols first and then to satisfy their needs.

In addition to the idea, rewinding back to my experience of learning python, I somehow feel that a programming language is an interpreter helping me and the computer understand each other and solve problems together. The language is not something that human being can hardly understand. Instead, each line can be read clearly. By just adding some functions, such as “+” and “if…then…,” developers can let the computer run the computation and transmit the data into something appears on the interface we usually see. In other word, the significance of a programming language is to give computer an instruction leading to some result.

Although computation and programming languages have their uniqueness and shining point, in some sense, they are merely the tools, as same as matches and knifes, people utilize to satisfy their demand.

Natural Language and Programming Language


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Huazhi Qin

This week is my first time to learn a programming language, Python. The most impressive point to me is that it is not a technique with multiple special terms. Rather, it is actually a language that represents a new way of thinking and expression in modern life. Just as what Evans said, “understanding computing illuminates deep insights and questions into the nature of our minds, our cultures and our universe”.

Language acts as a communicative tool in our daily life. It helps us deliver interpretable information among people. When the computer becomes a part of our life, we have to learn how to communicate with computers. Thus, the programming language is generated to be read and written by humans to create programs that can be executed by computers.

During taking the Python tutorial lesson, I realized the many differences lying in natural languages and programming languages. According to Evans, natural languages are no longer applicable to a computer in terms of its complexity, ambiguity, irregularity, uneconomic, and limited means of abstraction.

First, programming languages should be absolutely explicit on “what”. Natural languages are ambiguous in many cases. One word could refer to two or more different meanings. For instance, a pronunciation “ta” in Chinese can represent three English nouns “he”, “she”, and “it”. However, every string (or words) in programming languages should only lead to one thing. The string “it” only refers to what you assign to it in the code.

Second, “how” should be described step by step. Because unlike human beings, computers act without basic “common sense” or any knowledge background. In other words, steps should be described one by one, in order to be processed by computers. In the tutorial, when my code does not run successfully, the reason usually roots in that something is “not defined”, which shows that one step was missing in my code.

Also, the programming language should be abstract and describe languages with small representations. According to Evans, natural languages have limited means of abstraction and always too complex and uneconomic.  Too many details will be brought into computation if using natural language. Lots of replacement can be seen in Python. For instance, I can use string “x” to represent a list of numbers. A “for” loop can stand for an action that replaces a particular string with each item in a list.

However, similarities can still be seen in natural languages and programming languages. As for natural language, users attach objects with sound patterns which generate meaning.  In computer science, a language is “a set of surface forms and meanings and a mapping between the surface forms and their associated meanings”. Both two kinds of languages help deliver meanings of users.

References

David Evans, Introduction to Computing: Explorations in Language, Logic, and Machines. Oct. 2011 edition.

week 8


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

As a person who had experience with R studio and Tableau in the past, it’s not so hard for me to pick up memories and do the Python practice. I can still experience the struggle of those who doesn’t have background of coding, because the computing/programming language is different from our everyday natural language. As Evans says,  “Computing changes how we think about problems and how we understand the world”. This reminds me of a joke that popular among computer science students: “how do you react to the following question? Go buy a watermelon, and if you see tomatoes, get two of them. CS people would come back with two watermelons.”

Despite the joke, I do think that computing language can simplify tasks in our lives. The computing language is the language that we as human can use to communicate with machines, and give them specific tasks to do. As human, it’s easier for us to give command instead of doing actual things. For example, those tasks can be performed more accurate than we do with our bare hands.

And that’s why we created the computing language. We can see the overlap of computing language and everyday language. For example, here in Python we used we input “message = ‘Hello’; which mirrored the action of what we think inside our brain, like the message you prepare to say; then we input “drawName(message);”, where the word “draw” has the same meaning with literally drawing on board or show the word in our everyday language.

Just as Wing illustrated in Computational Thinking article, “when your daughter goes to school in the morning, she puts in her backpack the things she needs for the day; that’s prefetching and caching. When your son loses his mittens, you suggest he retrace his steps; that’s backtracking.” Where we can see that computational thinking is developed from our everyday life, and computational thinking is implanted in our everyday life thinking system.

Work cited

David Evans, Introduction to Computing: Explorations in Language, Logic, and Machines. Oct. 2011 edition. CreateSpace Independent Publishing Platform; Creative Commons Open Access: http://computingbook.org/.

Jeannette Wing, “Computational Thinking.” Communications of the ACM 49, no. 3 (March 2006): 33–35.

Python and Coding Application


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Tianyi Zhao

The Python program on CodeAcademy and this week’s readings are a perfect couple. Albeit this is my first contact with program coding, the finely designed and elegantly concise interface of Python immediately raised my interest. As a challenge-taker and a practitioner who prefers to get acquaintance with coding without any theoretical basis, I started Python online program before the readings. The beginning was quite boring until the section of function, coding a cost calculator for traveling and dice rolling game. The two highlighting tasks fuse the program languages learned so far together, which deepen my understanding of the coding, especially after reading David Evan’s contribution.

Unlike natural languages we speak every day, languages utilized in programming computers should be simpler, unambiguous, regular, economical, and with powerful means of abstraction so that it can be read and written for human beings as well as executed by computers. (Evans, 37) Python is an interpreter featured in its instructiveness, built-in support for objects and imperative control structures. The first point that impressed me the most is the rule of “importing a module.” Only when the programmer does the generic import, Python knows the specific definition that is going to be utilized. For example, Python cannot work out “sqrt(25)” until “math” module is imported previously. These modules are a kind of built-in languages in Python, which makes Python easily coded and widely understood.

Figure 1. Before importing the “math” module

Figure 2. After importing the “math” module

Additionally, the conditional and control flow of Python, enabling our code to make decisions, are also interesting and practical. During the two tasks, “if” statements are used dominantly in single layer and multi-layers. There is no doubt that the application reflects the rigor and concision of Python by coding “if” “elif” and “else.” Ending with “return,” an execution of a procedure finishes. “Return” statement is Python’s unique way to decide the result of procedure application.

Figure 3. “If” and “return” statements in Trip Planning Task

Figure 4. Multi-layered “if” and “return” statements in Number Guess Game

Besides the specific programing languages acquired in Python, I figure out the computational thinking is as significant and creative as design thinking. Computational thinking involves in solving problems, designing system and understanding human’s behaviors. (Wing 33) So will it be employed in biomedical field so that we can decode our genes and re-encode them to build ourselves whom we would like to be or to prevent diseases? Wilfred Chen Group from University of Delaware has tapped into an emerging field called DNA computing. Similar to the binary in computer programming, there is a code in DNA comprising four components which determining the output—proteins. By designing “logic-gated” DNA circuits with the DNA code, the researchers aim to applicate the technology to deliver effective ant-cancer drugs and even to product biofuels. Personally, I think someday in the future human’s DNA could be re-coded rationally, and the technology will be open to the public, applied legally and morally. I hope the application will never be a tool for the rich and the powerful to dominate the world.

Figure 5. DNA Coding

(Source: https://www.khanacademy.org/science/biology/gene-expression-central-dogma/central-dogma-transcription/a/the-genetic-code-discovery-and-properties)

Works Cited:

Evans, David. Introduction to Computing: Explorations in Languages, Logic, and Machines. Oct. 2011 edition.

Wing, Jeannette. “Computational Thinking.” Communications of the ACM 49, no. 3 (Mar. 2006): 33-35.

https://www.udel.edu/udaily/2018/march/dna-computing-wilfred-chen-rebecca-chen-nature-chemistry/. (2018)

https://www.codecademy.com/learn/learn-python. (2018)

Piano and Coding: Creating a Universal Language


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/commons/public_html/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

This was not the first time I was introduced to CodeAcademy- one of the assignments for 506 was to complete a JavaScript training module which bares similarities to the Python training module we had to complete in this class. As a first-time (or I guess second-time) coder, I greatly enjoyed this process of turning an input into an output. As I was finishing the exercise, I couldn’t help but notice so many similarities to how I learned how to play the piano.

Evans talks a lot about how language is very much like computing “since we use the tools of language to describe information processes” (Evans, p.16). Any kind of language has three characteristics that are also deeply fundamental in computing and coding- recursive definitions, universality and abstraction. All three of these are also seen in the language of music. Music is a universal language that can communicate meaning and ideas through a system of rules and symbolic representation- just like coding. Coding has a set of rules that, as we saw in CodeAcademy, allows you to communicate with your computer. As a concert pianist, I am able to communicate with my audience by playing a pattern of notes structured in a certain way. The meaning of the music is “coded” if you will, within the patterns- or algorithms- of a sheet of music. Below is a snapshot of my code from CodeAcademy and the second page from Rachmaninoff’s Prelude that I played to graduate from my music conservatory in D.C.

CodeAcademy, first tutorial

 

 

Second page from Rachmaninoff Prelude, Op. 32 No. 12 in G Sharp Minor

The music scale is universal to any musical instrument- my brothers who both played string instruments would do various scales- C major, d minor, F major- and so on, just like me. You can play C on any instrument and it would be the same note with the same intonation but the way you play it might change from instrument to instrument. Even with no training on the guitar or violin, it would be easier for me to pick up and start playing a tune than someone who has no musical experience. The key is the universal musical alphabet or language that lets you convert and interpret musical symbols from one instrument to another.

As Irvine states, “we use symbols (software) not only to represent meanings but to perform actions on other symbols” (Irvine). If I apply this to playing F sharp, G and A on the piano, I cannot “tell” my piano to perform that sequence therefore in this case I am “acting” like the console, or as the “print” function in Python. I was curious to find if there is computer-generated music out there and there is- tons of it.  FlowMachine is just a few of the websites out there that has songs created by A.I. and inspired by musicians such as Cole Porter, and the Beatles. Google A.I. ‘s Magenta also can create pretty good beats:

It would be very interesting to map out Rachmaninoff’s Prelude that I played using Magenta’s paradigms. I have included the second page of the 8-page piece and a recording of my performance below (only the first few seconds):  Irvine Blog

References:

David Evans, Introduction to Computing: Explorations in Language, Logic, and Machines. Oct. 2011 edition. CreateSpace Independent Publishing Platform; Creative Commons Open Access: http://computingbook.org/.

Irvine, Martin Introduction to Computation and Computational Thinking