Why programming isn't for everyone
Today I learned about HyperCard, a system where you could implement a basic
calculator in a few easy steps, one of them involving the following impressively English-like snippet:
on mouseUp
get name of me
put the value of the last word of it after card field "lcd"
end mouseUp
The article depicts HyperCard as a system making programming accessible to people who aren't professional developers. It is
claimed that Apple likely killed off the product because it's inconsistent with its business model (roughly, devices bought to
consume rather than to create).
I sympathize with the sentiment β I very much like stuff you can tinker with, and dislike business models discouraging
tinkering. However, I don't think businesses have the power to prevent anything that works well for many people from happening.
A conspiracy of typewriter manufacturers could never stop the PC.
This seems especially true with software, where huge systems can be built by volunteers in their spare time. If an idea
works, if a software system wants to be built around it, it will be built.
Of course it may be the case that the time hasn't come for a programming system for non-developers. It's just my opinion that
it never will come, not really. Why?
Not because you need much education to program. Very useful stuff can be built without knowing why optimal sorting is
O(n*log(n)), or even what big O means.
Not because programming languages must have, or typically have arcane syntax. As a kid, I found Pascal's somewhat
English-like "begin" and "end" off-putting, and was greatly relieved to discover Algolish braces. How close to natural language
syntax can get, and whether it is at all beneficial to go there is IMO an irrelevant question. The fact is that programming
languages can be very readable to people.
The main reason is that development leads to maintenance, and maintenance leads to suffering.
For example, if your program stores persistent data, and you want to change it, your changes to the program must be done such
as to preserve the meaning of existing data. This part of development causes major pain everywhere, from video recording to
financial databases to compiler construction. No amount of knowledge and no amount of support from the tools make this fun.
There are many other things. Everything in your program's environment is unstable and you must constantly update the program
to keep up. Your program gets cluttered with options and you forget what does what. There are cases you didn't test β spaces in
the names, empty data fields, reverse order of operations.
As a result, maintenance means dealing with misbehaving programs that eat data, send trash around, or simply make you wait
for an hour and then watch them produce garbage.
This never ends and quickly stops being fun. When something useful can not be done quickly and isn't the average person's
idea of fun, it becomes the business of professionals β or hardcore hobbyists indistinguishable from professionals. As a
counter-example, many people like cooking in their spare time without necessarily getting close to the level of a chef or
spending that much time cooking. Con Kolivas, on the other hand, could
technically be called a "hobbyist", but he could be called a "professional" as well.
Maybe I'm wrong, maybe there are plenty of places where a sprinkle of logic β in textual form or graphical form or whatever
form β can be figured out quickly, left alone and be useful ever after. It's just that it's usually the opposite with me. Every
time I have a nice little idea it takes me 10x the time it "should" take to implement, and most things keep biting me once in a
while for a long time.
Programming isn't for everyone because it is not fun to maintain what was fun to program.
I've long thought that the real issue is that that isn't English, and
no matter how much you make it look like English it never will be.
Come the day when a programming language looks exactly like English it
will still have the property that the computer will do what it's told
with an attention to detail and reckless disregard for actual intent
that would put any lawyer to shame.
Programming fundamentally requires a level of precision and detail of
thought that most people aren't prepared to deal with.
@Tolomea: I think that programming strong AI, that could guess your
intent or ask you when you're not clear enough, etc. is still gnarly.
Basically instead of programming you now have something like a project
meeting β the AI says, "OK, but what about the old files?" and now you
have to think together, ultimately whatever the AI proposes you must
understand and choose between alternatives. I believe the core
gnarliness lies in inspecting those alternatives. Another way of saying
it is that a part of programming is a sort of "project management", that
software tends to become a "project" requiring some sort of
"management", and this sort of project management isn't for
everyone.
"The main reason is that development leads to maintenance, and
maintenance leads to suffering."
Reflection on the contortions "normal" users go through to achieve
things shows that this statement is bunk.
Tools that bring more power to these users are good things, and
HyperCard was one of those tools. The most common programming tool (used
by non-programmers) is the spreadsheet. Users create immense works that
are an incredible pain to maintain, but they do it because it is the
only choice they know they have. "Fun" doesn't come into the
equation.
Spreadsheets is an interesting borderline example to discuss.
Human languages suffer from a lack of precision. You can tell what I
want to say if I use bad grammar or the wrong case. Even if a computer
is made to understand those imperfections, it seems rather unnecessary.
In my opinion, an English-like syntax such as the one in your example is
actually *less* readable than (non-esoteric) programming language
syntax.
@"This never ends and quickly stops being fun"
Sometimes, but not all code maintenance is tedious. Refactoring a
mess of poorly written unruly code is a bit like cleaning your house; it
seems mostly boring at the time, but once you're done and can look out
and see poorly designed buggy code suddenly become a well crafted bug
free architecture, there's certainly a feeling of enjoyment.
Although on second thought, I'd say the enjoyment factor of fixing a
bug is somewhat close to a ratio of time spent vs code modified. Days
where you spend 4 hours tracking a bug down only to realize that there
was only a single line of code you had to change... those just suck.
@saurabh: I agree as far as my own taste goes; the upshot is that
whatever one's taste, it's possible to make language syntax or some
other sort of command interface fairly understandable to people who
aren't deeply involved with computers.
@PherricOxide: I think that this sort of enjoyment is a
"second-order" thing happening to people who do lots and lots of this
sort of work. You aren't enjoying because that's what you came to do,
but because you've realized the inevitability of what you're doing and
how much worse the alternatives are. I think it's an acquired taste, and
it's only acquired, together with proficiency, through a lot of
experience.
Check this post, this guy is actually working since 10 years on what
he calls "Conversational Interface". http://wesnerm.blogs.com/net_undocumented/2012/01/conversational-interfaces-redux.html
I think you are right that the main problem is maintenance. I don't
think there is a general solution. All you can do is minimize the
maintenance needs by making the simplest program with the simplest IT
stack that will solve the problem.
IMHO this is also the best way to make programming accessible to
approximately everyone. First you assume that they understand their
problem domain and the problem that they want to solve. Then you give
them the simplest possible computer so that they don't have to spend any
more time than necessary learning how to program it.
They will have to learn how to program though (ideally after learning
the basics in school). There is no way around it. English syntax
programming languages and the entire galaxy of related ideas for making
programming look like something other than arranging instructions for a
(more or less) formally defined machine to execute are completely
wrongheaded. To say it is an AI-complete problem is a vague
underspecification: what you would need to do is provide the customer
with an entire automated developer (so you can have the project meeting
type discussions Yossi mentions in comment #2). Not only do you have to
figure out how to do that, but you have to figure out how to do it
cheaper than a meat developer. Then it produces an overly complex
program that is a maintenance nightmare, because it doesn't know as much
about the problem as the customer, the developers ran out of funding
after implementing the programming skills and didn't have time to give
it the best communication skills, and it is motivated to justify its
electricity bill and the enormous amortized cost of its development
rather than being motivated to making the simplest possible program so
you can get back to thinking about real problems in a real domain.
Is it possible to make very complex machines that do not need much
maintenance? Yes; they are called microprocessors. Microprocessors are
expensive, but most applications are not as complex as a microprocessor
and are much easier to do some maintenance on if it's not quite right
the first time. And you don't need expensive fabs for software.
I don't know for sure that anyone could write small applications
without needing to learn what amounts to a second career's worth of
skill given the right K-12 education and a reformed software industry,
but I think it's plausible. Perhaps more plausible are specialized meat
developers who can write simpler programs that don't require so much
maintenance. But maybe you'd have to reform the software industry (and
possibly also K-12 education) just to get that.
And maybe that's all Marxist engineering utopia nonsense. Here's an
alternate theory: People are cheap enough, and software is cheap enough
to copy and distribute, that it's usually business optimal to pay
specialists to talk to the domain experts and then quickly crank out
buggy software to sell to as many people as possible, and in the rare
case when you want software that you can't sell to very many people,
it's still business optimal to pay specialists to talk to the domain
experts and then quickly crank out buggy software because that's what
they know how to do and that's what the system is set up to support
because that's how to make money in the general case. In other words,
there is no business case for getting everyone to program (or for
writing programs that are easy to maintain, most of the time).
"it is motivated to justify its electricity bill and the enormous
amortized cost of its development" β and that's a pretty optimistic
scenario; it could as well try to take over the world, starting with
infecting everything connected to the net with malware while it were at
it :)
Everyone knows that C/C++ programmer gets most thrills from writing
main() function (i.e. writing new code), not from maintaining and
refactoring old code. That's why there are so many open source programs
that cannot get to 1.0 release, but end up being constantly rewritten
from scratch until the developer finishes college (has no more spare
time) or gets bored with it and starts a new project.
The no-fun part of programming (read: maintaining) is not the only
part that keeps some people from writing software. I think there is a
bigger reason: some people simply think in terms less structured and
organised than computer programs. Some people think in ideas and
pictures they have trouble communicating to other people (even when
those other people are attentive and willing to surmise or ask for
clarifications), not to mention cold and strict machines that computer
are. You know the saying: computers work as programmed, not as intended
:-)
I, too, think that the programming language is not the main barrier.
I think the effort needed to describe the problem and specify the needed
result (so one does not get a million possible answers from a computer
and has to dig through them to get the one) may for some people be
greater enough to discourage them from using a computer.
I agree about the programmed vs intended part, I'm just not sure how
bad it is on average. It seems as though a lot of non-programmers "get
it" β see computers for what they are and realize the need to be precise
in their instructions.
I agree writing long-lasting or large programs has the problems you
describe, but do I think there are a lot of use-cases for one-off
scripts that people could write and find interesting/useful, if they
knew only a little bit of programming, in an environment that was
vaguely accessible to them.
When given a suitable environment, even one that is broken in various
ways, people do actually do so: many "non-programmers" in office
settings write reasonably complex Excel macros, because Excel is there,
has a macro language, and the barrier to entry is low enough that you
slip into programming somewhat accidentally, when all you thought you
were doing was editing a spreadsheet. Processing has also been somewhat
successful in getting media artists to consider writing bits of code a
legitimate thing they could do.
@Mark: I think the trouble begins when you start interacting with the
larger environment β exchanging data, networking, that sort of thing.
Scripting inside a reasonably closed environment has more chances to be
"one-off".
To me, in this context, a "non-programmer" is someone who is doing
very little programming β someone who spends much time programming is a
"programmer" whatever his education and skills are. So the question to
me isn't how easy it is for someone without special education to get
into programming but whether they can get out :) β how much
time maintaining those Excel macros is going to cost. It could be that
diving into Excel macros is a net gain in a number of cases reasonably
large to be interesting; I do believe that the majority of MS Office
users do zero scripting, so in this sense Excel definitely isn't a
programming platform "for everyone" nor is programming becoming similar
to literacy either in its utility or in the extent to which it is
widespread through Excel.
Basically all I'm saying is that users will forever be the majority
and programmers will forever be a comparatively tiny minority, no matter
what tools are available. Perhaps a close analogy is what happened with
cars: you could once repair them yourself whereas today many things are
infeasible to repair for the owner, however, even back in the old days
many people would rather not touch their car (I'd be one of
those people for sure...). I think that with time, computers will
similarly become less accessible to people and lamenting the
demise of systems such as HyperCard is a bit like lamenting the demise
of manually repairable cars.
I appreciate the perspective here. But I think things have and are
changing in the world of software. There are always new technologies to
use and upgrades, along with a stronger product focus in software
nowadays, that can be done that when mixed in with maintenance to make
the whole experience fun.
One thing though, your comment "However, I donβt think businesses
have the power to prevent anything that works well for many people from
happening." isn't quite right. Apple is leading the way for others to
stop any such tinkering and their chief weapon is software patents. If
someone can successfully patent the switch and "drag and drop" (I think
Apple calls it slide to unlock), we are in deeeeeep trouble.
Much as I dislike software patents, they don't seem to prevent
tinkering; Apple can prevent people from sliding to unlock, but not from
running a root shell on their Android phone. More generally it seems
that up until now the ability of software patents to stop competition is
limited, though of course it could get worse with time.
Think it is also a mental issue: some people just don't "build"
things generally. Some people do, just don't get the same enjoyment of
"building something" that hackers tend to get out of getting a working
program.
Also, much like some people can't put a Lego car together that
doesn't shatter or break during transport, some people can't really put
the logic behind 1+1 together to make 2 come out reliably. The first
type of people doesn't have the intuition for shape and form that make a
Lego car stay a Lego car instead of reverting to a pile of bricks; the
second doesn't seem to have the intuition that builds a clear mental
model of how a program is supposed to work, how control flows, what
happens when etc. etc. So for them programming is a constant pain of
compiler errors, inexplicable bugs and the program never quite working
reliably.
So even if they did enjoy building things, trying to program tends to
be off putting β too much pain, and no real gain.
I for one don't much enjoy working with the soldering iron: I
perfectly well what the end result should look like, yet somehow after
way too much time it's far too much tin and a few components soldered
the wrong way round. Admittedly I've not done much soldering, but I can
already tell that it isn't going to be my favourite thing in the
world.
Could be a lot like that; the question is how much tools could help.
What if you could get a device that took the gnarly parts out of
soldering β would you do it more often then? What if people got
environments where the gnarly parts are taken out of programming? So
here I think the gnarly parts are basically too much part of what the
whole deal is about.
Yeah but at the core the gnarly parts of soldering (much like
programming) is the issue of doing your best yet still have it come out
all wrong.
If you give me an automagic tool that takes my circuit diagram and
solders it properly (thus removing the gnarly bits), then great, but
what you've just done is handed me a preprogrammed Excel spreadsheet and
told me to fill in "these values over there in those columns, then click
that button β it'll work". It's not the way actual programming or
soldering lies.
There's a sizable number of people who never, ever, will have to
worry about most of the things programmers would consider the "gnarly
bits" because they don't ever reach that stage in their programming
efforts. They've given up or in case of engineering/CS students been
told firmly not to bother with the second year before that point
already.
In fact, this "why can't people program" issue is a fairly
significant area of research in CS departments because, since about the
first CS departments ever sprung into existence, this has ever been a
major obstacle for first year students. First years' first programming
course always comes out with a fairly predictable two hump curve in the
distribution of grades. One is the "can't program" lot, who despite
about 30 to 40 years of research into making programming more accessible
(and hence improve their fate at the first course), still flunk the
course with 2-4 out of 10 points. Then there's the "actually pretty
good" lot who predictably score a sound 7-8 out of 10.
They do that whether the course was Pascal, Java or Scheme to mention
a few popular first course languages, they do that whether to tools
amount to a text editor and an interpreter in a console window, an
industry IDE like Eclipse or NetBeans, or a connect-the-dots "teaching
tool" such as BlueJ.
There's this real, gaping void in understanding between people who
can't program and people who intuitively can. It's not impossible for
someone to make the leap, but you can definitely feel it as you gaze in
utter disbelief when you see someone struggle with things like variable
assignment that are so... simple and obvious?
It's not a benign kind of gap either: it's intimidating. Any time you
want you can re-experience some of that unease about your own code and
about the time and effort it takes to do even the most trivial and
boring of things.
Always been an imperative "destructive update" kinda guy? Learn XSLT.
You'll weep for "proper" variable assignment. PHP the way the world is
supposed to work for you? Then try some Haskell. Spoiled with an
actually helpful tool chain? Try debugging a couple of "move or
conditional jump depends on unitialised variable" or "invalid reads of
size 0" type valgrind errors in a moderately complex C++ program, should
be good fun.
Now about that last example: the point is not that the toolchain is
going to be less than easy on you (due to not actually having a clue
about the real problem either). The point is: you are going to have *no
idea* on how to fix it.
To overcome such obstacles takes a basic attitude and skill that no
tool can ever "do for you".
Looking at that english-like snippet makes my head hurt, would anyone
honestly say it'd be easier to use that syntax? It looks like a mess,
and a mess with nothing but undefined behavior; the uncanny valley of
syntax. We can't even perfect computer-translation, let alone have a
computer act on what it is translating. The day that english-like syntax
will be viable, is the day that books can be scanned into the computer,
and entire games created... until then, it's so much easier just
learning a (thankfully) strict syntax.
Post a comment