We may earn an affiliate commission when you visit our partners.
Take this course
Gregor Kiczales

As your program requirements get more complex, you will find that simple additions to the design method make it easy to write well-structured and well-tested code that is easy to maintain.

By learning how to capture common data and control structures using abstraction, your programs will get shorter and better tested.

Read more

As your program requirements get more complex, you will find that simple additions to the design method make it easy to write well-structured and well-tested code that is easy to maintain.

By learning how to capture common data and control structures using abstraction, your programs will get shorter and better tested.

Building on the core methods from How to Code: Simple Data, this programming course, part of the Software Development MicroMasters program, quickly expands to cover more complex programs on more complex data. Towards the end of the course, you will design programs that even experienced developers would find challenging.

You will also learn how to design search programs. You will design a program to solve Sudoku puzzles, and will be able to design many other puzzle solvers as well.

Learners who enroll in the Verified track will receive staff grading for the course project and increased interaction with the instructor and staff.


Learner Testimonial

"It's a great course and maybe one of the most important topics to master if you're a programmer (any level). This course will teach you how to design better, cleaner and faster programs." - Previous Student

What's inside

Learning objectives

  • How to identify commonalities in data definitions and functions
  • How to avoid repetition using abstraction
  • How to design functions that operate on graphs
  • How to design programs that search a given problem space to find a valid solution

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
Develops core programming skills in data structures, algorithms, and problem solving, which are key to software engineering
Focuses on abstraction, which is a key concept in software engineering and computer science
Led by Gregor Kiczales, a researcher and professor in the field of software engineering
Introduces object-oriented programming, an essential paradigm in software development
Teaches how to identify commonalities in data definitions and functions, a useful skill in software design

Save this course

Create your own learning path. Save this course to your list so you can find it easily later.
Save

Reviews summary

Designing programs with complex data

According to learners, this course provides an excellent foundation for designing well-structured and well-tested programs, especially when dealing with complex data structures. Students appreciate how it builds logically on the previous course, "How to Code: Simple Data." The unique design recipes taught are frequently highlighted as a valuable takeaway that helps in breaking down complicated problems. While the course material, particularly on graphs and search algorithms, can be challenging, reviewers generally find the assignments to be engaging and rewarding, pushing their understanding. The focus on abstraction and design methodology is seen as key to handling more advanced programming tasks.
Success depends on applying the methods.
"You really need to practice applying the design recipes on your own to master them."
"The course provides the framework, but applying it to new problems is key and takes practice."
"Simply watching lectures isn't enough; consistent practice with the design method is crucial."
Continues concepts from the first course.
"It's essential to have taken the first course, 'Simple Data,' or have equivalent knowledge to follow this one."
"This course is a perfect continuation and expansion of the design principles introduced previously."
"Coming from the 'Simple Data' course, I found this flowed very well and built upon the concepts effectively."
Homework requires effort but is rewarding.
"The assignments are challenging, but completing them gives you a real sense of accomplishment and learning."
"Be prepared to spend significant time on the homework problems; they require deep thinking."
"Some assignments felt quite difficult, but working through them solidified the design principles for me."
Introduces graphs, trees, and search.
"The sections on graphs and search algorithms were particularly insightful and well-explained."
"Learning how to design programs for recursive data like trees and graphs was a major plus for me."
"Tackling problems like the Sudoku solver really demonstrated the power of the design methods on complex data."
Teaches a systematic approach to coding.
"The design recipes are incredibly helpful for structuring thoughts and writing better code."
"I finally understand how to approach complex problems systematically thanks to the design methodology taught here."
"This course hammered home the importance of design before coding, which improved my process significantly."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in How to Code: Complex Data with these activities:
Review the basics of object-oriented programming
Refreshes your understanding of the fundamental concepts of object-oriented programming, which will help you better grasp the application and benefits of design patterns.
Show steps
  • Review online resources or tutorials on OOP basics
  • Practice writing simple OOP programs
Create a blog post or article about a specific design pattern
Helps you to synthesize and reinforce your understanding of a design pattern by explaining it to others in a clear and concise manner.
Browse courses on Design Patterns
Show steps
  • Choose a specific design pattern
  • Research and gather information
  • Write a blog post or article explaining the pattern
Follow online tutorials on specific design patterns
Provides structured and guided learning materials that can supplement your understanding of specific design patterns.
Browse courses on Design Patterns
Show steps
  • Search for online tutorials on the specific design pattern
  • Follow the tutorial step by step
  • Practice implementing the pattern in code
Five other activities
Expand to see all activities and additional details
Show all eight activities
Participate in a study group or discussion forum
Allows you to engage with other learners, ask questions, share insights, and learn from different perspectives on design patterns.
Browse courses on Design Patterns
Show steps
  • Find or join a study group or discussion forum
  • Actively participate in discussions
  • Share your understanding and help others
Start a personal project to apply design patterns
Gain hands-on experience with applying design patterns in a real-world setting, which will deepen your understanding and retention of the concepts.
Browse courses on Design Patterns
Show steps
  • Choose a project idea that aligns with the design patterns you want to apply
  • Design your solution using the appropriate design patterns
  • Implement your solution in code
Work on a design pattern delivery
Develop a software component or solution that utilizes one or more design patterns. This will solidify your understanding and demonstrate your ability to apply patterns in a practical context.
Browse courses on Design Patterns
Show steps
  • Identify a specific design pattern or set of patterns
  • Design and implement a software component or solution that incorporates the identified pattern(s)
  • Test and evaluate the implementation
