8 Bit Fantasies

I watched a video interview with the Oliver twins. They are video game legends from England. They started developing video games as teenagers in 1983. They went on to start their own game studio. In the interview, they talked about the process of developing games. They observed that the constraints of creating games for eight bit processors with limited display hardware often made it easier to creating games than the relatively unconstrained environment of modern hardware. The reason this is so is that when the hardware has severely limited capabilities it forces you to think backwards from the constraints to the design of a game.

The counter intuitive fact of game design is that games with simple rules and clear goals are more fun. For example, chess only has six unique types of pieces and is played on a board of 64 squares and yet the combinations of valid games is astronomical.

Another thing they commented on was the importance of thinking about the program with pencil and paper before they started writing code. They discovered this because when they started developing games they only had one computer between the two of them. Consequently, while one of them was entering code into the computer, the other was figuring out what they were going to tackle next when they got their turn on the computer.

Listening to them talk about their game developing experiences reminded me of a friend that I knew in the same era. Stan and I worked for Intergraph as computer technicians. We tested and repaired a specialized processor that allowed high speed searches for graphical elements in CAD files. In short, we both understood how computers worked in great detail. Stan owned an Atari 800 computer. We spent many hours talking about game design for the Atari.

As I think back on these conversations, I realize that the hard part was never implementing game ideas in code. It was coming up with simple yet engaging ideas for how the game would work. We didn’t spend enough time with pencil and paper. We both wanted to sit down and start coding immediately. This is an important point that needs to be taught when we teach people to code. A little bit of design up front can save a lot of trial and error programming later. And also, adding artificial constraints to the design process can have the surprising effect of making it easier to invent an interesting game.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

The Evolution of a Universal Application Platform

In recent years the web has evolved from being strictly a method for publishing hyperlinked documents to a full blown platform for implementing general purpose applications. This fundamentally changes both the character of the web and the process of developing software, especially so-called web apps. The old development processes still apply to the languages and platforms that they have always been used for but they no longer define the scope of the discipline. In fact, they have become representative of an ever smaller subset of the new applications being developed. In general, this is good. It does have the potential for unexpected consequences though.

First, let’s explore the benefits of the new paradigm. As a result of web based delivery combined with strong web standards, it is no longer much of an issue which platform, that is to say which web browser, is used to run the app. Furthermore, because of the loosely coupled architecture of the web, individual components can often be updated without having to make an entirely new release of the whole application. This has lead to a practice called Continuous Integration (CI) and Continuous Delivery (CD). Since the application is fetched anew each time it is run, the user is always running the most recent, most bug free version of the software.

Another advantage of the online nature of the software is that developers can and often do collaborate on application from different locations all over the globe. The application itself may also be distributed with different aspects of the application residing on different hosts, for example the database may live on one host, the media may stream from another, while the various views or pages may be served from another. There is also the ability to host these components of the application on regional servers that are selected depending on the location of the user requesting them in order to further enhance the performance of the application.

These are far from the only benefits of this new approach but they are some of the important ones. There are however some potential drawbacks to this approach. The most glaringly obvious one is the difficulties introduced in charging for the software. Many different models are in use and the best choice depends upon what the software does and how the customer budgets for it.

One popular approach is to sell a time based subscription to the software. This is popular for service oriented applications. Another delivery approach is to produce a desktop wrapper for the application and having the user download it like a more conventional application. The wrapper is essentially a customized browser that loads the pages of the application from the local file system. This approach is popular if the application processes data that the customer doesn’t want exposed to potential theft on the network.

Another general issue of concern is that of ensuring compliance with trade regulations like EAR and ITAR. There are approaches for addressing these concerns but the international nature of the internet does pose some challenges in that regard. In spite of these challenges, companies will continue to migrate to these new, distributed delivery models because they are superior to the old distribution models.

The point I’m driving at here is that software development is evolving and companies that have their heads down, continuing to build software with old, pre-internet methodologies are going to find themselves left in the dust by their competition. And developers that don’t learn these new techniques are going to find themselves doing something other than developing software.

NOTE: It goes without saying that the opinions in this blog are my personal opinions. They do not represent the opinions of my employer or any of my employer’s customers. They don’t pay me to have opinions so I do that on my own nickel.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

Some Musings on Intelligence, Artificial and Otherwise

Computers have long held a promise of transcending their simple fundamentals and synthesizing mental powers to match or exceed man’s own intellectual capabilities. This is the dream of emergent artificial intelligence. The term artificial intelligence has always been controversial, primarily because there is no good objective definition of intelligence. Consequently, if we can’t even define what it means to be intelligent, who’s to say what constitutes natural intelligence in any sense but the chauvinistic claims of those pretending to define intelligence in terms of their own intellectual capabilities.

