• Looking back on my past blogs and other content, I’ve noted a number of recurring themes. While the blogs are tagged, I thought it might be useful to provide a one-stop index to the various themes.

  • Note from 2025: I wrote this blog in 2012, to celebrate my then 30th Anniversary as a professional working in the software field. The other blogs in the “30 year” series are retrospectives on my career up to that point. You can find those here, here and here. The current blog forecasts what, at that time, I thought the next 30 years, from 2012 to 2042, might look like. Even though this contains some “notes to myself” toward the end, I’ve decided to to leave it exactly as written, worts and all, because–frankly–I’m pretty proud of it. As I look back on these predictions from the perspective of 2025, thirteen years of that original 30-year interval have already occurred. While not all of my predictions have happened yet, many have–and I think the rest still seem very likely. I especially like my predictions about AI and what we now call “deep tech” or “hard tech”–the interaction of the digital and the physical world. Incidentally, I cover a portion of the material presented here in a keynote presentation I gave on IoT a couple years after this was written: https://youtu.be/En7KLoRqxsc?t=2273

    As the final installment of the series looking over my past 30 years in software I’d like to turn the clock forward and look at what may be in store for us in the year 2042—thirty years in the future.

    Picture of James F Walsh Senior, father of the author, who is 25 years older.
    I don’t have a picture of myself 30 years in the future, so this isn’t me; it’s my father. If I’m still around in the year 2042, I might look a little like this—though hopefully with more hair.

    Moore’s Law as it’s often stated says that the power of computing devices doubles every 18 months. This observation and prediction have held true since at least the 1960’s. Throughout my career, well-reasoned and convincing arguments have been made almost every year that—while Moore’s Law will continue to work for the next decade, perhaps—beyond that point in time a fundamental physical limit will be hit which will slow further progress. Each time, however, new discoveries have been made or new approaches taken that allowed the steady improvement of computing power to continue.

    So let’s assume that Moore’s law will hold good for the next three decades, as it has for the last five or more. If that’s the case, by 2042 computing power will grow more than a million times (2^20) beyond its current value. Your pocket-sized smart device thirty years from now, if Moore’s Law holds good, will be about twice as powerful as 2012’s fastest supercomputer. That supercomputer resides in a National Laboratory, draws 8.2 megawatts of power, and covers an area of over 4,000 square feet (400 m^2). Your engineering desktop workstation in the year 2042 will be about four times more powerful than that. It will have the same processing power as the entire (estimated) two million server Google Global infrastructure does today[i]. And if history is any guide, in 2042 both engineers and smart device users will still be clamoring for faster machines!

    This picture shows a very small part of Google’s 2012 multi-billion dollar global infrastructure, estimated at two million “average sized” quad-core machines. Your desktop in the year 2042 will have the same power as Google’s entire network if Moore’s Law holds true. Image Courtesy Wired.com

    So what will you do with this incredible computing power at your fingertips?

    Well, play games obviously. And shop. View and create entertainment and media. And interact with your friends, and do the normal things that humans like to do. If history tells us anything, it’s that people remain the same even when their environment changes radically. Jokes told during Roman times can still be funny, and words written thousands of years ago can still move us, inspire us, and resonate with our own experience.  I think we can safely assume that however much our technology changes in the next 30 years, people will still be acting like people, and doing the same types of activities that people have done for millennia—though, of course, in some very different ways as we’ll discuss below.

    A more intriguing question, perhaps, than what people will be doing with their machines, is whether other entities will also be acting more like “people” in 2042. Some serious futurists[ii] speculate that when a computing system reaches 10 exaflops (10^19 floating-point operations per second) it has the potential to model and perhaps even develop human-scale intelligence. This degree of processing power is roughly 100 times our current estimation of the processing power of Google’s 2012 global infrastructure. If Google keeps upgrading this infrastructure in pace with Moore’s law, before the year 2025 their network will exceed the human intelligence threshold. And further in the future, by the year 2042, a network of just 100 of the then-current standard server machines would have a “human intelligence” level of processing power, at a price affordable by a small business—say, around $200,000 in today’s money.

    This is all speculation, of course, but what would it mean to have computers with human-scale intelligence available to us? Some futurists predict that as we put our most intelligent machines at work designing even more intelligent machines, over time our computers will become so powerful that they will far exceed human intelligence and even human comprehension. Driven by these super-human intelligences, the rate of technological change will go from being fast to being essentially infinite, with new iPhone-scale innovations occurring every few seconds instead of at intervals of years or decades. Depending on your emotional outlook, some speculate this could result in a “diamond age” of infinite wealth and possibilities, while others believe it will lead to the end of human civilization, along the lines of “Skynet” in the Terminator movies. 

    Futurists sometimes call this point of infinite innovation the “singularity” or, in a phrase that I prefer, the “rapture of the nerds”[iii]. While some scenarios put this hypothetical event within or around our 2042 horizon, I for one am not going to worry about it. I find both the worst and the best case scenarios tend to be the least likely ones to play out. What generally happens is something far more quotidian. It’s true the course of history—of technology or pretty much anything—is often a “punctuated equilibrium”: a period of stability or relatively linear progress that is set in a new direction by a singular event. It is certainly possible that we may be approaching such a singularity within the next 30 years. However, by definition, the future then becomes unpredictable. So let’s assume we continue tottering along somewhere between the extremes of rapture and extinction, and continue to look at where we might end up.

    I think the most likely near-term manifestation of large-scale computing power will be really good intelligent agents. I am currently a frequent user of Apple’s voice-controlled Siri system for iPhones and iPads, regularly using Siri to check the weather, play songs, send texts, and perform other tasks. By even the most generous interpretation, however, Siri’s current capabilities are nowhere close to showing real “intelligence”. But I do think it shows the direction. Where even the best commercial voice recognition system in 2012 is mediocre at best by human listening standards, Siri is clearly far better than anything available to consumers 10 years ago. It’s clear that over the course of the next decades, given Moore’s Law, at some point voice recognition will become really good. Likewise the “intelligence” behind it will become much more sophisticated, not just doing what I specifically ask for, but “thinking ahead” and solving real problems for me. 

    In truth, though, I think few people will need their own intelligent agent. In my own career I’ve had human assistants or “admins” who, of course, already had the human-scale intelligence these automated systems aspire to! I am talking about the type of admin who books trips, schedules meetings, files expense reports and so on—not a project manager or budget analyst. Frankly, during those times when I had a human admin 100% dedicated to me, I needed to make a special effort just to keep them busy. This is because I have always done many administrative tasks myself—using technology—that in my parent’s generation used to be delegated; a trend that will clearly continue and accelerate. My (human) assistant right now is shared between several execs, and that works out well for all of us. My guess is the artificially intelligent assistants in our thirty-year future horizon will be much like this—shared between multiple people, and hosted by businesses. Undoubtedly many businesses will deploy such artificially intelligent systems as “call center agents”—replacing today’s ubiquitous “interactive voice response systems” (“Press 1 for Marketing, 2 for Sales” and so on) with real problem-solving capability—at least one may hope. 

    Hand in hand with ever-increasing compute power will be the increasing intermingling of the physical and virtual worlds. This is a clear trend. Even our current 2012 generation smart devices contain a wide array of sensors. The smart device now in your pocket or bag can almost certainly sense its geographical location, physical orientation, changes in direction, ambient light, sound, temperature (to some degree), “feel” through its touch screen, “see” through its camera and “hear” through its microphone. Your device can also sense things we humans cannot, such as radio signals. Clearly smart devices in the future will have more and subtler senses—perhaps water-vapor or infrared sensors, pressure and texture sensors (“touch”), environmental chemical sensors[iv] (“smell” and perhaps “taste”), height above ground, micro-location (that is, 3D position accurate to the centimeter or better) and micro-orientation, automatic triangulation between other nearby sensors, automatic information and preference exchanges with other nearby smart devices, and many others.

    These future devices will also make better use of the sensors they have because of their increased computing power. While more is better, camera sensors on current-generation smart devices arguably have enough resolution to support face recognition, but using the smart devices themselves to do facial recognition of arbitrary individuals—or even a single individual in varying lighting situations—is not very satisfactory. This is an issue with “training” (access to accurate data), storage and compute power, as well as battery consumption. Similarly, voice recognition, scene recognition, object recognition and many other processing tasks are just beyond the ability of current devices to do really well. I think it’s a safe bet that 30 years from now, the technology on your smart device will be capable of recognizing any person you point it at, any object it “sees”, and understand every word that it “hears”—among many other recognition tasks. 

    Because of decreasing cost, these smart devices will also be more ubiquitous and more interconnected. We already see this trend, and it will clearly continue. By 2042—and perhaps well before–computing power will be literally everywhere. Not just in our smart phones, home entertainment and businesses, but in our clothing[v], our shoes, our eyeglasses[vi], our walls, our appliances, our cars, everything made out of glass[vii], low-cost packaging, Harry Potter-like “newspapers”, even our toilets and toothbrushes! These devices will all “talk” to each other in complex and artificially intelligent ways, making things like commercial self-steering cars, real-time health and exercise monitoring, and custom-tailored advertising a commonplace occurrence. While this may seem the stuff of science fiction, this is really not very speculative at all—many of these applications and devices either already exist or are in development today. What will change over the next 30 years is their ubiquity. I believe that 30 years from now, compute and display power will be literally everywhere.

    In addition to being much more aware of and embedded in the world around them, future generation devices will also have an increased ability to manifest the virtual world into the physical world. Right now, our smart devices offer speakers and headphones to produce sound, and increasingly high-resolution color displays to display images. While these are wonderful in their own way, over time our smart devices will have more and more ways of projecting virtually created objects into the real world. Let’s briefly consider two current technologies that I believe will become an integrated fact of life in the future. “Virtual reality” technology—such as that used to paint markers onto football fields in sports broadcasts—overlays or composites virtual images on top of the “live” image being seen through a camera. Because the virtual images are rendered in the same perspective as the camera—using fine-grained orientation and location sensors—the real and the virtual world are combined into a single, seamless view.

    In the future, smart devices will use transparent “heads-up” displays to overlay what we are actually seeing with information from the virtual world. “Google glass” is one such real-world integration initiative[viii]. While the current generation device lacks the ability to dynamically overlay images in perspective on our current environment, this will clearly be addressed in succeeding generations and we will have true “augmented reality” throughout our day in everything we see through our glasses or contact lenses. In addition, virtual devices may incorporate projectors that appear to “beam” images from the virtual world to the physical, along the lines of the holographic images in the Star Wars saga (though you may need to look through a transparent screen to see them)[ix]. Devices will also be able to interface with the physical objects around them and use those objects as displays devices and sensors. For example, the windows and walls of your home will become displays for next-generation smart devices, fully integrating your virtual and physical worlds.

    Because of improved sensor and display technology, in the future you will interact with your mobile device in increasingly “natural” ways—that is, in a way that is similar to how you interact with other people, and with the physical environment around you. Your mobile device will be able to read your facial expression and tone of voice, for example, and respond to your mood more as a person would. You will use speech and gestures to manipulate real or virtual objects in increasingly natural ways. As a current example, consider the touchscreen and the “swipe” gesture. I have seen both small children as well as my late mother-in-law—who was in her 90’s—adopt this gesture almost without thought.

    Current year 2012 smart devices perform two key functions: (1) they offer us portable compute power as well as the associated displays and sensors to take advantage of it, and (2) they serve as proxies for our identity. There is a strong argument that the first function—that of providing portable computation, input and display power—will be supplemented even subsumed by the environment around us as computing power becomes genuinely ubiquitous. For example, if every glass surface in our environment can act as a display and input device, the need for a large screen or keyboard in the smart device itself is reduced—meaning that our devices can be made physically smaller. 

    I personally believe many smart devices will retain enough functionality that they can be used in a self-contained way; but there’s a good case that they won’t. In this case the second function—serving as a proxy for our identity—may become the primary function of smart devices. The original function of our smart devices was, of course, to receive phone calls. In this case, the device was an obvious proxy for our identity—when someone calls “your number” they of course reach your phone, not you personally; that is, the phone is a proxy for you. Similarly, smart devices are now serving as payment and location tokens and, I believe will increasingly broadcast information about us in the digital realm just as our appearance does in the physical realm. If the primary function of a smart device is to be a stand-in for us in the digital world, having such devices physically embedded in our body does not sound out of the question!

    “Virtual Reality” is in some ways the opposite of “Augmented Reality”. Where augmented reality projects the virtual world onto the physical, virtual reality projects the physical world into the virtual. The simplest manifestations of virtual reality are programs that enable you to control virtual beings or “avatars” in a computer-based world. Today in 2012, this has been commonplace for decades in gaming and also in simulations such as “Second Life” and “The SIMS”. We have already seen the trend where games and simulations have grown dramatically in sophistication. Thirty years from now these environments will be extremely rich and immersive, probably utilizing special suits and glasses, gestural interfaces or motion capture type technology to allow you to project yourself in a seamless and intuitive way. 

    As computing power grows closer to having the full capabilities of the human brain, some serious researchers—including DARPA, the US Defense Advanced Research Projects Agency who pioneered the Internet—are looking for ways to directly connect the human brain to external sensory apparatus as well as, presumably, virtual worlds[x]. This has real-world application for controlling artificial limbs, and prosthetic devices are already under development that respond to brain control[xi]. As computers capable of simulating every neuron and dendrite in the human brain become a reality, it is not entirely science fiction to imagine that at some point people may be able to “upload” their entire personalities into a computer. If that ever happens, though, it is likely to be outside the 30 year time horizon we are looking at, because fast as Moore’s Law is, the computing power to do this won’t be readily available quite yet—even in 2042. 

    A profound extension of the virtual world into the physical world is 3D printing. While it may sound like science fiction, the ability to “print” physical objects in layers has actually been around since the 1980’s. What has changed is the reduced cost and increased precision and speed of these devices due to the availability of more processing power. 

    One type of “additive manufacturing” or “3D printing” that is becoming practical is to use an inkjet printer to deposit one layer at a time of plastic or other material onto a substrate, which is then hardened. A second layer is laid on top of the first, and so on until a complex three-dimensional structure is built up in cross-sections, layer by layer. Scaffolding made of sprayed-on wax or other removable material is used to support voids in more complex objects. By laying down the sections of a three-dimensional object one-by-one—much like paging through the succession of individual cross-sections in a CAT scan—a three-dimensional object of almost arbitrary complexity can be built from a 3D computer model. 

    Many different 3D printing technologies exist in addition to inkjet that can take a computer model and “print” metal, plastic, glass, ceramic or other material into a real-life object. Even food items have been printed. Perhaps the most intriguing of the many items that have or will be “additively manufactured” is the initiative to print replacement human organs and bone joints. For at least a decade, researchers have been looking at ways to “print” new organs using computer models and inkjet technology[xii], using the jets to deposit living cellular material onto a cell-nurturing substrate. This is in some ways a holy grail because by printing organs using the patient’s own cultured cells, both the need for donors and the possibility of organ rejection can be avoided. It’s even conceivable that the patient’s own DNA could be synthesized on the spot from digitized sequencing data and used to grow the required cells, making the production of his or her own personalized organs available on-demand anywhere in the world. And what about printing entire human beings from scratch! This is getting more into the science fiction realm than I’d like to in this blog, but is certainly something to think about.

    Compared to printing organs and whole people, printing bones, joints and teeth may seem more prosaic. However printing custom-shaped replacement teeth is already being done commercially[xiii], and printing artificial hips customized to the patient’s specific bone structure is an active area of research.[xiv] I have had two elderly family members go through hip replacements, and even though the surgery went well their mobility and comfort was impacted afterward. To be able to essentially recreate and implant an exact replica of their original hip would have been of tremendous benefit—and in a few decades at most I think this will be commonplace.

    While many challenges remain, thirty years from now it seems very likely to me that the technology of printing custom-made human organs, bones, teeth and joints will have been perfected.  Whole humans may take a while longer!

    Printing technology also suggests one of several possible paths around obstacles to Moore’s Law, in that it suggests ways to create truly solid three-dimensional circuits by laying them down one layer at a time. While today 3D printing technologies for electronics are primarily being considered as a means of creating macro-sized objects like three-dimensional circuit boards, it seems conceivable that in the future 3D printing technology could be used to create truly “solid” (three-dimensional) circuits. Individual structures in conventional integrated circuits are expected to reach dimensions of 10nm within the next decade—far smaller than the 65nm structures current 3D printing technology can currently produce[xv],[xvi]. Still, it’s not beyond imagination that within the next 30 years techniques will be found to “print” semiconductors and the structures required for integrated three-dimensional circuitry.

    Perhaps the holy grail of “3D printing” would be the ability to “print” molecule by molecule, or even atom by atom, thereby creating entirely new chemical and physical structures. This is similar to the ultimate aim of a discipline called nanotechnology, and the theoretical machines in that discipline that can do manufacturing on the molecular level are called “Assemblers” rather than printers. A molecule-by-molecule assembly technology, along with software control, would among other things allow medical professionals to create “designer” medical compounds tailored specifically for you as an individual[xvii]. While this sounds far-fetched, note that biological processes “programmed” by DNA do indeed have the capability to synthesize new molecules. You yourself were physically produced using such “programmed”, chemically synthesized materials. The goal here would be to do such an assembly process—literally—programmatically under software control[xviii].

    A fully realized nanotechnology program would have the ability to create any structure using the chemical materials at hand. Much as a seed can be regarded as a set of programming instructions and chemical machinery that re-organizes dirt, sunlight and water into a tree, nanotechnology would have the ability to create—grow if you will—physical objects using information created in a virtual environment. While this sounds incredible, the pieces are in place to make it happen—and I think it will happen, within the next 30 years. While you may not be able to “grow” a chair by 2042, you will probably be able to design one on your computer and then print it at home or at a nearby service. And, with nanotechnology, once you have the physical object you may then be able to manipulate it into a different shape, color, and texture programmatically, as your needs or wishes change.

    At the heart of many of the trends I see converging over the next 30 years is “just in time” and “bespoke personalization”. I believe you will have an unprecedented level of control over the entertainment you see, the goods you buy, the medicines and healthcare products you use, and the way you interact with the world around you generally. Going one step beyond that, I think many items will be created for you “to order”, “on the fly” as you want them, including software applications.

    For example, a physical clothing store of the year 2042—if such a thing exists at all—may have only a very limited selection of sample garments. Those they do have will be mainly to stimulate ideas or showcase the latest fashions. You may try on a sample for “feel” and general appearance, after which your own personalized garment will be created for you, as you wait, in your choice of color and with personalized fit and details (pockets, no pockets and so on).  Such boutiques would be primarily for people who enjoy the experience of shopping. People who don’t want to shop can—in the “virtual” world—send their intelligent agent or “avatar” to try on and even select clothes for them, perhaps with the aid of intelligent assistants or human-driven shop assistant avatars. Some clothes may be “printable” at home, obviating the need even for shipping.

    These trends are already clear in the “fast fashion” industry (Zara, H&M, etc.), and in the emerging computerized “made to measure” industry. The technology is not really a stretch; what would need to evolve over the next 30 years would be the consumer preferences to make this a reality. Due to increasing automation the economics in many industries have already shifted so that making one unique item costs roughly the same amount per unit as manufacturing the same item in quantity. I believe the trend will continue so that items made “just for us” and “just in time” will become the norm. This is not just idealism; the huge savings in transportation, inventory and “wastage”—producing items that are never bought and need to be marked down—are very real and very measurable, and already driving fundamental shifts in the apparel industry. My guess is this will continue and the trend will spread to other industries as well as the technology to rapidly produce a “custom” product evolves.

    In addition to the just-in-time manufacture of physical goods such as furniture and clothing, I believe many virtual goods such as software will also be created “on the fly” by intelligent agents. Software tools have already progressed to the point where a typical “appstore” type app for a smart-phone now takes only a few days, weeks or at most months for one or a small handful of people to develop, requiring only a few hundred to a few thousand lines of code. This is a huge reduction from the norm of just a few years ago where teams of dozens or even hundreds of people took 18 months to produce a new product, which typically consisted of hundreds of thousands or millions of lines of code.

    Granted, most such “appstore” applications are simple compositions of pre-built components. These apps may leverage sophisticated services that do indeed take significant engineering effort to produce—but many apps can leverage the same services. Simple as they are, appstore-type apps solve real problems and are the kind of thing consumers are looking for most often. I believe in the future many apps will be created on demand by intelligent agents and then just as quickly discarded. 

    For example, before a recent car trip my wife asked me what the weather would be like along our route. I was momentarily at a loss—I knew how to find the route and I knew how to find the weather at each point along the route. What I didn’t know how to do was combine the two with the estimated-time-of-arrival for each point along the route, and then produce a meaningful display. I ended up finding a pre-built app that gave me what I wanted—and I suppose I could have written it myself given a small amount of effort. However this is exactly the kind of solution an intelligent agent could instantly build out of existing components to solve a problem in real-time.

    I believe that by the year 2042 “games” and “movies” will have merged into a single form of entertainment that is very immersive.  You will be able to both surround yourself with the drama in an “augmented reality” type of fashion—that is, projected onto the physical world—and also to project yourself as a character into the virtual world created by the content you are watching. A simple example of this would be the ability to give the hero or heroine of a conventional movie your own face and idealized appearance, and likewise cast the other characters as you choose. There will still be made-up plots and characters in the future, I believe, but certain plot points will evolve according to your actions within the drama and your preferences. That is, you will be an observer or a character in a play that is partly of your own making. Certainly we will still enjoy passively watching the creations of others—but even those we will probably be able to easily tailor to our preferences.

    To non-gamers, it may sound like science fiction. To the gamers among us, though, it is old news—current (2012) generation video games do much of this already. What will evolve, I think, is that the excitement of a great cinema experience will merge seamlessly into the interactivity and immersive quality of video gaming, and the two will in some sense become one. Certainly people will still go to places—theaters—that have more sophisticated equipment than an individual can comfortably afford, both for access to a heightened experience and for the social aspect. However I think our powerful smart devices and their associated intelligent agents will themselves become active participants in the experience, allowing us to continue seamlessly where the cinema experience leaves off.

    Finally, a few perhaps paradoxical predictions. Though intelligent agents will take over more of the mundane tasks of programming, design and production, I believe the role of the “designer” will be more important than ever. 

    Role of the designer

    Value of artisanship

    And, finally, what happens to all the programmers? Well, someone needs to make all this stuff happen! The programmer is the person who tells the machines what the humans want it to do. Though the technologies and approaches to this will change, that essential mission will remain just as important for the next thirty years as it was for the past thirty. And perhaps moreso, because more things are now possible. I think it’s an exciting future we face—and it’s you who will help make it. I wish you much joy on the journey that, as Steve Jobs so rightly said, can itself be the reward.

    Coda

    Science Fiction writer Arthur C. Clarke was probably one of the most insightful futurists in recent history. In 1968, Clarke made bold predictions about the future in his book “2001: A Space Odyssey”.  He was looking across just about the same 30-year time window I’m trying to envision. How well did Clarke do[xix]?

    Well, it was mixed. 

    Even though it was written in 1968, some of Arthur Clarke’s predictions in “2001” were highly accurate: The re-establishment of friendly relations between the US and the countries of the former Soviet Union happened by the early 1990’s; Video conferencing became popular for businesses in the 1990’s, and went mainstream for consumers in the early 2000’s (Skype first came out in 2003); in-seat personal televisions for in-flight entertainment in airplanes (Clarke has them in space ships) came out in the late 1980’s; and many of the other predictions in his book indeed came true before or shortly after the year 2001.

    A number of other devices that Clarke predicted—for example, a networked flat-screen tablet device—have become commonplace, though not by the year 2001. And there were other devices—for example, mobile phones—that had become ubiquitous by 2001, but which were not mentioned by Clarke, at least in this book.

    On his major predictions, Clarke was completely wrong—at least on the timing. Even though man actually got to the moon years before Clarke envisioned, he didn’t stay. There were no permanent bases established there, and no program of manned space exploration has been attempted for any other planets. Intelligent computers with fluent speech and speech recognition, the ability to recognize faces and pictures, and to think autonomously, still remain in the future at this writing more than 10 years after the year 2001 has passed. To date, no signs of intelligent life have been detected on planets other than Earth. True, there are tantalizing hints that microbial life exists or once existed on Mars[xx], and that the number of Earth-like planets is large[xxi], with one perhaps as close as 6.5 light-years away[xxii]. But, bottom-line, Clarke’s most provocative predictions have yet to come to pass.

    Clarke’s predictions that have so far failed to come true did so for several reasons:

    1. The external forces that had been driving technology in a particular direction changed. The driving force behind the space program at the time Clarke was writing—the 1960’s—was the military competition between the US and the Soviet Union called the Cold War. By the time of the first moon landing in 1969, the competition between the two countries had already shifted to arenas other than space. And by the early 1990’s, the Cold War had ended entirely. Without the military imperative behind it, the manned space program and the funding it required did not continue as Clarke had envisioned—hence no colonies on the moon by 2001. While I think that macro economic and social forces will continue to drive the electronics industry as they have in the past, I could be wrong. While individual “smart” items themselves get cheaper and cheaper, at present more and more massive concentrations of capital are needed to create those devices originally. Nanotechnology—once created—could completely change this equation, but currently it takes billions of dollars to create a new plant to manufacture state of the art display devices, microprocessors and other electronic components (“Fabs”). Economic disruption or other changes that limit capital investment in new technologies would slow or conceivable even stop its evolution. New social forces could also cause the technical world to branch out in a direction other than electronics. While I think technical, economic and social forces will continue to favor faster and faster evolution of computer and information technology for the next 30 years at least, events such as an all-out cyberwar, structural economic changes, or greatly heightened privacy concerns could place limits on growth.
    2. The technical problem was harder to solve than it originally appeared to be. Somewhat surprisingly speech and object recognition, as well as computer cognition, have proved to be much harder technical problems than Clarke originally imagined. At this writing I would guess that the earliest a HAL-type intelligence will be practical in a spaceship-portable system will be in the late 2030’s or early 2040’s, about 40 years after Clarke’s 2001. In other words, I estimate this goal is still almost as far in the future for us, as Clarke thought it was for him writing 45 years ago. Could my current 30-year forecast still be too conservative or too aggressive? Absolutely. Another possibility for a hard technical problem is something that causes the growth in computing power predicted by Moore’s law to slow or stop, or one that prevents higher capacity batteries from being commercially viable. We may indeed hit some fundamental physical limitation that we can’t figure out how to overcome. I don’t expect this to happen in the next 30 years, but it could.
    3. Projecting the assumptions of the current time onto a future time. One of the most amusing things when you look at past predictions of the future is the author’s implicit assumption that some commonplace item in the author’s own time would remain commonplace. One of my favorite “golden age of science fiction” (1950’s and 1960’s) authors, Robert Heinlein, describes people in the far future using slide rules to navigate their space ships. Arthur Clarke features phone booths—rather than mobile or networked phones—and other relics of 1960’s culture in 2001. Far from criticizing them, we should recognize the most difficult part of predicting the future is that we are looking forward from the context of our own time. Like fish in water, we are often so accustomed to what surrounds us here and now that it never occurs to us to question its existence in the future. As with any deep learning experience, the hardest part is to “let go” of our current assumptions—especially when we aren’t even conscious that we are making these assumptions.

    For my predictions in this blog, from the vantage point of the year 2012, I believe that I am actually being quite conservative about what will happen by 2042. I can see that the manner in which these predictions will come true will probably change—for example, perhaps a technology other than 3D printing may evolve to produce the results I mention. Still, as I write this I think the predictions themselves are very likely. But then again, I’m sure Mr. Clarke felt the same way when he wrote his famous book. The business of predicting the future is ever fraught with peril, because one thing that is entirely predictable is that people will surprise you!

    Personalized medicine

    Nano-technology—creating macro structures

    Bespoke

    Printing custom organs and hip replacements

     nanotechnology

    Intermingling of computers with normal devices

    3D printing

    immersive—physical and virtual world are seamless


    [i] Apple A6 Tri-core PowerVR SGX543MP3 running at 250MHz used in the iPhone 5 has total processing power of 27 GFLOPS, per http://en.wikipedia.org/wiki/Apple_System_on_Chips. The most powerful supercomputer known (that is, not classified) in 2012 was the Cray Titan, which at a peak rate of 17.59 petaflops (10^15 flops) was 637,000 times more powerful than an iPhone. The complete Google server farm was estimated to have 2M separate server machines in 2012 (James Pearn at https://plus.google.com/114250946512808775436/posts/VaQu9sNxJuY), each with a quad-core CPU. Google does not disclose details, but the quad-core Intel i7-950 which shipped in 2009 is a reasonable guess since Google has systems of various ages; these run at about 50 GFLOPS each. Two Million servers running at 50 GFLOPS gives 100 petaflops—about 3.7 million times more powerful than a current-generation iPhone. Note that not all of Google’s servers run Search, and not all are working at any given time. A current 2012 engineering-class desktop, containing a microprocessor such as Intel’s i7-3770 (Ivy Bridge), runs at about 100 GFLOPS.

    [ii] See, for example, Raymond Kurzweil “Turing’s Prophecy”, http://www.kurzweilai.net/turing-s-prophecy. The 10 exaflop number for human intelligence is from Raymond Kurzweil as quoted in http://www.futuretimeline.net/subject/computers-internet.htm.

    [iii] See, for example, http://en.wikipedia.org/wiki/Technological_singularity

    [iv] http://www.nevadanano.com/solutions/human-presence-detection/

    [v] http://electronics.howstuffworks.com/gadgets/high-tech-gadgets/computer-clothing.htm

    [vi] http://www.google.com/glass/start/

    [vii] http://www.youtube.com/watch_popup?v=6Cf7IL_eZ38&vq=medium

    [viii] http://www.youtube.com/watch?v=9c6W4CCU9M4,

    [ix] http://www.wired.com/dangerroom/2012/08/iarpa-holograms/

    [x] http://www.popsci.com/technology/article/2012-03/achieving-immortality-russian-mogul-wants-begin-putting-human-brains-robots-and-soonhttp://www.wired.com/dangerroom/2012/02/darpa-sci-fi/.

    [xi] http://www.nlm.nih.gov/medlineplus/news/fullstory_132301.html.

    [xii]  http://www.cell.com/trends/biotechnology//retrieve/pii/S0167779903000337, cited in http://en.wikipedia.org/wiki/Tissue_engineeringhttp://www.bbc.co.uk/news/technology-18677627 and http://www.theengineer.co.uk/in-depth/analysis/building-body-parts-with-3d-printing/1002542.article, as cited in http://en.wikipedia.org/wiki/3D_printing.

    [xiii] http://www.ft.com/cms/s/2/22affc68-64ee-11e2-934b-00144feab49a.html#axzz2NZArgWsT

    [xiv] http://www.economist.com/node/21541382

    [xv] Note that the 10nm feature size projected for integrated circuits this decade is already at molecular scale. A small molecule like an amino acid is about 1 nm in size, with 10 nm being fairly typical for a molecule. “Atomic scale” is considered about 0.1 nm—basically the diameter of a single helium atom. By contrast, the wavelength of visible light is enormous—between 400nm to 800nm, depending on the color.

    [xvi] http://eetimes.com/electronics-news/4070805/Cheaper-avenue-to-65-nm-, cited in http://en.wikipedia.org/wiki/3D_printing.

    [xvii] http://blog.ted.com/2012/06/26/lee-cronin-at-tedglobal2012/, as referenced in http://www.3ders.org/articles/20120627-create-personalized-medicine-using-a-3d-molecule-printer.html

    [xviii] http://www.extremetech.com/extreme/143365-3d-printing-cancer-drugs-molecule-by-molecule-using-dna-scaffolds

    [xix] Though not entirely serious, thanks for some useful reminders from the blog http://www.currybet.net/cbet_blog/2009/02/how-accurate-was-kubricks-2001.php

    [xx] http://www.theverge.com/2013/3/14/4100578/life-on-mars-still-elusive-after-curiosity-viking-other-discoveries

    [xxi] http://news.discovery.com/space/earths-exoplanets-solar-systems.htm

    [xxii] http://www.newscientist.com/article/dn23271-closest-earthlike-world-could-be-65-light-years-away.htmlThe next thirty years

  • My wife Carol and I in India in 2004. This was my third trip to India, and my wife’s first. I was not sure if I would get the opportunity to visit India very many times in my lifetime, so I wanted to be sure we both had the chance to see the wonderful sights. As it turns out, I have been a frequent visitor since then, staying for 4+ months altogether some years, and on individual trips as short as 1.5 days.

    Early in the decade of the 2000’s, I was at a startup developing a predictive analytics solution. Our objective was to host the advanced “decision analytics” engine we developed as a SOAP-based web service using a business model that was then called “ASP” (not to be confused with the Microsoft technology of the same name). ASP, standing for “application service provider”, is what we would today SaaS (“Software as a Service”) or even by the rather unfortunate acronym AaaS (“Analytics as a Service”).

    At the beginning of the decade words like “Agile”, “VoIP”, “WiFi”, “Open Source” and “Smart Phone” were just beginning to enter the engineering mainstream, while words like “Cloud Computing” had yet to be spoken—at least outside advanced R&D labs. Still, at this 2001 startup we used technologies that even today would be regarded as mainstream: Java, Struts, SOAP, Tomcat, SVG, and an XML decision model representation to name a few. Our server OS’s were Windows and (if memory serves correctly) Linux. Our development methodology was the then brand new Agile methodology, “Extreme Programming”. Even our telephone system was recognizably “modern”: the then-new Cisco VoIP Call Manager.

    If I were to make the same technical choices today that we made back in the early 2000’s, I doubt if any but the more technically aggressive people would be very concerned. All the technologies we selected back in 2001/2002 are still very much with us and in widespread use ten years later.  However I would not get the kind of throughput, scale, flexibility and rapidity of development that the current technology choices make available to me. In choosing the older “proven” technologies, I would be making in some sense a “safer” choice, but at the same time I would not be leveraging the best technology that’s available to me today.

    To implement a similar “Analytics as a Service” product concept in a similar business situation today, I’d make totally different choices. My guiding principal would be to build a product ready for the next decade, and to take maximum advantage of current technical advances to give me the “biggest bang for the buck”—the most benefit for the least engineering effort. Prominent among these technologies would be Cloud and bigdata technologies. These would give me massive scalability and reliability basically “for free” in terms of programming effort. 

    My first step—as it was then—would be to gather together the smartest people I know and brainstorm our options. Today, these options would no doubt include an elastically scalable Cloud deployment model; a NoSQL distributed data store such as, for example, Amazon DynamoDB or Cassandra; RESTful interfaces; JSON; perhaps the “R” programming language (http://en.wikipedia.org/wiki/R_language) for some aspects of decision modeling; and maybe Python Pyramid or node.js for the interfaces and d3.js for the graphs. There are lots of good options, and I learned long ago that the best technology decisions are made by listening to the smartest people you know in the space.

    This real-life example is a good illustration of how I’ve experienced technology evolution in general over the last thirty years. In 2012, Java, Open Source, XML, SOAP, VoIP and the other technologies we selected a decade ago seem like good, solid, well-validated choices. However when we made these selections back in 2001, they were seen as “cutting edge” and risky. In fact some people in that startup were acutely uncomfortable with these choices at the time.  And they had some valid reasons. Operationally, you could not go out and easily hire people in 2001 that already knew SOAP, for example—this was brand new technology. Even Java was still fairly cutting edge in the early 2000’s compared to, for example, the C++ language that I’d worked with a decade before at Borland and Rational. And because it was newer, Java programmers tended to be harder to recruit and more expensive—another argument that was used against the “new” language.

    It’s a similar situation today with the more “modern” Cloud-centric technologies I mentioned above. While each of the technologies I would consider today is well proven by highly successful companies in large-scale deployments, the mainstream is still uncomfortable with many of these choices.  Even where the “modern” choices solve a real need, whether or not a given team designing a new product can and should embrace the latest technologies will end up depending heavily on the non-technical factors of the project. In some situations, the skills and inclinations of the current development team may limit the options that can be realistically employed. Schedules, politics and other non-technical considerations may also limit a team’s ability to try a new approach, however much they would like to.

    In cases, though, where the advantages are compelling and create real value for the product, my advice is that you should embrace the newly proven paradigms wherever possible—even if it’s a little scary and the team needs to stretch. This is not to say that it’s a good idea to embrace every new idea that comes along—that’s more a question of “fashion” than of substance. But where a new idea emerges that offers real value, and where other serious and thoughtful people are using it to successfully solve real-life problems, then it’s worth your while to learn about it and take advantage of it. I can predict with some confidence that a product making appropriate use of the new best-of-breed Cloud technologies has a much better chance of still being “current” when I write my 40th anniversary blog in 2022 than one written using technology that was cutting edge in 2002.

    We certainly did see language and tools evolution in the last decade: Java grew “fatter” with J2EE / JEE and then got “thinner” again as the Spring / POJO paradigm grew dominant. Ruby on Rails emerged as a popular and highly productive choice for web applications.  Python—though with us since long before the 2000’s—rose to prominence as a first-class product development language. And perhaps most surprisingly to those of us who have been around a while, javascript—once considered by engineering snobs as a second-class language for HTML hackers—has emerged as a first-class language both on the client side and the server side. Though not novel conceptually, the emergence of distributed NoSQL databases to store unstructured data (text, for example) and non-relationally structured data (such as graphs, trees and key-value pairs), together with the tools to take advantage of them, is also of incredible importance. And the SOA / ESB (Service Oriented Architecture / Enterprise Services Bus) / Service Orchestration paradigm rose to prominence in various industries and is still widely used in the Enterprise Software space (though no longer very frequently in the ISV space).

    While in no way minimizing them, from my own personal perspective in product development I would classify the changes on the language and tools front in the decade of the 2000’s as more evolutionary than revolutionary in nature, compared to past decades. There are other recent changes, however, that have been very much revolutions. In terms of disruptive changes that have occurred in the software industry over the last decade, my short list would include:

    1. Outsourcing
    2. The move to browser-based systems and ubiquitous mobile service, leading to a “flattened” planet 
    3. Hosting and the elastic scalability paradigms of the Cloud (Big Data, compute elasticity) and the democratization of massively parallel compute paradigms like Map/Reduce to take advantage of it
    4. The Agile software development paradigm and the widespread availability of powerful, ubiquitous and free (or nearly free) software and people who know how to use it
    5. Smart devices, tablets and “physical world” aware devices (location-based services, etc.)
    6. Self-authoring and publishing of content on the world-wide web (facebook, twitter, blogging, “web 2.0”)

    Outsourcing

    By the beginning of the 2000’s, I had already worked on several distributed development projects—a memorable one being the Japanese Kanji version of NeXT’s Software’s NeXTSTEP Operating System (3.1j). I’d also worked with outsourced providers of specialized services such as software CD-ROM duplication and distribution. Still I had never done actual software product development outsourcing, and indeed was very skeptical of the whole concept. From my point of view at the time, software development was challenging enough when everyone was in the same building. Putting the barrier of timezones and oceans between teams seemed like a recipe for failure in the late 1990’s.

    I had encountered outsourcing as a concept in software development back in the 1990’s in two contexts. One was the use of specialized firms that focused on a particular and usually highly technical task—for example, Intel / Windows video device driver development. These companies tended to be US based (or later in the decade Eastern-Europe based) and small—maybe 20 people or so. The other type of outsourcing was generally done for IT departments of large companies. They used staff in low-cost geographies—with India being the most popular—to augment in-house programming staff for some relatively low-end (technically speaking) special-purpose work—for example, for “Y2K” conversion. 

    (For those of you not familiar with “Y2K”, there was an issue around date arithmetic with the turn of the century from 1999 to the year 2000, the year otherwise known as “Y2K”. Many programs that represented the year as a two-digit string or integer such as “95” assumed that the numerical value of the last two digits of a later year (for example, “99”) was always greater than the numerical value of an earlier year (for example, “93”). This assumption was no longer true across the century boundary since year “00” occurred after year “99”, not before. Uncorrected, this assumption would cause accounting and other date-dependent systems to fail spectacularly on New Year’s Day, 2000. Writing at a short distance of just over 12 years after this event, it’s hard for me now to imagine that the world could ever had developed so much software with this fatally flawed and short-sited assumption—but we sure did!)

    The Y2K problem led to the explosive growth of the India IT outsourcing industry because once the tools were in place, the inherently date-critical nature of the problem offered only one solution to compress implementation timelines: add staff. While plowing through millions and millions of lines of mostly COBOL code was an enormous undertaking, the fix to each individual instance of non-compliant code, once found, was generally straightforward. This allowed large numbers of relatively low-skilled programmers to be effective at finding and fixing Y2K problems. As a side effect, the India outsourcing industry was launched.

    Where there are large numbers of relatively low-skilled programmers, some fraction of these people will prove to be very smart and, over time, become high-skilled. Other high-skilled, smart and generally more senior people are needed all along to supervise and guide the lower-skilled ones, and educational systems were put in place to produce and grow more talent. While outsourcing remained mostly an IT-centric phenomena in the early 2000’s, the capability also rapidly developed to the point where some Indian outsourcing companies were able to field Silicon Valley caliber resources—first in the testing, support and maintenance areas, and later in product development.

    This era is where my own involvement with outsourcing began. By 2002, I had left the “AaaS” startup I described above and was working at an enterprise software company that had already made the decision, before I joined, to try outsourcing. My team was selected for the trial. I did not mind this at all since it would grow my team—in fact, nearly double it in time. I was on the vendor selection committee—quite interesting in itself—and we picked a vendor based in Hyderabad, India. I recall asking one of my Indian colleagues at the time which major Indian city Hyderabad was closest to; I had never heard of it before. My colleague looked at me rather strangely, saying: “Hyderabad is a major city—it’s the forth largest city in India and has about six million people.” So I got a map and looked it up: Hyderabad is in the south of India, about 550 km north of Bangalore by road.

    I don’t think my general lack of knowledge about India was unusual in the US at the time—I think it was fairly typical. Certainly we in the software industry had worked side-by-side with Indian immigrants to the US for many years—but we talked about software, not so much about India the country. For me, one of the first experiences I remember with an Indian colleague was in the early 1990’s. One of my fellow managers was an older (than me at the time) Indian gentleman who had been in the US for about 5 years when I met him. I remember one day he took me aside and said “Jim, may I make a personal statement?” I was rather puzzled, but told him to go ahead. He said “You know, I think you are the most “American” person I have ever encountered.” I didn’t know how to react to this statement, but chose to take it as a compliment and thanked him. My Indian colleague continued: “You know, just a few years ago, I would have had no idea how to deal with someone like you; I would have run screaming from the room. I take it as a real success and it shows me how much I’ve grown that we can work together so well.” After this I really didn’t know what to say, so I mumbled something vaguely positive and quickly changed the subject.

    My ignorance of India in the early 2000’s was such that given the surprisingly low cost per head (relative to Silicon Valley at the time) I had real and (as it turned out) totally unfounded concerns about whether or not the people on my outsourced India team were exploited workers. This bothered me so much that I got on a plane and went over to Hyderabad to check. As it turns out, I need not have worried. I found happy, well-treated people whose physical working conditions were actually better—literally—than those I had experienced at the San Francisco-based AaaS startup I had recently left. I found out that the wages that were paid to them permitted them to live comfortably middle-class lifestyles by the local standards—far better, in many cases, than their parents. Their jobs were considered prestigious and offered a great deal of upward mobility.

    As for the caliber of the people, with one or two exceptions (which I fixed), I found myself thinking that if they were in the US, I would hire these people.

    Fortunately I was not in a situation where I was ramping up in India in order to lay off in Silicon Valley—this time. But in Hyderabad I found myself thinking: Would it be the right thing to do to deny these great, hard-working people employment for the sole reason that they live in India and not the US? To me, at that moment, that seemed like the most “un-American” thing I could possibly do. 

    A few years later, I joined another Enterprise Software company specifically to help them establish an offshore development center in India.  Looking back on it I actually did not have a lot of practical experience with outsourcing at the time I joined. However with my one success I still had far more experience than anyone around me—and more than most in the industry at that time. This time our center was to be in Bangalore—which I had heard of. Over time, it grew to about 180 people and ended up “owning” the development, end-to-end, of two core product lines with only a limited on-shore presence in both areas. We also later opened a second development center in Eastern Europe that was highly successful in developing portions of our highly technical analytics product line.

    Today it is almost unthinkable for a software product company to NOT have an offshore development component. Even startups often begin with an outsourced team, either immediately or shortly after creating their first prototype and getting funding to develop a product. This reliance on outsourcing is because the demand for speed of development has grown higher while spending on engineering is capped by the expense ratios of the best-performing companies—who generally all use outsourcing.

    Another key driver of outsourcing is the relative lack of availability of skilled local resources. In 2012 I learned of a job posting in the Silicon Valley area that offered a salary of $160k per annum for an iPhone iOS developer with 2 years experience. While you need to wonder how long such a job would actually last (Days? Weeks?), at the same time no sane company would make such a posting if the skillsets they needed were readily available. Shortage of talented, skilled engineering labor is a huge limiting factor for technology companies in the US—and an important driver for outsourcing. If experience has taught me one thing, it’s that there are smart people everywhere, throughout the world. As long as that’s true, and as long as economic growth is not uniform globally, there will clearly be a need for outsourcing.

    My passport from the 2000’s and a set of my airline, hotel and car rental “loyalty cards”. I remember passing through customs at Amsterdam’s Schiphol airport in the late 2000’s. The border agent tried to find an empty place in my passport so he could stamp it. Frustrated, he looked up at me and said “You travel too much!” (Photo courtesy of the author.)

    One side effect of outsourcing is that in the 2000’s I became a frequent global traveler. I had always done some degree of business travel, some of it international, but nothing like what I experienced in that decade. Our youngest child turned 18 in 2003 and soon after left for University. While we missed her enormously of course, not having children at home enabled me to travel extensively, sometimes bringing or meeting my wife along the way. In the early 2000’s I traveled first as a relatively early customer of outsourced product development services; later in the decade I was traveling because I had switched to the provider side. There were several years during the decade when I spent more time traveling overseas than I did at home.

    I actually don’t know how many international trips I took and how many miles I travelled in that decade, but it was a rare year in the 2000’s when I didn’t fly the equivalent of multiple times around the globe. My frequent flyer balances on more than one carrier range up into the high hundreds of thousands—and those are just the miles I haven’t yet used.

    Technology flattens the world

    One of the most striking facets of traveling around the world in the 2000’s was how easy it was, in historical terms. There’s nothing technology can do about timezones, which are built into the shape and size of the earth. There’s also no way of changing the fact that even traveling near the speed of sound, it’s a long way from my home near San Francisco International Airport to Bangalore, Delhi, or Eastern Europe. But short of that, international travel in the 2000’s imposed relatively few inconveniences beyond the long plane rides and the fact that, when I got there, my colleagues and family tended to be asleep while I was awake, and vice versa.

    By 2012 many of the technologies that made convenient travel feasible became so commonplace as to seem mundane, but they very much changed the face of business travel over the last decade, mine included.

    On the everyday living side, browser-based banking and bill paying services meant that I did not have to come home anymore just to pay bills—which, prior to the early 2000’s I would have had to do for a few bills at least. This, together with direct deposit of my paycheck into my bank account, enabled me to be away from home for literally months at a time, which I sometimes was. The global interconnection of Cash Machines (known in the US and some other places as Automated Teller Machines or ATM’s) meant that my normal debit card from my bank “at home” could be easily used to get local currency from any cash machine in the world. My Visa, MasterCard and American Express cards were accepted world-wide, meaning I did not need traveler’s checks to pay for food or other living expenses while traveling. While we aren’t conscious of it very often, all of these are enabled by software and telecommunications technologies.

    Similarly, all my work could be done over the internet. I actually don’t need to “be” in any specific place to do work—I can work as effectively and with the same access to tools and information in a café in Vienna Austria as I can in my office in San Jose California. Even my office landline automatically forwards calls to the mobile phone in my pocket. Other than to be in physical proximity to the colleagues who at any given moment happen to be in GlobalLogic’s San Jose office, there is absolutely no reason I can’t be halfway around the world and do the same work.

    This has not been true for very long, by the way. If you’ve been following this series you may recall that as advanced as Rational, NeXT Software and Apple were, in the 1990’s I had to be physically or logically plugged into the corporate network to access certain tools and files. I needed a dedicated ISDN connection to “work from home” on my X-terminal at Rational, and a VPN connection over dial-up or ISDN modem to remotely mount my home directory when working from home at NeXT (theoretically possible but painfully slow—it was easier to work offline and email files back and forth). Today, every corporate tool I use is either browser-based or installed on my laptop, tablet and in some cases on my smartphone as well. Even my work email and file storage is browser-based (Google Apps). I don’t need to use VPN or any other network connection technology, enabling me to work exactly the same way—with the same access to tools and information—from the garden of my Silicon Valley home or a hotel in Bangalore as I do in from my office in San Jose. In fact I don’t even need to use the same machine or type of device—the bulk of my files are either stored on-line or automatically replicated between my devices.

    Of course the bigger picture is that what is true for me as a business traveler is the same thing that has enabled product development outsourcing to be effective: With current technologies, it literally does not matter where you do your work. We will always need to account for the impact of timezones on real-time communications and the human imperatives behind face-to-face communication and relationships, I believe. But my original concerns about outsourcing back in the 1990’s are addressed by today’s technology: Even if we’re in the same building or campus, unless you and I are literally face-to-face, we’re now using exactly the same technologies and communication mechanisms as we would use if we were on opposite sides of the planet. In the latter case, the corridor between our offices is just really, really long. That’s how I’ve come to think of it.

    Another technology that was essential for my international business travel is the email-enabled mobile phone. The fact that my business associates or family members could always dial the same number and my mobile device would ring wherever I was in the world, without my caller having to know where I am geographically, makes today’s flexible styles of travel possible. My associates and I may be in the same building today and on different continents tomorrow. Yet we can consistently receive our messages and make our calls as we travel, without having to explicitly alert any centralized system to re-route these communications. We take this for granted today, but the amount of infrastructure, standardization and legal / financial agreements that were required in the industry to accomplish this seemingly simple task is mind-boggling.

    A Blackberry 8800: one of a series of Blackberry devices I used over the 2000’s. I loved my Blackberry. It was great for email on the go, and the mechanical keyboard was great for a guy like me who tends to write a lot—provided you can learn to touch-type with two thumbs! (Image courtesy of wikipedia).

    Not to say that mobile devices are perfect for travel, even today. For a number of years in the 2000’s I was a Blackberry user. Even when more advanced phones became available, the Blackberry had a compelling advantage: international data roaming was cheap and unlimited—a flat rate of $50/month, as I recall. For someone who was mobile as much as I was—and pre-iPad, mind you—being “always connected” anywhere in the world and being able to read and respond to my email on a pocket-sized device was a compelling advantage.

    Voice roaming rates were not standardized, however, and in fact they were quite expensive. I recall that on my first visit to India with my new Blackberry, the data roaming was indeed cheap, but the voice roaming charges came to nearly $2,000 USD over a three-week trip! On my next trip, I acquired an Indian mobile phone with an India-based carrier for use when I travelled there, and thereafter avoided the roaming charged entirely. I still used my Blackberry for email, though!

    Hosting and the Cloud

    My previous decade’s extensive business travel was made possible—or at least much more effective—by the technologies that provide location-independent services for banking, cash, communications and on-line applications. Outsourcing, too, was also made effective by location-independent delivery of services and information over the internet.

    This same location-independence trend—when applied to compute resources—gave us first hosted services and then (quite different) the Cloud.

    The wish to co-locate compute resources with high bandwidth internet connectivity gave rise first to the “co-location” center, and then the concept of hosted services. People gradually realized that they did not have to have computing resources literally within the walls of a building they owned in order to control those resources. With virtualization providing the means to do it, a further step was taken when people realized they did not even need to own the physical hardware their applications were running on. The ownership of “virtual” machines that ran on top of the hardware gave nearly as much control, and with infinitely greater flexibility, than owning the machines themselves. Out of this realization, the cloud was born.

    Invented in 2006[1], the cloud made possible a new style of programming and a new scale of applications that can address the needs of the whole planet. That sounds like hyperbole, but with roughly a billion users—about half a billion of which use it daily—facebook alone touches roughly one seventh of the world’s population. And that’s just one site. About one third of the world’s population has internet access.  When we talking about developing applications at “internet scale”, the cloud and it’s accompanying “big data” technology is a necessity.

    Equally remarkable to the development of cloud technologies themselves is the fact that so many of these technologies have been made available for free as “open source” products. Giant companies like vmware, HP, IBM and many others are practically falling over each other to give us powerful, free software to create and enhance our own cloud infrastructures. Other giants such as Twitter, Yahoo! and Google are inventing and giving us powerful “big data” (10 TB up to many petabytes and beyond) analytics services such as Hadoop and Storm to process extremely large data sets, unstructured information, and streaming data. 

    While not entirely altruistic—improvements are for mutual benefit, including (and sometimes especially) that of the giver—there is no question that these gifts of software to the development community are far-sighted and extremely beneficial. Their benefit is not just to developers but to everyone who buys or uses software. The availability of free technology of this power and scope is completely unprecedented in my experience and, I believe, in the history of computer science. The effects of free cloud and big data analytics software will be extremely far-reaching, beyond what we can currently foresee.

    One thing I am pretty sure of: We are currently in a “golden age” of software development. I’m not predicting that things will get worse—in fact, I think they will continue to improve—but there is no question that as developers and as users we have never had it so good in terms of choices and price. What is possible and practical now is so immense it’s hard to convey. But the convergence of mobile technology, big data, cloud and new software development and interpersonal communication paradigms are propelling us forward to a very exciting future.

    Self-authoring and Publishing

    The fact that you’re reading this “blog” shows that you are well aware the world has changed profoundly over the last ten years through the ubiquity of self-published media. At the beginning of the decade, technical people were able to author and post web pages with personalized content with relative ease and at relatively low cost. What we couldn’t have done, though, is read the musings of approximately 31 million fellow bloggers—that is the number of people blogging (that is creating content like this) in the United States alone. Blog readership is even larger—over 300 million individuals read the blogs hosted on just one popular site (wordpress)[2]; there are many other sites which host blogs as well.

    We are all encountering similar explosions in self-published content in videos, social networks, e-books and everywhere we turn.

    Many of us saw the technical feasibility and value of “browser-based authoring” of Web content very early. For example, my team made remote authoring a key feature of the “Web Catalog” system we developed at NeXT and Apple way back in the mid to late 1990’s. In that system, a user could remotely create, merchandise and deploy a new Web Catalog entirely through a Web Browser—which was very cool for the time.

    Many saw the technical possibilities for user-generated content almost as soon as the browser was invented. In fact, Tim Berners-Lee created the original web browser so that people could easily share their technical papers and discoveries with each other. Still most of us—and certainly I myself—ended up being very much surprised by the intensity with which the world embraced the opportunity for self-expression provided by social media. I’m still stunned that over 30 million people in the US alone author blogs—that’s one in every ten people! And even more than that number produce other forms of internet content, such as facebook posts and tweets.

    From my perspective and from a somewhat technical standpoint, the key aspects of social media that give it tremendous power are ubiquitous access and the asynchronous nature of the communication. 

    • By ubiquitous, I mean that anyone with appropriate permissions can see social media posts. This offers a potential audience to the authors of content, large or small, which motivates them to produce it in the first place. For content consumers, ubiquitous access gives them the possibility that they will discover material that is relevant and meaningful to them, however specific their interest. Specific interests may include the activities of your friends and family. Or perhaps it may be some rather specialized field of interest, like lace-making or folk dancing, which may only be shared by a small to microscopic percentage of the population. Ubiquitous access (plus good search capabilities) offers at least a possibility that people with very specific interests can find each other and perhaps widen their circle of knowledge, friends and interests. Among other things, this has enabled marketplaces and businesses to flourish even if they cater to a very limited and distributed population—pipe smokers, handcrafters, or historical re-enactors, for example.  The ability to bring like-minded people together to share information and form a market has implications for the products and services we buy in the physical world as well as the virtual one—mostly, to my mind, for the better.
    • Asynchronous access means that content which is authored at one point in time may be read at a completely different point in time. Dialogs can last days, months or years between responses while still retaining context. The impact of this asynchronous access means that you and I don’t need to schedule a time and place to meet to communicate ideas—I can do it when it works for me, and you can do it when it works for you. This has the effect, among other things, of erasing time and distance. The fact that I am in California’s Silicon Valley in the year 2012 as I write these words does not mean my potential audience is local, or that it needs to be in same room or be on-line at the same time. Once I post this you can read it (or not) at your convenience in your timezone, and neither one of us needs to care about where we are and when we are posting or reading.

    I see social media as one of the more profound phenomena affecting global society today. By connecting people who previously thought they were alone with a particular experience, social media is both re-invigorating specialized interests and allowing people to make common cause around social issues that trouble them. One recent example of social issues is “bullying”—that is, a set of children teasing or physically harming another child because he or she is different in some way. According to a recent report I heard on the news, bullied children and their parents previously felt very isolated, but with the advent of social media they have realized other children have the same experience. This realization has led these children and parents to get media attention focused on this problem, and to address it by school reforms and legislation.

    There are many such examples of social movements arising from the connections made through social media. A profound one, of course, is the downfall of various regimes in the Middle East by individuals connected through social media such as Twitter.

    1. The Agile software development paradigm 
    2. Smart devices, tablets and “physical world” aware devices (location-based services, etc.)
    3. Self-authoring and publishing of content on the world-wide web (facebook, twitter, blogging, “web 2.0”)

    Agile

    Another trend that began in the early 2000’s and has continued is “Agile” software development. Certainly the speed at which new software is being produced has grown many-fold over the last decade.  


    [1] While just about everyone now takes credit for the invention of the cloud—I’ve seen claims dating back to the 1960’s—I date it here to the launch of Amazon Web Services with EC2. AWS and EC2 clearly define what we mean today when we speak of “the cloud”.

    [2] http://www.jeffbullas.com/2012/08/02/blogging-statistics-facts-and-figures-in-2012-infographic/

    NOTE FROM 2025: I didn’t complete the section on Agile back in 2012, but distributed Agile development has proven itself to me to be the most effective way to do distributed development at scale. The “trick” is that individual teams of, typically, 6-8 people need to be either co-located or in compatible enough timezones to allow real-time collaboration. Depending on people’s sleep patterns and means of communication, that may or may not require geographical proximity. But real-time contact for the bulk of the working day is key to the success of a given team. Within that constraint, different teams can be located anywhere, with collaboration between teams co-ordinated through mechanisms like scrum-of-scrums, SAFe, and so on. I have found this to be effective across continents for teams up to many hundreds of people in size. I expect that even though GenAI will radically transform software development, the essence of the Agile process will still drive development in this next GenAI-driven development era; see my Whitepaper on the subject in the Media section.

    This series, written for my then-30th Anniversary as a professional software developer in 2012, consists of the following parts: “pre-history” (before I began working professionally in 1982), 1982-1992, 1992-2002, this blog (2002-2012), and my predictions for the next 30 years, from 2012 through 2042.

  • From a computing perspective, the 1990s were recognizably more “modern” than the 1980s. Much of the technology we as software engineers use every day today—Ethernet, C++, the Java programming language, the Windows operating system, email and the internet, graphically rich interactive development environments (IDEs), hand-held smart devices—all entered widespread use in the 1990s.

    In this next installment of my blog series, I will touch on the evolution of mobile phones and personal digital assistants; email and the world-wide web; operating systems; and languages, processes and object orientation during this decade. You can find my previous blogs on technology from the 1980s and earlier at their respective links.

    Mobile Phones & Personal Digital Assistants

    Mobile phones actually did exist prior to the 1990s, but they were so expensive to purchase and to use that few people had one. In 1989, a Motorola MicroTac phone cost $2,495 (about $5,000 today), and the monthly service charge was about $500/month ($1,000 today). CEOs, stock traders and the very wealthy used these devices, but not the common person—or even engineers. It was very unusual in the USA to have a mobile phone until the late 90s.

    It wasn’t until around 1997 that I acquired my first mobile phone, a Motorola StarTac with carrier Cingular (now AT&T). This is only fifteen years ago, which seems pretty recent to be obtaining such a fundamental technology—but again, I was actually a pretty early adopter. Few of my colleagues at Apple had a cell phone at this time, and this one was seen as pretty cool. As I recall, my StarTac was a TDMA phone and cost about $250 ($350 or so today)—not so very different from a topquality phone today.

    There was no fixed price rate plan, either; everything was charged per minute of use. The minutes were fairly costly, maybe $0.10 or $0.20 per minute of “talk time.” Still, being a parent with young teenage children at the time, it was well worth it to be constantly reachable by them when I was at work, or vice versa. I saw this device as a huge benefit, even though its only “feature” was voice conversations. SMS soon became available with later generations of digital devices, though with my original phone it was not an option.

    I am not sure if world-wide roaming was available at any price. If it was, it must have been enormously expensive—it’s not cheap even today. When travelling overseas, the common practice at that time was to rent a physical phone specifically for the country you were going to visit. I remember doing just that on a trip to the Czech Republic as late as 2002. Nowadays, most countries —including the US— generally (though not exclusively) use GSM, which enables you to localize your device with a simple switch of the SIM card.

    My first mobile phone, a Motorola StarTac with carrier Cingular (now AT&T). Photo courtesy of Wikipedia.

    When thinking of today’s “smartphones,” it’s surprising to note that the “smart” part actually preceded the “phone” part historically, not the other way around. What we would today call “smart” devices were, in the early 1990s, called “personal digital assistants” or “PDAs.”

    Among the first of the PDAs was Apple’s “Newton MessagePad.” The Newton was a recognizably modern device that, though larger and noticeably heavier than today’s smartphones, was easily hand-carried. It performed many of the same functions that we today take for granted on our smartphones, such as calendars, contacts, email, calculator and so on.

    However, it lacked any integrated communications capability, except for an infrared port that only communicated Newton-toNewton. In practice, it synched with a computer via a cable.

    The initial version of the Newton shipped in 1993, the same year I joined NeXT software. The first version I purchased, however, was the “MessagePad 120,” which became available in 1995. I was inseparable from my Newton, and I carried it with me to meetings and (to a lesser extent) at home, like I carry my iPad today.

    In 1996, Palm Computing shipped a competing PDA called the “Palm Pilot.” Neither the Newton nor the Palm system had a keyboard; data entry was done through a touchscreen interface using a stylus (a pen with a rounded tip and no ink). However, the difference between the two systems was that Apple’s Newton recognized your natural handwriting in a full-page format, wheres the Palm required you to enter a single character at a time in a small rectangular data entry area, using a stylized type of writing. For example, the letter “T” was entered as a sort of inverted, mirror-image “L.”

    The 1996 Palm Pilot 1000. Photo courtesy of Wikipedia.

    While the Apple system may have had a theoretically more appealing approach, it was obvious from the time the Palm shipped that there was a key difference between the two systems: the Palm’s mechanism was reliable and worked, whereas the Newton’s mechanism was unreliable and frequently did not work. The Newton’s handwriting recognition was so erratic that it literally became a joke. You needed to double-check every word you entered to make sure it was not translated into total nonsense. The Palm’s character recognition mechanism—though it had a learning curve (you needed to practice for a couple of hours)—was surprisingly easy to master and was thereafter quick and accurate.

    The Newton’s handwriting recognition feature was so inconsistent that it became a standing joke. Gary Trudeau, Doonesbury, August 1993. Image courtesy of http://images.ucomics.com/comics/db/1993/db930824.gif.

    This is an instance of another recurring situation in software that has many names: “The perfect is the enemy of the good” or, as Steve Jobs used to say it, “Real artists ship.” Often 80% of the product value can be delivered simply and quickly, with the remaining 20% taking nearly all the effort. Generally—though not always—the right decision is to complete the simple part that delivers 80% of the value immediately and get the product in front of end users. You then listen to what the customers say and respond to their feedback. The part you thought was important—and that takes nearly all the effort—may turn out to be totally unnecessary.  That’s the essence of Agile and the foundation of most currently successful companies.

    My speculation is that someone at Apple insisted that free-form handwriting recognition was the most important feature of the product and that customers could not live without it. Therefore a huge amount of the implementation effort went into that very difficult problem. In the meantime, someone with a simpler solution that was “good enough” for customers—and, more to the point, actually worked—came and took away the PDA market.

    It’s a real art to decide what’s important and must be right, and what will be less important to customers. On this decision, whole enterprises rise and fall. Generally the best way to find out is to try something and ask—that’s the Agile way. In my opinion, Steve Job’s best talent was knowing what a customer would accept and what they would not. He was not necessarily reliable in this, but when he was right, he was spectacularly right. For the rest of us, I firmly believe that the Agile approach of “try, get input and adjust” is the right one.

    I remember having my Newton with me at a company meeting at NeXT Software, where I was sitting in the front row to make a presentation. Suddenly Steve Jobs, the NeXT CEO, sat down next to me. He gestured to my Newton and asked, “Can I see that?” I handed it to him, and — somewhat to my surprise — he pretty much took it apart. He flexed the cover’s hinges, removed it and put it back on; checked the battery compartment; looked at every mechanical button and weighed the device in his hands. I said to him, a little awkwardly, “You know, some day these handheld devices are going to change the world.” He gave me a little half-smile, and as he handed my Newton back to me said, “Not that one.”

    This is my personal Apple Newton MessagePad 2000 (which shipped in 1997) sitting next to my first-generation iPhone (which shipped 10 years later). Photo courtesy of Jim Walsh (all rights reserved).

    I remained loyal to the Newton for a few more years, until Apple canceled production. I then switched to the market leader, adopting a series of Palm Pilots as my PDA.

    Email & the World-Wide Web

    In addition to laying the foundations of the smartphone revolution that would come in the next decade, the 1990s saw the launch of the world-wide web. When I joined NeXT software in 1993, email was somewhat novel—though I’d already been using it at work for several years—and the world-wide web did not yet exist.

    The lack of the web made it challenging to do some of the things we take for granted today—for example, supplying customers with updated release notes and technical information in between releases. NeXT actually shipped its software to customers on CD-ROMs and bundled the release notes and support tips (called “NeXTAnswers”) with each version. If any new information was discovered in between releases, it was provided to customers over the telephone case-by-case—a slow and expensive process.

    Shortly after I joined NeXT, I was in a staff meeting where the topic was improving customer support. I spoke up and said, “At my last company, we had an automated FAX-back system where customers could use an IVR (interactive voice response) system to have the latest support notes FAXed to them in between releases. It worked pretty well.” Steve, who was running the meeting, turned to me and said, “Great idea. Make it happen.”

    Support was not my functional area, and I was already quite busy recruiting and organizing my team. Still, when the CEO tells you to make something happen, that’s what you do—especially if it’s Steve Jobs! I remembered a very bright young IT guy / developer who had been in the new employee orientation meeting with me a few weeks before, and I went to go see him. I explained what I wanted to do with NeXTAnswers, and he said, “Sure, we can do that. But why not make it an automated email response system, as well?”

    Remember, in 1993 email was brand new as a widespread technology. AOL had only started offering email to the public two years earlier. Many technology businesses had it, and I’d used it for several years. But it was clearly the coming thing. So I said, “Great idea. Let’s do it!” We pulled together a small team, got the necessary servers and equipment, and got the system up and running. In addition to being a big success with our clients, we were able to charge extra for a premium service, and we set up the team as a separate department within NeXT.

    This is the NeXTStep 3.1 team, taken outside the NeXT offices in 1993. I’m in the back row near the center, wearing a red plaid shirt. Avie Tevanian, co-inventor of the Mach microkernel and later SVP of Software Engineering and CTO at Apple, is immediately to my left, wearing a blue shirt. Paul Hegarty, later co-founder of Ariba, is standing on the extreme left of the picture, wearing jeans and a blue shirt with his arms folded. I worked for Paul and later for Avie while at NeXT. Steve Jobs is sitting cross-legged in the front, a little to the right of center, wearing—what else—jeans and a black turtleneck. Photo courtesy of Jim Walsh (all rights reserved).

    About a year later, the same guy came back to me and said, “You know, the world-wide web is getting to be a big thing. Would you help me pitch creating a website to host NeXTAnswers? A website would be much better than either FAX or email.” At that point (1994), I’m not sure I’d ever seen a website. Still, I said, “Great idea. Let’s do it!” I helped him make the pitch, and we got the support for creating what later developed into the NeXT corporate website. At the time of its launch, http://www.next.com was one of relatively few commercial websites on the world-wide web.

    The web evolved extremely quickly, and websites rapidly evolved from static pages to dynamic sites, with e-commerce being a leading driver. Around 1995, NeXT developed a technology called “WebObjects” that originally took advantage of Objective C’s remote proxy mechanism. This was initially developed as a test automation tool, but the inventors rapidly realized its value as what we would today call an application server. WebObjects was used to power a number of early ecommerce sites, including (in 1997) the online Apple Store. Even today, the WebObjects application server is used for iTunes and other Apple offerings.

    My desktop system at NeXT Software was a NeXTdimension Cube, which looked like the system above. Photo courtesy of http://www.kevra.org/TheBestOfNext/NeXTProducts/NeXTHardware/NeXTCube/NeXTCube.html.

    It’s astonishing to think back on how rapidly technology evolved during the 90s. From 1991 to 1996, we went from email being a relative novelty to deploying recognizably modern shopping sites on the world-wide web.

    Operating Systems

    In terms of operating systems, the 1980s were a CP/M and MS-DOS decade for me, whereas in the 1990s I did a lot of my work on Unix. I began using Unix at a startup in the late 1990s, where I actually ported part of the BSD “curses” cursorcontrol library to System V. At Rational, I had a Sun SPARC workstation that ran SunOS 4 (later relabeled as Solaris 1) with a Motif/X-Windows GUI. And of course NeXT ran on a BSD implementation on top of the Mach microkernel (as does its descendent, Apple’s OS X).

    Ironically enough, my first work on Microsoft Windows happened while I was at Apple in 1997. I was leading the development of a “Web catalog” application based on the Java API version of WebObjects. This system supported the remote authoring of web catalogs using a web browser to upload images; it also performed merchandising and other e-commerce related tasks. Obviously we needed to support the Windows browser systems since they dominated the market, so I was one of relatively few people at Apple with a Windows desktop machine on my desk. This was, of course, dual-boot so that I could also run “NeXTSTEP for Intel!”

    While at Apple, I also had a Mac PowerBook Duo that, I think, was my first laptop ever. Laptops had been around for several years already, but since none supported the NeXTSTEP operating system, I never bothered to get one while at NeXT. Apple did, however, have some beautiful hardware running MacOS. I chose a slightly older model that was “subcompact” and had a docking station for when you were working at your desk. That machine was definitely one of my all-time favorites, and I still have it in my garage (my wife, as you’ve probably guessed by now, is long-suffering).

    The PowerBook Duo 2300c was the type of laptop I carried while working at Apple in the mid-90s. It weighed only 4.1lbs (1.9kilos) and was 1.4” thick. Although not quite modern, it’s just a little thicker and heavier than today’s MacBook Air. We’ve come very far since the Osbourne 1 in just over 10 years. Photo courtesy of Wikipedia.
    A docked PowerBook Duo. Photo courtesy of Wikipedia.

    Languages, Processes and Object Orientation

    When I joined Rational (now part of IBM) in 1991, it was an island of object-oriented, iterative software development in a sea of procedural languages and waterfall development. Rational was a boutique firm specializing in the Ada development language and associated development tools. The company’s primary focus before 1991 had been architecture, consulting, process, and tools development for government customers. I joined the new “Commercial” business unit that would focus on the more commercially-oriented C++ language and on products for business customers.

    Here I am around 1992, when I was at Rational on the “Rational Rose” team.

    I did have home computers at this point—several Apple Macintosh’s that my children and I used. These were networked over AppleTalk via twisted-pair telephone wire. The connecting wires were initially strung from the ceiling, giving the appearance of a kind of literal “home-wide web”—something my wife was not at all pleased about. These machines were for fun (and the kids’ homework), not really for work. My work from home was done on an “X-terminal,” a physical machine that connected over a dedicated ISDN line to my Sun / Solaris / Motif desktop at the office. Photo courtesy of Jim Walsh (all rights reserved).

    Grady Booch, later co-inventor of UML, was one of the two architects on our team. Grady was already famous in the software community as the developer of “Booch Notation” for the architecture and design of object-oriented systems. He was also the author of the “round-trip iterative gestalt” methodology for software development. The development of our initial product, Rational Rose 1.0, was to be a showcase for both Booch Notation (which the tool supported) and Grady’s methodology.

    When it first shipped in 1992, Rational Rose was, at 250,000 lines of code, one of the largest “pure” C++ programs that had been developed up to that point. We used early iterations of Rose to design later iterations as an embodiment of Grady’s “round trip” methodology—and a foreshadowing of the Agile practice of continuous integration and deployment that would be introduced about a decade later. The process we used to develop Rational Rose served as an important input to the Rational Booch Method development process, which was a precursor to the later Rational Unified Process, or “RUP.”

    RUP and its Booch Method predecessor were more concurrent, iterative software development models that began to displace the waterfall methodology in the 1990s. While they still had distinct project phases as in the waterfall approach, these methodologies also advocated timeboxed iterations and concurrent development and testing throughout the project. In fact, Iseult White, author of the original Booch Method books, interviewed me and other Rose project participants to help document this new approach to software development.

    Similarly, we used a weekly build and deploy cycle at NeXT that today we would call “Sprints.” We incorporated the new check-ins and built the entire 5.5 million lines of the NeXTSTEP operating system weekly, and then deployed the latest build onto every engineer’s desk. If someone broke the email system, we found out very quickly! Not every weekly build went out companywide, but toward the end of the release they did, and the entire company ran on the pre-released version. As you can imagine, Steve was not shy in his feedback, so we had an additional (and very strong) quality filter before the first customer saw it.

    In the early 1990s, Steve Jobs liked to describe NeXTSTEP as an “Object Oriented Operating System.” While I’m not sure an operating system fits the strict technical definition for object orientation, this description did have merit. Each component in the operating system—for example, the “print” dialog—had a declared and well-defined set of inputs and outputs, and encapsulated behavior. Steve was proud of pointing out that while virtually every program in Microsoft Windows had its own implementation of the “print” dialog (and still does today), every program in NeXTSTEP—regardless of authorship— shared the common OS-provided dialog.

    Like any “object oriented” system, a program could override or augment the default behavior it inherited; but unless the programmer did something extreme, the dialog the user saw was recognizably the same for every application. This degree of reuse and commonality made the system easy for end users to learn, and it made programming far more productive because you did not need to re-invent the wheel.

    Probably the culmination of the object-oriented revolution of the 1990s was the widespread adoption of the Java language (around 1996). It was pretty clear to everyone—even to us at NeXT—that Java, not Objective C, was the wave of the future. At NeXT, we began migrating to Java and away from Objective C even prior to becoming part of Apple, and this trend continued thereafter. It is one of the ironies of the computer software field that Objective C has again come into prominence by being the programming language of the iPhone.

    It is indeed true, by the way, that Java borrowed many concepts from Objective C. I once had the opportunity to meet James Gosling, original inventor of the Java language, and he confirmed to me that Objective C was in fact an influence. While we’re on the topic, Tim Berners-Lee, inventor of the first web browser, also credits NeXTSTEP’s ease of programming as the reason he was able to create the first web browser. I don’t have this statement personally from him, but I do believe it.

    Finally, to close off this language section, I must confess that my on-again / off-again love affair with Perl began in the late 1990s. Whenever I do system control or text processing, my go-to language is Perl. I’ve been told that I’m old fashioned and should be using Python, but I must admit that I do keep coming back to Perl when I have a quick task to get done.

    In Conclusion

    Looking back, I’m struck by how the seeds of Agile, the smartphone and object-orientation all grew out of the 1990s—and from the early 1990s, at that. Next week we’ll take a look at the 2000s to current day, exploring how they led to both a high Velocity and truly “flattened” world.

    NOTE FROM 2025: This series, written for my then-30th Anniversary as a professional software developer in 2012, consists of the following parts: “pre-history” (before I began working professionally in 1982), 1982-1992, this blog (1992-2002), 2002-2012, and my predictions for the next 30 years, from 2012 through 2042.

  • This blog is Part II of a multi-part series that explores my thirty years in software engineering and how the industry and technologies have evolved over three decades. To read Part I of the series (focusing on the years prior to 1982), click here.

    A Full-Time Software Engineer

    In late 1982 I got a very happy and life-changing surprise: we learned that my wife was expecting our first child! My daughter Anna’s impending arrival motivated me to shift from being a full-time graduate student in physics to a full-time software engineering professional, finishing my Ph.D. thesis write-up in my spare time.

    Here is a picture of me in 1981, in my last days as a care-free full-time graduate student and teaching assistant. I began developing software professionally the following year. Note the absence of a computer in my study/music room —I didn’t have one! “Home computers” existed, but until IBM came out with their “PC” in 1981, I saw those devices (including the Apple I) as basically toys in terms of their mathematical capabilities. I instead used a programmable calculator for my physics calculation work. Photo courtesy of Jim Walsh; all rights reserved.

    Not incidentally, my new job came with a computer, the “Durango F-85.”  I was looking forward to using the computer (during off hours and with client approval, of course) as a word processor to type up my thesis.

    My very first “work” computer, the Durango F85. Intel 8085 8-bit, 5 Mhz microprocessor, 64K RAM. Do you think the computer you’re working on today will seem as primitive to you in the year 2042 as this one seems now? My guess is that yes, it will. Photo courtesy of http://www.sydex.com/durango/durango.html.

    The F-85 was an 8-bit Intel 8085 computer with an integrated printer, “green-screen” display device, and “high density” (480Kb) dual 5.25 inch floppy drives. The version I used ran an operating system called CP/M. The pre-Windows Microsoft operating system MS-DOS (which ran on similar Intel hardware) first shipped in 1982 and conceptually borrowed much from CP/M.

    The Durango was a loaner from my client and their choice of hardware, not my own.  A full-featured Durango F-85, including a 40Mb hard drive, retailed for $13k in 1982 dollars—roughly the equivalent of a mid-range luxury car (about $40k today). As my business grew, I would eventually have several of these machines. In fact, one currently sits in a box in my storage unit, much to my wife’s chagrin. I know I should get rid of it, but thinking about how much money these computers cost, I could not stand to part with them all.

    Lessons in Market Dominance: Part I

    The early 1980s were extremely fluid times for what we then called the “PC” (personal computer) industry, and it was extremely unclear what standards would emerge and who would be the winners. I’ve seen this pattern recur many times since then around different technologies — Cloud/BigData being an analogous area today. However, when IBM entered the PC market in 1981, it was obvious that they—together with the newly introduced operating system MS-DOS—would be the market-maker and define the standards.

    As my first MS-DOS machine, however, I did not pick the IBM PC but instead chose a cheaper one with better graphics called a “Victor 9000.” I’ve learned a lot from that decision, which turned out to be the wrong one for both myself and my client—who on my recommendation bought lots of them, circulating them to their offices worldwide. Though the Victor machine was arguably “better” from a technical and price standpoint, it was completely trounced in the marketplace by IBM.

    The lesson I learned, which I carry with me to this day, 30 years later is: the best product does not always win. Many factors affect market success, and technical superiority is not always—or even usually—the most important factor (a hard lesson to accept for a technical guy).

    An Early Adopter

    Another recurring situation that started for me in the 1980s has been the attention I sometimes get on airplanes when I bring the latest cutting-edge device on-board with me. Since I travel frequently and am also an early adopter of new technology, the new devices I carry with me often attract curiosity and appreciative looks from my fellow business travelers. I’m not intentionally trying to show off, but I have to admit I enjoy it when a cabin attendant drops by and asks breathlessly, “Is that a new XYZ?!”

    The first time I remember this happening to me was in the early 1980s, when I traveled with one of the first “portable computers” ever invented, the Osborne 1. The Osborne was portable in the sense that it could be hand-carried, but it was not what we would today call a laptop or notebook. The machine weighed 24 pounds (11 kilos), the weight of an average toddler (18 month-old child). Today’s “portable” machines are five to ten times lighter: a typical laptop might weigh about 5 pounds (2.3 kilos), with a lightweight machine like a MacBook Air weighing less than three pounds (1.4 kilos).

    When I first carried my Osborne 1 onto an airplane for a business trip, the heads turned and the necks swiveled the way they would today for someone carrying the very latest just-released smartphone. I remember my fellow business travelers shooting admiring glances at my new “portable computer” as I walked down the aisle of the plane, carrying it in one hand. I hadn’t expected this reaction, but it was fun.

    My first “portable” computer, the Osborne 1, weighed as much as a small child but could be carried on an airplane rather than shipped in multiple boxes. Photo courtesy of http://oldcomputers.net/osborne.html.
    My Osborne 1 was a Z80-based, 64K RAM machine running CP/M, and I loved it. Photo courtesy of http://www.vintagecomputer.net/laptops.cfm.

    Adventures in Word Processing

    The Osborne 1 also ended up playing an important role in helping me complete my Ph.D. thesis. The word processing features of the Durango were indeed great for text processing—much superior to the manual typewriter I would have used just a few years earlier. However, the Durango’s high-quality embedded and proprietary printer did not have software that could produce the mathematical symbols I needed for my thesis.

    The Osborne 1 was more “open” and came bundled with a word processing package called WordStar. In one of the (hardcopy) computer magazines I regularly read, I saw an advertisement for an add-on package that allowed WordStar to print mathematical symbols. I sent away for this—by snail-mail and with a paper check enclosed—and it arrived by mail some time later on floppy disk.

    CHARTECH advertisement. Image courtesy of InfoWorld Magazine, March 14, 1983. Digitized by Google Books.

    Since I already had a popular Epson dot-matrix printer, my thesis production problem was almost solved now—except for the logistics. All the formulae for my thesis were hand-written. Getting them all into the computer was a huge undertaking. Fortunately, my then very pregnant wife came to the rescue and typed the literally hundreds of equations for me on my Osborne 1, while I was transcribing the text into the Durango’s word processor. We then literally cut-and-paste, with glue and scissors, all the equations into the proper place in the separately typed text. As the final step, I Xeroxed the pasted-up pages onto the mandated thesis paper supplied by my University, and the result came out looking pretty good.

    A finished page from my Ph.D. thesis. The text and formulas were separately printed on two different printers and then manually (ie, scissors and glue) cut-and-pasted together. Photo courtesy of Jim Walsh; all rights reserved.

    When I wrote some additional scientific papers later in the 1980s, the state-of-the-art had evolved considerably. I was able to use the “LaTeX” markup language, which allowed you to embed equations into the text itself, thereby avoiding the need for cut-and-paste. LaTeX was available as a stand-alone postprocessor for text files, rendering postscript pages that you could then print. LaTeX and the typesetting language “TeX” from which it inherits were in many ways parallels to SGML and later, of course, HTML. Their separation of content from layout and rendering was especially intriguing to me, and it has proved itself to be a very useful paradigm in many contexts.

    An example of LaTeX markup language. Photo courtesy of http://en.wikipedia.org/wiki/LaTeX.

    Lessons in Market Dominance: Part II

    After completing and defending my thesis and receiving my degree, I got on-board the market trend and became a confirmed IBM PC user, using Microsoft operating systems and languages. The shakeout in the computer industry was fairly quick, and I had learned an important lesson: market dominance tops technical superiority almost every time.

    The only hope a new technology has to prevail, in my experience, is to create or define a new market segment where it can achieve market dominance. Otherwise, someone whohasachieved dominance with a previous or a worse technology will gobble the new one up—hopefully for a large sum of money, but sometimes not. If none of these things happen and the new technology never achieves market dominance, it will languish and/or die. A grim picture, perhaps, for those of us who focus on creating these new technologies!

    My advice to overcome the cycle is to find the best marketing and business people you can and make them your allies. And if it’s open source, find a way to publicize it! But in any event, technology success is much more about achieving recognition and dominance in the market than it is about the technology. It is a bitter truth, but the best technology does not always win, not even in the long run.

    I do see this situation improving with the more overtly Darwinian model of open source, where technically better packages sometimes do win out. Even so, given at least an acceptable level of technology, judging the winners is much more often a matter of how much market share and popularity they can gather quickly, rather than pure technical superiority.

    Introducing Email

    It wasn’t until the late 1980s that email started being widely used as a communication mechanism. Can you even imagine having no email or other electronic communications available to you other than voice telephone calls? Even fax machines did not become popular until the late 1980s.

    At a startup where I worked in the late 1980s/early 1990s, as an off-hours project I set up the company’s first email system using uucp. To do this, I manually strung cable between the serial ports (RS-232; USB ports did not exist yet) of selected machines and the multiple serial ports on a Unix machine that I designated as our inhouse mail server. The in-house mail server made a timed dial-up serial connection to a central mail server to send and receive external messages.

    It’s hard to imagine today, but like most companies at the time, we did not have Ethernet. Other than for electricity and land-line telephones, there was no cabling in the building except for an occasional point-topoint serial connection between physically adjacent machines. Ethernet had been invented, but it was not in widespread commercial use until the 1990s. Ethernet hubs were invented along with Ethernet itself in the 1970s, but the first commercial Ethernet switch did not ship until 1990, and routers were generally implemented in software on a multi-port computer. And, of course, there was no world-wide web to connect to yet!

    I believe that creating the cross-over cables for these connections was the last time I used a soldering iron at work. Starting in the early 1990ʹs, email and internal networks became commonplace in the high-tech community, and I have used them ever since.

    My first Microsoft product, the BASIC Compiler, arrived on an 8” floppy disk in a 3ring loose-leaf binder. (This is a web photo of their Fortran compiler, also on an 8” floppy disk). Photo courtesy of http://www.flickr.com/photos/happyhappyjoyjoy/1384618164/.

    The Evolution of Programming Languages

    The first programming language I used commercially was, I’m embarrassed to say, a rather primitive form of Compiled BASIC (“Bascom”). I used this language not because it was a good one, but because in 1982 it was the ONLY affordably priced compiled language available for the CP/M operating system. A compiled language was essential for commercial software because otherwise you’d be distributing the source code— there was no way to obfuscate it. Incidentally, Bill Gates personally helped write the code for the BASCOM compiler in the late 1970s.

    My first compiler arrived from Microsoft on an 8” floppy disk. It shipped in a three-ring loose-leaf binder with mimeographed (a pre-Xerox copying technology) instructions. This format was obsolete technology even in 1982, and I had to have a service migrate the binaries to the more modern 5-1/4” floppy drives I had on my Durango.

    The 1980s were an innovative time for language development, and I had heard of a language called “C. Unfortunately, the only available commercial-quality C compiler for the CP/M operating system on Intel (called Whitesmith’s C) cost $600 per CPU (about $1,800 in 2012 dollars), plus a per-client distribution license of, I believe, about $30 per seat. This was definitely prohibitive, especially the client-side cost.


    With its lack of structure, BASIC was not suitable for the type of larger-scale applications we were beginning to build, so I had a talk with one of my close friends from college who had worked as a developer on the US east coast at several national laboratories. He advised me to migrate to C, which I did as soon as the more affordable Manx Aztec C compiler came out (around 1983). I subsequently migrated to the Microsoft C compiler after 1985, when it became available. I learned C by reading the Kernighan & Richie book and all the related “white cover” C and Unix books, and I never looked back.

    The fact that I am self-taught in computer languages may be shocking to the current generation of developers who consider a Masters in computer science to be a minimum entry-level credential. But keep in mind that in 1982, the people who had computer science degrees were primarily mainframe developers working in large corporate IT departments or for the government developing accounting and back-office applications with Cobol; or else they were researchers at computer companies and academic institutions working on operating systems and compiler development. No credential or even training existed for developing on the personal computer. The people who developed PC software in those days were much like me: interested in technology, but with a math, science or other type of engineering background. In fact, Bill Gates and Steve Jobs did not even finish college—they had no academic credentials whatsoever! Nonetheless, they did pretty well.

    My choice of the C language proved a good one. Essentially every production (as opposed to scripting) language I have used since (C++, Objective-C, Java) has derived from C—so this was clearly the right choice versus, say, Pascal. This choice also taught me something else that has stuck with me: When you’re making a big technology decision, talk it over with the smartest people you know. Even Steve Jobs himself followed this principal. When I later worked at NeXT, it was routine for Steve to drop by engineers’ and managers’ offices and say “I’m thinking of doing XYZ—what do you think?” He wouldn’t always (or even usually) take your advice, but we felt listened to, and he got a variety of perspectives on his decision. Occasionally, he may even have learned something that changed his mind. Smart.

    Late in the 1980s, I had the opportunity as a consultant to help Borland develop the compiler validation suite for a then brand-new language for microcomputers called C++. When it shipped in 1990, Borland’s Turbo C++ became the first version of C++ for MS-DOS to achieve widespread developer popularity, and it helped pave the way for that language’s emergence in the developer community. It came with an integrated IDE and had available a closely coupled debugger, setting a pattern for many languages to come.

    By this time I had become a strong advocate of what was called “structured programming” and a “software tools” componentization approach for development using procedural languages. Once I encountered the new object oriented paradigm, I immediately understood the value of the encapsulation and potential re-use that C++ provided. It clearly solved what until then had been a real problem. Little did I realize, though, that this language would set the tone for the entire next decade, with Object Oriented programming having a huge impact both on the industry and on me personally.

    Looking Forward

    Next week, I will talk about the decade from 1992 – 2002. This was a pivotal time in software evolution, where in many ways the current software engineering era was created. To read my previous blog about technology in the years prior to 1982, click here.

  • This month, August 2012, is my 30-year anniversary as a software engineering professional, receiving my first official paycheck in August 1982. By both inclination and profession, my tendency is to look ahead, not back. As I think about this milestone, though, I can’t help but remember what it was like “way back when.”

    I thought it might be fun to share my personal experience of how the software industry has evolved over the past three decades, including some of the gadgets and technologies I have loved—and sometimes lost—along the way. I invite you to come with me on this journey, looking backward for a change, instead of thinking about what’s next!

    In the Beginning

    I started working with electronic computers when I was about 14 years old. Today, that would not be unusual, but back then “personal computers” did not yet exist. However, through a strong interest in science and technology—and some fortunate circumstances—I was able to begin working with mainframes at a fairly early age.

    Here I am around age 16. The strap around my shoulder is a camera, most likely a Kodak Brownie Twin-Lens reflex. I built a darkroom in the basement of my house and developed and printed my own photos—using a “non-digital” chemical process, of course!

    I was spared having to program using punch cards; I was just young enough to avoid the “batch processing” era entirely. My first programming experiences were with “timesharing systems.” Though we still needed to drive to the building where the enormous computer was physically located, once we got there each user had an individual terminal (screen and keyboard—no mice yet!) that provided what we would now call interactive on-line access.

    My first high-level programming language was APL. This is a truly bizarre array-oriented language that uses specialized symbols, rather than words, as commands. The language was extremely dense and efficient; you could invert a matrix with a single character and write a complex program in one line of code (which at the time I loved to do). For example, this program identifies all prime numbers between 1 and R:

    APL Program (courtesy of http://www.wikipedia.org)

    As you can see, APL makes Perl syntax look verbose and obvious. Why anyone thought it was a good idea to teach this particular language to high school students (ages 13 to 17-years-old) is beyond me. Nonetheless, I loved it and spent many happy nights and weekends figuring out clever things to do on my next visit to the computer. I especially enjoyed hacking through the timesharing system to take over my friend’s terminals and insert timebombs and other little presents. Ah, youth!

    I kept using computers and various languages throughout my high school, college and grad school careers. However, I never even considered studying computer science. (I was a physics major with a strong interest in mathematics.) At that time, computer science was a discipline in its infancy. The people who studied it planned to work for IBM, a large bank or the government—none of which I aspired to do. My interest at that time was in computers as tools, not as ends themselves.  I also had an interest in electronics, both as a hobby and as a study, and learned about logic circuitry and computer internals—which turned out to be pretty handy for programming, as well.

    My First Computer

    Until the mid 1970s, I had not owned a computing device other than mechanical computers. The first “computer” I ever owned was a slide rule, which I inherited from my grandfather and learned to use when I was about 12. This is a mechanical device consisting of wooden parts that uses logarithms to multiply, divide, compute powers of numbers, and perform trigonometric computations. It did not add or subtract (you were expected to be able to do that mentally). A slide rule is an instance of an “analog” computer, as opposed to a “digital” computer; the numerical values along the slide and other parts make a continuous number line, not discrete values. A knowledgeable person using a slide rule could generally achieve a precision of two and sometimes three significant digits.

    For college I saved up to buy what I considered the best slide rule available for physics, the Keuffel & Esser Log Log Duplex Decitrig. I had to visit the MIT bookstore to get one since they were considered quite advanced and only sold at engineering-oriented schools. Slide rules were still widely used by my fellow physics majors when I started college, though I was among the first to switch to an electronic pocket calculator when they became affordable. I cringe to think of it now, but I did indeed sometimes wear my slide rule on my belt in its foot-long orange case. Thankfully I never got any trouble for this because the other kids thought it was cool (or I was so “uncool” that I just thought they did…).

    K&E Log Duplex Decitrig (courtesy of http://www.sliderule.ca)

    The first digital computer I ever owned was a mechanical device called a “digicomp.” It was built from a kit and made out of plastic, believe it or not, and could be programmed to perform three-bit binary addition and logical operations (AND, OR) through the placement of a series of hollow plastic pegs. This was not a practical device—it was a toy—but it was indeed a real (albeit very primitive) programmable digital computer.

    Digicomp (courtesy of http://www.wikipedia.org)

    Electronic computers simply did not exist for home use before 1976. Even the idea of owning your own computer in the early 1970s was like aspiring to buy a jet airplane today. Similar to today’s jet airplanes, computers in the early 1970s were expensive (millions or tens of millions of dollars), and they required special facilities and staff for maintenance. Owning your own electronic computer was firmly in the realm of science fiction when I was in high school.

    Programming for Calculators

    A watershed moment in my relationship with computers was the introduction of programmable scientific pocket calculators by Hewlett Packard in the mid 1970s. Hewlett Packard had produced a series of desktop programmable calculators in the 1970s that I had used in school. However, these were physically large (covering most of a desk) and quite expensive. The ones I used were owned by the school. HP also introduced the first “pocket calculator” in the early 1970s (the HP-35), but it was not programmable and was quite expensive—about $3,000 in today’s currency.

    In the mid 1970s, however, HP introduced the very first programmable electronic device I ever owned: the HP-25C pocket calculator. It was priced at $200 (about $1,000 in today’s currency). My father paid the lion’s share, and I excitedly made up the difference with earnings from a part-time job. This calculator was truly programmable, with conditionals and loops (using GOTO statements), though programs were limited to a maximum of 49 steps. The programming language was quite low level, analogous to modern-day assembly language, though with the addition of pre-programmed mathematical functions such as the trigonometric functions “sin” and “cos.”

    HP25C Calculator (courtesy of http://www.hpmuseum.org)

    As a grad student, I later acquired an even more sophisticated calculator, the HP41C. Personal computers had been introduced by the late 70s (the first Apple computer shipped in 1976), but the Apple computer was quite primitive in terms of its scientific capabilities, which is what I was interested in at the time.  Though they were rapidly added, floating point operations were not even supported in the initial languages available for the Apple computer. IBM PCs, DOS and Windows did not yet exist. If you were interested in mathematics, the HP41C calculator was the apex of the programmable calculator world, offering extensibility through plug-in modules and a magnetic card reader for extra storage.

    Because my family situation required me to relocate away from the university while I was finishing up my research, the bulk of the mathematical calculations for my Ph.D. thesis were performed on an HP41C calculator that I programmed. I suspect that the program I wrote (testing certain quantum chromodynamic assumptions by calculating a range of hadron masses) may be one of the largest ever written on that device. Certainly if I’d had access to a university computer, I would have written in a higher-level language than the near-Assembler available on this device.

    HP41C Calculator (courtesy of http://www.hpmuseum.org)

    Still, because of the size and complexity of my program, I learned a lot about structuring code for readability and maintainability. In particular, I learned that it’s possible even on a pocket calculator!

    Here’s an example of an HP41C program to compute the factorial of an input integer:

    HP41C Program (courtesy of http://www.wikipedia.org)

    Imagine writing thousands of lines of code like this, and then debugging and maintaining it! On the plus side, you could call functions to do numerical integration and other rather sophisticated mathematical operations. Well, you learn to work with the tools you have available, and I completed the numerical processing needed for my thesis using my HP41C.

    Looking Forward

    My next blog post, which can be found here, explores my first decade in the computer industry, from 1982 through 1992. If you have questions about my experiences or would like to share your own stories, please feel free to leave a comment below.

  • NOTE FROM 2025: I wrote down a few thoughts at the time of my 30th Anniversary as a software professional, in August of 2012. I didn’t publish it on the company blog, given that some of these thoughts here are more personal and ‘political’. A number of the ideas here informed the series I did publish, though. The 30th Anniversary series itself consists of the following parts: “pre-history” (before I began working professionally in 1982), 1982-1992, 1992-2002, 2002-2012, and my predictions for the next 30 years (as of 2012) from 2012 through 2042.

    A flatter world

    One of the most profound and significant changes brought on by computer technology has been the “flattening” of the world.

    The biggest significance of this to my mind is that people of ability—no matter where in the world they live—now have the opportunity to prosper in a global marketplace, and can reasonably aspire within their or their children’s lifetimes to achieving a globally high standard of living. This certainly applies to software engineers, but because of the affects of technology, also to many less technical folks. By creating a global marketplace, people producing exceptional or unique products can now readily present and sell those products to a global audience, accepting payment and shipping them expeditiously at a reasonable price using software-enabled payment and logistics services. 

    This global flattening trend has created winners and losers, but on the whole I think it has been a very good thing for the world. In 1982 whole industries and fortunes were made by identifying the producers of goods at point A, and moving and selling those goods to point B. The producers at point A could rather easily be underpaid and exploited, because their own ability to get the goods they made to point B—where they had value—was limited or non-existent, giving the intermediary all the power. This era is over. Fortunes can still made by scouring the world to carefully select the producers, “curating” the products to insure quality, and then delivering those products to consumers, insuring their satisfaction in the target market. This much has not and—I believe—will not change. However the producers and consumers may now directly connect with an ease that was literally unthinkable 30 years ago. While not producing a utopia, the possibility of a direct connect at least helps keep things more fair, making winners of both the producers and suppliers.

    Like many US software engineering managers of my generation, I was opposed to outsourcing work to developing countries when it first started to become widespread in the 1990s, in the run-up to “y2k”. I suppose, in some part of my brain, I was afraid of the impact outsourcing would have on my job and my team. My conscious thinking at the time was that it was challenging enough to create great software with everyone in the same building, without adding communications, timezones and cultural barriers into the mix. This was before the full impact of the internet and affordable mobile telephony—also products of the software revolution—had effectively erased many of the barriers of geography.

    Though I had done geographically distributed projects earlier in my career, 2003 marked my first experience with true outsourced product development.  I arranged an on-site visit to my first offshore team in Hyderabad India with the primary—though unspoken—purpose of making sure the workers were not being exploited, fully intending to find another job rather than be part of any exploitation if that’s what I found. I had only had phone contact with India before, and had no idea what to expect—and what I found really was unexpected. I found happy, energetic and intelligent people just like those I worked with in the US, working in conditions very much like those in the US. In fact, their working conditions were considerably nicer than a San Francisco startup I had recently worked at!

    Working alongside this team, I also got over any qualms I might have had about “taking American jobs” and “moving them overseas”. To me, the whole point of being an American is that you can rise to the level of your ability. These people in Hyderabad were doing exactly that. Standing in India and figuratively looking back at the US, I felt strongly that the least patriotic thing I could possibly do would be to deny jobs to these great people simply because they lived in India—when these are exactly the same people we would have hired if they were in the US. America has never been an ethnicity or even a geography, but an idea. Hiring or not hiring a person simply because of where they were born or where they lived seemed to me like the least patriotic, most un-American thing I could do.

    Since that time, I have always held my Indian—and later Belarussian, Ukrainian, Argentinian and other “offshore-based” employees—to exactly the same standards as I would hold a US employee in the same role. I expect my offshore teams to be as good, person-for-person, as my on-shore teams—and I have found that they can be and are. I feel I owe that to all concerned: the offshore people I am hiring; the US-based people I’m not hiring for that job; and myself and the other stakeholders involved. I don’t think I’d be honest or fair to any one of these stakeholders by expecting that just because someone works in India, China or another “offshore” location they are inherently less capable than an onshore person in the same role—to me that’s simply wrong.

    This is not to say that thirty years on, in year 2012, the American-based programmer is dead—far from it. While census bureau statistics show that about a third of US-based software engineers are immigrants, that implies two-thirds were born in the US! That’s a fact that is somewhat surprising to me from my perspective in Silicon Valley, where nearly all the engineers seem to be from other countries! [[need some demographic info here]]

    Dangers

    The dark side of the information age lurks in the possibility of using the technology to control people’s lives rather than to empower them. I think most of us—even the technically literate—are only dimly and occasionally aware of the vast potential for misuse of the information infrastructure that surrounds us. Using this technology, it is an easy matter to track who we know, what we say and do, where we are and have been—and even what our values, aspirations and private fantasies may be. It’s all in the traces we leave on the internet, in our social networks, through our mobile devices, and in our spending patterns. And that is just the information we “control”! Much more information is passively tracked through cameras and other means in our increasingly connected world.

    In the wrong hands, this information could result in the grimmest tyranny known to man—one where not only our activities could be tracked and controlled, but even our private thoughts could be discovered and used against us.

    As a young man studying physics, I was fascinated by the Manhattan project—the secret initiative during World War II where scientists and engineers working in the US created the atomic bomb for the war effort. The most engrossing aspect of that effort to me was not just the physics, but the human dynamic. Even the most idealistic of the scientists involved got so caught up in the intellectual adventure of creating this new technology that they forgot about the horror of unleashing a terrible new weapon on the world. For many participants, the original motivation for creating the bomb was the fear that Nazi Germany—where much of the pioneering work in nuclear physics had originally been done—would develop such a weapon first. Even when it became clear that Germany had no such effort, the American engineers and scientists continued working on the bomb. In most cases this was not because they believed it was still necessary to win the war. Instead, many had become so excited about the intellectual challenge of creating this new technology that they never stopped to re-assess whether it was still the right thing to do.

    In introspective moments, I have sometimes wondered if our generation has been part of a sort of inverted Manhattan project that, instead of creating the destructive aspects of our technology first, instead created the benign and positive ones. This would be as if the original Manhattan project had focused instead on the positive uses of nuclear fission—say, medical radioisotopes—rather than building the bomb. In this alternate universe, the Manhattan project would still have discovered the means to create a devastating weapon, but chosen not to do so. In some ways, by building positive uses of information technology first, that is what our generation has done.

    While this sounds great and very enlightened of us, the problem is that any technology with the power to profoundly change the world for good also has the potential for great destruction. History shows us that technologies with the potential to be used as weapons or tools of oppression eventually will be, in some places and at some times. Much as our parents and grandparents left future generations to address the challenge of nuclear technology, we leave to our descendents the challenge of responsible use of information technology.

    Summary

    Thirty years is a long time, and at times I succumb to nostalgia over projects, products and day-to-day working relationships that are no more.  Some people I admire have passed away; others have been felled by the “golden bullet” which enriches people to the point they are no longer active in the software community. Some great ideas, products and companies have come and gone, never to be replaced or repeated.

    But my overall feeling looking back on the last 30 years is great satisfaction. I’m not sure that many of us set out with the conscious goal of transforming the world and making it a better place—I think many of us were just excited by the possibilities and happened to be in the right place at the right time with the right skills. 

    Lessons learned:

    • Listen to the people just graduating (or still in) University. Having experience is great in many ways, but in other ways it’s a handicap. It’s easy to develop a closed mind. I’m sure you’ve seen this many times—a person who responds to every new idea with “we tried that x years ago and it didn’t work.” This is why it’s important to listen to recent graduates, and learn through their still open minds. The new generation of developers does not come with the same preconceptions and prejudices that all of us develop over time; they start “fresh” and you can always learn something from the way they see the world if you stay open to it. One recent example would be the javascript language. The people of “my generation” tend to view javascript as a total kludge. We tend to see it as the way that encapsulation in web applications has been violated and hard-to-maintain business logic has found itself executing on the client. We see javascript programs as web pages using cut-and-paste code, with no re-use. Things have changed profoundly, and javascript is developing—or, arguably, has developed (it’s still hard for me to say that)—into a first-class language, both client-side and server-side. This is just one example. It’s not always easy to unlearn what you thought you knew and learn something else. But if you stick with your prejudices instead of being open to what the new joinees are learning and doing, you will rapidly grow stale and loose effectiveness as a developer or a technical manager.
    • Be curious and evaluate whether a new technology is a good solution to a real problem. The reason I was an early adopter of “winning” technologies like C and object orientation was not because I had precognition—it was simply that I recognized these technologies were good solutions to a real problem that I actually had. They turned out to be long-lived in the industry because they solved other people’s problems well too. When choosing a technology, the best approach is to ask yourself if it’s the best solution you’ve seen to a problem that you really have. If the answer is “yes”, and if the solution is simple and elegant, that technology will often be a winner—because more often than not, if it solves your problem it will solve other people’s problems too. Note that “technology” means, literally, the “technique” or method of solving a problem—it doesn’t mean a particular product or a particular company. For example, “C”, “distributed caching” and “AMQP messaging” are, in this sense, technologies. However there are many embodiments of each of these technologies, supplied by many vendors and open source suppliers. It generally is NOT a good idea to compromise on your selection of a technology—except in special circumstances (for example, no one understands how to use it; or it’s clearly headed for obsolescence) you want to choose the technology best-suited for the job at hand.
    • When choosing an implementation or vendor for a particular technology, you are often better off following the leader. For example, memcached is a currently-popular distributed caching mechanism. If you’re choosing to use a specific distributed cache, then the “market leader” or “most popular” is generally your best choice. Only if the leader genuinely does not suit your most important needs would I choose a less-popular system. That is because—just like teenage boys and girls—the most popular gets the most attention. This means the most popular (software, not boys and girls) will evolve the most rapidly, have bug fixed more quickly, have more active user groups who can answer your questions, have more people available to hire who already know about it, etc. The rule is not always true—there are some fantastic niche players sometimes—but in general the most popular implementation of the technology you’ve selected will your best choice.
    • While it’s always best to meet end-user needs—real or anticipated—keep in mind that it’s generally (though not always) better to ship than not to ship. The “perfect” can be the enemy of the “good”—and often the way to ship something great is to ship something good and constantly make it better.  The early days of the Blackberry are a great example of this. The Blackberry started out meeting a real need (mobile email) in a minimalist way and kept improving over time until the feature set became very rich. (Their mistake in my opinion was not throwing it out and starting over with another minimalist offering when they needed to—but that’s a different discussion). Starting with a simple beginning and growing isn’t always the best approach. If your initial offering doesn’t solve a real problem or if it doesn’t meet minimal user expectations or minimum standards, your product is dead with little hope of recovery. But before you hold on until it’s perfect or “complete” remember that “real artists ship”. It’s surprising the degree to which end users will adapt their behavior to take advantage of your product IF they see sufficient benefit to them (for example—the stylized alphabet used for data entry on Palm Pilots; the cryptic symbols, typing patterns and acronyms used for text messages (LMAO, etc.)).
    • Achieving excellence requires a focus on maximizing strengths rather than on minimizing weakness. The tendency of many companies and individuals is to try to fix what’s wrong, rather than to pursue excellence by building on what they already do well. For a software company, this generally takes the form of attempting to fill the “gaps” in their offerings, by either adding features, or by making an acquisition that covers some perceived hole. In individuals, it generally takes the form of addressing “areas of improvement” rather than building on the “strengths” you already have. The alternative for both is to learn to live with their imperfections and instead focus on taking their unique differentiators to the next level. Few actually do this because it entails a lot of risk to leave a known fault in place. If a flaw is going to literally put a company out of business—or will make you as an individual lose a job you want to keep—you need to address the flaw. There’s really no choice. However I think most companies and individuals have more choices than they realize. A strategy of fixing weakness certainly raises the average, but it does not maximize the upside. I think that’s why so many companies—and individuals—muddle along but never achieve excellence. For these people and companies, fear of failure is a stronger driver than seizing an opportunity for success. I think in some situations, this is rational behavior: If we can’t afford to risk losing our job—or having our business temporarily decrease—then maybe it makes sense to forget about “excellence” and instead focus our energies on avoiding disaster. But when we make this choice, we should realize precisely what we are doing: We are forfeiting the chance to achieve the best that we might be capable of. Companies and individuals that achieve excellence generally do so in spite of big flaws. They focus entirely on what they do or want to do well, rather than on being “pretty good” at everything. Like Achilles, companies and individuals have a choice: “A short life filled with glory, or a long life filled with obscurity.” The more we realize we have a choice, and are up-front about making it, the happier we will be as companies and individuals. 

    So, the final question in looking back: Did it matter? I’m not planning to retire anytime in the near future—in fact my father is still an active guy.  I firmly believe my best working years are still ahead of me. But the biological fact of life is that I now have more working years behind me than I have in front of me. At this milestone, with the bulk of my career in my past, I have to ask: Did it make a difference? Did it mean anything more than collecting a paycheck?

    Of course the relationships we have, and have had, with the people we work with are probably the most important aspects of any career, software or otherwise. There’s nothing quite like being part of a great team; it’s a satisfaction all its own. And the software industry has had no shortage of extraordinary characters, some of whom I had a chance to meet along the way—from true geniuses to a guy who regularly came to work with a parrot on his shoulder to a woman who had her hair dyed in the colors of the Apple logo (actually I didn’t meet her—but she had only recently left Apple when I joined). And those are just a few. Just thinking about some of these and the other characters puts a grin on my face.  I’ve also had the great satisfaction of helping people to advance their careers and skills, as others have helped me. The people have definitely made a difference—them to me and, I hope, I to them. That matters. But did the work itself make any difference?

    Certainly over the last 30 years, the industry of which I—and probably you—are a part has changed almost every aspect of how about three-quarters of the world lives (that’s the percentage of people the World Bank estimates now have access to a mobile device). The convergent information, telecom and computer revolution has changed how we work and how we play; how we spend money and how we make it; how we interact with those we care about and how young people date; how we spend our leisure hours, and how we learn in school. In fact, it has changed the shape of the world in every way, geo-politically, socially and financially, more profoundly than any war or revolution in history.

    If we can say that a soldier in an army helped to win a war, or that a revolutionary in a society helped to create a new form of government, then you and I as software engineering professionals can be said to have transformed the world in these profound ways. I and my colleagues; my competitors and friends; my bosses and subordinates; the leaders of our industry and the “freshers” just out of University—we have together changed the world, and mostly for the better. And I, for one, think that matters.

    Yes, we did help change the world. (Courtesy of http://www.dailydealmedia.com/789world-bank-says-75-of-global-population-has-a-cell-phone/)
  • Note from 2025: Before the microservices paradigm became dominant in the mid 2010’s, my paradigm of choice for highly scalable, loosely coupled distributed systems was the “worker” pattern described below. While I’ve encountered the worker pattern again just recently, it was in the context of a decade-plus old system due for modernization. As an older paradigm, I would not recommend using it as a first-choice for new systems today. However, as an illustration of separation of concerns, the worker pattern still makes a good example. I also think the analogies to movies and music here are fun.

    Some of the principals that contribute to good, maintainable software architecture can sound a bit abstract. Their impact on your software during development and in deployment are anything but abstract, however! Adherence to good principals of software architecture helps you more rapidly produce a scalable, robust and maintainable system. Departing from them can leave you with a mess that never works really well, is hard to add new features to, and costs a fortune to maintain.

    It is sometimes hard to articulate exactly what the adverse consequences of violating a given principal will be. These are “rules of thumb” which have been developed over generations of software architects—generally through analyzing what went wrong after a conspicuous failure had already occurred. Looking forward is always murkier. In the case of this particular principal, however, the consequences of ignoring it are fairly concrete: Your software will be significantly harder to build and enhance than if you do follow it.

    The architectural principal we’d like to discuss is called “separation of concerns”. What this means in a nutshell is that one part of your system should not care about what the other parts are doing. Each piece of your system should care only about interacting with its immediate “neighbors” and “colleagues”, and not have to worry about the whole world simply to do its job. Architectures that successfully embody “separation of concerns” are sometimes described as “loosely coupled”, in analogy with mechanical systems. A coupling that’s “loose” is like a floppy mechanical spring joining two metal blocks. Moving one block has little if any effect on the other block, because the spring joining them is not very tightly coiled.

    To illustrate this principal, let’s look at a couple of analogies from vocal music, and from theater.

    As a young man, I used to sing choral music. In my favorite pieces, each independent vocal part stands on its own as, essentially, its own song. The part sung by the Soprano or the Alto is usually the “melody”—the song the audience hears—but I used to sing Baritone, which generally sings harmony, and there things get more problematic. 

    In a lot of Baritone and Bass parts, you end up singing just isolated notes that basically sound like a Tuba—just bah, bah, bah. In isolation, these notes make no melodic or musical sense at all; your part is certainly not a catchy tune you can hum. Such a part only makes sense when the other vocal parts are sung with it. This makes these parts more difficult to memorize and practice on their own and, in my opinion, often less fun to sing. Returning to our architecture discussion, I would say that such parts are “tightly coupled” to the other vocal parts, in the sense that they do not stand on their on, and instead depend on the other parts to give them meaning.

    On the other hand, in some songs each vocal part has its own melody and “life”. One fun example is Neil Sedaka’s “Breaking Up Is Hard To Do” from the 1960’s (http://www.youtube.com/watch?v=tbad22CKlB4). The harmony part which goes “do do do do down, doobie do, down down, come on, come on, down, doobie do, down down”—while hardly Shakespeare—is contagiously fun to sing and catchy in its own right. It also works brilliantly as harmony to the other parts. (And, no, I’m not old enough to remember when this first come out! ;o))

    A rather more sublime example is “Unto Us a Child is Born” from Handel’s Messiah (http://www.youtube.com/watch?v=MS3vpAWW2Zc) . Here each vocal part carries its own story and emotional content. In fact in this work of musical genius, Handel captures a Mother’s feeling vocally using the female voices, Soprano and Alto, while the Father’s emotions on having a new son are in the male Tenor and Bass lines. Individually each part is moving and powerful; combined they are truly brilliant.

    Such parts that can “stand alone” I would describe as “loosely coupled” to the other parts. Each vocal part definitely adds value to the whole, and together they are far more powerful and brilliant. But each also stands alone—it has an independent life.

    Another analogy is from the stage or the movies. In some dramas, some of the characters seem to exist solely to support the other parts; they have no independent existence. In fact, for these characters there may be little or no connection between one thing they do and the next, except as it relates to another player. These players also seem to belong solely to the play or movie—you can’t imagine them existing apart from it.

    In a really compelling drama, on the other hand, you instantly believe that each character—even the “minor” ones—existed before the show began, and will continue to exist (assuming they weren’t killed off as part of the plot) as an independent being after the play is over. The drama itself just illustrates one episode in everyone’s lives, you imagine, rather than being the sole purpose for which these characters are called into existence. The drama may show the lives of multiple characters intersecting—either tragically, or for their good—but the strong sense is that each character is a person with their own life.

    Maybe it’s just because I’ve seen it so many times, but it’s hard for me to watch this scene from the classic movie “Casablanca” without believing the main characters have a history that started long before the movie, including long-standing and complex relationships with each other (http://www.youtube.com/watch?v=7vThuwa5RZU). Each character, in other words, has a life of their own.

    So what does this have to do with software architecture?

    In a software architecture exhibiting “separation of concerns”, each software component also has a “life” of its own. That is, each component exists as an independent, well-defined entity. As in the analogy to vocal music and drama, each software component has its own “story” or “part” that exists independently of the other components.

    Let’s take a look at what I see as a great example of the “separation of concerns” principal, which we’ll call the “workflow” pattern. This pattern is an elaborated and generalized version of the “Grep the Web” architecture described by Janesh Varia of Amazon in his paper “Cloud Architectures, June 2008. We have used variants and specialization of this pattern in several Cloud engagements, and have found it versatile and well suited to highly scalable systems:

    Let’s first walk through the sequence of execution, and then talk about how this illustrates the “separation of concerns” paradigm.

    1. The client stores any required data or references to data in a shared input data repository
    2. The client requests that a particular type of activity be performed. The client’s activity requests are stored in a queue, and then processed sequentially by the workflow manager
    3. The workflow manager pulls the next activity off the request queue
    4. The workflow manager refers to the stored workflow definition(s) to determine the proper workflow to use for this particular type of requested activity
    5. The workflow manager creates a log record in the activity status data store that a particular activity has been requested at such and such a time
    6. Using the workflow definition for the requested type of activity, the workflow manager determines the first task that needs to be performed and determines which work queue contains workers that perform that type of task. The workflow manager then inserts a request into the appropriate work request queue. If requested in the workflow definition, the workflow manager may also use the timing service to set a timer which, when triggered, will signal the workflow manager that a task has not been completed on time.
    7. For each type of task, there is a pool of workers who perform that type of task. For example, there might be a pool of workers whose job is to input and transform data from one format to another. As it finishes its previous task, each worker examines the shared work queue for its pool, and tries to pull the next task off the queue. This is done in an atomic way so the worker either succeeds and the task is claimed, or it fails and the task is either left on the queue or is claimed by one and only one fellow worker. The first worker to claim the task owns it. In a cloud deployment, a worker would typically consist of one or more virtual machines.
    8. The worker performs its specialized task and stores any output data—or a reference to such data—in the shared output data repository. When it’s done, the worker places a “done status” message into the “task complete” queue that includes the task’s exit status (success, failure, etc.). Current task complete, the worker then returns to the shared work queue for its pool and competes against the other available workers to pull the next task.
    9. The workflow manager receives “done” messages from the “task complete” queue, and also messages from the timing service for tasks have not completed within the previously specified time. 
    10. On receiving a “done” message from a given task, the workflow manager will cancel any timer alarm that may be scheduled against that task. It will then decide on the next task to be performed by using the exit status of the current task and consulting the appropriate workflow definition. For tasks that have timed out, the workflow manager also consults the workflow definition to determine the appropriate next task—which could be a cleanup and/or abort activity, for example.
    11. The workflow manager logs the exit or “timeout” status of the just completed task, and logs that the next task has been requested at a given time. 
    12. The workflow manager then inserts a request into the appropriate work request queue for the next type of task, as determined above. If requested in the workflow definition, the workflow manager may also use the timing service to set a timer which, when triggered, will signal the workflow manager that a task has not been completed on time.
    13. Steps 7 through 12 repeat until all tasks as defined by the workflow are completed.
    14. After all the tasks in the workflow have been completed, the workflow manager puts an “activity complete” message in the activity complete notification queue together with the exit status information.
    15. The client pulls the activity complete message off the queue, and proceeds to its next activity as it sees fit.
    16. The client may download or otherwise access the output data produced by the execution of the workflow.
    17. Asynchronously from the workflow activity, the “Autoscale Manager” monitors the loading of all systems involved in implementing the workflow system. Consulting a set of external rules, which may say something like (for example): “Instantiate a new worker when the average utilization of the other workers in that pool is above 75%”, the autoscale manager creates or destroys cloud instances as needed to dynamically adjust to the current workload. It can also use predictive analytics to pro-actively scale the system in anticipation of future workloads (e.g. a shopping site needing more payment processing systems in the morning or the evening).

    To see how this pattern illustrates the principal of “separation of concerns”, let’s zoom in and follow the activities of one particular worker, which we’ll call “Worker 1”, keeping in mind that the behavior of all workers servicing all request queues is identical. Let’s focus strictly on Worker 1 here; the other workers are independently performing their tasks in parallel with Worker 1, but have no interaction with it in any way. Each worker is autonomous and none knows about the existence of the other workers on this queue, or in any other queue.

    In the first step of this example, Worker 1 tries to pull the next task off its request queue. Worker 3 is also trying to pull the same task in our example, but Worker 1 got there slightly sooner and thus claims the task, removing it from the queue. Worker 3 will note that it failed to pull a task off the queue and will try again to do so, but Worker 3 does not know or care about the existence of Worker 1. The two are entirely autonomous.

    After successfully claiming a task, Worker 1 fetches any input data it requires to do its work from the Input Data store.

    Worker 1 then performs its task, whatever that may be. For example, it may be to convert a file from one format to another, perform an analytic operation, or to do some other type of work.

    Having completed its task, Worker 1 then writes any output data it has produced to the Output Data store.

    Worker 1 now writes the exit status of the task just completed to the task completion queue.

    Worker 1 now tries to pull another task from the Request Queue, beginning the cycle all over again.

    So, looking at the sequence of activities to be performed from the “point of view” of Worker 1, the “to do” list would look like the following:

    1. Get the next task from the request queue. If I fail to pull a task, or if the queue is empty, wait and retry later.
    2. Now that I have pulled a task, fetch the input data required to perform that task from the Input Data store.
    3. Do my work.
    4. Now that I’ve completed my work, store my output data to the Output Data Store.
    5. Push my exit status for this task onto the Task Completion Queue.
    6. Repeat the cycle from Step 1.

    This is short, sweet and self-contained, much like the “down, doobie do, down down, come on, come on, down, doobie do, down down” portion of the song “Breaking Up Is Hard To Do” we listened to earlier. Note that the activities of this worker are completely self-contained; the worker is not “aware of” and does not need to be concerned about anything in the workflow architecture other than (1) the Request Queue; (2) the Input Data Store; (3) the Output Data Store; and (4) the Task Completion Queue. In particular, the worker is not aware of any other workers, and does not need to know how tasks get into the request queue, what is done (if anything) with the task completion status it writes; where the Input Data comes from or where the Output Data goes.

    Another way of saying this is that terms of the workflow architecture, each individual worker has no “concerns”—that is, other parts of the system it must interact with—beyond the four listed above. The meaning of “Separation of Concerns” is exactly this: that each piece of the overall system may go about its own “concerns” or activities without being aware of or heavily influenced by the rest of the system. Each piece is autonomous, “living” a life of its own, much as two strangers living in the same apartment building. Those two strangers have some shared concerns—for example, perhaps the repair status of the elevators, the availability of parking spaces, or the handling of package deliveries to their building—but in any event their concerns do not directly involve one another and their direct interaction is either minimal or nonexistent. One of the strangers may move out of the apartment building without the other either noticing or caring.

    That may sound like a lonely life for an individual, but it’s very good for a software component. The reason it’s good is that when one part of the system changes, few if any other parts of the system will “break” or be impacted in any way. For example, we could completely re-write the workflow manager or add features to it and it would have no effect at all on the implementation of any of the workers. This dramatically decreases maintenance costs, as well as allowing for rapid and safe evolution of the system—both as a whole, and of its various components. From an engineering management standpoint, product development is simplified since individual components can be developed or modified pretty much autonomously, allowing one to co-ordinate around availability of resources and other challenges.

  • Note from 2025: Steve Jobs passed away on October 5, 2011. This blog was written and posted the following day.

    I am finding the strong and world-wide reaction to the passing of Steve Jobs intensely moving. That so many people were touched by Steve and what he stood for in people’s minds speaks well for the human race. 

    Steve was a vital and vibrant human being. He was the kind of guy who was excited to come to work in the morning—not every morning (he was very human)—but the vast majority of them. When I worked at NeXT back in the 1990’s, I had a meeting scheduled with Steve at 8:00am the morning after his other company, Pixar, went public. This was an event that netted Steve a profit of close to a billion dollars, at a time when he really needed it. I hustled to make it to the meeting on time, all the while thinking that there was no way Steve would be there after what must have been quite a celebration the night before. He was not only there, but after responding to my congratulations with a brief “thanks”, we went right to work like nothing had happened.

    By the way, when people refer to Steve Jobs as “Steve”, it does not mean they are trying to imply a close and familiar relationship with him—as it would, for example, if I referred to the current President of the United States as “Barack”! Everyone at NeXT called Steve Jobs “Steve”, as did everyone at Apple when I was there. I never heard anyone, from his direct reports to the security guards, ever call him “Mr. Jobs”. 

    On the other side, there was only one “Steve”. If there was another person in the company whose first name happened to be “Steve”, we renamed them. Steve Naroff, for example, who headed the Development Tools group at NeXT and is even today still at Apple, was never referred to as “Steve”, but as “snaroff”, his email name. This was not at Steve’s urging or by some corporate policy, by the way—we, the team, did it without really thinking about it, I guess as a form of respect. There could of course be only one Steve.

    So why was Steve Jobs so admired, respected and—seems strange to apply to a guy I actually knew, but I guess it’s the right word–beloved?

    I’ve given a lot of thought to this, and clearly his amazing success at Apple over the last ten years has a lot to do with it. People love a winner, and Steve helped take Apple from near-extinction to one of the most valuable companies and brands on the planet. No small feat, and worthy of admiration in itself. 

    Steve had that doubly-rare gift of not only being superb at what he did, but also of getting rewarded and recognized for it.  There are many people who do great things and are never recognized for them. There are others who would do great things if they were in the right position, but they don’t have the political and other skills needed to get to those positions in the first place.  Steve not only had the ability to recognize and help create great products, he also had the political and other skills needed to move himself to a position where he could cause these things to happen, and get recognized and rewarded for them. This is exceedingly rare. Most people with the skills to rise to the top of a multi-billion dollar company are demonstrably not the right people to actually run the company—at least in terms of consistently producing great products. I think many people’s admiration stems from the fact Steve could do it all.

    However, I think a lot of it—and certainly the foundation of my own admiration—is Steve’s mantra of “Insanely Great”. I took and still take this to mean that products should be as good as they can be—as good as you know how to make them. They should not just be “differentiated enough to beat (or neutralize) the competition”, but rather they should serve the end-user’s needs as well as you possibly know how to do that. There are of course pragmatic considerations—like the cost to the end user (it’s not “great” if the customer can’t afford it), the time to market (it’s not “great” if it never ships) and the need to fund the growth of a healthy business that can create more great products. If you don’t take those into account—and there were times when Steve did not, and paid for it—you won’t be able to continue to produce great products. But within those constraints, “insanely great” means the product should be better than it needs to be. In fact, it should be as good as it can be.

    The foundation of “insanely great” is a refusal to accept anything less than excellent. This was Steve’s best gift, in my mind. While Steve was personally a fountain of creative ideas (some good, some bad), even moreso Steve was able to recognize the great ideas of others and know instantly when it wasn’t quite right. When you met with him—as we all did at NeXT—he would give you a big job to do, and when it didn’t measure up to his standards he would say “You can do better than this”. While disheartening sometimes, this was really a vote of confidence—because Steve knew you had it in you to do better. And chances are, you did. By setting a high bar and refusing to accept anything less, we ended up rising to levels of excellence and to learn to work together as a team in ways I have never seen before or since.

    It must be said, though, that “insanely great” really is “insane” in the sense of not being fully rational. It truly does NOT make business sense to invest more in the quality of your product than you have to in order to beat your competition and win in the market. Also, keep in mind that Steve championed the development of many products that were so far ahead of their time or the technology of the day that almost no one bought them.  “Insanely great” is more a matter of faith and philosophy than it is a bankable business strategy. You have to believe. Still, this is what inspires me about Steve Jobs, and I think it is a key reason why so many of us around the world mourn for him today. 

    To me, Steve’s gift to the world is to show us that “insanely great” can not only exist, but win. This attitude builds the kind of products people are thrilled to buy, and the kind of companies we are excited to work for. Pragmatists will probably never understand why doing something better than you need to do it can make any sense.  These voices are temporarily silenced by Apple’s business success, but many of us—myself included—fear to lose Apples’ shining example of “insanely great” products with Steve’s passing if the pragmatists again win the day. 

    Looking back on it, if I had to choose—and putting financial considerations aside—I would have chosen to work for Steve during the NeXT days rather than be part of his more recent Apple success story. At NeXT we knew we were developing something insanely great—and the NEXTStep operating system and other products we developed did indeed lay the foundations for Apple’s later success technically, in many ways. But at the time, there were few customers (relatively) and all we had was our belief in the value of what we were producing. We had the admiration of people we respected in the industry—which is no small thing—but at that time, not a lot of validation from the market. Our satisfaction and the excitement we took in our work had to come from inside.

    But that’s a lot. Knowing that what you do—your work—has intrinsic value because it’s good, truly good, is almost certainly the greatest gift you can receive in life. Creating and appreciating something of value, whether it’s raising a child, taking a great photograph, or helping develop a new software tool, is probably the best experience life has to offer. I think Steve Jobs has touched a chord in so many of us because he gave us that experience of excellence beyond reason: certainly to those who worked with him, but most of all he gave it to those who got a product better than merely “differentiated”. Customers got a product better than they could have ever expected.

    So, my farewell to Steve Jobs. Steve, you were an insanely great individual, and you lived an insanely great life. You set out to change the world, and you did. We are privileged to have been your contemporaries, and to enjoy the benefits of all you brought to the world. May you not only rest in peace, but in the satisfaction of a job unreasonably and irrationally well done.

  • Note from 2025: This blog was originally written in 2011 as a series of short posts describing different architectural features of cloud-native systems. I’ve decided to leave these posts all in-line, in the form that I provided it to our publication team, rather than break it up. Please don’t get confused when I refer to the “next blog”–I’m talking about the next section in this document, not a separate post.

    AWS first introduced the key components of its cloud architecture (the storage and compute virtualization components S3 and EC2) in 2006. When this blog was written in 2011, the cloud paradigm was still unfamiliar to many. In fact, lots of companies with virtualized data centers referred to their infrastructure as a “cloud” and thought they were already there! I wrote this series, in part, to disambiguate the public cloud from a virtualized data center, and to explain the advantages of cloud-native architectures.

    Interesting to me looking back on it from 2025 is how well these principles pre-figure the microservices paradigm. In fact the term “microservices” was invented right around the time this was originally written. As the microservices paradigm emerged, the principles seemed very natural to me–and ideally suited for cloud-native systems.

    Location anonymity

    What is “The Cloud”? The central characteristic of the cloud is that the assets required to deliver a unit of functionality—computation, data access, networking devices, etc.—are in unspecified and potentially dynamically changing physical locations. This is, of course, where the “cloud” metaphor comes from—in physical clouds, knowing the location of each individual water droplet is not necessary to understand the behavior of the cloud as a whole. For many years a cloud symbol has been used on network diagrams to denote hidden and largely irrelevant complexity—for example, that symbol has been used for internet, or—prior to that—the public switched telephone network (PSTN). 

    Though their physical locations may be unknown, functional units deployed in the cloud are addressable, usually though not always via a URL (like a web page address) and programmatically via paradigms such as REST and protocols such as SOAP. However these assets cannot be addressed as conventional physical resources (traditionally hostname or hardware-specific IP address) as they would be in a corporate network, except perhaps as aliases for an anonymous system. Leveraging this “location anonymity” is actually what drives some of the most powerful aspects of the cloud paradigm.

    It would be easy to read “location anonymity” only as “cloud means ignorance of location”, but a more useful characterization is “components of a well-designed cloud architecture shouldn’t assume nor care about having a specific location”. In other words, a cloud application or service is best architected in such a way that each of its constituent components can tolerate wide variations in the proximity of the other components and resources it needs, and in the physical location of the clients it serves. In this sense, cloud is the software equivalent of geographic globalization, where the physical location of human and other resources may be widely dispersed, with modern business practices and technologies making that location increasingly irrelevant.

    In addition, not depending on the physical location of components is a key driver of cloud “elasticity”: Since a given system is anonymous, the function performed by that system can easily be realized as a “pool” of identical systems instantiated dynamically from the same boot image, front-ended by a “load-balancer”. The pool can grow or shrink in size depending on the workload characteristics of the application, allowing for a very high degree of scalability during peak loads, and economy when demand is small, since fewer resources are then deployed. In a physically-tied system, deploying more systems can take weeks if not months; even in a virtualized data center this process can involve considerable manual configuration effort. With the cloud, elasticity is intrinsic to the paradigm and when properly implemented only takes minutes.

    Independence of system components from physical location necessitates that our cloud-based applications follow some important architectural principals if they are to be robust, dynamically scalable and high-performing. These principals, in turn, imply what I would consider a “functional” definition of the cloud: I would claim that systems that violate these cloud architectural principals are less cloud-oriented systems than systems that follow them—and vice versa.

    To define the cloud, then, we will look at the unique opportunities and challenges it poses architecturally. This is much like trying to understand a physical material—like, say, unreinforced clay bricks—by the opportunities and challenges that constructing a building from them would pose. Physical masonry bricks and mortar, for example, cannot be used to construct long unsupported overhangs unless they are formed into an arch. Bricks and mortar are strong in compression—i.e. they can carry heavy loads—but not in bending; when bent, they tend to fracture. If you were to see a building that violates that architectural principal by, say, having a 100 foot by 100 foot unsupported brick overhang, you could with confidence infer that this portion of the building is not, in fact, structurally made out of traditional masonry bricks and mortar. It may look like bricks, but that part of the building must be made of some other material—reinforced concrete, for example—with a brick façade. That is, of course, unless it’s engineered to collapse!

    Similarly, if you see an application that violates the cloud architectural principals we propose in the following blogs, I assert that it is not a fully cloud-based application. It may look like one or be called one, but it is not a “full” cloud application.

    Toward an architecturally-based definition of The Cloud: Architectural Principals 1 & 2

    Let’s look at the first two of the eight key principals GlobalLogic’s architecture team has found helpful in designing effective cloud systems:

    • The underlying architecture should be distributed. Although cloud computing and distributed architecture are in theory orthogonal, we have found that distributing the application architecture is a very important step to capitalizing on the full benefits of cloud computing. Organizations taking their first step in moving an existing enterprise application unmodified into the cloud will quickly see the advantages of re-architecting their system in a distributed manner if they wish to fully gain the benefits of the cloud, for the reasons we outline in subsequent principals. For example, having all components access a single, massive relational database—while common in enterprise applications—is not an architecture that will lend itself to exploiting the advantages of the cloud as readily as a more decentralized system.
    • Each component of a cloud-based application must be highly tolerant of variable degrees of latency between messages sent to or received from every other component. This is because when invoked, one resource might be deployed on a VM residing on a physical machine somewhere, say, on the West Coast of the United States while a resource it communicates with is located in India. When called another time, the resources might be co-located on the same subnet in the same data center in Europe. Called yet another time, they may be in, say, Argentina and Ukraine. That’s an extreme example, but it’s to make the point that in a fully cloud-enabled application you don’t have full control over where your components are. Even more to the point, you should not have to care. Components should not rely on their communication being synchronous, or even that the latency between components is low and constant, since resource location is dynamic. To be sure, some commercial cloud offerings let you specify an affinity for a particular datacenter or even for the same equipment rack—but applications that require such approaches are, in my view, using a workaround and are not architected to take full advantage of this new paradigm.

    In the next blog in this series, we will discuss principals related to state and data consistency.

    Toward an architecturally-based definition of The Cloud: Architectural Principals 3 & 4

    In the previous blog in this series, we discussed the first two of the eight principals GlobalLogic’s architecture team uses in designing effective cloud systems:

    • The underlying architecture should be distributed
    • Each component of a cloud-based application must be highly tolerant of variable degrees of latency between messages sent to or received from every other component.

    The next two principals relate to state and data consistency:

    • Cloud components should be as stateless as possible, with state maintained in a shared, distributed data store or cache. The dynamic “elasticity” of a cloud application is a key benefit, since instances of a given component can be created or destroyed to respond to the load at any given time. To take maximum advantage of this, the individual components in a pool must be as interchangeable as possible—in particular, they should ideally not carry state. Whatever state a component must carry should be maintained in a separate data service so it can be shared between component instances. This can be done via a distributed data store or caching mechanism, and can provide redundancy for fault tolerance, as well as support for elastic scalability.
    • The system should tolerate eventual data consistency rather than enforcing immediate data consistency. Because distributed components operate asynchronously and with variable latencies, enforcing instantaneous global data updates can lead to race conditions, bottlenecks, retries, and general loss of system efficiency. Cloud systems are better architected to support local updates which propagate through the system over time and are consolidated eventually, as opposed to having a single monolithic data repository which is guaranteed complete and accurate at all times. While this may not be possible or desirable in every situation, note that even bank ATM systems are generally architected to enforce eventual, rather than immediate, consistency of your account balance; this approach is not the heresy it might seem to be. And “eventually” need not be a long time—the time to achieve consistency is commonly seconds, but may be shorter or longer depending on the needs of the system.

    Toward an architecturally-based definition of The Cloud: Architectural Principals 5 & 6

    In previous blogs in this series, we discussed four of the eight principals GlobalLogic’s architecture team uses in designing effective cloud systems:

    • The underlying architecture should be distributed
    • Each component of a cloud-based application must be highly tolerant of variable degrees of latency between messages sent to or received from every other component.
    • Cloud components should be as stateless as possible, with state maintained in a shared, distributed data store or cache
    • The system should tolerate eventual data consistency rather than enforcing immediate data consistency.

    The next two principals relate to the physical locality of data to computational logic:

    • Minimize data movement by moving the code toward the data or, better yet, act only on the data closest to each compute node. Because of the distributed components in a cloud application, having a centralized data source—such as a massive database—diminishes the efficiency of the system. This is because of the time it takes to propagate data to the distributed components, and because of those components trying to access or modify the same co-located pool of data with their variable latencies. To improve processing parallelism, it is better to move away from a physically centralized data store entirely, and toward a distributed one that enables each processing component to act against its local data. Those intermediate results may then be consolidated at a higher level. This is how Google search, for example, is able to achieve such high levels of performance against massive amounts of data (the entire internet in their case)—data is distributed across many compute nodes. In such a “MapReduce” operation, each of the “mapper nodes” searches only the relatively small amount of data contained in its local attached storage, with the results being consolidated globally at the reducer nodes. In applications where it is not feasible to so distribute the data, it is better to move the compute nodes as close as possible to the data store, to minimize the impact of data traffic and latency. This location bias definitely is a workaround that makes the application less “cloud” oriented, but it is a workable paradigm where legacy data stores, for example, must be incorporated into a new cloud application.
    • Asynchronously redistribute data in the background. Elasticity is a fundamental feature of the cloud paradigm so systems must be architected to tolerate the fact that machines may come and go in a planned or an unplanned fashion. Because application state must be retained somewhere—hopefully in a shared and distributed data service rather than in each individual component—the systems which carry that state must themselves be tolerant of being created or destroyed. In other words, when the pool of stateful components grows or shrinks, data has to be redistributed across surviving or newly instantiated nodes. Also, new data coming into the system must be transferred to the components that will use it; this is true even in a MapReduce operation. Our preferred way to mitigate the performance and other impact of these data movement is to implement them as a “background” task that is done asynchronously from the processing tasks. The processing components that depend upon the data must then be architected to tolerate temporary data inconsistencies, but this has other benefits as we discussed above.

    Toward an architecturally-based definition of The Cloud: Architectural Principals 7 & 8

    We have now covered six of the eight key cloud architecture principals GlobalLogic’s architecture team uses to design effective cloud systems in previous blogs in this series:

    • The underlying architecture should be distributed
    • Each component of a cloud-based application must be highly tolerant of variable degrees of latency between messages sent to or received from every other component.
    • Cloud components should be as stateless as possible, with state maintained in a shared, distributed data store or cache
    • The system should tolerate eventual data consistency rather than enforcing immediate data consistency.
    • Minimize data movement by moving the code toward the data or, better yet, act only on the data closest to each compute node.
    • Asynchronously redistribute data in the background.

    The final two principals deal with data movement:

    • As you grow and shrink the pool of components, minimize data movement. Moving data is expensive in a cloud system since, in general, data must be assumed to at least sometimes travel at WAN speeds. In particular, the need for a “real-time” data transfer should be avoided due to its potential performance impact on the system. In systems where the data is distributed—for example, in the distributed web search scenario we mentioned previously—spawning or removing a stateful component requires that other stateful components surrender or acquire the data being managed by the new or deleted component. Because of fault tolerance, it is generally better to have data redundancy built into a distributed system, such that either accidentally or intentionally removing a stateful component instance does not necessitate an immediate data transfer to insure accurate results. By building the system to tolerate a degree of redundancy—which you can sometimes do, for example, by filtering out redundant results at a higher level of the system—data may be cached or lazily transferred asynchronously around the system to take advantage of the addition or compensate for the removal of a stateful component.
    • Maximize the use of cache. Once your system is designed to tolerate data inconsistency issues, you can leverage cache more effectively. Use of a distributed cache is an important mechanism to support the separation of concerns that result in stateless components, asynchronous data distribution and eventual consistency as outlined above. Some excellent commercial and open-source alternatives are readily available. Memory-based architectures with terabytes of reliable and in some cases non-volatile storage are becoming a reality for cloud applications, and cache-centric architectures that follow the principals described above will be well positioned to exploit these new developments.

    Now that we’ve outlined a set of architectural principals behind good cloud design, how can we apply these to form a functional definition of a “cloud based system”? In the next blog in this series, we will take an example and see.

    Toward an architecturally-based definition of The Cloud: Is a virtualized data center a cloud?

    We have discussed in preceding blogs in this series the eight architectural principals we keep in mind when designing a new large-scale cloud application. These are:

    • The underlying architecture should be distributed
    • Each component of a cloud-based application must be highly tolerant of variable degrees of latency between messages sent to or received from every other component.
    • Cloud components should be as stateless as possible, with state maintained in a shared, distributed data store or cache
    • The system should tolerate eventual data consistency rather than enforcing immediate data consistency.
    • Minimize data movement by moving the code toward the data or, better yet, act only on the data closest to each compute node.
    • Asynchronously redistribute data in the background.
    • As you grow and shrink the pool of components, minimize data movement
    • Maximize the use of cache.

    I would now argue, coming back to the physical building analogy I used early in this series, that applications and/or “platforms” which follow these principals are more cloud-oriented than those that do not—and I think now you should see why. But what about the infrastructure on which these systems are deployed? Can we use these architectural principals to say anything about the physical infrastructure itself?

    Let us ask the question: Is a single virtualized data center a “cloud”? In the light of our discussion above I would re-frame that question to ask: “Does a virtualized datacenter provide support for cloud-based applications?” I would argue that while there is nothing to stop a cloud-based application from being deployed in a virtualized data center, there is also nothing about a single virtualized datacenter that requires or takes full advantage of the unique characteristics of cloud-based applications. So my short answer would be: No, a single virtualized data center is not a cloud. It does not impose the conditions of variable latency, location anonymity or other characteristics for which cloud applications are architected.

    Obviously at some scale, a virtualized data center does become a cloud. But where does the tipping point occur? We will discuss this in our next and final blog in this series.

    Toward an architecturally-based definition of The Cloud: Conclusion

    In the previous blog in this series we asked ourselves: At what point does a “virtualized data center” become a “private cloud”? This is clearly at least in part a question of scale, but where is the dividing line? I would say that based on the conditions that need to be met by cloud applications as discussed in the architectural principals above, to be considered a “virtual private cloud” the following conditions should be met:

    1. There are multiple interconnected virtual private data centers with significant geographic separation between them (on multiple continents, for example), or applications are designed to scale elastically to utilize both the virtual private data center(s) and a publically hosted cloud in a “hybrid cloud” model
    2. Provisioning of new systems which host application components is entirely automatic and in response to load
    3. No human intervention is required to provision a new system or to deploy an application component on it; or to de-commission an existing system
    4. Deployed systems and components can freely or algorithmically migrate between the distributed data centers in response to load with and, at least ideally, without human intervention

    Unless the above conditions are true, there is really no need to architect an application that follows all the above cloud architecture principals; a more conventional approach would be equally suited—unless an eventual migration to a “true” cloud environment is envisioned. I would not consider applications that do not follow the architecture principals above to be as cloud-enabled as those that do, however. I would also not consider a deployment environment to be a cloud if it does not meet at least the “virtual private cloud” criteria listed above—though that is a high bar, I admit.

    Perhaps a more useful concept in this transitional time is a “degree of cloudiness”, rather than a simple “Cloud” / “Not Cloud” dichotomy. In reality, few existing applications or cloud infrastructures meet all the above criteria. This is where I believe the Cloud is headed, however, and it is in embodying these principals that we will see the real benefits of this new paradigm.

    That being said, there is nothing wrong per se with not being a cloud or a “full” cloud application! There is plenty of scope for non- or semi-cloud applications and infrastructures, both within organizations and as commercial offerings. When an application or an infrastructure is not a “cloud” or is a “partial cloud”, I think we should admit it without apology, rather than trying to stretch the definition of “cloud” to cover it. A definition is not meaningful until it’s clear what it does not apply to. If everything is a cloud or a cloud application, then the term loses any meaning. And I think the concept of “The Cloud” is way too useful for us to let it just drift away!

    My warm thanks to the GlobalLogic architecture team for their insights and for stimulating discussions on “The Cloud” and related topics.