Applying Complexity Theory to Software
I just finished reading Emergence, written by Steven Johnson, which was recommended to me by Jeff Smith. I'd suggest this book to anyone who is looking to break out of the daily software development grind mentality, and wants to take a broader view of what is beginning to occur within the software industry. Johnson examines in-depth the history and growth of complexity theory, the studying of bottom-up systems and how they develop without authoritative figures. He writes some very interesting sections, which as a whole do a great job of linking the behaviors of social insects, urban communities, neurons and software development.
Johnson doesn't focus on the detailed inner-workings of software, but this book contains some really clever methods of problem solving that may lead you to new thoughts on your next project, and just might change how you think about everyone standing next to you on the El.
Some of his ideas tie very closely with Ray Kurzweil's thoughts on innovation via natural selection; here's a quick snippet:
But that control paradigm is slowly giving way to a more oblique form of programming: software that you "grow" instead of engineer, software that learns to solve problems autonomously, the way Oliver Selfridge envisioned with his Pandemonium model. The new paradigm borrows heavily from the playbook of natural selection, breeding new programs out of a varied gene pool. The first few decades of software development were essentially creationist in philosophy -- an almighty power that wills the program into being. But the next generation is profoundly Darwinian.
Much of Johnson's writing refers to a simple software simulation of slime mold, which has since evolved into StarLogo, an educational program for children. You can download it here.