We may earn an affiliate commission when you visit our partners.
Dan Grossman

[As described below, this is Part C of a 3-part course. Participants should complete Parts A and B first -- Part C "dives right in" and refers often to material from Part A and Part B.]

This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course uses the languages ML, Racket, and Ruby as vehicles for teaching the concepts, but the real intent is to teach enough about how any language “fits together” to make you more effective programming in any language -- and in learning new ones.

Read more

[As described below, this is Part C of a 3-part course. Participants should complete Parts A and B first -- Part C "dives right in" and refers often to material from Part A and Part B.]

This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course uses the languages ML, Racket, and Ruby as vehicles for teaching the concepts, but the real intent is to teach enough about how any language “fits together” to make you more effective programming in any language -- and in learning new ones.

This course is neither particularly theoretical nor just about programming specifics -- it will give you a framework for understanding how to use language constructs effectively and how to design correct and elegant programs. By using different languages, you will learn to think more deeply than in terms of the particular syntax of one language. The emphasis on functional programming is essential for learning how to write robust, reusable, composable, and elegant programs. Indeed, many of the most important ideas in modern languages have their roots in functional programming. Get ready to learn a fresh and beautiful way to look at software and how to have fun building it.

The course assumes some prior experience with programming, as described in more detail in the first module of Part A. Part B assumes successful completion of Part A.

The course is divided into three Coursera courses: Part A, Part B, and Part C. As explained in more detail in the first module of Part A, the overall course is a substantial amount of challenging material, so the three-part format provides two intermediate milestones and opportunities for a pause before continuing. The three parts are designed to be completed in order and set up to motivate you to continue through to the end of Part C.

Week 1 of Part A has a more detailed list of topics for all three parts of the course, but it is expected that most course participants will not (yet!) know what all these topics mean.

Enroll now

What's inside

Syllabus

Introduction, Course-Wide Information, and Software Installation (Start Here)
Welcome! Start here! Learn about this course and how it's organized.
Read more

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
Suitable for experienced learners with background knowledge in programming
Delves into functional programming concepts, essential for understanding elegant and robust programming
Emphasizes how different programming paradigms, like functional and object-oriented programming, can complement each other
Covers advanced topics like subtyping and generics, extending learners' understanding of object-oriented programming and static types
Features hands-on learning through programming assignments, providing practical application of the concepts taught

Save this course

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

Reviews summary

Challenging deep dive into programming languages

According to learners, this is a challenging yet rewarding capstone to the Programming Languages series. Students found the course offers a profound synthesis of functional and object-oriented programming concepts, particularly through its use of Ruby. The final programming assignment, porting an interpreter, is highlighted as significantly demanding but a highly valuable practical exercise that solidifies understanding. While the material on topics like subtyping and generics is appreciated for its depth, the overall difficulty and time commitment are frequently mentioned as potential hurdles, reinforcing the need for a solid foundation from Parts A and B.
Clear explanation of complex types
"The lessons on subtyping and its relation to generics were explained very clearly, helping me understand these tricky topics."
"Section 10 provided a solid introduction to subtyping, which was new material for me and felt important for a complete PL overview."
"I found the final module on subtyping to be well-structured and easy to follow despite the complexity of the subject matter."
Effective vehicle for advanced topics
"Using Ruby to demonstrate object-oriented features like inheritance and mixins was a great choice; it made the concepts clear."
"While I wasn't familiar with Ruby before, it turned out to be a good language for illustrating the concepts taught in Part C."
"The lectures did a good job introducing just enough Ruby to understand the language features relevant to the course topics."
Excellent integration of paradigms
"The way the course ties together functional programming ideas with object-oriented design in Ruby was insightful and truly eye-opening."
"I appreciated how Section 9 compared and contrasted the two programming paradigms, showing how they can be surprisingly similar in practice."
"This part of the course brilliantly synthesizes the concepts from A and B, showing a more unified view of programming languages."
Demanding but valuable hands-on experience
"The interpreter project in Ruby was tough, but it was probably the most valuable programming assignment of the whole series. It really forces you to apply the concepts."
"Spending a lot of time on the final project (porting the interpreter) paid off; I feel like I finally understood how everything connects."
"The final homework was a significant challenge and time sink, but felt like a worthwhile conclusion to the series."
Requires significant effort and focus
"Part C was definitely the hardest part of the series. Be prepared to dedicate a lot of time, especially for the final project."
"Even after doing Parts A and B, I found this module challenging. Don't underestimate the workload."
"The pace is fast, and the concepts, particularly subtyping and generics, require careful study outside of the lectures."

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 Programming Languages, Part C with these activities:
Gather Ruby programming resources
Maintain a repository of useful Ruby resources for quick reference and further learning.
Show steps
  • Identify and collect articles, tutorials, documentation, and code examples.
  • Organize the resources based on topics or categories.
  • Create a document or website to store and share the resources.
