Friday, October 17, 2014

System Design and Construction

Way back in my life, when I was considering getting out of hospital work, I decided to learn computer programming.  Although I had mixed feelings about computers, I was good with them and I enjoyed the logic of computer programming as well as the fact that if you did it right, you could make a computer do something.

Unfortunately, I realized that I was thinking about programming all the time and didn't like the way I felt-- sort of like I was trapped in computer thinking.  So I stopped studying computer programming, but every so often I find myself attracted to computer books.  Since one of the folks that I'm staying with works with and teaches about computers, he has some computer books lying around.  I picked up one and started to read it and was surprised to realize it was useful--not just for work with computers, but a lot of what the author is talking about seemed applicable to any type of design and planning work and seemed very systems oriented.

Of course, it isn't really surprising when I think about it because, just as the human body is a system composed of subsystems (see my last couple of posts), a computer program is a system composed of subsystems.  The book, Code Complete by Steve McConnell, proclaims on its cover that it's "A practical handbook of software construction".  While a lot of the book is about programming techniques (with a bunch of examples in 'code' or programming language), there's also a whole bunch of thinking that might be useful to anyone planning any type of project.  (Some of it reminds me of the way that Ben Falk approaches permaculture design--see my post called Resilient Farm, 8/25/14, for a bit more on that.)

Here's an odd place to start reviewing Code Complete but one of the books that the author references as a resource is The Sciences of the Artificial by Herbert Simon.  I hadn't heard of it before but McConnell says it "draws a distinction between sciences dealing with the natural world (biology, geology, and so on) and sciences that deal with the artificial world created by humans (business, architecture, and computer science).  It then discusses the characteristics of the sciences of the artificial, emphasizing the science of design."  (This book looks like something I will probably want to read.) Again, comparing this to Ben Falk, Falk points out the difference between natural systems and human created structures (like buildings) and the different care needed to give to each.  We can help natural systems evolve (and can design things to do this), but we need to actively design artificial systems like buildings, etc.  (And I think that communities have aspects of both.)  McConnell's book focuses on the design and construction of artificial systems--and it's important to understand that artificial systems are necessary, we just need to get them to support natural systems and not vice versa.

McConnell has a whole chapter entitled 'Measure Twice, Cut Once'.  That's advice I've often seen in books about construction and design.  Nevertheless, when I built a shelving unit at my cousins' house, I put it up fast, and then had to redo it, not once but twice.  We built a second shelving unit and this time we measured multiple times before we put it up--and it went up without a problem.  Yes, this stuff is important.

The book claims that growing is a good way to describe natural processes, but for design of artificial systems terms like accretion, building, and construction are more useful.  ("...building construction suggests careful preparation is needed and illuminates the difference between large and small projects.") McConnell point out the importance of problem definition and the problem with moving too quickly toward solutions before adequately defining the problem.  He covers design challenges such as 'wicked problems' and dealing with the fact that 'Design is a Sloppy Process (Even If it Produces a Tidy Result)'.

Here's another good quote from the book: "A study of great designers found that one attribute they had in common was their ability to anticipate change... Accommodating changes is one of the most challenging aspects of good program design."    McConnell even talks about the personality characteristics of good programmers (or, I would say, any good designers), which he claims are humility, curiosity, intellectual honesty, creativity and discipline, and what he calls 'enlightened laziness'.  He believes that the two ways to make laziness work for you are  1) "Doing an unpleasant task quickly to get it out of the way" and 2) "Writing a tool to do the unpleasant task so that you never have to do the task again".  (Or creating a process that does the task.)

There's lots more in here but this gives you an idea.  This is a book worth browsing if you want to get ideas on the basics of systems design and construction.

Quote of the Day:  "You need to experiment throughout the development process...  To experiment effectively you must be willing to change your beliefs based on the results of the experiment.  If you're not willing, experimentation is a gratuitous waste of time." - Steve McConnell

No comments: