Learning to Code as a Form of Language Learning

Lessons from Second Language Acquisition, and how we can apply them to code

Featured on Hashnode

Before I became a programmer, I worked in language access - first in English language education, then in nonprofit management running the Language Access and Proficiency program at a refugee resettlement agency. When I made the transition into software development, I was excited to see how much overlap there was between the two seemingly unrelated fields. The overlaps most obvious to me revealed themselves when I was first learning my programming languages and approached the learning process through the lens of second language acquisition.

As developers, we refer to the tools we use as 'programming languages,' but we don't always think of learning to code as a form of language learning. There are of course differences between natural languages and programming languages, but humans have been learning natural languages for hundreds of thousands of years longer than we've been learning programming languages, and there are lots of insights we can glean from the field of second language acquisition.

Below I'll outline three concepts from the field of Second Language Acquisition and how they can be applied to learning to code - computer language acquisition, if you will. Some terms I'll be using throughout this article:

  • Second Language Acquisition (SLA) - a sub-discipline of applied linguistics that studies the process by which language learners acquire any language other than their native language(s)
  • natural language - a spoken or signed language that has evolved naturally through usage in human communication (e.g. English, Japanese, Arabic)
  • programming language - a system of notation used by programmers to develop computer programs (e.g. Python, Javascript, Java)

Comprehensible input

victor-barrios-yjygDnvRuaI-unsplash.jpg Comprehensible input in the field of SLA refers to language input that is just slightly above the level of the learner. Language input generally refers to receptive skills like listening or reading, whereas language output refers to productive skills like speaking or writing.

According to Stephen Krashen, comprehensible input is "the only true cause of second language acquisition" (64). It's often represented as i + 1 (or i++ for all you programmers), where i is the learner's current level. To further translate that into programming speak,

for (let i = 0; i <= fullProficiency; i++) {
    const comprehensibleInput = i + 1
    practiceLanguage(comprehensibleInput)
}

Generally, the idea is that learners should encounter language beyond what they have already learned so as to challenge them, but not so far beyond what they've learned as to completely discourage them.

Comprehensible input applied to coding

Gaining exposure to code just slightly above your comprehension ability will help you to expand the limits of your knowledge. There are a few places we can look to find comprehensible inputs in programming. Documentation, courses, and tutorials can all serve as excellent sources of comprehensible input.

For those that are already familiar with at least one programming language, a less obvious source of comprehensible input that I really love to use is code review! If you work with any team members that use different programming languages than you, have any friends that do, or even know of any open source projects that do, I encourage you to do your best to review their code. You won't understand everything, and might not be able to provide high-value feedback at first, but if you already have context around the project they're working on, that's a great starting point to build from. Depending on the context, you might even be able to ask questions to learn more about the code they wrote.

Making mistakes is a critical skill

visuals-JpTY4gUviJM-unsplash.jpg One of the biggest hurdles for most adult language learners is getting over the fear of failure or of being wrong. This limitation delays many adult language learners from progressing at the rate of many juvenile language learners. This is because many adult learners are so debilitated by a fear of using language incorrectly that they barely use the language at all.

It has been suggested that inhibition discourages risk-taking, which is necessary for progress in language learning. (Lightbrown and Spada, 61)

Counterintuitively, getting comfortable with making mistakes is one of the best ways to make progress as a language learner. Focusing on the goal of communicating instead of on the goal of producing grammatically perfect sentences allows a learner to gain practice using new vocabulary, which will help them better remember it; and using new grammar structures, which will help them gain intuition for when and how to use them.

Sometimes language acquisition is reflected in a decrease in the use of a correct form that was based on rote memorization or chunk learning. New errors may be based on an emerging ability to extend a particular grammatical form beyond the specific items with which it was first learned. In this sense, an increase in error may be an indication of progress. (Lightbrown and Spada, 77)

I love this idea that mistakes can be a sign of progress, and think it can be a very helpful reminder for folks who get discouraged when they make mistakes.

Making mistakes applied to coding

It's important not to be so afraid of making mistakes as to never write any code in the first place. Try not to be afraid of a blank page - start with a 'Hello World,' add some complexity, and correct when necessary.

Making mistakes will be a natural part of the process of applying new knowledge, and it's important not to get discouraged when mistakes occur. Instead, see mistakes as an essential part of the process of gaining proficiency and an opportunity to learn. Get comfortable with reading error messages, debugging code, and asking for help. These are some of the most important skills for leveling up as a developer.

Scaffolding

reto-simonet-WN9QRESOu5c-unsplash.jpg As you might expect, one of the fastest and most effective ways of learning a language is to actually use that language. Using language productively to create meaning is infinitely better practice than simply reading or listening to someone else use language.

In the field of education, scaffolding refers to the strategy of gradually progressing students toward increased independence in the learning process. In a language classroom, this could look like:

  1. The teacher introduces a new grammar concept to the class
  2. Students read a short passage and identify all instances of the new grammar structure
  3. Students then complete an exercise where they complete sentences by filling in the blank with a verb conjugated using the new grammar structure
  4. Students think of and write three sentences using the new grammar structure
  5. Students converse with a partner using a prompt designed to elicit the new grammar structure naturally

In this process, students begin with lots of support (or scaffolding) from the teacher, but as they gain familiarity with a concept, they are able to demonstrate more and more independence until they are finally able to use the new concept independently and could even use the new concept outside the classroom. Working toward productive language use is generally always the goal in a natural language classroom because it is the most effective way for learners to internalize information about a language.

Scaffolding applied to coding

Similarly, reading coding tutorials is a great way to start learning a new coding concept, but we should work to scaffold our learning with the ultimate goal of writing code and working on real life projects. In the context of learning to code, scaffolding could look like:

  1. Reading documentation about a programming concept
  2. Watching a course on the new concept and perhaps completing small challenges if they exist in the course
  3. Following along with a tutorial using the programming concept
  4. Working independently (i.e. not through a tutorial) on a project applying the programming concept

If you're feeling overwhelmed while learning something new, a great way to set yourself up for success is to first think about how you ultimately want to apply your knowledge, then work backwards to build up some scaffolding for yourself.

TL;DR - How can I be a more effective (computer) language learner?

  1. Start with input that is just slightly beyond your current level.
  2. Embrace mistakes as part of the process.
  3. Give yourself support as needed, but make it a goal to work towards independently developing projects.

Works Cited

Brown, H. Douglas. Principles of Language Learning and Teaching: A Course in Second Language Acquisition. Pearson Education, 2007.

Krashen, Stephen. “Immersion: Why It Works and What It Has Taught Us.” Language and Society, 1984, p. 64.

Lightbown, Patsy M, and Nina Spada. How Languages Are Learned. Oxford University Press, 2006.