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

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

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 B of a 3-part course. Participants should complete Part A first -- Part B "dives right in" and refers often to material from Part A.]

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
Covers topics in functional programming, which is an important and widely used paradigm
Examines benefits of static typing and dynamic typing, while contrasting the two
Taught by a professor from Brown University, a recognized institution for its work in computer science
Emphasizes teaching participants to be more effective in programming in any language
Structured with three progressive parts, providing intermediate milestones
Starts with a welcome module to introduce course to new students and their different approaches to learning

Save this course

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

Reviews summary

Advanced concepts in programming languages

According to learners, Programming Languages, Part B provides a challenging yet highly rewarding exploration of key programming language concepts, particularly focusing on functional programming paradigms through the lens of Racket. Students frequently highlight the course's strength in building upon material from Part A, making it a necessary continuation for those serious about the topic. The comparison between static and dynamic typing is noted as particularly insightful. While the assignments are often described as difficult and time-consuming, many feel they offer a deep and practical understanding of the material. The course is best suited for those with a solid foundation from Part A and a willingness to tackle demanding problems.
Good dive into Racket language.
"Learning Racket in this depth was a fantastic experience and opened my eyes to new ways of thinking."
"The course does a great job using Racket to illustrate complex functional programming ideas."
"I appreciated the focus on Racket idioms and how they differed from ML."
Clear explanation of static vs dynamic typing.
"The module comparing static and dynamic typing using ML and Racket was incredibly clarifying."
"Gained a much deeper understanding of the trade-offs between different typing systems after this section."
"This part alone made the course worthwhile for me; it connected a lot of dots."
Effectively continues and requires Part A.
"This course truly builds on the foundation from Part A; I couldn't have taken this one without it."
"It felt like a natural and essential progression from the previous part of the series."
"Definitely needed to have completed Part A thoroughly to keep up with the pace and concepts here."
Assumes solid programming background.
"This course is definitely not for beginners; you need solid programming skills coming in."
"If you struggled with Part A or lack programming fundamentals, Part B will be very difficult."
"It moves at a fast pace and assumes you are comfortable picking up new language paradigms quickly."
Homework is demanding and requires effort.
"The programming assignments were significantly more challenging than expected, requiring deep thought."
"I spent a considerable amount of time on the homework, but I learned a lot from struggling through it."
"Be prepared for difficult problems that really test your understanding, they are not trivial."

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 B with these activities:
Organize and Review Course Materials
Staying organized and reviewing materials regularly will help you retain the information and perform better on assessments.
Show steps
  • Create a system for organizing notes, assignments, and other course materials, both digital and physical.
  • Regularly review your notes and materials to reinforce your understanding and identify areas where you need further clarification.
  • Use flashcards or other techniques to memorize key concepts and definitions.
Find a Mentor in Functional Programming
A mentor can provide valuable guidance and support throughout your learning journey.
Browse courses on Mentorship
Show steps
  • Attend meetups or conferences related to functional programming and networking with professionals in the field.
  • Reach out to professors, researchers, or industry experts who specialize in functional programming and express your interest in mentorship.
  • Clearly define your goals and expectations for mentorship and communicate them to potential mentors.
Review Introduction to Computer Science
Review of the core concepts of computer science will lay a helpful foundation for this course.
Show steps
  • Review basic programming concepts using an online tutorial or textbook.
  • Complete practice problems and exercises to reinforce your understanding.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Read Structure and Interpretation of Computer Programs
This classic text provides a comprehensive and in-depth exploration of foundational concepts in computer science and programming, including functional programming.
Show steps
  • Read through the chapters and work through the exercises to grasp the fundamentals of programming and functional programming paradigms.
  • Discuss the concepts with classmates or online forums to enhance your understanding and gain different perspectives.
  • Apply the knowledge gained from the book to your coding projects and assignments.
Practice with Racket
Practice is key to understanding the functional programming concepts taught in this course, and Racket is a great language for practicing.
Browse courses on Racket
Show steps
  • Solve coding problems using Racket, focusing on concepts like recursion, higher-order functions, and lazy evaluation.
  • Participate in online coding challenges or contribute to open-source Racket projects.
Explore Functional Programming Concepts
This course provides a solid foundation in functional programming, so taking the time to explore these ideas further will enhance your learning experience.
Browse courses on Functional Programming
Show steps
  • Find online tutorials or courses that cover advanced functional programming topics like monads, category theory, and type systems.
  • Watch videos or read articles about real-world applications of functional programming in industry.
  • Experiment with different functional programming languages like Haskell, OCaml, or F# to compare and contrast their features.
Build a Functional Programming Project
Applying what you've learned to a practical project will solidify your understanding and demonstrate your skills.
Browse courses on Functional Programming
Show steps
  • Identify a problem or idea that can be solved using functional programming techniques.
  • Design and implement your project using a functional programming language of your choice.
  • Test and refine your project to ensure it meets your requirements and demonstrates functional programming principles.
  • Document your project, including a description of the problem, your approach, and any challenges you encountered.

