tag:blogger.com,1999:blog-84537333151260803392024-03-13T14:57:56.774-04:00Object Reference Not SetSteve Salterhttp://www.blogger.com/profile/01706560630255032002noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-8453733315126080339.post-58720553263002721972013-12-15T18:18:00.000-05:002013-12-15T18:18:08.812-05:00Programming in the Real World, part 2I found this article over at Ars Technica which answers the same question I posed in this blog earlier. Some good comments there.<br />
<br />
<b><a href="http://arstechnica.com/information-technology/2013/12/whats-the-difference-between-college-level-and-corporate-programming/" target="_blank">What’s the difference between college-level and corporate programming?</a></b><br />
<a href="http://arstechnica.com/information-technology/2013/12/whats-the-difference-between-college-level-and-corporate-programming/">http://arstechnica.com/information-technology/2013/12/whats-the-difference-between-college-level-and-corporate-programming/</a><br />
<br />Steve Salterhttp://www.blogger.com/profile/01706560630255032002noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-86195537885185756002013-03-28T23:43:00.000-04:002013-03-28T23:43:27.981-04:00Programming in the Real World<br />
I've been thinking a lot recently about the difference between how I program now versus what I thought programming was in college, in part because I've had the task of trying to convey that difference to several very bright and energetic recent graduates. <br />
<br />
Here is some food for thought:<br />
<br />
<b>Choosing what to work on is choosing what not to work on.</b><br />
<br />
There's always more work than time. You have to choose wisely what is worth the effort, not from some snobby sense of code righteousness, but from what is most important for your users, what develops your application towards the ideal, and what can deliver the best experience for the investment.<br />
<br />
<b>Every change carries risk.</b><br />
<br />
Even trivial changes can break things in ways you may not discover until later. A code refactoring that shouldn't theoretically make a difference opens the door to unpredictable outcomes. It's better to leave something alone if you aren't willing to test it.<br />
<br />
<b>Simplicity is better than elegance.</b><br />
<br />
I love perl, but perl has a <a href="http://www.perl.com/pub/2000/01/10PerlMyths.html" target="_blank">bad reputation</a> for being unreadable. A perl guru can probably solve a string manipulation problem in one line, no matter how complex. Good luck maintaining that in the future, or getting someone else to maintain it.<br />
<br />
<b>Making it easy to understand is important for the future you.</b><br />
<br />
There's a myth out there about programmers writing obscure code as "job security". This is baloney. Job security comes from doing good, dependable work, and writing unmaintainable programs will only make it harder on yourself later. Writing code that's easy to understand isn't just for other people. When you have a project that lasts longer than a semester (mine is over 7 years old now), you will not be able to remember it all, and having confusing method or variable names will only degrade your own productivity.<br />
<br />
<b>The art is in how you organize.</b><br />
<br />
Figuring out what the algorithm is will only solve half the problem. The implementation of an algorithm does not necessarily suggest a class hierarchy, method organization, or a data structure; you still have to implement that algorithm in some form. This is where the true artistry comes in, to be able to express the algorithm in a way that is correct, minimal, efficient, and easy to understand. And the only thing you have to work with is how you organize all the pieces.<br />
<br />
<br />
<b>The interface matters.</b><br />
<br />
What do you call this method? Is it public or private? If it's public, can it successfully be executed out of context, or does it have dependencies that will cause it to break? How your class presents to the outside world, and whether it delivers what it advertises, will make or break its usefulness to other members of your team.<br />
<br />
<br />
<b>Plan for the future, but implement for the present.</b><br />
<br />
You want your code to be extensible in ways that allow it to grow. But you don't want to spend all of your time implementing all of that growth at the beginning. Create an architecture that allows for growth, but only implement what you need. By the time you are ready for that growth, it may not be exactly what you originally thought it would.<br />
<br />
<b>Performance matters.</b><br />
<br />
Unless you work with purely conceptual machines, or you're trying to solve P=NP, it's not enough to write an algorithm that can provably solve a problem. It has to do it within the timeframe required, which might be seconds. If you're working on the web, making your users wait for even 2 seconds might be enough to frustrate them. Little mistakes, extra unnecessary iterations, methods that do extraneous work, can add up when executed many thousands of times over.<br />
<br />
<b>Write UIs for your mother</b><br />
<br />
Unless your mother happens to be a computer professional, then pick someone else. Know your audience, and make things simple.<br />
<br />
<br />
Steve Salterhttp://www.blogger.com/profile/01706560630255032002noreply@blogger.com5tag:blogger.com,1999:blog-8453733315126080339.post-40089401281689322802013-03-08T12:59:00.003-05:002013-03-08T12:59:58.888-05:00Excel as a metaphor for Life
<br />
<div class="p1">
I have concluded (mostly because virtually anything is better than the mind-numbing tedium of more requirements thrashing), that Excel is an excellent metaphor for life.</div>
<div class="p2">
<br /></div>
<div class="p1">
My instance upon this planet is a workbook.</div>
<div class="p2">
<br /></div>
<div class="p1">
The portions of my life which are essentially encapsulated (work, not work) are sheets.</div>
<div class="p2">
<br /></div>
<div class="p1">
On the WORK sheet (for example):</div>
<div class="p2">
<br /></div>
<div class="p1">
Rows are thing to be done. They are constantly being added.</div>
<div class="p2">
<br /></div>
<div class="p1">
Columns are changes in the state of the row (the next work to be done on that thing). They are always extending to the right.</div>
<div class="p2">
<br /></div>
<div class="p1">
Some rows have lots of columns and seem to go on forever. Other rows end quickly with few columns.</div>
<div class="p2">
<br /></div>
<div class="p1">
There are many fewer of the low column count rows than are desirable.</div>
<div class="p2">
<br /></div>
<div class="p1">
Column extension will most certainly end. Although that might require my death. (Which is probably a small price to pay to avoid some of the rows).</div>
<div class="p1">
</div>
<div class="p1">
In each cell is a snapshot of a point in time on a particular thing to do, which is permanently captured, and (usually) utterly irrelevant because only the right most cell actually matters now, but it is the sum of all that cell's antecedents (to the left) that (sort of) explain how it got there.</div>
<div class="p1">
<br /></div>
<div class="p1">
It would seem quite futile taken in it's entirety.</div>
<div class="p1">
<br /></div>
<div class="p1">
I console myself with this thought:</div>
<div class="p1">
<br /></div>
<div class="p1">
This particular row just got it's last column.</div>
<div class="p1">
<br /></div>
David Hesslerhttp://www.blogger.com/profile/04758977388706314301noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-56526292126764198152012-07-06T11:49:00.001-04:002012-07-06T11:49:12.499-04:00Living in Apple LandAs a long-time Windows developer and user (started writing Windows programs with Windows 3.0 and Turbo C++), I thought I'd share a little bit of my experience since April switching to a MacBook Pro. The contributing factors were an aging Dell E6400 with maxed out 8GB of RAM and the need to run at least two virtual machines at the same time as our core development environment.<br />
<br />
The <a href="http://store.apple.com/us/configure/MD104LL/A?">MacBook Pro</a> is a circa Spring 2012, 15" display with 250GB drive purchased through Amazon. I bought it with 4GB and then upgraded it to 16GB for $250 from Newegg. I have not yet replaced the HDD with a 7200rpm 750GB, but its only a matter of time.<br />
<br />
Ostensibly the reason for this shift from Windows to OSX was that the 16GB would allow me to run two VMs and still use the host, all with acceptable performance. In a nutshell: this works. Certainly there is a performance hit for doing this, but the VMs are acceptable for development and database work, and the host runs quite smoothly.<br />
<br />
Some details on the environment:<br />
OSX Lion 10.7<br />
16GB RAM<br />
VMware Fusion 4.1.2<br />
VM#1 is 64 bit Windows 7 with Visual Studio 2010 and 8GB RAM<br />
VM#2 is WIndows Server 2008 R2 (64 bit) running Oracle 11G enterprise with 2GB RAM<br />
(leaving 6GB for OSX)<br />
<br />
The Pros:<br />
<br />
<ul>
<li><span style="background-color: white;">Runs two or three Windows VMs quite easily at acceptable speed without tearing down the host.</span></li>
<li><span style="background-color: white;">VMware Fusion integrates the use of Windows apps into OSX so that you can get by without Office for Mac. VMs created from Workstation came into Fusion without a hitch.</span></li>
<li><span style="background-color: white;">Cisco VPN support works fine within the VM</span></li>
<li><span style="background-color: white;">OSX is unquestionably more pleasant, fluid, and faster than Windows 7 (even for me)</span></li>
<li><span style="background-color: white;">Desktop switching is really easy and efficient</span></li>
</ul>
<br />
<br />
The Cons:<br />
<br />
<ul>
<li><span style="background-color: white;">Cisco VPN support on Mac seems like false advertising to me: I can't ever get it to work.</span></li>
<li><span style="background-color: white;">For daily use Mac Office 2011 is much better than using a VM, but it's a culture change like anything else in Apple Land. Hated the ribbon bar? Well they redesigned it </span><i style="background-color: white;">yet again</i><span style="background-color: white;"> for Mac...</span></li>
<li><span style="background-color: white;">VMware Fusion is not as robust as Workstation (Windows version). Its buggier, and forget about port mapping, there is no tool: you have to hack the file system.</span></li>
<li><span style="background-color: white;">The Mac refuses to disassociate resolution of my dual monitor from the Mac laptop display (keeping the monitor at low res).</span></li>
<li><span style="background-color: white;">Skype is different on the Mac (can't separate conversation windows). Somebody thought it was better this way, but that isn't me.</span></li>
<li><span style="background-color: white;">Chrome has some flakey issues with web service stalls, but I use it almost 100% of the time and for me it has been quite stable.</span></li>
</ul>
<br />
<br />
The Summary<br />
<br />
This turned out to be a good move for me. I had been "counseled" by friends to go this route, and the bonus is that as we move into native iOS development I have been able to use xCode on the host. There is event a native <a href="http://jasonfharris.com/machg/">Tortoise</a> client (we use Mercurial for version control) for the Mac. In fact, I have found many native clients for the Mac like <a href="http://filezilla-project.org/download.php/">Filezilla</a>, Office 2011, Skype, Microsoft RDP. Still, as a Windows developer the general reliability of VMware Fusion has been the saving grace of this switch.<br />
<br />
Anything I can't do in OSX, I can do in the Windows VM...<br />
<br />
Life is good.<br />
<br />
<br />David Hesslerhttp://www.blogger.com/profile/04758977388706314301noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-21555900781564429592012-05-25T10:00:00.000-04:002012-05-25T10:00:03.885-04:00Artful MakingMy professor and friend, <a href="http://artfulmaking.com/about" target="_blank">Lee Devin</a>, has started a blog on innovation and collaboration <a href="http://artfulmaking.com/blog" target="_blank">here</a>. It's good reading, and very applicable to the software industry and other product development fields.<br />
<br />
Lee is a Theatre guy, but don't let that frighten you; as Lee would tell you, the Theatre has attributes that are enviable from any product development field:<br />
<br />
<ol>
<li>The product is routinely delivered on time and within budget.</li>
<li>The end date is known from the very beginning (the curtain will rise, and there better be a show!)</li>
<li>The product isn't fully understood until the day it is finished, and can continue to change thereafter.</li>
<li>Collaboration from every participant is necessary to make the product.</li>
</ol>
<br />
He'll be updating his blog every Monday. Add him to your list. <br />
<br />
And add us to your list while you're at it.Steve Salterhttp://www.blogger.com/profile/01706560630255032002noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-24955285397747400282012-03-07T12:18:00.000-05:002012-03-07T12:18:06.779-05:00Music, Running, and CreatingEarlier this week, <a href="https://plus.google.com/108988276571177665337/about">Christopher</a> sent me a link to a <a href="http://vimeo.com/36579366">video presentation</a> by inventor <a href="http://worrydream.com/">Bret Victor</a>. I found this particular talk to be brilliant and entertaining. Most important, it inspired me into doing something different. How this happened I can not say. One minute I was walking the dog and thinking about the video, and the next minute I was wondering about... running.<br />
<br />
Huh? If you are looking for the thread of this post, hang in there.<br />
<br />
About a year ago I started running. At the time I was terribly out of shape and coming out of a crazy stressful set of commitments which consumed way too much time. I took the end of that as the start of getting myself back together: eating better, losing some weight, getting a lot more exercise. It's turned into something bordering on obsession as I am now training for my first marathon and don't hesitate to run at 6am in the dark and 10 degrees.<br />
<br />
But I digress...<br />
<br />
Along with running I have developed an interest in <a href="http://barefootrunninguniversity.com/">minimalist or "barefoot" running</a>. One of the tenets of this mode is that you need a high "turnover" rate, as measured in steps-per-minute. The idea is to reduce time in the air and impact by using shorter strides at a higher frequency. The problem is that this is actually pretty hard to do, because runners have a basic form, and adjusting it can be a bit uncomfortable. The ideal rotations translate into <a href="http://shodless.com/stride-rate-180-steps-per-minute/barefoot/">180 steps-per-minute</a> (SPM) for accomplished endurance runners.<br />
<br />
For reasons I can't explain, something in the video caused me to start thinking about timing and feedback and rhythm and...running. The next thing I know I am off on a hunt for music that has the "ideal" beats per minute (BPM) of 90 (two steps per beat) or 180 (one step per beat). This is actually a pain. The music is random lists by others who found it, how exactly???<br />
<br />
From there I am discovering that DJ's actually use BPM data for tracks to blend them without interrupting the flow of the dance (duh, I don't go to many dance parties obviously).<br />
<br />
Where do they get this data? Software! Inexplicably, lame music tools like iTunes don't provide BPM data analysis (booh!), but <a href="http://www.mmartins.com/mmartins/bpmdetection/bpmdetection.asp">there are other tools</a> that do, like <a href="http://www.mixmeister.com/bpmanalyzer/bpmanalyzer.asp">MixMeister</a>.<br />
<br />
And magically, now I have a list of songs from my digital library that match the correct tempo to train for barefoot running. Create a playlist, and away you go!<br />
<br />
At this point, somebody is expecting me to start writing about Fourier Analysis and codecs, and how I hated the fact that these tools don't actually do a great job of interpolating the BPM data, nor do the free ones inject it into the metadata of the audio file so that iTunes can display it. Well I'm not going to, hah!<br />
<br />
The key to this experience was the speed at which the idea occurred and that I could get feedback on whether it worked (it does for me). If I had to build my own waveform analysis code, then study audio decoding libraries, and finally how to write audio metadata, and then choose what tools to build it with, and write, compile, and test it. Oh dear, I don't have time for that next run, do I???<br />
<br />
The lesson for me here was that the speed with which I could think of something and then try it out mattered a lot. As Bret said: ideas are precious. Too many barriers kill them.<br />
<br />
As software developers, we should try to remember that what we design for users will control how they use it, probably more than we would like. As users, we should rebel against those constraints. As both developers and users, we should strive to bring software to the point where our end users feel like the tool is enabling them to create their ideas, not defining the boundaries around them.<br />
<br />
<br />David Hesslerhttp://www.blogger.com/profile/04758977388706314301noreply@blogger.com1tag:blogger.com,1999:blog-8453733315126080339.post-35381582202259468102012-02-02T12:49:00.003-05:002012-02-02T12:49:50.050-05:00Javascript Object and Variable ScopeWe've been trying to come up with a template for building Javascript objects successfully as we transition from using .NET WebControls to a UI entirely written in Javascript. We came across the following interesting example of how Javascript variable scope can sometimes be frustrating and confusing.<br />
<br />
Consider the following Javascript object definition:<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/m9E2r/1/embedded/" style="height: 300px; width: 100%;"></iframe><br />
<br />
myObjCreator keeps a single variable in scope, and then provides a single selector and mutator for accessing that variable. It also exposes the variable directly, and this is where the fun begins.<br />
<br />
If you believe that variables get passed by reference when assigned to Javascript objects, you would expect to see the following output:<br />
1<br />
1<br />
2<br />
2<br />
3<br />
3<br />
<br />
However, if you click the handy dandy "Result" button above, you'll see the output is instead:<br />
1<br />
1<br />
2<br />
1<br />
2<br />
3<br />
<br />
What's going on, here?!?<br />
<br />
This appears to be proof that assignment to a Javascript object is done by value, not by reference. Meaning that myObjCreator's internal variable x and the variable o.x are not references to the same internal memory location. They are different variables.<br />
<br />
Here's another example that proves this beyond a doubt:<br />
<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/m9E2r/2/embedded/" style="height: 300px; width: 100%;"></iframe><br />
<br />
<br />
After assigning x to ret, we modify x to 5. Yet, when we look at ret.x, it still has the value 1. So when we did the assignment of x to ret, what was stored was a copy of the value of x, not a reference to the variable x.<br />
<br />
Our solution to this problem is to structure our objects to address internal and external references to public variables the same way. To correct our example, we would write:<br />
<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/m9E2r/4/embedded/" style="height: 300px; width: 100%;"></iframe>
<br />
<br />
Now we get the output we originally expected. <br />
<br />
And there was much rejoicing.<br />
<br />
<br />
<br />Steve Salterhttp://www.blogger.com/profile/01706560630255032002noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-52271123284368061732012-01-25T10:03:00.001-05:002012-01-25T10:22:11.926-05:00The Importance of Being QuippedNot too long ago, we switched from <a href="http://www.bugzilla.org/">Bugzilla</a> to <a href="http://www.fogcreek.com/fogbugz/">Fogbugz</a> as our issue tracking system. I say "not too long ago" because I'm trying hard not to remember the whole incident too clearly. I'm sure I agreed to it, that's the way we do things: as a team. Nonetheless, as with most technology stack shifts, there are both unintended consequences, and <b><i>unexplained ones</i></b> (ahem, you know who you are). Now don't get me wrong, Bugzilla and Fogbugz are both fine defect tracking solutions, and we have benefited significantly in our SDLC from <a href="http://www.fogcreek.com/kiln/features/code-reviews.html">Kiln's Code Review</a> features (which are actually the primary reason we switched).<br />
<br />
Nonetheless, I have my regrets. There is something comforting about old tools, and I don't think software developers are immune to the easy comfort of the well-loved chef's knife or hand-saw. Oh sure we "thrive" on change and PROGRESS, but underneath, we suffer the <a href="http://amplicate.com/hate/emacs?page=7">obscenities of EMACS</a> and <a href="http://www.exceluser.com/explore/surveys/ribbon/ribbon-survey-results.htm">Microsoft Office Ribbon Bars</a>, every bit as much as the normal application user.<br />
<br />
All of this has nothing to do with this post however.<br />
<br />
Well except for the intro line.<br />
<br />
You see Bugzilla had a feature which turned out to be (for our team) even more important than case tracking. This feature turned out to be the very foundation of our team knowledge, wisdom, and humor. And the moment it was taken away (because it didn't exist in Fogbugz) we began the slow inexorable slide towards... well, being boring. If you are a software developer, date one, have a sibling who is afflicted, or (god help you) are married to one: then you will know this: we don't tolerate boredom well.<br />
<br />
So I made a "request" (which probably sounded like a demand, but was in fact <b>For The Betterment of The Team</b>, honest) that we bring this feature into Fogbugz; thereby improving the product, recapturing our institutional wisdom, and most importantly, adding a respectable veneer of sophisticated humor back to our daily plod through defects which others have thrust upon us. Like a superhero without a cape, <a href="https://plus.google.com/108988276571177665337/about">Christopher</a> swept down upon Fogbugz and created a JS plugin which has become the analogue to Bugzilla's Quip feature.<br />
<br />
If you have never seen this feature, a picture is worth a {for(int i=0;i<1000;i++)} words:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-gHg31q17I7Y/TyAPdg0rs1I/AAAAAAAAADA/ziCpzEJiJA4/s1600/codefreeze.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-gHg31q17I7Y/TyAPdg0rs1I/AAAAAAAAADA/ziCpzEJiJA4/s1600/codefreeze.JPG" /></a></div>
<br />
These little snippets of philosophy, wisdom, existentialism, or ridiculousness are defining characteristics of what I think of as our team. They leap out at us every time we look at an issue. In their absence, the world is somehow less friendly, bright, and human. Almost every day, quips are added based on Skype messages, emails, phone conversations, meetings, whatever. Sometimes they make me laugh, sometimes they make me regret being too fast on the send button, but always they remind me of what a wonderful experience it is to work with people whom I respect, who aren't afraid to speak their minds and share their day.<br />
<br />
I have often succumbed to (and regretted) the temptation of using the term "personalization" to mean "application configuration specific to a known user account". YUCK. That is just customization of a more or less friendly UI, but there's nothing remotely personal about it. Quips on the other hand, are true personalization. Tied to personalities, expanding your knowledge of others and encouraging self-evaluation.<br />
<br />
As a developer, team member, and manager, some of my favorites show that our team's intent to collaborate is alive and well:<br />
<br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><i>Phil to David: This is the only corporation in America where the vice president cleans out the fridge</i></span></span><br />
<span style="font-family: inherit;"><i><br /></i></span><br />
<span style="font-family: inherit;"><i><span style="background-color: white; line-height: 18px;">David to Steve: you were right. I was wrong. Don't tell anybody. Steve: K.</span></i></span><br />
<span style="font-family: inherit;"><i><br /></i></span><br />
<span style="font-family: inherit;"><i>Christoper to Steve: David was going to show me... then he saw a squirrel</i></span><br />
<br />
<br />
<i>David to Others: Do I need to join this meeting to suck the fun out of it?</i><br />
<br />
<br />
These make me smile, they also make we wince. What makes them funny is they are also true, and the good-natured acknowledgement of both fault and opportunity to get better is what makes us more than just a team, it makes us an improving, enthusiastic team. We tease, we lend criticism, we self-deprecate, we connect.<br />
<br />
By the way, we also have a wonderful bunch of Quality Assurance folks who keep us honest, and are also a part of our team and our success:<br />
<br />
<span style="background-color: white; font-family: Cambria, Georgia, 'Times New Roman', Times, serif; line-height: 18px;"><i>Dev1: there are a heck of a lot of re-opens... QA1: Duh Sherlock!! You didn't fix them right.</i></span>
<br />
<br />
<i>The QA mantra - Please don't say "It works for me", Please don't say "It works for me", Please don't say "It works for me"</i><br />
<br />
I guess in the final analysis, Quips may not be the most critical feature in our issue tracking system, and they certainly aren't the most effective way to archive and convey SDLC knowledge. Quips are, however, profoundly important because they tie us together on a truly personal level, and in the end any good team is more than the sum of its skill sets.<br />
<br />
I am more productive, more tolerant, more motivated, just <b><i>more</i></b> because of knowing the others I work with.<br />
<br />
And so I leave you with one more tidbit from our central repository of all known knowledge and wisdom:<br />
<span style="background-color: white;"><br /></span><br />
<span style="background-color: white; font-family: inherit;"><span style="line-height: 18px;"><i>I'd rather write with pen and paper, scan the document using OCR, and then edit the resulting image using Windows Paint than use emacs</i></span>
</span><br />
<span style="background-color: #eeeeee; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Well, they can't all be beauties.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span><br />
<span style="line-height: 18px;"><i><br /></i></span>David Hesslerhttp://www.blogger.com/profile/04758977388706314301noreply@blogger.com0tag:blogger.com,1999:blog-8453733315126080339.post-43777598362669067712012-01-24T11:40:00.001-05:002012-01-24T11:40:42.420-05:00Post-Peak Society: Dystopia, or Opportunity?The other night, my wife and I took our girls to our <a href="http://www.buffalostreetbooks.com/">local bookstore</a>. While I was browsing the photography books with my older daughter, I heard my wife call out, "Oh, Phil, here's something that's right up your alley." <br />
<br />
Sure enough, <a href="http://www.kunstler.com">James Howard Kunstler's</a> novel <a href="http://thewitchofhebron.com/">The Witch Of Hebron</a> articulates almost word-for-word the dystopic vision of the world after petroleum that I have been agitating about with my friends and colleagues for several years now. Here's the description from the inside cover:<br />
<br />
<blockquote>Kunstler expands on his vision of a post-oil society with a new novel about an America in which the electricity has flickered off, the Internet is a distant memory, and the government is little more than a rumor. In the tiny hamlet of Union Grove, New York, travel is horse-drawn and farming is back at the center of life. But it’s no pastoral haven. Wars are fought over dwindling resources and illness is a constant presence. Bandits roam the countryside, preying on the weak. And a sinister cult threatens to shatter Union Grove’s fragile stability.</blockquote><br />
True as Kunstler's novel is to my worst boom, gloom, and doom diatribes, I recoil from reading it. And only in part because I know better than to read such things before bedtime. <br />
<br />
First of all, brooding about such a dark future doesn't lend itself to the healthiest mental and emotional state. Imagining the worst contriubtes to fear, anxiety, and just plain moodiness: at some level of our being, we <i>believe</i> in what we imagine. <br />
<br />
More importantly, what you imagine sets your overall direction in life. In place of the fear and cynicism of Kunstler's vision, why not embrace the idea of shifting, as activist <a href="http://www.joannamacy.net/thegreatturning.html">Joanna Macey</a> describes it, "from the industrial growth society to a life-sustaining civilization." <br />
<br />
As the high cost of petroleum makes shipping food from places as far away as China impractical, for example, local agriculture could return to being a more significant portion of our food supply. Reliance on local food sources, in turn, would lend itself to a higher quality of connection with the people in our immediate surroundings. It would also make us more conscious of the quality of our immediate environment. Who would tolerate <a href="http://www.foodandwaterwatch.org/water/fracking/">fracking</a> knowing just how precious those local water and agricultural resources are?<br />
<br />
You don't have to get discouraged by the level of effort necessary to steer an entire civilization in the right direction. You only have to see the change in your mind's eye and take small steps towards <i>living</i> that change. Macey describes the challenge as "The essential adventure of our time." Indeed.<br />
<br />
Don't get me wrong. I still believe that we're in for some rough spots in this adventure. Go ahead and stockpile your flashlights, batteries, food, and wind-up radios to prepare not only for a Katrina-scale weather event, but also for the rolling blackouts and unpredictable region-wide power outages that peak-oil will bring. (I recommend <a href="http://www.amazon.com/Ultimate-Suburban-Survivalist-Guide-Smartest/dp/0470463163">The Ultimate Suburban Suvivalist Guide</a> for a full picture of how to prepare in a reasonable way). But, the difficulties can give way to a better future -- if we dare to imagine.Anonymoushttp://www.blogger.com/profile/08684534706277130929noreply@blogger.com1