Every now and then when I see a poor practice of programmers, I think about the possibility of a world where such mistakes do not happen. I think about what I can do to make that future a possibility.
I started programming in the 1990s using a “Basic Training” section that would appear in the 3-2-1 Contact magazine. Back in those days, I don’t think the future was in my thoughts. Programming was just fun. As my knowledge of programming progressed from madlibs written in QBasic to scripting pinball tables with Visual Pinball, programming remained fun.
I think my thoughts about the future really started with my job out of high school. I learned and used Coldfusion to build websites in the job. In conjunction, I learned SQL, specifically the Jet SQL variant used in Access. It was when I learned about SQL injection that the thought of the future entered my thoughts when it came to computers.
The next boost in thinking about the future came in my first year of college. This was in the era before Windows XP SP2 when the firewall in Windows was not on by default. I was reinstalling my computer as I frequently do, and before I had finished the installation and turned on the firewall, malware took advantage of an RPC vulnerability in Windows at the time to infect my machine. Ever since then, I have my paranoia guard up when I use any computer system I have not personally set up and configured.
I don’t know if problems have gotten worse or if my perception has become more acute, but each day there is something that prompts a dream. I might read a story on The Old New Thing describing how software developers did not follow the documentation so Microsoft has to try and cope with software doing the wrong thing and keep both that software and Windows running. I might see an installer instruct the user to turn off security software or disable UAC. Or, leaving the techology realm, I might see a student at school go to the mailroom and ask for the contents of a particular mailbox and be given the contents without showing identification or being challenged to verify he or she should have access to that mail.
My thoughts on that future are often wild ideas like making my own operating system. Truthfully, that would make things worse I believe. It’s a programmer’s instinct to write their own software instead of getting existing software fixed. My thinking right now makes me wonder this: Has the capability of software progressed beyond our ability to understand it?
Take for instance Notepad in Windows. It’s a seemingly simple application. It just shows you text. But the evolution of software and technology has made text stored in a computer complex. There are many character sets from which characters can be chosen. A nice thing here is that ASCII is generally a common denominator with Unicode being the modern norm. But then, particularly with Unicode, things are still complex: Is it encoded in UTF-8? UTF-7? UTF-16? Forgetting the text of a file, what about the file itself? Is it the default data stream for a file or an alternate data stream? Is it named with a short or long name? Does the name have spaces in it? Is the name from the days of DOS? That’s just the tip of the iceberg. How can we write software with all of this capability understood? How can we write software so that issues that affect a seemingly simple application like Notepad not only do not happen but cannot happen?
My dream is not concrete. My dream is quite abstract, but there are influences out there with technology that exists today. I think the research into static analysis holds a lot of promise. The idea of static analysis is to catch problems in the application before it ever runs. I think there is a promise in bringing ideas from static analysis and syntax completion together. I also think the shift towards more functionaly programming has promise as well. A pure function is deterministic, and that makes it easier to understand for both people and humans.
Do you have any thoughts? I’d like to encourage discussion about this. What has made software development complex for you? How do you manage that complexity, and how do you think that complexity can be reduced without reducing capability?