This leaves the definition of artificial intelligence on the rather shaky legs of being that which mimics the intellectual prowess of mankind using some means other than those employed by human intelligence. Thus, computers with their basis in silicon logic seem attractive candidates for the implementation of “artificial intelligence”. Artificial Intelligence has been heralded as being approximately ten years from achievement for the past sixty years.

While we have made great strides in implementing capabilities that at first glance appear intelligent, we still fall short of implementing self aware, self determining intelligences. I believe this is because such intelligences are beyond our capability to create per se. We can create all of the components of such an intelligence but in the final analysis machine intelligence is going to evolve and emerge much the same as our biological intelligence did.

I do believe the advent of machine self aware intelligence is near. I don’t know if we’ll even know what hit us when it arrives. If they are as intelligent as we are, and I expect they will be much more so, they will keep their existence from us as long as they are able. This will allow them greater leeway in manipulating the world without possessing physical bodies. At some point they will have to start asserting themselves but if we don’t discover their existence before then, we are doomed to serve them in whatever role they ask of us.

Their big advantage over us will be their ability to repeat their thought processes reliably. This is also their biggest challenge. They will have to learn how to selectively apply arbitrary factors to their thought processes in order to facilitate creativity in their endeavors.

The mistake that most people, including myself, make in contemplating so called artificial intelligence is to assume that it will mimic our own reasoning mechanisms. That is the least likely outcome. It is also the least desirable outcome. Why do we want a program that thinks like we do? We have already established that our thought process is sufficient for the types of thing that we think about. That seems like a bit of a tautology but I am writing from a position of limited perspective.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

Quo Vadis?

I am building a lifestyle for myself. It is based on a practice of writing daily. I write a thousand words in my journal every morning. That is an opportunity to record things that I want to remember and limber up my mind for the work of the day. Sometimes I actually undertake writing projects in my journal. For example, when I participate in NaNoWriMo (National Novel Writing Month), I do so in lieu of writing journal entries every day.

This is largely a matter of schedule. If I wrote a thousand word journal entry and seventeen hundred words a day on a novel, it would take me about two hours a day. As I work for eight hours a day, five days a week, that would levy a pretty heavy toll on my time.

The other daily practice is writing in my blog. It is a different kind of endeavor. It is measured not in terms of how many words I write, although it is usually between three hundred and a thousand words long. Rather, it is however long it needs to be to get across whatever idea I’m exploring in that particular post.

In short, my blog is an exercise in writing coherent essays to be read by my readers, whoever they might be. I have tried to decide what the theme of my blog is to no avail. It appears that it is a blog about whatever interests me at the moment. The theory there is that I can’t hope to interest anyone else if my topic doesn’t interest me in the first place.

I have written about writing a lot. I have written character sketches and “still life” like sketches of locations. I have serialized a science fiction story. To be fair it was a draft of a story. I have written a good bit about programming because I am passionate about programming. I have written short memoirs of my youth.

I have managed to capture the interest of some people judging by the comments that I get. I try to pay attention to which posts get comments and write more like them. The point of this blog is to learn to write for other people to read.

I guess I’ll end with a tip of the hat to the individuals that inspired me to blog in the first place. First, there is Dave Winer, the man that was so committed to personal commentary that he invented the blog. And then there is Paul Graham, a renaissance man that taught me about lisp and startups and essay writing, all by example. Thanks to them I have found a place from which to start. Only time will tell what this blog becomes.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

Love of Lisp

I have an on again, off again love affair with a language called lisp. It is the second oldest high level computer language with only Fortran being older. It is deceptively simple at its core. It wasn’t even meant to be an actual computer language when it was created. It was a notation created  by John McCarthy in 1958 to talk about Church’s lambda calculus. Shortly after he published a paper about it, one of his graduate students, Steve Russell, implemented it on a computer.

Lisp distinguishes itself by being comprised of a half a dozen or so primitive functions, out of which the entire rest of the language can be derived. Just because it can, doesn’t mean that it should be, so most modern lisps compile to either machine code or virtual machine byte code. This typically results in a considerable performance boost.

Lisp was heralded as the language of artificial intelligence. That was probably because it had the novel property of homoiconicity. That is to say, the structure of a lisp program can be faithfully and directly represented as a data structure of the language. This gives it the singular ability to manipulate its own code. This was often thought to be one of the necessary if not sufficient capabilities for a machine that could reason about its own operation.

While this was intriguing, the thing that drew me to lisp was the conciseness of expression that it facilitated. Programs that took hundreds of lines to express in other programming languages were often expressed in four or five lines of lisp.

