21 August 2008

Unweary

Starting today I'll be writing at a new blog location: http://unweary.com/blog/ I've redirected the old RSS feed http://feeds.feedburner.com/davidweiss to the new blog. If you want to subscribe to the shiny new RSS feed http://feeds.feedburner.com/unweary please go right ahead. At some point I'll take down the old RSS feed. This change includes an upgrade from Blogger to Movable Type as my blogging platform, but if you sensed that there was more to the blog location change than just that, you were right. I'm "going indie", as they say. :-) This is something I've wanted to do for a long time and now is the time to make it official. I quit working for the MacBU at Microsoft in December 2007 to go back to school. I'm very much enjoying school, and I'm trying hard to keep that my main focus, but I keep wanting to build stuff and publish it and Unweary is just a natural result of that innate desire to create. I expect to build pretty focused, humble, non-life changing software that just makes regular things easier and better in some way. Right now I'm mostly trying to decide which idea to tackle first. I feel like a kid in a candy shop! So that's the news. I'm sure I'll write more about the adventure as it develops, but in the meantime, wish me luck!

02 July 2008

Experience

Especially with a code base that is mature, assumptions correctly made years ago can be terribly difficult to deal with later when the current and new assumptions reign. Writing code that lasts even 5 years and "is robust" is what everyone wants to do for sure, but the recipe for doing just that is not easy to learn and even harder to actually do. For example, you might know what changes need to be made to conform to even the most obvious object oriented design principles, but the business requirements and time to market needs dictate leaving once again old crusty code alone and racking up yet another round of technical debt. Over time, this technical debt will demand payment and the effects on your ability to hire, employee morale, design changes possible, speed of delivery, testing burden, marketing message etc. become very real and very painful. I wonder, can these concepts can be fully learned without actually experiencing pain? Could you even attempt to learn these concepts experientially in college? My experience so far makes me think that one may know something intellectually, without really knowing it. It seems like for so many, one may talk about design patterns or abstraction or low coupling, but until you actually try to build something the other way, the painful way, you just don't appreciate what you are avoiding. What's worse, junior developers who, for no fault of their own lack experience with "the hard way" have a difficult time understanding why one must "go the long way around" to do what seems like such a direct solution. Passing on the stories of the past and their consequences and lessons seems to be an unending challenge.

From my economics book comes this fictional story which I think illustrates the point:

"One Pepsi plant is managed by an economics major with an MBA and has a labor force with an average of 10 years of experience. This plant produces a larger output than does an otherwise identical plant that is managed by someone with no business training or experience and that has a young labor force that is new to bottling."

I definitely fall into the "young labor force that is new to bottling" camp. In the technology industry there is a tendency to glorify the young and bright rather than those who have the experience and have paid the price to learn the lessons that matter in the long run. Whenever I talk to some developer and we talk about where they learned some valuable lesson about software development, rarely do they refer to a book. Almost invariably, they say, "I worked with Joe on this project and he showed me x, y and z. I learned so much working with him." Smart developers, experienced developers who know how to teach and share important lessons to junior programmers seem like a key to the experience problem. Sadly, junior developers who have the presence of mind to ask, listen and apply what they hear are hard to find, and senior developers who are both willing and able to teach effectively are even more rare.

Perhaps the answer to all this is simple. Perhaps it's just he or she who writes the most code, wins. What I mean by this is simply when one writes a lot of code that increases the probability that he or she will make more of the key mistakes needed to learn how to write software with longevity. Just getting more exposure to "how bad things can get" helps bring a sober reality to each line of code written thereafter.

What's remarkable about all this, is that failures in teaching and learning are what keep us "discovering" new ideas that are 40 years old. Truly, "there is no new thing under the sun."

13 June 2008

Don't Fight the Music

As with most forms of art, there are those pieces of music or sculpture or painting that you'll dislike. Perhaps what they portray or teach don't match with your ideals of right and wrong. You'll disagree on a moral level. Perhaps they bring forth memories of the past. Maybe they just look or sound chaotic and simply don't make any sense to you. In all honesty you may not know why you don't like the art, but it might just be grating to you and make you want to turn away. Still, there was and often is a real, living, feeling, breathing human being full of senses, sympathies, misgivings, prejudice and paradoxes behind that creation. Behind all art, prose and poetry are the feelings approximated in the expressions of their craft. The ability to see and feel through the art into the heart of another person, this is the challenge and amazing quality of art. Everyone has a song and they are always singing it. They want to be heard, really listened to, and find out they are not alone.

Appreciating art because of the human behind it, has for me become a simile to working with people with whose opinions I disagree. My Dad would say, "Son, behavior has its reasons." I first remember him saying this when I worked as a Scout leader and got a front seat to the varied expressions of teenage boys. Invariably as I got to know each boy, I found many reasons for strongly held opinions, and behaviors. Often, the life experiences behind these behaviors even for young boys are deep and poignant.

I see similar issues when working in a team of people. The disagreements had in office discussions of the "obviously objective" technology problems often have their roots in other aspects of life much deeper and more powerful and often hidden. This is why teams that have learned to interact with each other "off the clock" as friends and treat each other as respected individuals, for who they are, today, are more successful at solving problems.

