you.would? like(:fries).with(that)
January 27th, 2010
I was recently linked to an insightful article about how software is hard. He makes several good points, but the one that sticks out most in my mind is the following:
Every software engineer has a low opinion of the way we develop software. Even the term “software engineering,” Rosenberg writes, is a statement of hope, not fact. He quotes the 1968 NATO Software Engineering Conference that coined the term: “We undoubtedly produce software by backward techniques.” “We build systems like the Wright brothers built airplanes–build the whole thing, push it off the cliff, let it crash, and start over again.” Certainly statements that could still be made forty years later.
That is so true, especially when it comes to the programming languages we use. Most of the languages with widespread use in industry today are essentially thirty years old, and even those are just the latest in a long lineage that leads back to FORTRAN and Lisp in the late sixties. Languages in today’s generation don’t do anything for you that their ancestors didn’t do forty years ago.
What’s worse is that more modern languages exist–they have existed for decades–yet they don’t find mainstream adoption. For the last twenty years the main thrust of innovation in the software industry has been focused on people and process rather than languages and tools. Modern languages are dismissed as academic, and industry experts are struggling to find new and better ways to build useful systems with ancient technology.
We are rapidly approaching a singularity after which the descendants of FORTRAN and Lisp will be grossly inadequate for writing programs. The current rise of concurrent programming is just the beginning. As time plods on and concurrency and distributed programming become more commonplace, we are going to have to develop new ways of writing software.
This really isn’t news. Software is hard. Concurrent software is harder. We know that. The solutions offered today are primitive, and not much different from the thinking over thirty years ago. Whether you use some shared-memory model or some message-passing model, writing concurrent programs is a mentally exhausting process with a lot of work centered around getting the parallelism right.
Another problem we face is the increasing ubiquity of software. In the modern, Western world it is nearly impossible to take ten steps without walking past at least a hundred semiconductors. Many of those little bits of manufactured silicon are running some sort of program (whether it is firm or software). We passed the point in time where our lives are computerized a long time ago, and many people didn’t even notice. Your life relies on software in vehicles, hospitals and banks.
With software becoming so commonplace, the burden to produce quality software is greater than ever. Software verification is a critical area of the development process that has been shit on and forgotten for over forty years. Today’s state of the art in quality assurance is a combination between exploratory testing and developer-written regression suites. In other words, if you don’t think about verification, then none happens at all.
These problems are both huge. We must solve them, and wetware solutions will be woefully inadequate. We need to adopt and develop new languages and tools that directly address these issues. This is the area where we have regressed from forty years ago. Back then programmers quickly grew impatient with wetware solutions and would write software to automate things and introduce abstractions: programming languages, parser and scanner generators, build automation tools, build configuration tools, stream editors, and the list just goes on.
Somewhere in the last forty years, we just gave up. As an industry, we decided that languages and tool-chains were fundamentally solved problems, and all we needed to do was evolve the syntax and libraries. We have eschewed the virtuous path of software development in favor of a naively pragmatic alternative. Rather than working smarter, we try to work faster. Rather than finding smarter people, we just find more people. These days, there’s an alternative to working in food service: programming.
January 27th, 2010 at 7:01 pm
So: You rue the lack of mainstream adoption of more modern languages that break from the FORTRAN/Lisp mold. Which languages in particular would you like to do see more widely used?
January 27th, 2010 at 8:04 pm
Well, to tell you the truth, Fortran/LISP can express anything English can. Now, can you please express to me something that English can’t? Seriously, English has been around for centuries? What have those old folks done to the language? Why don’t we have a more modern English, that express ourselves easier? Oh, yeah, lolcat-English.
The reason we don’t use more “modern” languages is the opposite of what you said. We have way too much stuffs built already, and switching to, says, Haskell would mean such an effort that no one can muster. Oh, talking about which, I am willing to bet that your favorite “modern programming language” is not as expressive as Lisp is (including the case you like Lisp).
Lastly, I don’t understand this: if you want to switch to modern framework (says, COBOL to OCaml), you need A LOT OF WORK, so you need a HUGE work force. You need tens (if not hundreds) of thousands of capable programmers working like dogs to covert all of those finished, tested, tried (over and over) from an “ancient” language to something newer. Why do you complain when we train more programmers? Or, are you afraid of competition?
January 28th, 2010 at 1:27 am
Since the post mentions parallelism, I’m willing to bet that the author likes Erlang.
@magice:
We do have a modern English. We call it English. Our natural languages aren’t stagnated like our computer languages are. Every time someone coins a technical neologism or verbs their nouns, they’re performing language design.
Your idea about hundreds of thousands of programmers porting COBOL code to OCaml is silly. Let the working old code sit and do its job. People could be writing their NEW code in a modern language instead of C++, Java, and their ilk; that’s the point here.
February 2nd, 2010 at 5:14 pm
@Trevor: Every language has some tradeoffs. My biggest two are fault-tolerance primitives a la Erlang, and Hindley-Milner type inferencing a la ML/Haskell. I honestly am most interested in seeing new languages that incorporate these features, as I think that the existing ones have their own issues weighing them down.
@magice: What @sean said. Beyond that, though, just because we have a mountain of stuff built out of shit is no excuse to stop building stuff out of shit. Work smarter.
@sean: Indeed, I like Erlang. Although, I find it a bit cumbersome to develop in.
March 29th, 2010 at 2:49 pm
“This really isn’t news. Software is hard. Concurrent software is harder. We know that. The solutions offered today are primitive, and not much different from the thinking over thirty years ago. Whether you use some shared-memory model or some message-passing model, writing concurrent programs is a mentally exhausting process with a lot of work centered around getting the parallelism right.”
Have you checked Erlang? It makes concurrent programming much simpler.
March 30th, 2010 at 1:34 pm
@prim: Yes, I have looked at Erlang. It’s decent, but it only shifts the complexity around when it comes to concurrent programming. It’s certainly a better approach than threads, but message-passing is still just as primitive a way of dealing with concurrency. Granted, I’m not sure I can think of a better way.