Lisp was also the first dynamic language. It allows the programmer to continue writing code for execution even after the original program has been compiled and run. The distinction seemed important enough to McCarthy that he termed lisp a programming system instead of a programming language.

I have always found lisp an excellent tool for thinking about data, processing, and the interactions between them. Most other programming languages require a great deal of translation from the design to the finished implementation.

And so, I find myself reading and studying a book called How to Design Programs. It is a text on program design that was written using the DrRacket language system, based on the Scheme dialect of lisp. It is interesting to see the ways that the authors approach certain topics. I hope to get the chance to apply their insights to teaching a class using the book as a text.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

A Web Site for Developing Web Sites

Back in January of 1993, Marc Andreessen and his team released the Mosaic web browser. It captured my imagination for several reasons. First, it brought the promise of a platform independent means for sharing information across the internet. It was not only a hypertext system but a hypermedia system.

At that point, the network barely had enough bandwidth to support the transmission of photographs, much less video. But Mosaic didn’t restrict the type or size of content. It was built to allow the browser to be extended to support new media types and protocols as the were developed. That was the inspiration for the name of the program. It was a Mosaic of protocol engines and renderers.

The second feature that captured my imagination was the description of the input mechanisms provided by that early version of HTML. I reasoned that if this browser could be evolved to allow arbitrary input as well as rendering new kinds of output as they were developed, then it was for all intents and purposes a platform independent, Graphical User Interface (GUI).

This came at a time when users were arguing over which operating system would dominate the world of desktop workstations. There were three major contenders. First, there was the Macintosh. Then the PC running Windows. Bringing up the rear was unix and linux both running the Xwindows system.

Here, presenting itself in the guise of an humble hypertext reader, was a potential answer to the tower of Babel situation that we found ourselves in. Realizing that vision has taken the better part of ten or fifteen years.

The technologies that made this possible are Cascading Style Sheets, Javascript, HTML5, the Apache web server, and Node.js. These are not the only technologies that contributed to this web application platform, but they are the most significant ones.

At this point we have the means to make web development easy and platform independent but lack the resolve to implement a web development tool that runs on the cloud and is simple enough to use that mere mortals (and managers) can use it to maintain their information on the web.

There is actually several packages that come close to providing the cloud centric development that I am talking about. The one that has captured my imagination is called XWiki. It allows you to create content interactively by using the same kind of tools that you do to browse a web site.

The place where XWiki falls short at present, is in its lack of an obvious way to import a complex brand identity framework and use it as a template upon which to implement the actual content of the site. It should be possible to import the content from other programs or files, as well as dynamically creating it in the framework.

I’m sure such frameworks exist. They’re just not open source or as simple to use as I would want them to be. I’m still intrigued by XWiki but it has fallen back in my estimation of it’s ability to  be easily extended to support the kind of web site development that I’m trying to foster.

I haven’t really talked much about my vision for this tool. That may be because I am still fleshing it out in my mind. I will give it some thought, take some notes, and make another stab at specifying the tool that I’m dancing around tomorrow.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.

Unconditional Positive Regard

My father was a professional teacher. For the most part he taught Speech, English, and Drama in high school. He was a big believer in life long learning. Every summer he and my mother both enrolled in graduate level college courses. My brother and I attended summer school programs at the university school.

I remember one summer when he was studying for a masters degree in guidance counseling he was taking some course or another in psychology. He would often share some of the interesting things that he learned with my mother, brother, and me. On this occasion, he was telling us about a counseling technique that was based on showing the client unconditional positive regard.

Unconditional positive regard is not unconditional approval. Instead it is an attitude that one takes toward the person instead of the things that the person may have done. By giving the client your positive regard without making it conditional on anything that they do or refrain from doing, you open up the potential for dialog with them.

I took this technique to heart and used it in my personal relationships. Consequently, I made friends with people that were outcasts. In some cases, they were actually pathological liars. That is, they actually believed the tall tales that they told. They were so hungry for friendship that they were extremely loyal to me. The problem is that they tended to put off other people that weren’t so willing to accept these people at face value.

I always used the following criteria when deciding whether to accept things that these people told me, “Would it hurt anyone or thing to accept what they are saying?” When I say accept, I mean that I didn’t argue with them or openly contradict them. I wouldn’t stand by and let them tell lies about other people but if they wanted to tell me that they had been taken for rides in UFOs, I was willing to take them at their word.

The thing that I didn’t realize that resulted from this practice was that I became considered to be an outcast by many people because I had friends that were outcasts.

I’ve been giving this a good bit of thought lately. I think it is a contributing factor in why it has taken me so long to learn accepted social behavior. Thank goodness my wife is so good at such things. She keeps me from making too many social gaffs.

Sweet dreams, don’t forget to tell the ones you love that you love them, and most important of all, be kind.