I like a good debate and enjoy the challenge of a difficult problem and opposing viewpoints. My experience at Microsoft was of a very "challenging" kind of culture. There you can't squeak out an idea without several counters and objections. This can be good, honest disagreement, but also can turn into ugly contention that yields no redeeming fruit. (It can also drown out innovation since ideas don't have time to germinate and grow and most importantly interact.) Everyone has different tolerance levels for this kind of discord and those who are naturally shy, not quick witted in a debate, or easily persuaded will often find themselves quieted and discontent. This is especially sad when that individual is full of really good ideas, ideas that need to be listened to and acted upon.

Certainly you can't change others, but how can you avoid the destructive discord? How do you know when a good debate has turned into a bad debate? I have noticed in myself the following warning signs:

Respect. If I don't have a deep respect, on a personal level, for the people with whom I'm working, a discussion can degrade incredibly fast. When I'm working with people like this, I have to keep on a higher state of alert.

Civility vs. Hostility. This includes the obvious things like pointing and repeating "you" a lot. In all things keep the discussion civil. Take the time to reinforce with sincerity that you think there's something you don't understand. Let them know you are pushing forward because you think there's something important worth understanding.

Desire to understand. When I sense my desire to understand dissipate and my desire to prove myself right increase, this is a sure indication that the discussion is heading down a destructive path. I can feel it. There's something not right in the air. I get tense, not relaxed. These are signs for me that I need to regroup, reevaluate and possibly try again later.

Judgement. Another indicator is if I am in my mind passing judgement on the individual. I can sense this when I find that I'm thinking about what I'm going to say next while they are still talking, or when I interrupt their thoughts and don't let them finish. I think I already know what they are going to say, so why wait it out? This kind of impetuous behavior indicates that I'm placing myself on a higher moral ground, and this lack of humility doesn't allow understanding, and without understanding, there's little possibility of unity or resolution.

I'm sure there are other even better ways to avoid the pointless and destructive arguments, but this is what I've found so far. In reality, everyone has a song. Listen to it. Find the art in it. Discover what it is saying and if possible the reasons behind the melody. Don't fight the music. There's a person in there waiting to be found.

11 June 2008

Management

I just found this great quote by Dee Hock, founder and CEO of VISA.

I ask each person to describe the single most important responsibility of any manager. The incredibly diverse responses always have one thing in common. All are downward looking. Management inevitably has to do with exercise of authority — with selecting employees, motivating them, training them, appraising them, organizing them, directing them, controlling them. That perception is mistaken.

The first and paramount responsibility of anyone who purports to manage is to manage self, one’s own integrity, character, ethics, knowledge, wisdom, temperament, words, and acts. It is a complex, never-ending, incredibly difficult, oft-shunned task. Management of self is something at which we spend little time and rarely excel precisely because it is so much more difficult than prescribing and controlling the behavior of others. Without management of self, no one is fit for authority, no matter how much they acquire. The more authority they acquire the more dangerous they become. It is the management of self that should have half of our time and the best of our ability. And when we do, the ethical, moral, and spiritual elements of managing self are inescapable.

Asked to identify the second responsibility of any manager, again people produce a bewildering variety of opinions, again downward-looking. Another mistake. The second responsibility is to manage those who have authority over us: bosses, supervisors, directors, regulators, ad infinitum. In an organized world, there are always people with authority over us. Without their consent and support, how can we follow conviction, exercise judgment, use creative ability, achieve constructive results, or create conditions by which others can do the same? Managing superiors is essential. Devoting a quarter of our time and ability to that effort is not too much.

Asked for the third responsibility, people become a bit uneasy and uncertain. Yet, their thoughts remain on subordinates. Mistaken again. The third responsibility is to manage one’s peers — those over whom we have no authority and who have no authority over us — associates, competitors, suppliers, customers — the entire environment, if you will. Without their support, respect, and confidence, little or nothing can be accomplished. Peers can make a small heaven or hell of our life. Is it not wise to devote at least a fifth of our time, energy, and ingenuity to managing peers?

Asked for the fourth responsibility, people have difficulty coming up with an answer, for they are now troubled by thinking downward. However, if one has attended to self, superiors, and peers, there is little else left. The fourth responsibility is to manage those over whom we have authority.

The common response is that all one’s time will be consumed managing self, superiors, and peers. There will be no time to manage subordinates. Exactly! One need only select decent people, introduce them to the concept, induce them to practice it, and enjoy the process. If those over whom we have authority properly manage themselves, manage us, manage their peers, and replicate the process with those they employ, what is there to do but see they are properly recognized, rewarded, and stay out of their way? It is not making better people of others that management is about. It’s about making a better person of self. Income, power, and titles have nothing to do with that.

Your example can be your greatest method of influence. Sadly, for some, you may be doing all of these things and find very little appreciation from those you manage. That's okay. They may think, "What does my manager do?", but it doesn't matter that they fully understand, unless you are preparing someone to take your place. Your job is not to prove your worth to those you manage. If your team is feeling individually appreciated, inspired, free to explore and get things done, then you are largely doing right by them. Still, your team will likely fail if you don't manage your superiors, peers and yourself properly, which is to say, I agree whole heartedly with Dee Hock's comments above.

15 May 2008

Contrast

I've visited a lot of places around the world, but I've only really lived in a few places. I grew up in Redmond, Washington, the Redmond before Microsoft. The little town with one stop light on Leary Way and fields next to the Library where I would ride my BMX bike. I grew to love the green, tall trees, massive amounts of rain and the feeling of misty mornings and amazing sunsets. Rivers were all around me and the ocean never far away. The mountains either the Olympics to the west or the Cascades to the east were ever present. I honestly couldn't imagine a better place to grow up.

