### Fundamental Science, Software Design & Finding Primitives > At least the way I do it, doing software design is a lot like doing fundamental science. > > In fundamental science, one starts from a bunch of phenomena, and then one tries to drill down to find out what’s underneath them—to try to find the root causes, the ultimate primitives, of what’s going on. > > Well, in software design, one starts from a bunch of functionality, and then one needs to drill down to find out just what ultimate primitives one needs to support them. > > In science, if one does a good job at finding the primitives, then one can have a very broad theory that covers not just the phenomena one started from, but lots of others too. > > And in software design, it’s the same kind of thing. > > If one does a good job at finding the primitives, then one can build a very broad system that gives one not just the functionality one was first thinking about, but lots more too. > > We start with some particular new area of functionality. Then we get a rough description of the functions—or whatever—that we think we’ll need to cover it. Then we get down to the hard job of design analysis. Of trying to work out just what the correct fundamental primitives to cover the area are. The clean, simple functions that represent the essence of what’s going on—and that fit together with each other, and with the rest of _Mathematica_, to cover what’s needed. > > I want to understand things at the most fundamental level—to see what the essential primitives should be. Then I want to make sure those primitives are built so that they fit in as well as possible to the whole existing structure of _Mathematica_—and so they are as easy as possible for people to understand, and work with. A note on how this relates specifically to software design: > At least when we’re doing design reviews for _Mathematica_ kernel functions, we always have a very definite final objective for our meetings: we want to actually write the [reference documentation](http://reference.wolfram.com/mathematica/guide/Mathematica.html)—the “function pages”—for what we’ve been talking about. ### Problem Solving Core Primitives Note: Brainteasers often require and additional variable (think *color* in a red/black tree). Or algorithm development may require a core element such as random selection of an element (think *quicksort*). We can break down problem solving into **core primitives**. The same ### Chollet “Kernels of Structure” See the kaliedoscope theory in: [Abstraction and Reasoning in AI Systems](Abstraction%20and%20Reasoning%20in%20AI%20Systems.md). --- Date: 20221211 Links to: Tags: #review References: * [Ten Thousand Hours of Design Reviews—Stephen Wolfram Writings](https://writings.stephenwolfram.com/2008/01/ten-thousand-hours-of-design-reviews/) * [https://www.harvardlds.org/wp-content/uploads/2017/01/SpelkeKinzler07-1.pdf](https://www.harvardlds.org/wp-content/uploads/2017/01/SpelkeKinzler07-1.pdf)