Read 'The Well-Grounded Rubyist'
Gain a deeper understanding of Ruby's design, implementation, and best practices.
Show steps
  • Purchase or borrow a copy of 'The Well-Grounded Rubyist'.
  • Read and study the book thoroughly.
  • Complete the exercises and examples provided in the book.
  • Discuss the concepts covered in the book with other learners or mentors.
Design and implement a simple Ruby program
Reinforce the principles of object-oriented programming and language fundamentals by building a project from scratch.
Show steps
  • Define the requirements and design the program.
  • Create classes, objects, and methods.
  • Write code to implement the program's functionality.
  • Test and debug the program.
  • Deploy or share the program.
Five other activities
Expand to see all activities and additional details
Show all eight activities
Form a Ruby study group
Enhance understanding and retention by discussing concepts with peers and working on projects together.
Show steps
  • Find fellow students who are interested in forming a study group.
  • Set regular meeting times and establish a communication channel.
  • Prepare and discuss topics, work on assignments together, and share resources.
Attend a Ruby community workshop
Connect with other Ruby enthusiasts, share knowledge, and stay updated on the latest trends.
Browse courses on Community Involvement
Show steps
  • Find a Ruby community workshop or meetup.
  • Register and attend the workshop.
  • Participate in discussions, ask questions, and network with other attendees.
  • Follow up with any contacts or resources obtained at the workshop.
Find and debug errors in Ruby code
Practice error handling and language fundamentals by identifying and fixing bugs in Ruby code.
Browse courses on Exception Handling
Show steps
  • Test the fixed codebase to verify that the errors are resolved.
  • Locate a Ruby codebase with known bugs.
  • Set up the Ruby environment and run the codebase.
  • Identify and analyze the errors reported.
  • Fix the errors by modifying the Ruby code.
Build a basic Ruby web application
Apply the concepts of web development using Ruby by creating a simple web application.
Browse courses on Web Development
Show steps
  • Find a tutorial on building a web application using Ruby on Rails.
  • Follow the tutorial and create the application.
  • Deploy the application to a hosting platform.
  • Test the application and ensure it functions as intended.
Develop a presentation on Ruby's object system
Solidify understanding of Ruby's object system by explaining it to others.
Browse courses on Communication
Show steps
  • Research and gather information on Ruby's object system.
  • Create a presentation outline and slides.
  • Practice presenting the material.
  • Deliver the presentation to an audience.
  • Get feedback and reflect on the presentation.

Career center

