CSC 395

Human-Centered Programming (Fall 2021)

Traditionally, the study of programming languages lies at the intersection of systems building and mathematical logic. We are interested in applying mathematical logic to build languages, tools, and processes that help us state and verify formal properties of programs. However, we do little in the way of verifying that these analyses and the resulting artifacts align with what actual developers need or want.

To address this concern, we will not only study programming languages from a mathematical perspective. We will also view a programming language as a general-purpose interface to a computational device. By doing so, we will apply human-centered design (HCD) techniques and the core principles of human-computing interaction (HCI) towards building better programming languages and tools.

By combining traditional programming languages concepts with HCI and HCD, we hope to understand:


Date Topic/Reading Lab Deliverables
F 08/27 Introductions
Week 1: Preliminaries
M 08/30 What is PL? Introduction to Haskell
W 09/01 Human-Centered Programming Brainstorming Problems with Programming
F 09/03 The Haskell Programming Language Elements of Haskell
Week 2: Principles of Interaction
M 09/06 Principles of Interaction Principles Applied to Programming
W 09/08 Algebraic Datatypes Algebraic Datatypes
F 09/10 Program Representation Writing Interpreters
Week 3: Observation and Needfinding
M 09/13 Design Thinking Project Formation
W 09/15 Observation and Needfinding Observing Programming
  • Demo #1 Revisions due
F 09/17 Case Study: Error Handling Error Handling in Interpreters
Week 4: The Gulfs of Execution and Evaluation
M 09/20 Emotion and Blame Discussion About Emotion
W 09/22 Notional Machines Discovering Notional Machines
  • Demo #2 Revisions due
F 09/24 Case Study: The Road to Monads The Road to Monads
Week 5: Ideation
M 09/27 Case Study: The Monad Abstraction A Monadic Puzzle
W 09/29 Ideation and Personas Programming Personas
  • Demo #3 Revisions due
F 10/01 The Academic Research Process Digging In
Week 6: Knowledge, Memory, and Learning
M 10/04 Storyboarding and Sketching Design Challenges
W 10/06 Knowledge in the Head and in the World Embedding Knowledge in the World
  • Demo #4 Revisions due
F 10/08 The Structure of Memory and Learning Project Reflections
Week 7: Prototyping and Evaluation
M 10/11 Designing with Memory in Mind Natural Mappings in Programming
W 10/13 Introduction to Prototyping Answering Questions with Prototypes
  • Demo #5 Revisions due
F 10/15 Lo-fi Prototyping
(Fall break: 10/18 to 10/22)
Week 8: Constraints and Design
M 10/25 Kinds of Constraints Constraints in Programming
W 10/27 Forces, Conventions, and Sound Kinds of Forces
F 10/29 Case Study: Type Systems Evaluating Types
Week 9: Feedback and Evaluation
M 11/01 Slips and Mistakes Slips and Mistakes
W 11/03 Designing for Errors Errors in Programming Case Study
F 11/05 Evaluating Design Heuristic Evaluation
Week 10: Interface Design Principles
M 11/08 Introduction to Interface Design Principles Memory and Design
W 11/10 Learning and Implications for Interface Design Designing Programming Tutorials
F 11/12 Visual Structure Gestalt and IDEs
Week 11: Aspects of Interface Design
M 11/15 Reading is Unnatural Project Day!
W 11/17 Physical Realities (No lab today, discussion!)
F 11/19 Emotional Realities Motivating Backups
Week 12: Applications to Programming Interfaces
M 11/22 Notation Notation
W 11/24 (No class, pre-Thanksgiving Break!)
(Thanksgiving Break: 11/25 and 11/26)
Week 13: Human-Centered Programming
M 11/29 Compiler Error Messages Compiler Error Messages
W 12/01 Usability of Types Efficacy of Type Systems
F 12/03 Accessibility Accessibility
Week 14: Wrap-Up
M 12/06 Live Programming Live Programming
W 12/08 The End of the Road
F 12/10 Final Project Presentations
Finals Week
F 12/17
  • Final Project due
  • All remaining work due