I have also lived in Northeast Brazil for 2 years. There is some desert there, but mostly verdant forests, jungles, farm land and grass lands. There, it seemed like you couldn't drop anything on the ground but that it would grow. Again I was close the the ocean and while I didn't spend much time there, I got to know fishers and farmers and cattle ranchers all of whom helped me to see life more clearly. The green you experience in the equatorial areas in Brazil is a different green than I experienced back home in the Northwest. It was a brighter and more vivid green, not the dark, wet mossy green of the Pacific rain forests. It also amazed me how on the equator, there is no dusk. The sun sets so fast, you can turn your head and miss it. But with all the sun and rain and rivers, the tall trees of the jungle were always close by. The Mango trees and the huge Jaca trees seemed to always provide shade and something to look up to.

Imagine my surprise to move to southeastern Idaho, in the high desert plains. Comparatively few rivers, though there are lots of irrigation canals. Flat land, most of it lava rock. Harsh winters and an overall color I'd describe as, well, brown. Trees here are a green color, but with a muted brown to them. The ocean seems a distant dream and large bodies of water few and far between. While we drove to our new home for the first time, I commented to my wife, "Man, this is ugly!" Now, least I offend my fellow Idahoans, we are learning more about this new climate and the wonderful things to explore here, and I'm sure those of you who have braved the high desert plains will have much advice to add, but it's still a shock and the contrast is very real.

Contrast often allows you to see things more clearly, and today, I saw very real beauty in this area, for the first time. And I saw it in the trees. What struck me is how solid, sturdy and unyielding these trees are. There are trees planted and nurtured by those living around houses or in the city, but the trees that captured my mind are those out on the plains. These trees are growing up amidst the driving sub-zero wind and snow of winter and withering heat of summer, from a bed of lava rock! It's as if these trees are saying to Mother Nature, "Sure, I'll grow here, right where you planted me." And they do grow. Against all the odds for survival, they survive! They take in carbon dioxide, unusable by most around them and exhale precious oxygen into the high altitude air. In the search for water, they break up the rock and begin to make dirt for other, less sturdy plants who will benefit years after they have died. They bear the weight of heavy snows and heavier ice. They just seem to "take it" and keep living, untiringly and unheralded, these miracles of nature do their part to grow.

Perhaps my love of trees comes from my childhood growing up around them. Perhaps I took for granted the trees, water and green always around me. What ever it might be, for me, these lonely, windswept, dust covered but undaunted trees are inspiring.

29 April 2008

By Example

Microsoft's recent introduction of Live Mesh is a perfect example of a core difference between Apple and Microsoft. Apple is, at heart, a product company. Microsoft is, at heart, a platform company. Both produce products and platforms, but the way they approach the problem and communicate with developers is decidedly different.

With Live Mesh Microsoft says, "Come, build on our platform and do amazing things!" What is the oft cited example for using Live Mesh? Multi-device synchronization of data. Now, to be sure, this is a big and very hard problem to solve. In fact, I really wish Apple's Sync Services were much, much better, but do you wake up in the morning thinking, "Man, I really have a Multi-device synchronization problem?" Most people don't. What they do think is, "Man it's great that when I put stuff on the web, I can get it wherever I am. All I need is a web browser." You see, syncing folders or sharing data across devices isn't top of mind in the way a developer thinks about it. Microsoft's challenge is mapping their platform to real problems in a persuasive way.

Contrast this with Apple's normal product focused pattern. First they release a product that solves a real, tangible problem people have. Say, "I hate it that I have to carry around my iPod and my Cell phone everywhere!" or "Man I wish I could buy that cool song I just heard, right now." or "I have so many digital photos, I wish there was an easy way to do something cool with them." or "Man I hate it when I loose files on my computer, I wish I could just go back in time." To solve these problems Apple, like Microsoft, has to build a platform, but this platform is built for a product first, which they use and improve. Then when they talk to developers they can say, "Did you see this cool thing we just did? You can do the same thing or even something better! Here's how we did it..." It's the difference between saying, "Here are the tools, let me show you how to use them." and "I used these tools to do this great thing. Let me show you how and maybe you can do the same thing." Ultimately, it's leadership by example.

Another great example is Apple's use of the Cocoa APIs in their own applications. Apple builds amazing products and then is able to say to developers, "We used the same APIs available to you today!" Contrast this again to Microsoft. Windows Vista was released with some remarkable new C# APIs. Many of them very cool and very interesting, but what is Microsoft Office written in? C and C++. What APIs does Office use? A multitude of Office only APIs and libraries shared among the applications. Does this hurt C# and the new "WinFX" platform "street cred"? I think so.

Ultimately, Apple and Microsoft are trying to solve many of the same problems, but the path you choose while logical to you, may not be so logical to those you most need to persuade and inspire. No one can argue with the results. For me Apple's "solution first, platform second" approach makes for easy understanding of new ideas as well as providing the activation energy needed to try something new.

21 April 2008

Metacognitive Miscalibration

A few tweets ago, (I always feel weird referring to Twitter in the past tense) I posted: Why are the unintelligent or uninformed so arrogantly confident while the intelligent and well informed so often unsure and apprehensive? There is something very human to thinking you know more than you really do about a subject or issue. While, this problem can be seen in many areas generally it's particularly acute in software development. For example...

AppleScript in Office X

