Problem Solving with Modern Computer Languages

There are different ways of arriving at the same solution to a problem. You can be good at recognizing patterns and matching aspects of the problem at hand with problems that you have seen in the past. You can exhaustively enumerate the potential solutions to the problem, judging each one to decide if it solves the problem and how well. You can imagine the problem solved and work backwards toward the conditions from which you are starting. You can conduct experiments to determine what methods might be useful in solving the problem and which would not.

The list of ways to solve a problem goes on and on. The way to choose one of them depends upon how your mind works. For instance, you might be better at remembering things than you are at thinking of all the possible solutions. You may instinctively recognize patterns. Probably your style is some combination of methods. It may even vary from problem to problem.

I suspect that we will discover the same characteristics are evident in Artificial General Intelligence (AGI). We will find that as we automate all of the various approaches to solving problems we will be producing a catalog of techniques that will serve the AGI as well as it does us. We are already building such catalogs. They are called library packages.

Every computer language has them. Most recent language have centralized repositories that make these packages available and sophisticated dependency management software that assist the programmer in ensuring that the versions of the libraries that are loaded to support any given application are compatible with each other.

Some cutting edge languages are building the package management facilities right in to the syntax of the language. This acknowledges the importance of dependency management while simplifying the task for the programmer. Instead of having to look for an external dependency management package and perhaps choosing between several competing solutions, the programmer just uses the built in facility.

Another feature of the modern computing environment is the facility with which languages are interoperating with each other. Whether it is through the facilities of a Foreign Function Interface (FFI) or an Application Programming Interface (API) or some other mechanism for interoperating with different software facilities, the modern programmer is more often faced with an embarrassment of riches when it comes to ways to implement commonly used library facilities.

When combined with the exponential increase in raw computing power, todays programmer is able to spend more time coming up with abstract solutions to the problem at hand and less time trying to conform their solutions to digital representations.

My major hope is that we don’t forget how all the underlying infrastructure works. It would be a shame if we got so sophisticated that no one knew how to fix the basic system software that interacts directly with the hardware. Of course, as time goes by, that will become abstracted into the design of the hardware as well.

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