========================================================================== videla-metaphors-cacm2017 ========================================================================== A. Videla, "Metaphors We Compute By." Communications of the ACM, 60(10):42-45, Oct 2017. After we finish Topic 9 on ADTs, students often ask, "If the low-level list and vector ADTs already provide all of the functions necessary for implementing high-level ADTs such as sequences, stacks, queues, sets, and maps, why don't we just directly use the low-level ADT?" In other words, why not just directly use the low-level list ADT's push_back and pop_back methods if we want to implement a stack? What is the point of explicitly using a stack ADT, especially since the stack ADT interface is more restrictive? This article helps answer this very important question. The article discusses how metaphors affect the way we structure code and implement data structures and algorithms. If a programmer explicitly chooses to use a stack ADT vs. a list ADT, then the programmer is attempting convey deeper meaning on how the ADT fits into the overall program. When other programmers read code which uses a stack ADT, they immediately know that data will only be pushed onto the stack and popped off of the stack. The stack ADT enables the programmer to use a metaphor to convey meaning. Similarly, a programmer could certainly use a vector to store unique items in a set. However, if the programmer instead explicitly chooses to use a set ADT, then the programmer is using a metaphor to convey meaning. When other programmers read code which uses a set ADT, they will immediately know that the items in the set should be unique and that the order of the items in the set is not important. In this course, we often discuss the principles and practices of programming. The lectures focus on fundamental principles (e.g., conditional and iteration statements, static typing, stack and heap diagrams, abstraction, interface, implementation, abstract data types, algorithm analysis), while the programming assignments focus on applied practices (e.g., Linux development environment, compiler toolflows, incremental and test-driven design, distributed version control, continuous integration, code coverage analysis). There is a third aspect which is more difficult to teach: the _art_ of programming. As the article discusses, the art of programming requires programmers to "tell a story with their code, explaining how they solved a particular problem." Carefully following coding conventions is part of the the art of programming, but it is analogous to using good grammar in a novel. The true art of programming is how you tell a story through your code.