Table of Contents
- The Assumptions
- The Process
- Utilizing Modern Technology in Education
- Final Thoughts
Welcome to the Grand Experiment
I'm Steve Brownlee, Lead Instructor at Nashville Software School, and what you are about to read is a Grand Experiment in adult software education.
This article weaves together results from empirical educational studies, ideas from thought leaders, and my own observations in the classroom. My goal is to provide a solid framework for the most effective way to teach the foundations of software development to adult learners.
As I write this, vocational schools dedicated to teaching the skill of software development is a 3.5 year old industry.
Meaning, we're still figuring this stuff out.
Since NSS is a vocational school, focused solely on teaching adults, I've been scouring the web, and reading books about andragogy, which is the theory of adult learning. I want to ensure that the way our courses are set up to provide the most efficient environment for adult learners.
As I was reading Salman Khan's The One World Schoolhouse, I learned about the concept of Mastery Learning. I then delved into learning all I could about that, and what immediately emerged is that mastery learning and andragogy are complementary. They both focus on self-directed learning, and education through practical application instead of memorization of content.
As I continued to read about both topics, I came to the conclusion that they are both describing the same thing: effective teaching strategies.
This article touches on some of the terms and philosophies that inspired the new process, but they are not the central point. I may write an article later those points, but I am directing this article towards the other coding academy instructors out there who might be looking for alternatives to teaching software development.
As I have talked with instructors at others schools, and previous instructors at NSS, I quickly notice that the focus is heavy - and sometimes only - on learning the skill of writing software. Makes sense, right? It's a coding school, so we teach coding. There's also so much to teach, especially in the browser libraries. New techniques and tools are being introduced at a blistering pace, and what was hot last year can quickly be displaced, and then delegated to the dustbin of history.
The pressure is on, then, to...
I'm taking a different approach. Like every other endeavor of human knowledge, the foundations need to be taught before advanced topics.
- Algebra before calculus.
- Aerodynamics before rocket design.
- Rhyme before poetry.
If someone has a rock solid comprehension of the skills and theory of algebra, then topics such as geometry, statistics, discrete mathematics and calculus become obvious and natural. Unfortunately, few people attain a true, 100% level of comprehension of algebra.
The same concept applies to software development. I need to give students a solid understanding of the foundational building blocks of modern coding. Once this happens, understanding web components, promises, generators, React, cherry picking, and weak maps become natural and obvious. It's a tall order, but I firmly believe that it is achievable in 6 months, the length of our program.
The building blocks are more than just variables, conditions, and iteration. Students need to comprehend how using git and Github make them better teammates. Students must understand that their job is to solve business problems, and how to effectively communicate with other roles in a company. Students must know that designing a solution is far more important and complex than coding it.
Having 25 years experience working on software teams has shown me what works, what doesn't, and how the lack of a solid foundation can significantly hinder a person's effectiveness on a team.
Nashville Software School
Nashville Software School is the first non-profit coding school in the United States. Several others have since opened their doors, but NSS was the trail blazer, and that's one of the main reason I decided to work here. For those of you who might wonder what the basic tenets of a non-profit organization are, here's a quick list.
- A non-profit's mission is to undertake activities whose goal is not primarily for profit. Many people make the mistake of assuming the goal is to not make a profit. We need to be profitable in order to continue with our mission.
- No person owns shares of the corporation or interests in its property.
- The property and income of the non-profit corporation must never be distributed to any owners, but get recycled back into the non-profit corporation's public benefit mission and activities.
So while we make sure that we are a profitable organization, it's not the whole point of the organization. There was a time, around mid-2014, when I started to consider teaching at a code academy full time. When I evaluated all the schools that were out there, I felt uninspired. They were all for-profit, which, when dealing with the education of students, doesn't feel right because the current mindset of for-profit companies is that their sole purpose is to provide a financial return to investors and shareholders.
To me, that means that the students are simply customers buying a product, which, in turn, gets priced as high as the market can sustain. In order to maximize profit, the product is produced at the smallest cost possible.
See the problem?
I wanted an organization whose sole purpose was to invest in the education of students. An organization where being cash-flow positive was a natural byproduct of being extremely good at education. I wanted a non-profit. Luckily, right in my own city, there was Nashville Software School.
Our director is John Wark, who had an extremely successful career leading for-profit companies. He knows how to grow a business and keep it in business. He also knows the value of building talent in the community that needs it, which is why he started NSS.
So I joined in early 2015, and as of publish date, I've instructed 5 cohorts of students. I've learned much from this process, and here are some basic assumptions I've developed as a result.
These are non-static, and will evolve over time.
Assumption 1. Non-traditional structure
If the goal is to maximize the learning of each student, the traditional education processes that we all grew up with does not work. Political and organizational inertia prevents it from changing, even in the face of evidence of its inferiority in attaining a higher level of comprehension in a classroom when compared to mastery learning.
Assumption 2. Elaboration
Elaboration is absolutely critical. In an educational context, elaboration means that each concept must build upon a previous one, and students must be able to see that connection when they learn each topic.
Notes: I built my original curriculum in an elaborative way before I even knew about this concept. Once I researched the topic, I strengthened the curriculum to be even more so. Many students have already expressed an appreciation that their skills were built up - gradually becoming more complex, but easier to comprehend since they had more foundational knowledge.
Assumption 3. Mastery Learning
Mastery learning has demonstrated the ability to provide a more successful environment for learning than our current, dominant system of forcing students into age-based classrooms, and time-based curriculum where students move into new subjects without having mastered the current one.
Since age is not a concern, my most pressing concern is breaking away from the time-based curriculum as much as possible.
Notes: This is tricky, because they only have 6 months with us, so there is a time constraint. Also, I do want every student to participate in group projects, and I want those projects to be done in a fairly narrow time range (e.g. +- 4 days of the estimated end of the milestone).
How can I accomplish covering each subject in the allotted time, while still giving students time to learn at their own individual pace? I don't believe there is a straightforward answer for this. I'll need to address the issue of a student being significantly shy of 100% comprehension at the time of the group project on a case-by-case basis.
Some students will not take part in the group projects. Others may be close enough to comprehension that taking part in the exercise would fill in any remaining gaps better than individual instruction.
Assumption 4. Collaborative Learning
After teaching five cohorts of students, the one thing that has emerged as the greatest contributor to their ability to grasp concepts is collaborative learning. During their six months at NSS, students take part in numerous group projects to solve problems by designing and building applications.
It's one of the basic tenets of androgagy as defined by Malcolm Knowles (1984). In fact, I'm constantly striving to find ways to increase the number, and variety, of group projects for them to work on.
It is that effective.
Lecture & Live Coding
Classroom time will be for minimal lecture, my goal is to keep any true lecturing to under 15 minutes. When it comes to live coding and discussion for critical concepts, my goal is a maximum of 45 minutes. Students can ask questions, have me repeat anything that wasn't clear and see how the code is written. I also am recording the live coding sessions so that students can review basic concepts any time they want.
During this part of the process, I discuss the history behind the concept, how it fits into the context of what they will be using it for, and how it connects - if applicable - to any previous concepts they learned.
I also make heavy use of, what I call, The Dramatic Pause. When I hit certain crucial points in the process of live coding, I just let students look at the code for a while and let questions form in their brain. I've found this to be helpful for the class.
The exercises take the core concepts we cover in class, and provide the affordance for students to strengthen their comprehension by using their creativity to apply it in several ways. My goal is to have, at least, 5 increasingly challenging exercises for each main branch concept.
Some of the exercises even get live coded with the class. Obviously, I don't share the code I produce with them, but much of it makes it into the resulting video since I plan on recording many of the live coding sessions. This way, students can do the exercises as many times as they wish and can always refer to the curriculum, the video and other resources they discover.
After I have live coded some concepts, and some minor group projects have completed, we must take the time to identify students who are lacking in comprehension. For each milestone, we accomplish this with a quiz.
Once the students feel they have obtained adequate comprehension of the concepts for the current milestone (not memorization of syntax), they can take the quiz. The quiz itself is complex, and requires a creative application of the concept. It's not meant to regurgitate facts, or use short-term memorization of simplistic solutions.
The quiz has two main purposes.
- Encourage students to use their analytical and creative intelligence to solve a more complex problem.
- Understand how this concept elaborates upon previous skills and knowledge.
Elaboration is a critical part of this process. Each concept must build upon previous concepts, and students must be shown how they connect. Also, each of the exercises and quizzes are comprehensive, meaning that it will require the student to use all of the skills that have been learned to that point.
It's also crucial that feedback from instructors happens as promptly as possible.
Once a student submits a quiz, and the instructor feels that it was completed without any further opportunities for comprehension, the student can then take on challenges. There are both individual and team challenges. These are exceptionally complex problems that require a deep understanding of the concepts that have been covered in the current milestone.
Often, these remain incomplete before it's time for the group project.
I provide no guidance whatsoever for the challenges. Students choose to take on one, and when they feel it is complete, they can come sit with me and I let them know if the challenge is complete or not. If it is not, I tell them where there are deficiencies, but do not tell them how to fix them.
The group project marks the end of the milestone. It requires the students to utilize many tools to effectively solve a complex problem with their teammates. We're not just teaching the ability to code at Nashville Software School. We're also teaching students how to be valued, productive teammates.
- How to define a problem and break it down into discrete tasks in a Trello board.
- Produce wireframes to aid in the production of acceptance criteria.
- Decide on a git branching strategy, how & when to perform merges, and how to resolve merge conflicts.
- Write unit tests for core functionality before implementation begins.
- Effective communication strategies when there is team conflict, and that team conflict is not a bad thing, but a good thing when done with respect and not in a destructive manner.
I provide clear requirements for the success of the project, then the students are broken up into teams of 3 or 4 and then sent off to build it out over a few days' time.
One of the major concepts in mastery learning is to not drive a classroom forward as if they were a herd of cattle. In the current, traditional environment, an instructor covers many discrete topics, quizzes the students on the topic, provides a grade, and then the entire class moves on, regardless of the individual level of comprehension of each student.
We don't do that.
In the previous section, I described what goes into a successful group project for the student teams. There are four milestones (plus the capstone), each with a corresponding group project where students take their individual comprehension on a set of concepts and then collectively apply them to a large, complex problem.
Upon completion, they present their project, as a group, to the rest of their teammates in their cohort. Each student in the group discusses what went right, what went wrong, and a general summary of their experience for the project. It serves as a prototype for taking part in a retrospective after a product launches.
Milestone 1: Foundations
Milestone 2: The Static Web
Milestone 3: Single Page Applications
Milestone 5: Rich Browser Applications
After all the exercises, and all the quizzes, and all the group projects, comes the capstone. It's the final project for the students, and they must independently develop this final project from an idea to completion. I have only two rules:
- The project must be the student's idea and worked on only by the student. This is to make sure that there are no external influences on the student during development.
- It has to be something that the student finds interesting. If it's not something that the student wants to build, it's already in peril of not being done.
This is the summative assessment for the course, and students must use their analytical and creative intelligence to apply the knowledge they have gained to implement a complex solution to their idea - and there are multiple ways to achieve it. They have to find the way that make sense to their own brain.
We help them every step of the way.
We start by helping them filter through all the ideas that they have brainstormed for their project and focus on no more than 5 Trello tickets that define their MVP. I then have regular check-ins every few days to see their progress, and guide them towards the next step of the project.
Utilizing Modern Technology
We have the ability, with all the modern tooling available, to allow students to have access to every resource, at any time, in any location. One of our main jobs, as mentors, is to ensure that students learn quickly how to locate, and absorb that information.
This is the linchpin of the entire effort. Students must be able to review code examples, listen to us explain the context & purpose, and have references to external resources at any time.
Curriculum on Github
My front end curriculum is open sourced on Github. Students can access the code I use during live-coding sessions, do exercises for each module whenever they like, and see what's coming up if they want. One of my long-term goals is to have our entire curriculum publicly available to any potential, current, or former, student who wants to review the material.
Some schools do not do this. They believe the curriculum is a kind of secret, special sauce.
What is being taught is not secret at all. We all teach the same things.
How it is taught is the secret sauce.
Videos of Live Coding and Lecture
When I lecture, and live-code with the team, about a concept, process, or tool, I provide the context they need to understand how to implement it, how it relates to what they have previously learned, and the context in which it should be used. Unfortunately, during that time, students have a crucial choice to make (especially when we delve into more complex topics).
- Pay close attention to what I'm doing, discuss it, and ask any questions that they have about it.
- Take notes as I talk, or code along with me. This way they have a record of what was discussed, but they could not focus on the discussion and start the comprehension process.
Even if students do pay attention and take part in discussion, their comprehension is minimal at best, and once the process is done, they have no way of enhancing their understanding through repetition.
To alleviate that, I'm going to be producing videos of my live coding sessions, along with me talking about the concept while I'm coding. Students can then watch the video as many times as they like, pause it to try out some code, or even go back to a video later in the course to refresh their understanding.
Quizzes on Github Classroom
Github Classroom has a serious potential to help me out when giving out quizzes, exercises and group project. Right now, it has some annoying bugs, but nothing that prevents me from using it (there are workarounds for the serious issues).
So I can create a classroom object for each cohort of students, pre-fill it with all of the quizzes, and send the links to each student. When the students feel prepared to take a quiz, they get a fresh repository based off of a boilerplate repository that I specify. Each student can then work on the quiz and submit it to myself, or one of the TAs for an assessment.
This is a nice setup because we can then comment on their code directly on Github, and if more work is needed from the student, they can submit further pull requests.
I'll iterate my opening thought that this is all a grand experiment. Coding schools are only a 3 year old industry, and nobody really knows what they are doing yet. However, my plan is to utilize the theories that emerged from the past 100 years of researching adult learning, and how the human brain effectively learns. This article describes my first concrete implementation of those theories, by applying it to what I see in the classroom every day.
It could all crash and burn, but as of the release of this article (), I'm seeing many positive steps in allowing students to learn at their own pace, while constantly prodding them to push themselves harder than they feel comfortable. It's a tough process, though.
Many students still find themselves comparing their progress to the other students'. Some still find it hard to ask for help. Breaking down the habits and expectations of a lifetime of traditional education requires effort, patience, and empathy.
I believe that one of the byproducts of teaching in this way is that it will refine what exactly gets taught. There may be some concepts on my milestones that are unnecessary given the 12 weeks available for front end technologies. There may be others that need to be added in order to strengthen students' knowledge of fundamentals.
So what is mastery learning? It comes from the writings of Benjamin S. Bloom of the University of Chicago. In the 1960s, Bloom began researching the different methodologies that existed in student learning outcomes. He examined how learning happened in the traditional classroom that was driven mostly by time, and then he examined how learning happened in a 1 on 1, tutor/student relationship.
A brief summary of his findings for the most effective method to maximize student comprehension (i.e. mastering the concept) is pulled from education.com. There is also an easy to follow video which provides an introduction.
Teachers first organize the concepts and skills they want students to learn into learning units that typically involve about a week or two of instructional time. Following initial instruction on the unit, teachers administer a brief quiz or assessment based on the unit's learning goals. Instead of signifying the end of the unit, however, this assessment's purpose is to give students information, or “feedback,” on their learning.
Paired with each formative assessment are specific “corrective” activities for students to use in correcting their learning difficulties, [and] the correctives are individualized.
When researchers and teachers applied the concepts of mastery learning, here's what they found.
"When compared to traditionally taught classes, students in mastery learning classes consistently have been shown to learn better, reach higher levels of achievement, and develop greater confidence in their ability to learn and in themselves as learners." - (Guskey, 1997, 2001)
In mastery learning classrooms, there are formative assessments, which is a general term for a test, or quiz. The difference is that the test is no longer a Thing to be Dreaded, which officially marks The End of the unit of learning such as it is in a traditional classroom.
"Bloom believed that a far better approach would be for teachers to use their classroom assessments as learning tools, and then to follow those assessments with a feedback and corrective procedure. In other words, instead of using assessments only as evaluation devices that mark the end of each unit, Bloom recommended using them as part of the instructional process to identify individual learning difficulties (feedback) and to prescribe remediation procedures (correctives)."
Thomas Guskey (2001)