The End of Coding
alexn.id.au
alexn.id.au
I'm not an expert in "human" coding or AI, but I get the same vibe from both of them -- until you try it yourself, it seems pretty reasonable that someone will solve this problem fairly soon. And it has seemed that way for many years now.
Simple CRUD apps can already be built with simple, friendly interfaces. The simple apps will continue to get easier for non-programmers to assemble without "coding".
But real life requirements get comlicated soon -- your simple CRUD app now needs to auto-charge customers every time they foo 100 bars, unless it's been less than a month (in which case you charge a prorated total at month end), and early subscribers are grandfathered in to a simple fixed monthly charge. How will you click-and-drag that? Or explain it clearly in natural language, without multiple possible interpretations?
People make complicated stuff in Excel spreadsheets, and while it starts off as fairly vanilla, it quickly becomes something as complicated (if not more so) than writing a standard computer program in code.
Natural language serves a purpose -- mostly around navigating complicated social situations, including expressing general desires to others (who have motivations of their own, and will interpret according to their own internal rules). It's fuzzy and generally non-specific because that's how we are.
Why do we imagine our normal ways of interacting with each other can be applied to instructing a process to execute complex & strict logic?
I'm pretty sure we can make progress -- clean up the leakiest abstractions from software to APIs to hardware... -- and sort out the best way to build coding languages so they are as intuitive as possible for humans -- but I don't think "code" generally is going to disappear anytime soon.
We as programmers have weird brains, compared to most of the population. You give a programmer the list of road rules, and they will probably immediately identify, instinctively, several rules that are mutually exclusive / in conflict with each other. You're able to understand how a home entertainment system needs to be set up, even though that's really not what most programmers do. You identify loopholes in legal frameworks / contracts, because the lawyers that wrote them aren't used to thinking about what has to happen for edge cases.
To talk down the scope of lots of projects, I've always educated a client by saying if certain types of thinking were automated then we'd have to say we were creating AI and that the cost of the project would grow exponentially.
The lawyers do understand, and did it on purpose. Programmers just think similarly enough to lawyers that they can sometimes find things that were meant to be hidden from the general public (and from the junior lawyers who work for the competition). :)
Fred Brooks, author of The Mythical Man-Month, dismissed the idea in his 1986 paper No Silver Bullet:
"... building software will always be hard. There is no silver bullet."
Of course, they had to write in a minimal, highly structured pseudo-English. And the problem domain was highly restricted. So it was basically programming, except less effective.
A fine example of the phenomenon that if enough people want something, somebody will come along and sell it to them, whether or not it actually works. I used to think this was malice, but as far as I can tell, greed, narcissism, and the Dunning-Kruger effect can explain it perfectly well.
Then I explained, the hard part of laying out webpages is not the basic layout -- it's how layout reflows when text overflows, when the browser window is too narrow, when image sizes change, what things maintain alignment and what things don't -- and that by the time you've added all these options to your visual tool, the visual tool is now equally complicated as CSS, so you've defeated the whole purpose.
At its heart, it's the fact that the specification of the program is the program. The devil is always in the details. (Which, incidentally, is why it's so hard to estimate development time accurately.)
It's a small step. I can easily imagine bigger ones.
The particular app in question has been tried a million times and countless hours have been invested into it, perhaps learning from that body of work would be helpful? But hey, maybe that guy is The One who will come out of nowhere and solve the problem in a completely new manner (half-serious - it's technically possible, but I don't think it's useful to put our eggs in that basket).
General rule of thumb, if your friend wants to achieve something, help them do it. Don't sit there telling them why they're going to fail. It almost doesn't matter what it is. They want to start a business, be a brain surgeon, jump the grand canyon on a motorcycle, whatever, believe in them and help them succeed. If you don't believe in them, what kind of friend are you really?
I do believe that there is an amazing HTML/CSS design tool waiting to be created. I don't know what it is, and I don't know if that guy would have been the one to create it, but I love to see people try. He probably would have learned a lot even if he failed.
That negative attitude just really gets my goat in real life. There's one guy at work on whom I can count to shit all over any idea I bring him. There's another guy who always gets excited about trying new things. Guess which one I would happily give a recommendation, and which one I wouldn't care if he fell out a third story window?
His friend would have made a lot of personal progress in their understanding and abilities.
Error establishing a database connection
Maybe the OP should hire a coder to fix his site?
If you try taking some well-written code and converting it to natural language with utterly no ambiguity, you'll quickly find that:
- the natural language version is far, far longer and harder to read - it takes a lot of work to remove all ambiguities, and you will find yourself wanting to put a dictionary with strict rules and extensions -- totally unlike a REAL dictionary.
=> Word "allow" will always mean generally the 1st (verb) definition in Mirriam-Webster online, and will further imply that if the subsequent test (see below for definition) succeeds (definition below), then execution (see below) will continue; if the test fails (see below) then standard error (see below) handling procedure (see below) will be followed, in which...
It's ridiculous, isn't it?
You'd be inventing a new (but probably horrible) coding language, not using natural language at all any more.
The thing about natural language code -- it does exist, sort of. Think about the checklists that airline pilots run through before takeoff, for a good example.
That's sort of natural language process execution... but it's the same every time, the context is known (it's being executed by an airline pilot sitting in the cockpit of a specific airplane), the pilot is trained such that s/he has practiced running the checklist many, many times before doing it "for real". And: it's a friggin' checklist. Is logic in there whatsoever, beyond "if this is true, continue; if not, abort"?
The limitations on it are incredible, and we still have human beings executing that "code"; they are not automated. The answer to one of the questions might unexpectedly be "sort of", or "yes, value in the safe range, but why is it steadily dropping?"
(the second sentence is a joke.)
I think this has been on HN already: http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/why_undef.ht...
Essentially it has to be that way, or on some architectures every access to a potentially shared variable would have to be wrapped in fences by the compiler.
It strikes me that the real difficulty is drawing a line between which tasks should be left to technical professionals and which should be within reach of the layman?
This is much easier to define in the case of mechanical devices which tend to be fairly fixed function rather than computers which are applicable in an almost infinite number of tasks.
For example , you wouldn't expect a car driver to be able to modify their own vehicle, but you would expect a lay computer user to be able to do tasks such as changing their wallpaper or installing software on their computer. I wonder if this is partly what is driving the popularity of computer hardware with artificially imposed constraints? Is it simply easier to understand when you use separate devices for reading books and playing games?
It also begs the question over whether simply changing the means with which to do something changes the nature of the task. For example is somebody designing a complex logical system not "programming" because they are doing it inside of a spreadsheet program instead of an IDE?
But to your last point: I chose the word "coding" so as to refer specifically to the linear textual formal representation we use today. People will keep designing complex logical systems - indeed, I hope more people will become more capable of doing so, and I think better tools will help.
edit: Here's an example - I recently got done teaching a data basics class, and inevitably, my students ran into the problem of data typing in Excel...you type in something like "9/14" into a field, and it treats it like a date, and moreover, displays it as "Sep-14". But when you try to concatenate the field, or perform some other kind of operation on it that is not date-related, Excel treats it as an integer (number of days since 1904, or something like that).
So Microsoft has arguably done something user-friendly here...virtually anyone who types in '9/14' probably means September 14, 2013. However, this isn't always the case, and if it isn't, you have to know how to format columns in Excel as text. Moreover, the operations upon date types are not at all intuitive. If you've done a minimal level of programming, you get the idea of data types, including dates and strings. Let's pretend Microsoft comes up with a way to perfectly guess what you mean when you've typed in a value...is it possible this will eliminate the need for the average user to have an understanding of data types in order to do non-trivial work?
If you want to do a fun experiment, try and watch the pain in two subjects faces. One who has never used predictive text trying to use it for the first time, and one who has used it for years and is trying to use an old phone without it. Now imagine a scenario where every predictive text implementation had tailored itself to the user.
On the other hand when you're trying to do some specific task you already know in most cases exactly what you want to happen, so if it does something else then that is very frustrating.
OTOH when we have smaller and more focused collections of information such as programming documentation or catalogues of similar products we tend to find it easier to navigate with categorical listings or simpler search algorithms.
This seems like a simple task. Get all the ingredients and put them together. This is simple to explain to human because they can make choices on their own and generally understand how a food is constructed. But when are are trying to teach a robot how to make a sandwich you have to exaplain every little detail because it doesn't understand that bread comes in a plastic bag or how to open it, or where the fridge is, or not make the sandwich on the floor.
Everyone in the class got the question wrong because they were all missing details.
I believe that code is going to be around for a very long time because it is currently the only way to truely express 'exactly' what you mean.
Code is remarkably universal. The article claims spreadsheets are an example of a post-coding tool, but they, and his other examples, really aren't. Notably, "visual programming" has been a failure. I expect the end of coding to be presaged by things that break the linear symbolic language model. There are no such successful things.
Though I agree, they were my gateway drug to programming.
There's still a non-zero chance that this one come true. It does not fit well within the others.
Best joke of the year.
We may be able to build tools that reduce the burden but making a computer debug itself without either re-stating the expected outcomes and/or understanding the "intent" of the running code seems pretty much out of reach by definition.
Now, million of software developers are working on the same problems at the same time, they are asking the same question and following the same Q&A path in sites like SO. There is a lot of space for automation.
Regarding new tools for ending coding, nobody came up with a solution yet and there are a lot of smart people who are/were thinking about it. Surely it will be a breakthrough but it will work for solving domain specific problems. It's impossible to solve it for the "general coding problem".
And I should point out that coding will never fully become unnecessary. Of course many of the repetitive parts of coding can be automated, but with all kinds of new ideas and unknown technologies that the future has in store for us, custom code will almost certainly always be required.
BTW: I know you're probably trying to collect emails of interested parties with your "get notified" form but you may wish to consider a direct "Add to Google Calendar" link or button. Here's an example of how to create such a link:
http://www.google.com/calendar/event?action=TEMPLATE&text=Lo...
If HN supported proper linking it wouldn't look so ugly :)
By "outdated", I was referring to the product description(s).
Nice idea for the Google Calendar! Is that a fairly common thing? I can't recall seeing it anywhere else, but it could just be the bubble I'm in.
Beginning about 1995, Borland's Delphi (now CodeGear / Embarcadero) seemed to me to have a pretty nice IDE for making GUIs on Microsoft Windows.
Any opinions on Delphi or information on anything similar for Linux or Mac?
About "GUI builders were crap. GUI builders are still crap": that's just BS. Not usable by non-programmers? Of course. But that hand-wavy dismissal is terribly lazy. Identifying what's exactly wrong and specially how to improve is the difficult part.
On the other hand, maybe the answer is learning logic ... nay, code.
[1] The one currently on my mind is the web publisher part of Microsoft Access from about 2000. Certainly not today's state-of-the-art, but representative of the typical tool.
I wrote about this when Visual Studio LightSwitch promised "CODING OPTIONAL" (verbatim, from the installation splash screen):
http://cvmountain.com/2011/10/programming-without-coding/
An excerpt from my 2011 post -
The dream endures, but why?
One reason could be a lack of trust.
Successful software needs constant maintenance. As a software product becomes harder and more costly to maintain (as most do) the boss who doesn't quite trust his team will be tempted to look for alternatives that appear more trustworthy.
This basic lack of trust becomes a self-fulfilling prophecy as communication breaks down and the team and the boss begin to work in opposition. The boss is now a prime target for being sold the idea that software development can be very nearly automated. It’s not a logical process, it’s an emotional one.
In other cases the boss simply lacks the necessary understanding. They might think that programming is actually an unskilled or semi-skilled profession, where the programmer simply memorises a quirky list of words and symbols and then types them in according to a specification written by someone in marketing.
All this raises the question of what it means to program a computer.
As the author states, the idea of abstracting away the complexity of creating user interfaces isn't new, but I think it's wrong to think we could one day create tools that lets you do that without having to write code and still keep all the flexibility of going sufficiently low-level. An application platform usually gives you low-level building blocks (e.g. Core Animation) and higher-level ones (e.g. UIControl and family). You can construct visual tools to manipulate the latter, but you can't do the same with the former, since they're much more than just position and parameters. Reducing this difference in complexity by blaming it on the tools is misguided IMHO.
There an inherent complexity in coding that isn't its weakness but rather it's advantage. You can't abstract away coding just like you can't abstract away human language or writing. Could you substitute an essay with a very detailed painting?
What's wrong with "right-click -> open component in editor"?
I'd also like to add that a lot of people think "coding" means "typing" and their idea of the ultimate abstraction involves a lot of drag & drop. That would be just fine for starting the development of an app but would get really annoying really fast as you start to add more features and functionality.
At the very least give us the option to perform every single task with the keyboard in an efficient manner.
Honestly, I think it's a bad idea. Programming skills turn over too quickly. If people in my age bracket had learned computer programming in middle school or high school, they would have been dragged through one sort of BASIC or another and then promptly forgotten about it. Which is probably better than them remembering it and being frustrated that nothing would let them use those skills.
If they were to learn something technical, I'd much rather it be a simple robotics class. A little bit of programming, a little bit of electronics, a little bit of Mech E, and a lot of problem-solving, self-teaching, and making of things that work. Those are skills that last, as does the attitude that they can figure things out if they want.
But even when the day of having to do very minimal physical coding to direct computers arrives, I think there are still many benefits for the majority of people to learning this crude and dated form of coding. Perhaps not necessarily to become programmers, but to at least have some understanding of the guts of machines that power society.
In fact, I think the further removed we get from the physical code in directing machines, the stronger the imperative we have to expect future generations to understand not just what something is, but how and why it works.
Nowadays, most of the population has an immensely capable camera in their pocket. I foresee that something similar will happen with programming. Most people will be able to command their computer and teach them to do new things, without having to know the first thing about how they actually work.
There will still be people that fiddle with data structures and pathfinding algorithms, but they will be doing it for research purposes or because they need a highly specialised application.
For example, there's this popular interview that Louis C.K did on Conan, where he said "Everything's awesome, and nobody's happy". Sure, most of that frustration can be attributed to the human condition, but ignorance also plays a big role. If people knew (and I don't) how planes actually worked (at at basic level, of course), it's harder to get frustrated about spotty Wifi.
The problem is the definition of programming. And the fact that people are afraid they won't be considered a 'real' programmer if they don't write cryptic code.
I believe that right around the time that programmers start to figure that out, general AIs will come out about 1.5 times as smart as the smartest human, and at that point ordinary human's childish perspectives and problems won't be very relevant.
Ok go make video editing package without any of ths "coding" nonsense and then explain it to us childish programmers. :)
No but seriously I don't think there is a lot here ...
Until a computer can program itself (which may never happen), there's going to be a person telling it what to do - and no matter whether it's a formula in a spreadsheet, a programming language, or something higher level, it'll still be code...
These posts beside some hand waving never actually attack the meat of the issue, don't predict the demise of something unless you know what is going to kill it.
Each of these tools creates a 'function' in some way or another. The main problem I see is that it is too hard to make a function in a spreadsheet, combine it with a function made in a data-flow graph editor, and all tied together with a function made in a text coding language.
We need to make the publishing and consumption of 'functions' easier. I've started the work on the underlying framework. Please stay tuned!
I can type faster than I can search for the right button in Photoshop. Ask anyone who lives in their terminal - it will increase (rather than decrease) your productivity and agility. This isn't because the gui isn't well made.
I think a better prediction is, writing code and building constructs will be easier. Cognitive overhead will be reduced. That's the design problem - not coding.
Why then so many people find it strange that to write a program you must.. program.
The end of the world is nigh. etc.
But something like, 'give me the set of all things that....'
(let ((set1 (remove-if #'(lambda (x) (not (things that....))) from-lst))) 'BODY)
How'd you do that in Excel? Probably something like SUMIF - (I don't really use Excel much so I don't know if there's something that returns a list of things matching a predicate.)
Yes, doubtless that can be expressed more concisely than the code. Heck you could wrap that up and just call it fetchset and have it go.
(set1 (fetchset (things-that) from-lst))
But there you're putting more load on the person learning the arcana of certain macros or functions - and it's honestly not that much more concise in terms of headspace, you still have to think about sets for it to make any sense at all. It's not clear how that would translate into a visual interface of any significant power or how doing so would simplify the concepts that one would have to learn.
You know? Will programming get more efficient? Count on it. Will we automate tasks that are just following a pattern? Yeah. But will we stop coding?
Well, if you think about coding as being typing, then maybe we will. I don't think that visual interfaces are efficient enough to let you stick together all the concepts you need in a reasonable space of time without actually typing - but it's possible.
But will we stop thinking computationally? (Which is the real essence of coding I feel.) I don't think so. It seems to me that you have to know what you want a computer to do, or you have to have the computer guess at it. And the problem with guessing at it, other than the computer being wrong, is that if you're not a precise thinker; if don't know fairly precisely what you want to do; then you can't even mean certain things. Assuming quicksort hasn't been invented yet, how do you tell the computer that you want quicksort if it's guessing, what cues does the computer take from a general expression that you want a faster kind of sort?
Now whether that will reduce coding to mathematics I don't know. I'd tend to think not, if for no better reason than that programming includes a kind of coevolutionary mastery that can be a more fitting route for some people into thinking about things like transformations and sets and so on. I'm deeply indebted to programming for helping me think about maths in a way other than my teacher just reading black-box formula at the class.