Back when Mac OS X was just about to go 10.0.0 we were busy working on getting Mac Office working on the new platform. There was a lot of pain involved with the transition. Many APIs had been removed and alternatives needed to be provisioned (and tested), the new Aqua interface guidelines had to be applied to the whole of Office and a host of other issues needed to be addressed. I was at the time on the team that wrote the tools for automated testing and I was pushing hard to get Office wide AppleScript support on the list of features we'd commit to doing for Office X. I wanted this not only for our customers, but to augment our testing efforts. With an API to drive the applications we could automate many "smoke tests" on a daily basis as well as set the stage for long term AppleScript based test suites. Automation testing benefits are often not fully realized, especially static automation, until the version after you setup the automation, so I was especially anxious that we get our API in Office X, so we could reap the return on investment for Office 2004.

I remember talking with Jim Murphy about getting AppleScript support like it was yesterday. We were in building 44 and his window office was near the 2nd story walkway that connected our building to the cafeteria. In my naivete I asked why we couldn't just build a some kind of layer to call into the engine code of Office and presto, AppleScript dictionaries for Office would be complete. I pointed to some improvements Apple had made to make AppleScript a better inter-application communication protocol and ask, "How hard could it be?" Jim turned to me and said, "Hard? There's nothing easy about it. It's all pain. All pain." Then as was typical, turned back to his work, leaving me to think.

In this case, I was the unintelligent and uninformed, but very enthusiastic novice. Jim turned out to be right. For Office X, we did try to do the AppleScript work, but it turned out to be much more difficult a problem to solve. After months of work and many dead ends, we pulled the feature from the Office X feature list. For Office 2004, we tried again. In this case, Jim himself, one of our best developers, ended up spending the better part of a year getting AppleScript to work with Office, which is probably worth another post in and of itself. I thought I knew more than I did, I thought the problem was simpler than it was. My confidence and thinking was miscalibrated. The root cause was my lack of understanding and experience.

Wicked Problems

Sometimes, even the best developers underestimate the scope, breadth and depth of a problem. In a drive for simplicity, I observed in myself and others another kind of design time problem where thinking was miscalibrated. The cycle I have observed looks like this:

  1. Developer looks at a problem A, and thinks he or she fully understands the problem.

  2. Developer designs a simple solution to problem A.

  3. Developer codes the simple solution.

  4. Developer or tester or marketing or customer use simple solution for problem A.

  5. Bugs trickle in and solution A is modified, bit by bit, bug by bug, until it is patched in a thousand ways and no longer looks or acts like the simple solution. The solution is complex.

Some will say, "Hey! Why didn't that lame developer take the time to really understand the problem? Then he could have taken the time to fully comprehend the complexities of the problem, and then design a simple, elegant solution!" The problem with this is that many subtleties to the problem do not manifest themselves until very late in the development process which make re-architecting the solution for such a small issue un-reasonable. But this is a "death by a thousand paper cuts" issue. What's worse, many architectural issues can only be comprehended after years in a problem space, and as promotions or attrition happen, the so called simple solutions, with their complex instantiations proliferate in code.

Adam Richardson spoke to the challenges of wicked problems when he said:

Wicked problems are very difficult to understand by staring straight into them and looking for clear detail, however. They need to be approached from the edges, sort of like doing a jigsaw puzzle where you find the edge pieces first. Having peripheral vision that is trained to be sensitive to the edges is a key capability (this applies both to product teams and to business units - wherever wicked problems occur).

Normally this causes the developer to tack on simple solution to solutions with patch upon patch applied with the Hippocratic Oath echoing in their ears to "do no harm", but deceptively the bandage is not big enough for he wound, and no one knows.

The Desire to Learn

Another reason why some can feel "informed" when in fact they are not is that they have lost the hunger to learn. They've lost the desire to learn and grow. René Descartes said it this way:

Good sense is the most equitably distributed of all things because no matter how much or little a person has, everyone feels so abundantly provided with good sense that he feels no desire for more than he already possesses.

There is a reason for diversity of opinion, it provides the natural tension that keeps us from thinking we've got the problem solved. When I left Microsoft to go back to school and finish my degree, many asked, "Why are you doing that? What are they going to be able to teach you?" I'll admit that this partially resonated with me. I wanted to be the sage of wisdom, but as I've spent time with teachers and students, many of whom do have less "industry experience", I have learned an enormous amount! To put it bluntly, I have been humbled. I've learned things technically, intellectually, physically and even spiritually. I feel so blessed. I'm beginning to think that what any given situation can teach you depends largely on the person experiencing the situation and very little on the experience itself. Put another way, there's a great difference between 50 years of experience and 1 years worth of experience repeated 50 times.

Personal Pride - the Anti-change Agent

Closely related to the lack of desire to learn is the desire to avoid being wrong. So much in school is focused on being right, knowing the right answer to a test or the correct proof or solution. In sports, no one likes to lose. Everyone likes a winner! But this desire can work into our minds in a limiting way. Leo Tolstoy wrote:

I know that most men, including those at ease with problems of the highest complexity, can seldom accept even the simplest and most obvious truth if it be such as would oblige them to admit the falsity of conclusions which they have delighted in explaining to colleagues, which they have proudly taught to others, and which they have woven, thread by thread, into the fabric of their lives.

At work I would say, "We don't fail half as much as we need to." I still think this way, but now I've found a new reason: Failing keeps our mental muscles and joints from stiffing with pride and forming into the arthritis of the mind.

The Well Intended Deception

