Top

CSC207H: Software Design

Thank you to Prof. Paul Gries for providing this information!

So, what exactly IS CSC207H1??

The course is about software design concepts, which are ways to think about and organize your code as you design and develop a large program in a team of programmers. We use Java to illustrate and apply these concepts, but they apply to most programming languages.

Programs grow and change over time. Bugs are fixed, new features (and new bugs) are introduced, documentation gets outdated. All of this maintenance requires planning and design. Poorly-designed code gets very hard to change.

Many (a large majority?) of you will are planning to apply for internships this year. This course gives you the tools, terminology, and knowledge to be able to discuss programming concepts with professional software developers.

Here is an excerpt from personal correspondence with a former student (reproduced with permission):

“I was motivated to write this email because I've been interviewing for internships, and the more I do, the more I realize that CSC207 prepared me for real world software development more than any other course by far. The topics from the course come up constantly and knowing Java opens a lot of doors since it's so widely used. I've done 6 interviews at this point and I think I've spent at least 80% or more of the non-technical portion of each one talking about the CSC207 project, the struggles our group went through and the actions I took to fix things. I found that I was able to relate nearly every question the interviewers asked back to 207 and the project, which made for really solid answers.

Of course, CSC148 and LeetCode were essential for the technical portions of the interview, but the skills and experience I gained in 207 covered all the other bases extraordinarily well, and are not things you can just study and practice the day before an interview like you can with LeetCode problems.”

If you apply for internships, the course will give you stories to tell about challenging situations and what you did about it. Some companies will want to explore your teamwork skills and how much of a growth mindset you have. For those interested in research, you’ll be familiar with how to manage a large codebase, and you’ll be able to quickly get up to speed with the rest of your research team.

Keys to Success! 

  • Include every teammate in conversations. If someone is quiet, ask them what they think. Get to know your teammates, at least a bit. Spend a few minutes each meeting chatting. Make sure everyone gets a chance to talk. Be proactive and helpful.

  • Don’t ghost your team. Let them know when you need help. Maybe you can meet for 20 minutes, share your screen, and a teammate can walk you through what you’re trying to learn or develop or design. Maybe you can get on a call and co-work so you can ask occasional questions. You’re learning the material, and there’s a lot of it, and it’s okay to not know things and to take time to understand ideas. Just be engaged!

  • Change how you think about programming. A large program is a collection of components, each made up of several closely-related classes. Each component has a purpose, such as saving data in a file or presenting a user interface. The components need to communicate with each other, and this course teaches you principles about how to organize all of that, and a framework for thinking about design. All the edges of the components need to be tested.

  • Become familiar with your development environment. It’s your lab bench. We use a professional Integrated Development Environment (IDE) in CSC207 — practice using the tools that will make you more efficient. This will save you hours and hours over the semester. The tools exist because they’re useful.

  • Get good at using the debugger. It should be your first step (heh, get it? give me a break…) when trying to figure out why your code isn’t working. Go to office hours if you want a walkthrough!

  • Spend lots of time in weeks 1 and 2 learning Java and the IDE. From first year, you know classes and functions and loops and types and information hiding/encapsulation and data structures and file input and output and documentation and learning a problem domain and linked structures and recursion and assertions about data. Zounds! Many, many of the concepts are similar in Python and Java, you just need to figure out how those look in Java and practice them. If you get stuck, please ask for help!

  • Practice using the terminology. You’ll talk about code a lot in your career, whether you go into research or development.

How is CSC207H1 going to help me?

  • CSC207 gives you a higher-level view of how a program is organized, including common techniques used in industry.

  • Apart from preparation for a software internship, if you get good at using software tools, you will have a much easier time in CSC209, CSC301, and CSC369. (And other applied courses.) In those, you’ll be expected to know how to use the debugger and to think at a more abstract level.

  • You’ll get to practice soft skills, which are incredibly important in any team environment.

How will CSC207H assignments help me learn?

  • The project lasts most of the semester. Over the term, you’ll choose a project, describe it semi-formally, start it small, and grow it, making modifications as you learn more about design.

A few last words from the instructor:

  • It’s challenging to work in a team. There are always conflicts, even when friends are working together. You need to learn to rely on each other, and that implies building trust.

  • Communication is key. If you’re not going to be able to go to a meeting, let your team know right away. If you don’t know how to do your part of the project, ask for help! If you see a teammate struggling, offer to meet with them for a half hour to get them started.

  • For each phase of the project, make sure you all understand the tasks you’ve decided are yours, and take ownership of that process. And ask for help when you need it!

CSC207H is a prerequisite for... 

  • CSC209H1 — Software Tools and Systems Programming

  • CSC311H1 — Introduction to Machine Learning

  • CSC320H1 — Introduction to Visual Computing

  • CSC343H1 — Introduction to Databases

  • CSC401H1 — Natural Language Computing

  • CSC410H1 — Software Testing and Verification

  • JSC270H1 — Data Science I