03 - Software Design

Class: CSCE-331


Notes:

5.1 Design Challenges

Definition of Software Design

  1. Design Is a Wicked Problem

    • Definition: A "wicked" problem is a complex, persistent issue with incomplete, contradictory, and evolving requirements, making it difficult or impossible to solve definitively.
    • The Paradox: You essentially have to solve the problem once to define it, and then solve it again to create a solution that actually works.
    • Example (Tacoma Narrows Bridge): The original bridge design was a wicked problem because engineers did not know that aerodynamics needed to be a main consideration until the bridge collapsed. Only by building the bridge (solving the problem) could they learn the requirements necessary to build a bridge that would stand,.
    • School vs. Professional Work: School assignments are rarely wicked; they are designed to move in a beeline from start to finish. Professional programming problems are wicked because the requirements and constraints often change as the solution emerges.
  2. Design Is a Sloppy Process

    • Process vs. Result: While the finished design should look tidy and well-organized, the actual process of creating it is messy.
    • Role of Mistakes: The point of design is to make mistakes. It is cheaper to make and correct errors during the design phase than to recognize and fix them after coding.
    • Completion: It is difficult to know when a design is "good enough" or "done." Because design is open-ended, the most common criterion for stopping is simply "When you're out of time".
  3. Design Is About Tradeoffs and Priorities

    • Balancing Act: In the real world, designers must weigh competing characteristics. A designer must strike a balance between mutually exclusive goals, such as fast response rates versus minimized development time.
    • Prioritization: A good designer chooses a design based on the specific priorities of the project.
  4. Design Involves Restrictions

    • Purpose: The point of design is partly to create possibilities and partly to restrict them.
    • Constraint as a Tool: If resources were infinite, solutions would be sprawling and inefficient. Constraints force simplifications that ultimately improve the solution.
  5. Design Is Nondeterministic

    • Multiple Solutions: Design is not a process where A + B always equals C. If you send three people to design the same program, they can return with three vastly different, yet essentially acceptable, designs.
    • Variety: There are usually dozens of ways to design a computer program.
  6. Design Is a Heuristic Process

    • Heuristics vs. Algorithms: Design techniques are heuristics ("rules of thumb" or "things to try") rather than algorithms (repeatable instructions guaranteed to produce a specific result).
    • Trial and Error: Design involves trial and error. A specific tool or technique that worked on one project may not work on the next.
  7. Design Is Emergent

    • Evolution: Designs do not spring fully formed from a developer's brain. They evolve and improve through reviews, discussions, and the experience of writing and revising the code itself.
    • Change: Virtually all systems undergo design changes during initial development and continue to change as they are extended.

5.2 Key Design Concepts

Software’s Primary Technical Imperative: Managing Complexity

Desirable Characteristics of a Design A high-quality design strives for these internal characteristics:

Levels of Design

Levels of Design Design occurs at five distinct levels of detail:

Level 1: Software System

Level 2: Division into Subsystems or Packages

Level 3: Division into Classes

Level 4: Division into Routines

Level 5: Internal Routine Design

Here are the comprehensive notes for Chapter 5.4: Design Practices, formatted for your digital notebook.

5.4 Design Practices

Iterate

Divide and Conquer

Top-Down vs. Bottom-Up Design

Experimental Prototyping

Collaborative Design

How Much Design Is Enough?

Capturing Design Work Formal design documents are not the only way to capture a design. Alternatives include:


Have you had any experience in robotics? If so, please let us know the following information:

Yes, I have prior experience in competitive robotics through FIRST Robotics Competition (FRC). My previous team was XRAMS 6200 from Ciudad Juárez, Mexico. I participated in the 2023 FRC season (Charged Up) as a team member, and continued with the team in the 2024 and 2025 seasons as a mentor.

My primary area of experience is Software. During my time as a student, I worked closely with the lead programmer and was responsible for committing and maintaining the robot code as the robot evolved throughout the season. As a mentor, I have continued to focus on software development and best practices, helping guide students in version control, code organization, and debugging.

I do have technical writing experience. As a mentor, I wrote internal documentation for my team covering programming resources, GitHub workflows, and general coding practices, and I also gave practical presentations to help train newer students.


For the text response, please write about a time that you faced hardship during robotics and how you dealt with it.

One time I faced real hardship during robotics was during a competition match when our robot fell completely and one of the motors that lifted our arm broke on impact. That arm was essential for grabbing and scoring game pieces, so without it we basically could not score any cones anymore. We immediately went into problem-solving mode, but we realized we did not have a backup motor of that exact model. A few teammates and I went scouting through the pits, explaining our situation, and fortunately another team was kind enough to lend us a similar motor that fit our framework design, even though it was not exactly the same one.

Because the motor was different, its behavior was not identical to what our software was tuned for. As a software team member, I had to quickly adjust and test speed and control values between matches through trial and error until we found a configuration that worked well for both autonomous and teleop. In the end, it worked surprisingly well. That experience taught me the importance of staying calm under pressure, asking for help when needed, and adapting quickly with both hardware and software when things do not go as planned.


If you had any past software experiences with a robotics team, please explain here.

Yes, I implemented github repositories and version control for the robot on the team for the first time! for this I had to do hard sessions of documentation and teaching other members how to use github but it was fine and I feel it is one of the most important things my generation did for the team.

Of course I worked on the robot code a lot, I worked on some of the features of our robot for the 2023 season, which was balancing a platform, I did this implementing a gyroscope and coding some PID movement using the gyroscope kind like as an encoder so that the robot corrected its own weight and was able to balance this way, that was a pretty cool thing. I also worked on autonomous path planning which was basically a lot of trial and error with distances and motor power and control, all of it was fun stuff, but the hardest part was on early season were we had to coordinate a lot with the hardware team to get some functions to work, but again it was all part of the fun.


If you've done any past projects regarding software, please explain here.

Yes, I had significant software experience with my robotics team. One of my main contributions was introducing GitHub repositories and version control for the robot code for the first time in the team's history. This required writing documentation and running several training sessions to teach other members how to use GitHub properly. It took effort, but I believe it was one of the most impactful improvements my generation made for the team.

I also worked extensively on the robot code itself. For the 2023 season, I helped implement the balancing feature by integrating a gyroscope and coding PID-based control so the robot could correct its own position and balance on the platform. I treated the gyroscope readings almost like a motor encoder to keep the robot stable, which was a really rewarding challenge.

In addition, I worked on autonomous path planning, which involved a lot of trial and error with distances, motor power, and control tuning. Early in the season, one of the hardest parts was coordinating closely with the mechanical team so that software and hardware matched well, but that collaboration ended up being one of the most fun and valuable parts of the experience.


If you've done any past projects regarding software, please explain here.

Yes, I have worked on several software projects as I have progressed through my degree. Many of my classes have required building fairly large projects, which has helped me learn solid software engineering practices such as code organization, debugging, and basic design principles.

Outside of class, a big part of my project experience comes from hackathons. Through those, I have worked on a variety of projects, including web applications, machine learning models, Java GUI applications, simple CLI tools in C, and small games in Python. Hackathons have been where I get to experiment the most, learn quickly, and work closely with teammates under time pressure.

In addition to these projects, I also gained a lot of practical experience through robotics, especially writing and maintaining Java code for our robot. All of these experiences together have helped me become comfortable working with different languages, frameworks, and styles of development.