Less is exponentially more
๐ Abstract
The article discusses the development of the Go programming language and why it has not attracted as many C++ programmers as expected, despite being designed for the same types of software. The author, who was involved in the creation of Go, explains the key differences in philosophy between Go and C++, with Go focusing on simplicity, composition, and ease of use rather than complete control and flexibility.
๐ Q&A
[01] Reasons for Go's Unexpected Adoption
1. What were the key reasons that Go did not attract as many C++ programmers as expected?
- The author explains that Go and C++ have fundamentally different philosophies - C++ is about having complete control and flexibility, while Go is focused on simplicity, composition, and ease of use.
- C++ programmers have "fought hard to gain exquisite control of their programming domain, and don't want to surrender any of it." To them, software is not just about getting the job done, but about doing it in a certain way.
- The author suggests that Go's success would contradict the worldview of C++ programmers who are excited about the new features in C++11.
2. What were the main simplifications and differences between Go and C++?
- The article lists over 30 significant simplifications in Go compared to C and C++, including:
- No header files, circular dependencies, or arithmetic conversions
- Garbage collection, implicit interfaces, and no constructors/destructors
- Simpler syntax, no templates or exceptions, and built-in data structures like slices and maps
- The author notes that despite these simplifications, Go is more expressive than C or C++, as it focuses on composition and coupling rather than type hierarchies.
3. How did the Go team approach the design of the language?
- The author explains that the Go team, including himself, Ken, and Robert, were C++ programmers who wanted to design a new language to solve the problems they faced in their work.
- They started by writing down a list of desiderata, focusing on the big picture rather than detailed syntax and semantics.
- The author notes that they didn't really start from C, but built Go from scratch, borrowing only minor things from C and other languages they knew.
[02] Go's Approach to "Programming in the Large"
1. How does Go's design approach differ from C++ and Java for large-scale software development?
- The author argues that the widely held belief that C++ and Java are better suited for "programming in the large" is a historical accident or industrial accident.
- He believes that big software needs strong dependency management, clean interface abstraction, and superb documentation tools, which are not well served by C++ (although Java does better).
- The author is confident that Go will turn out to be a superb language for programming in the large, as it focuses on composition, concurrency, and other features that support large-scale software development.
2. What are the key compositional techniques in Go that differentiate it from C++ and Java?
- The author highlights three key compositional techniques in Go:
- Interfaces, which allow the composition of components without caring about their underlying type.
- Concurrency, which enables the composition of independently executing computations.
- Embedding, a simple form of type composition.
- These compositional techniques give Go a profoundly different flavor compared to C++ or Java programs, which are more focused on type hierarchies and taxonomy.