This article is part of the Follow the Science series where I share our team's journey in developing a learning experience based on modern cognitive science, learning science, and educational psychology.
Coding bootcamps are often thought of as intensive coding tutorial sessions where the only focus is on pounding out line after line of code. What if the ability to produce code is simply an emergent behavior of more fundamental skills that must be developed first?
This article explores how we integrate core problem-solving skills development into the experience, and how competence in code syntax is viewed as an important, but secondary, skill to learn.
The Giffygram Scenario
The 2023 team called me into their breakout room around mid-morning of the 3rd day to show me what they had pieced together. I was stunned.
In 2023, I had a team of developers that had the option to choose from 5 different projects that were designed for them to develop their communication and teamwork skills. One of those projects is called Giffygram. It is a simplified version of a social media platform where people create posts that contain only animated GIF images.
I gave the team an overview of the project and explained that their initial goal was to deconstruct an existing implementation and generate a technical specification that details how it was constructed. The code itself was compressed and uglified so they could not rely on using the source code to build the spec. They had to use their existing understanding of the strategies and concepts, and use all of the other diagnostic tools at their disposal to figure it out.
They had 5 days to deconstruct the project and then build their own implemetation from the spec.
This team took their job seriously. They spent 3 of the 5 days deconstructing the code, documenting how the HTML was structured, the CSS classes used, the payload/response signatures of each HTTP request, and the organization of the modules that had been downloaded to the client. They also built an incredibly accurate sequence diagram that fully articulated the flow of each feature in the application.
It was a testament to how to debug, investigate, and use analytical and algorithmic thinking skills. Truly one of the most impressive efforts that I've ever seen a team put into a group project.
Traditionally, I observe teams spend about 1 to 1.5 days on the deconstruction and problem-solving stage because they are focused on getting to the code writing stage as quickly as possible. They want to get it done rather than understand it.
This leads to the inevitable conclusion of having an incomplete project after 5 days that is rife with errors, and features that are half-implemented or implemented incorrectly. It's all part of being a beginner to learn those lessons the hard way.
The 2023 team called me into their breakout room around mid-morning of the 3rd day to show me what they had pieced together. I was stunned. I know many seasoned pros who could not produce the quality of documentation, depth of analytical and algorithmic thinking, and professional dedication that this team demonstrated to me.
After I made a couple minor corrections to their ERD and documentation, they forged ahead with coding the solution. At that moment, I was so proud that I didn't care at all that they would barely get any of the code written and wouldn't have much to show. After all, they had just over 1.5 days left to develop what is a complex application for beginners.
Imagine the depth of my astonishment when, at the end of the 5th day, they messaged me and said they wanted to demo their completed application.
They built the entire thing in one and a half days. A team of beginners who didn't know what a function was just 50 days ago. It was a full stack application that made fetch calls to a JSON API service. It was a single-page application that dynamically rendered components given different states. It had a main feed with the ability to favorite posts, a new post component, a messaging component, a user profile component, with simplistic login/logout capabilities.
All of that was possible because they followed our advice -
Never try to solve a problem with code. Solve the problem, then code the solution.
The Science of Problem-Solving
Research in cognitive science suggests that effective problem solvers are not just knowledgeable in their field but also skilled in analytical thinking, algorithmic thinking, and efficient learning. Our strategy encompasses all these aspects to ensure a comprehensive learning experience.
Advances in technology and changes in necessary workplace skills have made the ability to think critically more important than ever before, yet there is ample evidence that many adults consistently engage in flawed thinking.
"Teaching Critical Thinking for Transfer Across Domains" - Diane Halpern (1998)
Being able to think analytically and algorithmically are crucial to software developers because they provide value not through their code, but through their ability to solve problems. Code is simply the vehicle by which a solution is delivered.
The good news is that being aware of modern cognitive science about how the human brain learns means that you can craft a learning experience that methodically builds problem-solving skills.
Our experience is crafted around reinforcing core problem-solving skills. It's not about the quantity of code written but the quality of the thought process behind it.
We have discovered over the years that many of our students begin day one with a diminished ability to think critically (i.e. analytically and algorithmically). The first section of the course introduces them immediately to two tools that help them strengthen the skill.
- The Debugger - This allows them to track the data used in the application and understand the signal flow of basic software instructions.
- Sequence Diagrams - This gives them the ability to build a visualization of an algorithm, which is immensely helpful to a beginner.
These valuable tools help learners build the foundation for how software works and enables them to design a solution for novel problems. Knowing the syntax for code is not enough. A learner needs to know exactly how the code is designed and executed.
Learners begin by seeing solutions for problems similar to what they will be asked to solve. They learn the basic tools and strategies they will be using professionally. Then they are asked to implement the strategies and tools to solve similar problems.
To help them effectively build these skills in problem solving, we use another strategy called Faded Worked Examples, which will be covered in another article.
Problem Solving Process
Here is an overview of the steps involved for a software developer to solve a business problem and deliver an effective solution.
- Understand the problem
- Break down the problem into atomic tasks
- Consider solutions to each task
- Implement solution for each task
- Deliver solution to the problem
Because most of our learners begin the program unsure how to methodically solve problems using critical thinking skills, we model the process for them and expertly guide them through each step. We do this via three mechanisms.
- Project based coursework
- Collaborative sessions
- Behavior modeling sessions
Project Based Course
Project-based learning will be explored in-depth in a separate article. At a high level, each section of the course focuses on a few core learning objectives, and students build 3 or 4 small-scale projects that are focused on developing the competencies in those objectives.
The first project provides them with a walkthrough of a solution that includes copious explanations, supporting videos they can watch to gain different perspectives, and graphics that help their brains learn through dual modalities. The last project they work on in the section simply provides the requirements and they must develop it completely from the ground up.
Weekly collaboration sessions are where student teams, usually comprising of 4 or 5 learner, use analytical and algorithmic thinking skills to solve a problem together with an instructor present. The instructor is not involved in building the solution, but rather serves as a coach during the process.
The learners are guided to first understand the problem that is presented for the project. Then, using only English comments, they developer their analytical thinking skills break down the project into the smallest operations possible.
Once the individual tasks have been defined, the learners then use their algorithmic thinking skills to rearrange them in the order in which they should be written. This tends to generate the most discussion, and a bit of coaching from the experienced coach to ask targeted questions about order of operations.
Finally, the students collaboratively start writing the code to implement each step in the algorithm.
Once they write all of the code and fix any remaining syntax errors, each team realizes that the code was obvious and they can get a working solution very quickly. It's the most effective way to demonstrate to beginners that code is the last part of the process. Coming into the program, their instinct is to start coding immediately and then fix it all as it becomes increasing complex and broken.
We give them the confidence to break that instinct and follow a process the valuable professionals follow.
These sessions are where an instructor breaks down a problem, decides on a strategy for a solution, and slowly implements the solution while allowing learners to contribute if they want and answer all questions along the way.
It is a opportunity that students find highly valuable. They can listen to an experienced developer think through a problem, see how tickets are written, absorb more advanced analytical thinking and algorithmic thinking processes, and have some cognitive dots connected as the coach talks through their code implementation.
Ask most beginners and they will tell you that watching an experienced developer go through the process of solving a problem is an invaluable resource.
By taking this approach, one grounded in learning science, successfully develops professionals who are prepared to navigate the modern technological landscape. They are capable, well-rounded problem solvers equipped that can learn efficiently and provide value to their teams and customers.
I encourage educators and learners alike to embrace evidence-based practices. Think about how these insights can reshape your educational endeavors and share your thoughts or questions.