Another reason for metacognitive miscalibration I think stems from the very basis of good object oriented abstraction and encapsulation. When I write some simple app with Cocoa's AppKit and Foundation libraries, I am, as they say, standing on the shoulders of giants. I've wondered how many actual lines of code are called when I double click a simple app like TextEdit. Who wrote these lines of code? When did they actually get written? What were the discussions behind their design and implementation? Even Apple couldn't fully answer these questions. It is all this code that even the simplest of Cocoa applications depends upon. But still we continue to have demos around how "few lines of code" were needed to accomplish something. This is a well intended deception, because really, more code is being executed and written, but only now how this code works is opaque. It's well intended because who wants to write, maintain and debug more code? Why not offload this to Apple? I expect these demos to continue, because less code for a developer to write is the canonical example of efficiency, but there's something wrong that comes from this. It's the feeling that you actually really understand what is going on to make your application tick. These assumptions and abstractions can be benign, but they can also make one feel and think that they know more than they do and can do more than easily possible.

In the process of detail management that is software development, making things simpler and more tractable is an excellent goal, but there's a limit to how "simple and easy" things can get and still be valuable. Recently I overheard two students talking about building an iPhone application. The one said to the other, "Dude, they showed this awesome demo of Spore, where in only 2 weeks, 2 weeks! they got this awesome iPhone game running! It's so easy. We can totally build an awesome iPhone app!" First, I love the enthusiasm and I hope they do in fact build an awesome iPhone application. Apple was trying to demo how easy it was to build iPhone applications and I think we've never seen a mobile platform that's better for developers, however:

Taking a senior developer who as spent the last several years of his life building games and developing Spore, bringing him into Apple with full and uninterrupted access to Apple's staff of iPhone engineers that have been developing the iPhone SDK and iPhone applications hardly equates to a college student being successful at all the complexity involved with boot-strapping a company and building a successful iPhone application from scratch. Building great software is still hard, hard work. It's tedious, often un-glamorous and takes someone who doesn't mind getting down and dirty with the details to make something great. Most will simply give up, and even those with the passion and stamina to continue are hardly assured of success. I suppose I'm arguing simply that a healthy dose of Steve Job's famed "Reality Distortion Field" do not a great developer, company or software make.

There are probably other reasons we tend to think we know more than we actually do. But the lesson for me is this: I need to take some time to ponder and reflect regularly. Am I in the "unintelligent or uninformed and arrogantly confident" camp? If so why and how can I get humble? Am I part of the "intelligent and well informed but unsure and apprehensive" group? If so why and what can I do increase my tolerance for risk and decrease my fear of being wrong? A little meta I know, but the title should have warned you. :-)

13 March 2008

CodWarrior

Here's a blast from the past. As Xcode continues to improve as the default IDE on the Mac and for the iPhone, the majority of Apple's current developers don't even how CodeWarrior saved Apple. With the release of the iPhone SDK, I think it's not far fetched to imagine Apple's WWDC attendance tripling. Someone sent me this graphic from an old Metrowerks t-shirt. If you have this shirt, you fully qualify as an old timer.

26 February 2008

Heuristically Thinking

You don't have to understand calculus to appreciate this entertaining story:

A teacher, trying to explain what a theory is, asked this question: “If you take a letter half the distance to a mailbox and stop, then start over going half the remaining distance and stop, then repeat the process over and over, theoretically will you ever really get to the mailbox?” One bright student said, “No, but you’ll get close enough to mail the letter.”

There are many definitions for what a heuristic is, but the one I like best is illustrated in this story. A heuristic is "close enough." I am beginning to believe that more and more what matters in software isn't so much building the perfect algorithms, that match and mimic real life in every way and hold up in every edge case. What matters most is getting a model that comes close enough. What matters are heuristics.

My favorite chemistry textbook, has this to say on the topic of "The Kinetic Molecular Theory of Gases" (KMT):

However, although laws summarize observed behavior, they do not tell us why nature behaves in the observed fashion. This is the central question for scientists. To try to answer this question, we construct theories (build models). The models in chemistry consist of speculation about what the individual atoms or molecules (microscopic particles) might be doing to cause the observed behavior of the macroscopic systems (collections of very large numbers of atoms and molecules).

A model is considered successful if it explains the observed behavior in question and predicts correctly the results of future experiments. It is important to understand that a model can never be proved absolutely true. In fact, any model is an approximation by its very nature and is bound to fail at some point. Models range from the simple to the extraordinarily complex. We use simple models to predict approximate behavior and more complicated models to account very precisely for observed quantitative behavior. In this text we will stress simple models that provide and approximate picture of what might be happening and that fit the most important experimental results.

The textbook then goes on to explain postulates for this model of thinking, many of which by themselves are absolutely false, but taken together and used properly, they create a system of thinking that works for a wide range of situations. This collection of half-truths produce a half-truth baked solution, absolutely, but one that is indeed close enough.

For example, some "half-truths" or "simplifications" if you will, involve assuming things like: each molecule of gas is perfectly spherical in shape and any collision is perfectly elastic in result. Or worse, the volume of all these individual molecules is assumed to be zero! Individually, each of these 3 statements is categorically false, but they were the right bits to "design away" as they defined the problem space so that the model could be simplified, made useful and the problem of dealing with billions of particles be made into something tractable.

