// HACKER NEWS — CYBERSECURITY
Could a computer scientist build a brain?
How does a brain wire itself, starting from a single cell, using only the information encoded in a genome? We pose this as an engineering problem: Write a program that a single cell executes to build itself into a brain. The program must be small enough to fit in a genome, and fast enough to finish within developmental time. A computer scientist who knows little about biology quickly realizes why the obvious strategies, which developmental biology has rejected experimentally, fail at scale: The genome is too small to store per-synapse wiring, and axons searching blindly for targets would take too long. These same algorithmic constraints drive the design toward solutions that resemble the developmental strategies organisms actually use. That the same solution structure falls out of scaling limits as out of evolution suggests that features of neural development can be grounded in computational necessity rather than contingency alone. Where earlier thought experiments reached discouraging conclusions about the ability of a biologist to fix a radio1, or to understand a microprocessor2, the news here is better: The design of the brain may be recoverable, not from taking it apart, but from asking how a genome must specify it in the first place.
Suppose we hand a computer scientist the complete wiring diagram of a brain and ask: Write a program that a single cell executes to elaborate itself into this network. The program must fit in a genome-sized instruction set of about 1 gigabyte, and it must halt within a developmental time window of at most about a year. The challenge is that the algorithm must scale: It should work for the 302 neurons of C. elegans, the 10510^{5}105 neurons of a fly, the 10810^{8}108 neurons of a mouse3, and the 101010^{10}1010 neurons of a human brain4 (Fig. 1). How would someone with no knowledge of developmental biology approach this problem?
The computer scientist is, in effect, formalizing a task in the spirit of Turing5, von Neumann6, Waddington7, and Brenner8, who all saw the genome as a set of instructions for making an organism rather than a description of one. Formalizing the task helps to identify the algorithmic strategies that are both feasible and tractable. Working through the exercise, we find that strategies that work for a small nervous system hit hard walls as the network grows, and the constraints narrow the field to a small class of solutions. The convergence between theory and experiment informs both directions. For developmental neuroscientists, it formalizes familiar molecular mechanisms as solutions to a well-defined algorithmic problem and picks out which features of those mechanisms are computational necessities and which are free to vary. For theorists, it presents biological development as a system that solves an as-yet-unsolved computational task. Modern machine learning does not yet know how to generate large functional networks from compact descriptions, relying instead on either a large stored weight matrix copied from disk, or a training set that is orders of magnitude larger9. The initial zygote contains exactly such a description, and analyzing the developmental process may help inspire new algorithms for artificial systems.
What does it mean to write a developmental program10–14? The computer scientist does not get to place neurons and wire them up from the outside, like an engineer soldering a circuit board. Instead, she must write a set of instructions that go into a single initial cell, and then she walks away. This initial cell divides, and each daughter inherits the same program and runs it independently. Each instance of the program can read only what it can sense locally: its own internal state along with molecular signals from its neighbor cells that are themselves running the same program. The cell performs actions that will build the brain: It divides, migrates, extends growth cones that navigate by reading molecular cues and form synapses upon arrival. The en