Career center

Learners who complete Programming Languages, Part B will develop knowledge and skills that may be useful to these careers:
Software Developer
A Software Developer designs, develops, and maintains software applications. This course is an excellent fit for this role because it provides a comprehensive understanding of programming languages and their design principles, which are essential for developing robust and efficient software applications.
Machine Learning Engineer
A Machine Learning Engineer designs and develops machine learning algorithms and models. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing machine learning algorithms.
Artificial Intelligence Engineer
An Artificial Intelligence Engineer designs, develops, and maintains artificial intelligence systems. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing AI algorithms.
Data Scientist
A Data Scientist analyzes data to extract insights and develop predictive models. This course may be useful for this role because it provides a foundation in programming languages and data structures, which are essential for manipulating and analyzing large datasets.
Blockchain Developer
A Blockchain Developer designs and develops blockchain-based applications and systems. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for implementing and optimizing blockchain-based systems.
Computer Systems Analyst
A Computer Systems Analyst analyzes and designs computer systems. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for designing and implementing efficient computer systems.
DevOps Engineer
A DevOps Engineer designs and implements DevOps processes and tools. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for developing and managing DevOps tools and pipelines.
Cloud Architect
A Cloud Architect designs and implements cloud computing solutions. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation, which are essential for developing and managing cloud-based applications and services.
Information Security Analyst
An Information Security Analyst designs, implements, and maintains information security systems. This course may be useful for this role because it provides a strong foundation in programming languages and their implementation, which are essential for developing secure and reliable security systems.
Database Administrator
A Database Administrator designs, implements, and maintains databases. This course may be useful for this role because it provides a deep understanding of data structures and their implementation, which are essential for designing and managing efficient databases.
Game Developer
A Game Developer designs and develops video games. This course may be useful for this role because it provides a strong foundation in programming languages and their implementation, which are essential for developing complex and engaging game applications.
Web Developer
A Web Developer designs and develops websites and web applications. This course may be useful for this role because it provides a foundation in programming languages and their implementation, which are essential for building dynamic and interactive web applications.
Network Engineer
A Network Engineer designs, implements, and maintains computer networks. This course may be useful for this role because it provides a deep understanding of programming languages and data structures, which are essential for developing and managing efficient networks.
Computer and Information Systems Manager
A Computer and Information Systems Manager plans, coordinates, and directs computer-related activities in an organization. This course may be useful for this role because it provides a deep understanding of programming languages and their implementation.
Computer and Information Research Scientist
A Computer and Information Research Scientist designs, develops, and evaluates computer and information systems. This course may be useful for this role because it provides a strong foundation in programming languages and their design.

Reading list

We've selected 14 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 B.
Covers advanced topics in type theory and programming languages, including type systems, lambda calculus, and semantics. It valuable resource for those who want to gain a deeper understanding of the theoretical foundations of programming languages.
This book, often referred to as SICP, widely-used textbook that delves into the foundations of computer science and programming, including topics such as data structures, algorithms, and programming paradigms. It provides a solid theoretical basis for the concepts covered in the course.
Provides a comprehensive and up-to-date overview of programming languages and their compilers. It good resource for those who want to gain a deeper understanding of the design and implementation of programming languages.
Guides readers through the process of building interpreters for various programming languages, including a functional language. It complements the course's emphasis on the implementation of programming languages and provides practical insights into how interpreters work.
Provides a comprehensive overview of compiler implementation, using the ML programming language. It valuable resource for those who want to gain a deeper understanding of the process of translating high-level code into machine code.
This comprehensive textbook covers a wide range of programming language concepts, including syntax, semantics, type systems, and programming paradigms. It provides a more general overview of programming languages than the course's focus on functional programming.
Presents a collection of case studies in artificial intelligence programming using Common Lisp, a dialect of Lisp that is similar to Racket, one of the languages used in the course. It provides examples of how to apply functional programming techniques to solve real-world problems.
Provides a concise and accessible introduction to programming languages, covering core concepts such as syntax, semantics, types, and evaluation. It good starting point for those who are new to the field.
Focuses on the practical aspects of programming in Haskell, a purely functional programming language. It provides a hands-on approach to learning the language and its features, which can be beneficial for understanding the concepts covered in the course.
Provides a comprehensive overview of the Lisp programming language, covering both its history and its modern incarnations. It valuable resource for those who want to gain a deeper understanding of the Lisp family of languages, including Racket.
Focuses on the principles and techniques for designing effective software programs. It valuable resource for those who want to improve their programming skills and learn how to write more maintainable and extensible code.
Uses a simplified version of the Scheme programming language to introduce core computer science concepts. It good resource for gaining a deeper understanding of the foundations of programming.
Provides a detailed introduction to the Ruby programming language, which is one of the languages used in the course. It practical guide that covers both the basics and more advanced topics, including object-oriented programming and metaprogramming.
Provides an introduction to the Forth programming language, which is known for its simplicity and efficiency. It good resource for those who want to learn a different programming paradigm and gain insights into low-level programming.

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