To me, this is more than simple object oriented encapsulation and abstraction. This is thinking about the whole problem differently. It's about looking at individual behaviors from a very small sample and knowing, by some spark of genius, which attributes are the important ones to the ultimate outcome of the system as a whole, and which are not. This is writing software that is able to predict things, for example, test software that is able to predict when "something good" has happened and also when "something bad" has occurred. This is about designing software by building software models that categorically do not reflect the real complexities of the system, but that taken together, get "close enough" to do real work in the real world. Ultimately your models will fail when pushed to the limits, but even just understanding those limits will help you better understand the problem you are tasked with solving! It even begs the question: What kind of programming language best allows for the definition and use of heuristic models?

I don't know where I first heard this, but someone once said something like, "Where Microsoft codes if statements, Google codes in Bayesian probabilities." There are more data and variation in that data than there ever was before. If you are going to write or use programs (very likely) that deal with large amounts of data (also very likely) it might be a good idea to get used to thinking about things in heuristic terms. It may not be exactly perfect in every case, but it will be close enough.

24 February 2008

Finishers Wanted

When I was a little boy my Mom had me memorize this little poem:

Stick to your task ’til it sticks to you;
Beginners are many, but enders are few.
Honor, power, place and praise
Will always come to the one who stays.

Stick to your task ’til it sticks to you;
Bend at it, sweat at it, smile at it, too;
For out of the bend and the sweat and the smile
Will come life’s victories after a while.
—Author Unknown

I think my Mom had me memorize this poem because she knew I would need it. She understood better than I the old adage that "Life does not reward us for effort expended." Finishing is required.

For me, it is exciting to find a problem and imagine a way to solve it. The creative exhilaration in coming up with a solution that will work within all the constraints involved is almost intoxicating. I have a remarkable tolerance for ambiguity and when the major "problems" as I see them, have been solved, filling in all the details seems so much less important. The hard design work has been done. There's perhaps little glory in all the simple, small and detailed work needed to connect the dots and make the grand vision a reality. However, software is ultimately just simple 1s and 0s and if you don't fill in all the details, then all you are left with is a dream. You've got to have both the vision and the finishing of all those tiny details.

"This is all your app is: a collection of tiny details." - Wil Shipley

Missing a few details can drastically reduce the value of the whole idea. I guess that's why I love Mac software so much: There's the constant demand from both the users and my peers for my concerted effort across the entire spectrum of "pie in the sky" ideal to actual, practical details in implementation. To make it work in software, you need to consistently execute well across the whole spectrum of work. Let me underscore the words consistently execute again, they are very important.

Matt Ball recently wrote a nice post about some up and coming Mac developers that worked so hard on their first release, but since then have produced relatively little. They haven't created new apps, updated their 1.0 apps, even posted to their blogs. Some still have ideas in picture form posted in all their high fidelity glory, but with no application to show or sell to the customers that have been waiting to see the finished product. These developers seem to be struggling with consistently executing against their plans.

Matt goes on to explain that he thinks this is related to their young age. Most of these developers are young (19 years old) and he thinks suffer from some kind of "shiny ball syndrome" where they are easily distracted from one project to the next. I don't know the developers, and they could be easily distracted or they could have absolutely justifiable reasons for their delays, but the result is the same: Doubt builds as to their ability to consistently finish their ideas. Their credibility and reputation weakens.

Many of life's failures are people who did not realize how close they were to success when they gave up. - Thomas Edison

I don't think it's age. I think that's far too simple an answer. I know developers in their 50s who struggle from this exact same problem. It's not size or lack of resources either. Look at Microsoft. Here's a company where a large part of their problems revolve around consistently producing, not a lack of money or great people or innovative ideas.

The idea is not the thing!

One part of the problem comes from patent law. There is a remarkable and universally held assumption that ideas are worth a great deal. I will not say ideas are worthless, but they are worth far less than most of us realize. Even the most simple idea takes remarkable effort, and follow through to get designed, built, packaged, and ultimately used by others. This is why I felt My Dream App was destined for difficulty. They had enthroned ideas as the product, when in reality it's all the grunt work after the idea that make the product. It's all those pesky little details and the consistent effort required to follow up and deal with each of them that matters.

Finishing is the thing!

When the iPhone was released, there was a collective groan world wide from designers who had years before envisioned the ideas that Apple had now so beautifully produced in a finished product. Kim Lenox, Senior Interaction Designer of Adaptive Path explains:

With the launch of the iPhone, I’ve been hearing many grumblings from interaction designers who’ve worked for various, well known consumer electronics companies. We can all see in the iPhone aspects of our concepts from years past that were brushed aside or died prematurely. Our concepts are suffocating under the pile of NDA verbiage, never to see the light of day. What sets our mere concepts apart from this final product however, is a company with leadership who has the fortitude to take the risk, find the budget, and push the technology for the single cause of designing compelling user experiences. Apple got it right.

Amazing isn't it? Once again, it's all about execution and finishing, not just the ideas. Leadership is important for sure, but finishing the job in a company is so much more than Steve Jobs simply saying, "We're going to build an iPhone and it will have a compelling user experience." It's thousands of decisions made by hundreds of employees at Apple and elsewhere. It's dealing with setback after setback and still pushing forward. It's taking the right calculated risk (EDGE and AT&T) and saying no to other things (10.5 on time, a Dev SDK) in order to finish. That is the task of finishing and at Apple, it seems to be part of their DNA.

Tranquil and Steady Dedication of a Lifetime

One of the most important attributes of a software company I would like to work for, comes from an idea the late Adlai Stevenson a U.S. Democratic politician explained when referring to patriotism:

