When are we going to stop writing code?
plsadventures.blogspot.com
plsadventures.blogspot.com
Well, we'd have to write that specification in some sort of consistent formal language. What kind of computer program converts a program specified in formal language into an executable program? Oh, right--a compiler.
The most generous I can get here is to suppose he's advocating a declarative high-level programming language. But that wouldn't be nearly as interesting to write an essay about, so let's pretend that your declarative, high-level "specification" language means "no more writing code". Either that, or he honestly believes you can write a compiler for English. But given how most specs are written, I would be even more fearful of the output of an English compiler. So you have to use a formally specified language--oh wait, that's coding again.
Also, I think you're jumping way back into coder-world by talking about declarative high level languages. Sure, that might be one way of achieving the stated goals (and indeed, many have gone down that path!) however specifications can come in many shapes and sizes. The idea is to reduce the number of abstractions which the programmer must hold in his or her head in order to write programs. The ability to construct ambiguous, incomplete specifications that can be interacted with or validated before anything resembling an executable specification comes about is beneficial in many circumstances, particularly when you are talking about concurrent or distributed systems.
Basically what I'm saying is that a specification provides only some of the information required to construct an executable program, and may abstract away specific behavioural information until much later into some refinement process. A "program", as such, does not, and by its nature contains a description of exactly all the behaviour that can be exhibited by execution of said program.
Not really--"specifications" are usually understood to be expressed in declarative English, and any sort of "specification" that can be programatically translated into a program would simply be high level source code.
I'm not against writing specs, I'm simply saying "a spec that can be compiled is code".
And I'm not sure that I'm aware of any production-grade systems that use declarative English as a specification mechanism. Most of the systems that I am familiar with use ASCII-friendly logic notation or mathematical notation in the style of LaTeX or similar.
I'm not necessarily suggesting that this is how software should be developed, rather I'm just pointing out that your experience and knowledge of what might pass as a specification is different to mine.
Useful things to say include "here's a good high-level language that makes it easier to program" or "here's a language and a compiler for it that allows the compiler to ask intelligent questions about ambiguity in the code". "I want to be able to push a button and turn a specification into a program" is too vague to be useful--interpreted literally it already describes the compilers we have today, and interpreted liberally it could mean anything from "languages aren't high level enough" to "programming is too hard" to "I want to express programs with pretty pictures and by answering questionnaires" to "I want to compile English". Now, if we rule out "I want to compile English" as a very bad and stupid idea, we're left with things that, quite frankly, we've been researching the whole time (with the possible exception of compilers that question ambiguous expressions). Forcing us to ultimately conclude, first that the author doesn't know what he's talking about, and second that he isn't asking for anything more than what computer scientists are already working on.
A specification is to a program as a building plan is to a house.
I spend less effort on drawing the plan that I do into the house, although I wouldn't put anything into the plan that I don't want to end up in the house that will (eventually) be built.
Similarly, once the house is built, I can verify (presumably using a tape measure) that my house implements my building plans. But I can't live inside a blueprint.
So, while this is not a formal definition, I think a good (informal) means of distinguishing a specification from a program is that if the specification could be substituted for the program it is specifying, then it's probably not a specification in any useful sense. This is to negate the usual argument that "my poorly-hacked C code is the specification for my program".
The "push a button" argument is a bit of a red herring. "Pushing a button" is a convenient metaphor for "perform some low-effort, largely-mechanised process". If your complaint is that it's an over-simplification, perhaps it is worth thinking about what the intention of the article was. It's not a work of serious theoretical value - it's simply advocating an ideological position to an audience of programmers who don't already know about specification and think that it's a good idea.
It seems to me that a formal spec need only provide a method of verification and is therefor distinct from the solution, though it's no surprise that the distinction goes unnoticed in our industry, given the dearth of both specs and difficult algorithmic problems.
My point, which you don't seem to be contradicting, is that a formal specification of a problem is not the same as a solution. They just seem the same because real world programming problems tend to have obvious solutions, or at least solutions that don't feel much like programming.
It seems like there should be a way for things to "connect" themselves. Eh, just thinking aloud I guess.
Knowing how to express an idea in code is easy. It's easier as languages get more high-level but it's easy enough now. But knowing what ideas to express, and having ideas that are consistent enough, have the right tonality and the right balance and the right leanness to express, is the difficult part. Playing piano is about knowing what keys to hit, not how to hit the keys. Same with programming. If your fingers are too short, slow, and fat to play the piano, play trumpet. If the incidental parts of one programming language are difficult or useless to you, use another.
YouTube and Digg simplified distribution, not creation. Distributing software is no more difficult than distributing anything else. What you're talking about isn't analogous to allowing non-celebrities to create music, what you're talking about is allowing people who don't know how to sing, play an instrument, or compose a song to create music.
I've looked over your business's website. It seems like you have a good idea and a useful target market, but the web implementation is questionable, and there's nothing stopping someone from taking your same basic idea, executing it better, and eating your lunch.
"Middle men" are usually doing something of value otherwise there wouldn't be a need for them, and they wouldn't be around.
It's not because of a conspiracy that programmers are needed. You could use a "point and click type program", but they just don't work that well. And programming via a visual tool instead of writing code by tapping on a keyboard doesn't change the fact that you are programming.
from the article:
> Compilers, on the other hand, are generally very good. I have a high degree of confidence in most of the compilers I use. Sure, there are occasional bugs, but as long as you're not doing safety-critical development, most compilers are perfectly acceptable.
Which is the same reason that we use Rails, Django, or Cake, etc. We're not doing safety critical development, we're writing CMSes and blogs. This isn't rocket science, but it is code someone will pay for. So why not do it in the most comfortable and convenient way currently possible?
It's not necessary for the carpenter to be an expert on the design and manufacture of power tools. Knowing the tools they use, however, will improve the quality of their work.
Similarly, the quality of my work as a programmer will improve as I grow into my tools, knowing their uses and imperfections. It is not necessary for me to be constantly focused on how imperfect they are and how I should be building better tools instead of using the ones I have. Along the lines of kenshi's comment: why are people upset that I am enjoying myself and taking pride in my work? I recognize the limits of my tools and I am comfortable with their being limited.
He mentioned this idea to his boss (famed comics artist Jim Lee) who apparently just said: "Why? Drawing is fun,".
And to this idea of automatically generating code from some formal spec, I can't help but think: "Why? Programming is fun,"
Sure no one likes tedious, rote programming. I especially don't like the kind of tedious typing statically typed languages tend to require you to write. But if you aren't finding the art of programming fun... I think you are in the wrong line of work.
For any interested parties, the interview with Nguyen was from episode 91 of the Sidebar podcasts - http://www.sidebarnation.com/
Not to mention that I am likely to make mistakes while I'm typing up my solution. I'd rather not have to waste time chasing errors I've made that could have been avoided. Instead, I would rather spend time fixing errors in my solutions to problems, or looking for even better solutions.
Talk about stupid ideas. This illusion has been out there for a while and infects non programmers. I am almost tempted to post a "don't feed the troll" ascii art pciture
The question remains, though: what do we do about it?
We didn't replace our horse and buggy with a car, we put some Tri-Flow on the bearings and meth in the feed bag and called it a day.
You tell the computer what you want it to do. The computer does it. You can tell it at as high or low a level as you want (within reason). The computer requires a precise formulation of what you want it to do before it can do anything. Can you see a way out of this?
If anyone seriously thinks that traditional procedural languages (even the more concise ones ones like Python and Ruby) are going to scale for another fifty years, they're on glue. We can't go on like this.
Sometimes they are called operating systems: if you want to tell the computer "play chess with me" it's a simple matter of opening a chess program.