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):

鈥淚 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鈥檒l be familiar with how to manage a large codebase, and you鈥檒l 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鈥檛 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鈥檙e trying to learn or develop or design. Maybe you can get on a call and co-work so you can ask occasional questions. You鈥檙e learning the material, and there鈥檚 a lot of it, and it鈥檚 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鈥檚 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鈥檙e 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鈥檛 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鈥檒l 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鈥檒l be expected to know how to use the debugger and to think at a more abstract level.

  • You鈥檒l 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鈥檒l 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鈥檚 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鈥檙e not going to be able to go to a meeting, let your team know right away. If you don鈥檛 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鈥檝e 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