What do we mean by patriotism in the context of our times? I venture to suggest that what we mean is a sense of national responsibility ... a patriotism which is not short, frenzied outbursts of emotion, but the tranquil and steady dedication of a lifetime.

In a great software company, there wouldn't be "short, frenzied outbursts of emotion" but a consistent focus on finishing in a steady and sustainable manner. My guess is that those prone to "putting on a big, glitzy show" and those that don't effectively resist the "constant bombardment of new and exciting things to try out" will have set themselves up as an unsustainable business, and ultimately end up disappointed.

Saying No: a feeling of strength in reserve.

One of the biggest challenges is just saying no to things. What's hard about this is often you need to judge between what is "good", what is "better" and what is "best". In order to do that which is "best", you will, you must say no to many, many things that are "good" and "better". This is heart wrenching work, but choosing what you do now to remain focused and finishing, this is your competitive advantage. When asked what work he was most proud of from among his work at Apple, Steve Jobs famously said, "All the products we didn't ship." Many people and businesses talk about focus and priorities, but very, very few actually finish the idea and follow through with the well executed decision making and focus required.

“You must always work not just within but below your means. If you can handle three elements, handle only two. If you can handle ten, then handle five. In that way the ones you do handle, you handle with more ease, more mastery and you create a feeling of strength in reserve.” - Pablo Picasso

Keep Moving Forward!

There is a scene in Disney's animated movie Meet the Robinsons that I love. The story is of a young boy inventor who is learning. During this particular scene he is trying hard to fix a peanut butter and jelly gun, used to automate sandwich building. Everyone is watching him and it looks like he's going to succeed, finally the time comes to try his fix. The whole thing explodes sending peanut butter and jelly everywhere and onto everyone in the room. He is devastated, but immediately he hears cheers and people start to comment on what a great failure that was! "You Failed!" "And it was awesome!" "Exceptional!" "Outstanding!" "Uh, I've seen better." "From failing you learn, from success, not so much." They congratulate him like he succeeded. They ultimately propose a toast to his brilliant failure. He is stunned. The motto of this family is: Keep moving forward!

This is a good motto for anyone working with software. The challenges are so great and the problems so complicated and frequent, you simply must have the determination to keep moving forward, to and through the finish. Start small and build momentum and keep finishing small things, just to keep in the habit of it.

This is not always easy. Sometimes I would come home from work so frustrated with how slow things were going and how little progress was being made, I'd tell my wife I just needed some time alone to cool down. I'd go into my room, open my laptop and write a blog post. I'd post it and point to it while saying to my wife, "There, I did it. I produced something today! It may not be much, but at least I produced something tangible!" You've got to keep in the habit of producing or finishing. You can't let those muscles atrophy.

One of the best development techniques I've seen over the years is test driven development. The pattern is to build a small test that represents an improvement you want to make to your program. Once the test is built, run it and watch it fail. Then write just enough code to make the failing test pass, then run the code and watch the test pass. Repeat. This tends to lead to low coupling and good cohesion and a reasonable test bed. The real hidden value is regular focus on tangible completion in a consistent way, over time. Just keep moving forward step by step and then after some time you'll be impressed as you look back on the mountain of work you've accomplished by such simple means with constant effort.

There are bugs to be fixed, old code to re-examine and refactor, performance problems to analyze and improve, build automation, test automation and website improvements, help docs to write, blogs to read, posts to write, ideas to explore, customers to contact, emails to read and write. Your job is to choose which of all of these you will do now, and then keep moving forward. Those who master the art of consistently and sustainably producing value, are setup for success. Be one of them. Don't quit. Don't stop. Focus on consistently finishing something of value, no matter how small. That's what the world will pay you for, and since so few seem to stick to it, there's plenty money in play for those who pay the price to consistently finish the job.

23 February 2008

The Perfect Laptop

Business Week's recent cover story on Lenovo's new ThinkPad X300 laptop caught my attention. Can you imagine spending 2 years working on a super thin, super light laptop for release in February 2008 and then have Apple announce the MacBook Air on January 15th? What a commotion must have been had at Lenovo after Jobs' keynote!

It turns out that the X300 is actually lighter than the MacBook Air when configured without the DVD drive. It apparently also snugly fits into a mailing envelope! It has 3 USB ports and an Ethernet port and includes a solid state drive as the only drive option. What's really striking about the X300 is Lenovo's whole approach to the project. When they think of the "perfect laptop" they don't see the svelte curves or shiny metal jewel that Apple sees, they see 90 degree angles, boxy, matte-black, computer that looks all business. David Hill, Lenovo's chief designer and "keeper of the ThinkPad tradition" said it best: "I'm a bit tired of looking at silver computers, I'd never wear a silver business suit."

Despite the fashions of the day, Lenovo is not only trying to remain true to, but underscore the original ThinkPad design by Richard Sapper. I'm impressed by this. They are trying to build an equally, if not more impressive laptop than the MacBook Air, and retain their own identity in the process. It's both courageous and unique these days. In some ways it says something about the times that "simple, elegant, matte-black machines with precise, 90-degree corners" would be thinking differently, while so many are trying to "be like Apple." My applause goes to Lenovo for being themselves! Well done!

22 February 2008

The Mix Tape and iTunes

