“First, Solve the Problem. Then, Write the Code.”

This quote, attributed to John Johnson, encapsulates a fundamental principle in software development that is often overlooked, especially by those new to the field. It emphasizes the importance of problem-solving over the mere act of coding. Let’s delve deeper into what this means, why it’s important, and how to implement this philosophy effectively in software development.

Vítor Azevedo
5 min readSep 7, 2024

The Essence of Problem-Solving in Software Development

Programming is more than just writing lines of code; it is fundamentally about solving problems. When faced with a task, many developers, especially beginners, are tempted to jump straight into coding. This approach might yield quick results initially, but it often leads to complications, bugs, and a longer time to completion as the project grows. The philosophy of “first, solve the problem” is about taking a step back and understanding what you’re trying to achieve before writing any code.

Why Problem-Solving is Crucial Before Coding

  1. Clarity and Understanding: Before you write code, you need to understand the problem you are solving fully. Without this understanding, you might write code that seems to work but actually solves the wrong problem. By solving the problem conceptually first, you ensure that your code aligns with the requirements.
  2. Efficiency: Solving the problem first allows you to think through different solutions and choose the most efficient one. You can weigh the trade-offs between different approaches, such as time complexity, space complexity, and maintainability, before committing to any particular code path.
  3. Reduced Debugging Time: If you start coding without a clear plan, you’ll likely end up with a lot of trial and error. This can lead to a significant amount of time spent debugging. A well-thought-out solution minimizes this by addressing potential issues upfront.
  4. Maintainability and Scalability: When you solve the problem before writing the code, you think about the design, modularity, and scalability of your solution. This foresight helps create clean, understandable, and maintainable code that is easier to extend in the future.
  5. Collaboration: Clear problem-solving helps when working in teams. If everyone understands the problem and agrees on the solution, the code will be more consistent and cohesive, making collaboration more effective.

Steps to Solve the Problem Before Writing Code

To adhere to the principle of “first, solve the problem,” it’s essential to follow a structured approach. Here are some steps to help you implement this effectively:

1. Understand the Problem Thoroughly

The first step is to comprehend the problem in detail. You can achieve this by:

  • Reading the Requirements Carefully: If the problem comes with a specification or set of requirements, read them carefully. Clarify any doubts with stakeholders, clients, or team members.
  • Break the Problem Down: Divide the problem into smaller, more manageable components or subproblems. This not only simplifies the problem but also makes it easier to understand.
  • Identify Inputs and Outputs: Define what input the program will receive and what output it is expected to produce. This gives a clearer picture of what needs to be achieved.

2. Devise a Plan or Algorithm

Once you have a firm grasp of the problem, the next step is to devise a solution:

  • Create a High-Level Plan: Outline a high-level plan that describes the steps needed to solve the problem. This might include a flowchart, pseudocode, or a verbal description of the steps.
  • Choose the Right Data Structures and Algorithms: Selecting appropriate data structures and algorithms is crucial. Consider their trade-offs and how well they fit the problem requirements.
  • Consider Edge Cases and Constraints: Think about edge cases, special conditions, and constraints that your solution must handle. Planning for these will prevent many common bugs later.

3. Validate the Plan

Before writing any code, validate your solution:

  • Walk Through the Algorithm with Sample Data: Use sample inputs to manually walk through your algorithm step-by-step to ensure it behaves as expected.
  • Peer Review: If working in a team, get feedback on your plan. Other developers might see potential flaws or improvements that you missed.
  • Consider Performance: Evaluate the time and space complexity of your solution. If the problem size scales, will your solution still be efficient?

4. Write the Code

Now that you have a validated solution, writing the code becomes straightforward:

  • Translate the Plan into Code: Write code that follows the structure of your high-level plan. This should be easier now that you have a clear roadmap.
  • Keep it Simple and Readable: Write clean, readable code. Stick to coding conventions, use meaningful variable names, and break code into functions or modules where appropriate.
  • Test Continuously: Test the code with different inputs, including edge cases, to ensure it works as intended.

5. Refactor and Optimize

After the initial code is written:

  • Refactor for Readability and Maintainability: Look for opportunities to refactor your code to make it cleaner and more understandable. This may involve removing duplication, simplifying complex logic, or renaming variables for clarity.
  • Optimize Where Necessary: If performance is an issue, consider optimizing your code. This could involve using a more efficient algorithm, reducing the number of loops, or minimizing memory usage.

Real-World Example: A Step-by-Step Approach

Let’s apply this philosophy to a real-world problem: finding the shortest path in a maze.

  1. Understand the Problem: Given a maze represented as a 2D grid, find the shortest path from a starting point to an endpoint. The path can only traverse open cells (not walls).
  2. Devise a Plan: For this problem, a good algorithm is Breadth-First Search (BFS), which is well-suited for finding the shortest path in an unweighted grid.
  3. Validate the Plan: Walk through the BFS algorithm with a small sample maze to ensure it behaves correctly. Consider edge cases like no possible path, multiple paths, or starting and ending points being the same.
  4. Write the Code: Implement the BFS algorithm in the chosen programming language. Ensure each step of the code aligns with the plan.
  5. Refactor and Optimize: Refactor the code to be modular, test thoroughly with different mazes, and optimize by using more efficient data structures if needed.

The Benefits of Problem-Solving First

By following this approach, developers create robust, efficient, and maintainable code. This mindset also instils a disciplined approach to programming, leading to fewer bugs and more scalable solutions. It enables developers to focus on the real value they provide — solving problems — rather than getting bogged down in syntax or framework intricacies.

Conclusion

“First, solve the problem. Then, write the code.” This simple yet profound statement by John Johnson serves as a reminder that software development is fundamentally about problem-solving. The code is simply the implementation of a well-thought-out solution. By prioritizing problem-solving, developers can write better code, create more maintainable systems, and ultimately build software that meets users’ needs more effectively.

The next time you face a programming task, remember to step back and think. Understand the problem. Devise a plan. Only then should you start writing the code. This approach will not only make you a better programmer but also help you build software that truly solves problems.

--

--

Vítor Azevedo
Vítor Azevedo

Written by Vítor Azevedo

Frontend Developer with 25+ years' expertise in HTML, CSS, JavaScript, Angular and Vue. Builds dynamic, user-centric web apps. Award-winning projects.