Read 'Design Patterns: Elements of Reusable Object-Oriented Software'
Provide an understanding of design patterns, which are reusable solutions to commonly occurring problems in software design. This will help you write more maintainable and extensible code.
Show steps
  • Read the book
  • Take notes or summarize key concepts
  • Discuss the patterns with classmates or colleagues
Participate in coding challenges or design pattern competitions
Provides a fun and challenging way to test your understanding of design patterns and apply them in a competitive environment.
Browse courses on Design Patterns
Show steps
  • Identify a coding challenge or design pattern competition
  • Prepare for the competition
  • Participate in the competition and strive to solve the problem using design patterns

Career center

Learners who complete How to Code: Complex Data will develop knowledge and skills that may be useful to these careers:
Data Scientist
Data Scientists are responsible for analyzing data and extracting insights to help businesses make better decisions. By taking this course, you will learn how to design programs that search a given problem space to find a valid solution, a skill that is essential for Data Scientists who need to be able to identify patterns and trends in data. Additionally, you will learn how to avoid repetition using abstraction, which will help you to write more efficient and maintainable code.
Software Engineer
Software Engineers design, develop, and maintain software systems. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Software Engineers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Computer Programmer
Computer Programmers write and test code to create software applications. By taking this course, you will learn how to avoid repetition using abstraction, a skill that is essential for Computer Programmers who need to be able to write efficient and maintainable code. Additionally, you will learn how to design programs that search a given problem space to find a valid solution, a skill that is essential for Computer Programmers who need to be able to write code that can solve complex problems.
Data Analyst
Data Analysts collect, clean, and analyze data to help businesses make better decisions. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Data Analysts who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Business Analyst
Business Analysts help businesses to improve their performance by identifying and solving problems. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Business Analysts who need to be able to write reusable and maintainable code. Additionally, you will learn how to design programs that search a given problem space to find a valid solution, a skill that is essential for Business Analysts who need to be able to solve complex problems.
Systems Analyst
Systems Analysts design, develop, and maintain computer systems. By taking this course, you will learn how to design programs that search a given problem space to find a valid solution, a skill that is essential for Systems Analysts who need to be able to write code that can solve complex problems. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Web Developer
Web Developers design and develop websites. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Web Developers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Database Administrator
Database Administrators design, develop, and maintain databases. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Database Administrators who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
IT Architect
IT Architects design and develop IT systems. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for IT Architects who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Software Architect
Software Architects design and develop software systems. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Software Architects who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Data Engineer
Data Engineers design and develop data pipelines. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Data Engineers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Machine Learning Engineer
Machine Learning Engineers design and develop machine learning models. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Machine Learning Engineers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
User Experience Designer
User Experience Designers design and develop user interfaces. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for User Experience Designers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Project Manager
Project Managers plan and execute projects. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Project Managers who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.
Business Intelligence Analyst
Business Intelligence Analysts analyze data to help businesses make better decisions. By taking this course, you will learn how to identify commonalities in data definitions and functions, a skill that is essential for Business Intelligence Analysts who need to be able to write reusable and maintainable code. Additionally, you will learn how to design functions that operate on graphs, which will help you to write more efficient and scalable code.

Reading list

We've selected 24 books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in How to Code: Complex Data.
This multi-volume series provides a comprehensive treatment of computer science, covering topics such as algorithms, data structures, and programming languages. It valuable resource for learners who want to deepen their understanding of the fundamental concepts of computer science.
This classic textbook provides a comprehensive introduction to computer science, covering topics such as data structures, algorithms, and programming languages. It valuable resource for learners who want to deepen their understanding of the fundamental concepts of computer science.
It classic textbook that provides a comprehensive overview of algorithms, with a focus on theoretical foundations and mathematical analysis.
It multi-volume series of books that provides a comprehensive overview of computer programming, with a focus on algorithms and data structures.
This textbook provides a comprehensive introduction to algorithms, covering topics such as sorting, searching, and graph algorithms. It valuable resource for learners who want to develop their algorithmic thinking skills.
Provides a foundation in discrete mathematics, which is essential for computer science. It valuable resource for learners who want to deepen their understanding of the mathematical concepts used in computer science.
This textbook provides a comprehensive introduction to algorithms, covering topics such as sorting, searching, and graph algorithms. It valuable resource for learners who want to develop their algorithmic thinking skills.
It book that provides a comprehensive overview of discrete mathematics, with a focus on applications in computer science.
This practical handbook provides guidance on software development best practices, covering topics such as coding standards, testing, and debugging. It valuable resource for learners who want to improve their software development skills.
Provides practical advice on writing clean and maintainable code. It valuable resource for learners who want to improve their coding skills.
Provides practical advice on refactoring code, which is the process of improving the design of existing code. It valuable resource for learners who want to improve their software development skills.
Provides a visual introduction to design patterns. It valuable resource for learners who want to learn about design patterns in a fun and engaging way.
It classic book that provides a catalog of design patterns, which are reusable solutions to common software design problems.
It book that provides a comprehensive overview of object-oriented design and analysis, with a focus on UML and other industry-standard tools and techniques.
It book that provides a set of principles and practices for writing clean and maintainable code.
It classic book that provides a collection of essays on software engineering, with a focus on the challenges and pitfalls of large-scale software development.
It book that provides a practical guide to managing software development teams and projects.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser