We may earn an affiliate commission when you visit our partners.
Course image
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
Section 8 and Homework 6 (First Module with Ruby)
Let's get started programming with Ruby, including learning about Ruby's variant of (almost) function closures and the "inheritance and overriding" that is the essence of object-oriented programming. The welcome message has a few additional comments about "what makes Ruby different" and how to approach the (rather different) homework assignment, so let's get started...
Section 8 and Homework 6 (First Module with Ruby): Lesson Choices
Section 9 and Homework 7 (Second Module With Ruby)
Welcome to the second week of Part C where we will focus on how functional programming and object-oriented programming encourage such "exactly opposite" decompositions of problems that they are "more alike than you might realize". This is a key opportunity to synthesize much of what we have learned so far. As the welcome message discusses in more detail, we will go a bit beyond this to touch on some related advanced topics and then dive into the last -- and challenging -- programming assignment, which involves porting an interpreter from ML to Ruby.
Section 9 and Homework 7 (Second Module With Ruby): Lesson Choices
Section 10, Final Exam, and Course Wrap-Up
We have reached the last module of Programming Languages! We first study subtyping, how it relates to static types for object-oriented programming, and how it relates to generics. There is no assignment or quiz devoted only to this last "new material", but there is a "final exam" covering Part B and Part C of the course. Enjoy studying for the exam, and don't miss the final "wrap-up" lesson when you're all done!

Good to know

Know what's good
, what to watch for
, 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

Save Programming Languages, Part C to your list so you can find it easily later:
Save

Reviews summary

Highly rated programming languages course

Learners say this highly regarded Programming Languages course is well-structured and engaging. Assignments, quizzes, and exams are said to be challenging but fair. The course is described as packed with fruitful content and is especially well received by students who come from an OOP background. However, those with less experience may struggle with the pace and complexity.
Course content can be applied to real-world scenarios.
"You will be a better developer, no matter where you came from."
"you'll learn things about OOP that you will encounter in your daily job if you deal with Java/C++."
Assignments provide opportunities to practice concepts.
"It also has challenging homework which is good"
"Seeing other implementations in the peer reviews was interesting."
"I liked most of the programming assignments."
Offers a lot of valuable content.
"I learnt a lot from these courses."
"It was very dense in content, and challenging."
"This course covers many concepts in detail."
Course is well-organized with a clear structure.
"Wonderfully-structured class, the assignments and exams are well-thought-out."
"This concludes the three part series (an awesome trilogy!) on programming languages - and yet again, everything about this part in the series (structure, content, quizzes, programming assignments and exams (practice and final)) is great."
"Having all that this course still was completely awesome I had enourmous amount of fun taking it."
Professor is engaging and knowledgeable.
"Professor Grossman's enthusiasm helps a lot"
"Dan Grossman is the best instructor I have ever had."
"Dan said in the last lecture that he hoped to have shared some of the passion and awe about programming languages with us."
Prepare for some frustrating quizzes.
"The quizzes were only frustrating."
"I still will never know why I got the questions wrong that I did on the final or even on the practice quiz."
Course may be too challenging for beginners.
"This course is no piece of cake."
"It might be a bit hard to complete for a novices."
Prepare for a challenge.
"I often found myself lost in the pace and complexity"
"It is hard when you can't have an instructor go over things individually when you don't understand."

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

Here are nine courses similar to Programming Languages, Part C.
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 - 2024 OpenCourser