I know I'm dating myself a bit here, but there was a time when friends my age would exchange songs via cassette tape. It was illegal I'm sure, but such a wonderful labor of love. The carefully selected list would exchange hands and then the recipient would spend typically 60 minutes straight listening to each song trying to deduce the "real meaning" for this song being included in the mix. Meanwhile, the giver would also listen to the same songs wondering how the recipient might be enjoying it. As you can imagine this made for some great follow-up discussions. I was reminded of this recently when I found this product from the UK:

Note: the authentic bent label. There are even other styles shown here.

With 64 MB of storage you can get at least 60 minutes of songs for your gift. Very retro. Fun, not terribly sustainable and probably illegal as well, but still pretty cool.

When I saw this I wondered, and not for the first time, "Why doesn't Apple do this kind of thing on iTunes?" They've allowed gifting for a long time, but that's one song or album at a time, not a collection of specially chosen songs. They could send a custom "iCard" or well designed announcement. Going to iTunes would allow you to download the gift list with a special custom cover for the playlist along with custom messages for the whole list and each individual song. What you're selling here is the experience of the music and the gift of listening to each song specially selected for you. There would be a one click "Add to my iPod" once the songs downloaded so you could get going right away. While you listened you could continue to refer to the sender supplied comments for each song on your iPod. As an added bonus, if the person receiving the list, already purchased this song on iTunes, it wouldn't copy down a duplicate song, but just link it into gift playlist with custom text. In this case the cost of the collection would go down by the cost of the duplicate song.

This isn't just about love birds or anniversary collections either. I can see "get well collections" sent, "congratulations you did it!" collections, and even "inspiring songs from a friend that cares" lists being given. I can even see adding a movie or movie rental to the list with the connection of "this movie makes me think of you" or "let's watch this together..." etc.

I suppose every regular Mac user who blogs has to post from time to time, with wishes for Apple to fulfill. I haven't done my fair share of them, so here's my penny in the fountain. I think it would work wonderfully. Come on Apple, give us Mix Tape gifts on iTunes!

28 January 2008

Passing of President Gordon B. Hinckley

Beloved Church President Gordon B. Hinckley, who led The Church of Jesus Christ of Latter-day Saints through 12 years of global expansion, has died at the age of 97. President Hinckley was the 15th President in the 177-year history of the Church and had served as its President since March 12, 1995.

I suppose he said it best:

Death is a part of life. It is a fundamental, basic part of our eternal lives. We can't go on with the great work that lies ahead without stepping over the threshold of death, sorrowful as it is for those who remain. I am satisfied that it is a beautiful experience for those who make that step, who have lived lives of righteousness and faithfulness. - Gordon B. Hinckley, Ensign, Aug 1997, 3

For my part, this man was an example to me of someone who finished the course, kept the faith. (2 Timothy 4:7) I will miss him.

27 January 2008

Change is Hard

I just rediscovered this great quote:

A new scientific truth does not triumph by convincing its opponents and making them see the light, but rather because its opponents eventually die, and a new generation grows up that is familiar with it. - Max Planck

I believe this doesn't just relate to scientific truth, but truth in general. My Dad would say, "Experience is always in the first person," meaning that it's a good idea to learn from others, but most of the time we don't. There are great new truths to be had, but everyone is at a different point in the journey, with all the baggage that entails. Many of the most important and needful changes can't happen until there is a personal experience with the need for change. Mostly that happens one person at a time. There are those who think people would act differently if they only knew some bit of relevant knowledge, but more often than not, the reality is much more complicated than a simple lack of knowledge.

Change requires love, patience, help and encouragement, a willingness to learn from above, from below and from all those around you. It requires an absolute and deep conviction that you could really be wrong about something in a fundamental way. It requires a desire to improve and a motivation to exercise more effort than normal. It requires the courage to be wrong and fail again and again in the pursuit of new understanding. In the end, it often requires the willingness to forgo the due respect and esteem of others. Almost always it requires some kind of sacrifice. It is for all these reasons and many more, that change is hard. Thanks be to those who, despite all of this, do change. They make space for others to do the same.

01 January 2008

Leaving Microsoft

Starting today I no longer work at Microsoft. As many of you know, I started working at Microsoft after an illustrious post high school career as landscape architect. ;-) I loved the landscape work, but Microsoft paid better. I was just barely 18 and Microsoft was just realizing that the internet (lower case then) was amazingly NOT going to be replaced by the Windows 95 Microsoft Network. Much has changed since then. While I started my 4 year degree and continued working on it part time, it’s now time for me to go back to school full time and finish. After that, I hope to get an MBA.

I’ve had a remarkable time at Microsoft and in MacBU in particular. I’ve learned so much. I’ve been so thankful to interact with such a high concentration of good individuals. I feel very blessed. My last day was December 31st, 2007.

So that’s the news. I realize that many of you subscribe to this blog because of my connection with Microsoft and especially MacBU. Since I'm no longer working there, feel free to unsubscribe. During the Holiday's I've been mentally processing my MacBU experience and I'll be posting much of what I have learned and observed. If that interests you, hang on, there might still be some content here for you! As you may have noticed I've not really posted anything since September when I returned to work after paternity leave! These last 3 months finishing up Office 2008 were quite the grind, not a death march, but certainly not pretty. I'm glad for it to end. With a bit more time, I think you'll see some more frequent posts here.

If you'd like to contact me informally, as always, feel free to email me at my Gmail account referenced on my Blogger profile page. If you'd like to contact/track me more professionally, feel free to follow my LinkedIn profile.

Happy New Year to all and wish me luck!