Learners who complete Programming Languages, Part C will develop knowledge and skills that may be useful to these careers:
Software Engineer
Software Engineers design, develop, and test software applications. Gaining a strong foundation in programming principles is crucial for anyone wishing to become a Software Engineer. This course helps build that foundation and specifically emphasizes functional programming, which is essential for writing robust, reusable, and elegant programs.
Computer Programmer
Computer Programmers write and test code that allows computer applications and software programs to run. To be successful in this role, a strong foundation in programming fundamentals is important. This course provides that foundation and can prepare learners to write understandable, reusable, component-based code that emphasizes correctness and elegance.
Web Developer
Web Developers design and create websites. A strong foundation in programming concepts is a must. This course provides a strong foundation in programming languages and concepts. Specifically, the emphasis on functional programming can help Web Developers write code that is robust, reusable, and elegant.
Mobile Application Developer
Mobile Application Developers design, develop, and test mobile apps for devices such as smartphones and tablets. A thorough knowledge of programming principles is needed to be an effective Mobile Application Developer. This course provides a deep understanding of programming fundamentals and places an emphasis on functional programming, which can aid in writing robust, reusable, and elegant code.
Data Scientist
Data Scientists use scientific methods, processes, algorithms, and systems to extract knowledge and insights from structured and unstructured data. To become a successful Data Scientist, it is important to have a background in programming and an understanding of functional programming principles. This course can help build that background and provide a foundation in functional programming, which is key for writing robust, reusable, and elegant code.
Database Administrator
Database Administrators manage and maintain databases. To do this effectively, they need a solid foundation in programming languages and an understanding of database systems. This course provides a strong foundation in programming principles and specifically emphasizes functional programming, which can help Database Administrators write robust, reusable, and elegant code that interacts with databases.
Systems Analyst
Systems Analysts design and implement computer systems. To be successful in this role, a strong foundation in programming principles is necessary. This course provides a thorough understanding of programming languages and concepts. Particularly, the emphasis on functional programming can help Systems Analysts write code that is robust, reusable, and elegant.
Information Security Analyst
Information Security Analysts plan and implement security measures to protect an organization's computer networks and systems. To be effective in this role, it is important to have a foundation in programming languages and an understanding of secure coding practices. This course provides a solid understanding of programming principles and emphasizes functional programming, which can help Information Security Analysts write robust, reusable, and elegant code that is secure and reliable.
Software Test Engineer
Software Test Engineers test software applications to ensure they are working as intended. To be successful in this role, a strong foundation in programming principles is required. This course provides a clear understanding of programming languages and concepts. The focus on functional programming can help Software Test Engineers write robust, reusable, and elegant test scripts.
Technical Writer
Technical Writers create user guides, technical manuals, and other documentation for software and hardware products. To be successful in this role, it's important to have a background in programming and an understanding of technical concepts. This course provides a thorough understanding of programming principles and can help build foundational programming knowledge. Especially, the emphasis on functional programming can aid Technical Writers in understanding and explaining complex programming concepts to non-technical audiences.
Quality Assurance Analyst
Quality Assurance Analysts test software products to ensure they meet quality standards. To be effective in this role, a solid foundation in programming and an understanding of testing methodologies is needed. This course provides a thorough understanding of programming principles and also emphasizes functional programming, which can help Quality Assurance Analysts write robust, reusable, and elegant test scripts.
User Experience Designer
User Experience Designers enhance the user experience of websites and software applications. To be successful in this role, it is important to have an understanding of programming concepts and human-computer interaction principles. This course provides a strong foundation in programming languages and principles and can help User Experience Designers build a foundation in programming. In particular, the emphasis on functional programming can aid in writing robust, reusable, and elegant code.
Product Manager
Product Managers oversee the development and launch of new products. To be successful in this role, a strong understanding of programming languages and principles is important. This course provides a solid foundation in programming languages and concepts, which can aid Product Managers in understanding the technical aspects of product development and communicating effectively with engineering teams. The emphasis on functional programming can help Product Managers understand the principles behind writing robust, reusable, and elegant code.
Business Analyst
Business Analysts analyze business needs and design solutions to improve business processes. To be effective in this role, it's important to have a background in programming and an understanding of business principles. This course provides a solid understanding of programming principles and can help build foundational programming knowledge. In particular, the emphasis on functional programming can aid Business Analysts in understanding and analyzing complex business processes.
Project Manager
Project Managers oversee and manage projects from start to finish. To be successful in this role, a strong foundation in programming and project management principles is important. This course provides a thorough understanding of programming principles and can help build foundational programming knowledge. The emphasis on functional programming can aid Project Managers in understanding the technical aspects of projects and communicating effectively with engineering teams.

Reading list

We've selected seven 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 Programming Languages, Part C.
This classic textbook provides a comprehensive introduction to programming and computer science. It is written in a clear and concise style, and it covers a wide range of topics, from basic programming concepts to advanced topics such as recursion and object-oriented programming.
Comprehensive guide to the Ruby programming language. It covers all aspects of the language, from basic syntax to advanced topics such as metaprogramming and concurrency.
Comprehensive guide to functional programming in Scala. It covers all aspects of the topic, from basic concepts to advanced topics such as monads and type classes.
Classic introduction to the Scheme programming language. It is written in a clear and concise style, and it covers a wide range of topics, from basic programming concepts to advanced topics such as recursion and lambda calculus.
Comprehensive guide to the Haskell programming language. It covers all aspects of the language, from basic syntax to advanced topics such as monads and type classes.
Comprehensive guide to functional programming in Haskell. It covers all aspects of the topic, from basic concepts to advanced topics such as monads and type classes.
Comprehensive guide to the Clojure programming language. It covers all aspects of the language, from basic syntax to advanced topics such as macros and concurrency.

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