Coding - the new Latin
bbc.co.uk
bbc.co.uk
"Software is what the 21st century is made of. What steel was to the economy of the 20th century, what steel was to the power of the 20th century, what steel was to the politics of the 20th century, software is now. It is the crucial building block, the component out of which everything else is made, and, when I speak of everything else, I mean of course freedom, as well as tyranny, as well as business as usual, as well as spying on everybody for free all the time."
http://www.softwarefreedom.org/events/2011/fosdem/moglen-fos...
My personal lesson from this, is that computer software jobs in general might soon have the hourly pay of PHP coders on elance. (Then the cycle of few people studying computer science will repeat... like ten years ago.)
It's obvious that in some distant point of future programming will cease to be The hot thing to do, but what makes you think it might be soon enough for us to see it?
Take from that what you will about the software industry, but just remember that everyone either gets replaced by someone cheaper or technology takes their job away.
Well I did Latin for 6 years in High School (Sydney Boys fyi). I find this title "Coding - the new Latin" as a bizarre way of inducing people to learn to code.
Latin is dead. Very dead. Back in my day Latin was billed as "The Fastest Growing Language", but that never transpired.
Now if you want to read Caesar, Virgil, Catulus et al, then fine learn Latin. But Latin is no longer the ticket to an elite private members club that it once was.
Latin - is also a language that you exclusively read. There is so little creative element to it. One furthers oneself in Latin by re/interpreting existing works.
Coding - is a creative craft where you take instructions and make something that never existed before.
It would be better to strap coding onto something intensely creative:
Technical Drawing
Metal Work
Fine Art, Sculpture- Obviously it was the language of the Roman Empire;
- It is the basis for many European languages;
- It was the language of Christianity, the Papacy for thousands of years (tying in somewhat historically with the conversion of Constantine). This went so far as Roman Catholic services being held in Latin until IIRC the 1960s;
- Prior to the printing press, books were the province of monks and the like so being educated (in Western Europe) involved speaking Latin;
- In England, Latin was the language of court and the law for centuries. There are many Latin terms--even in American law--for a reason;
- Latin was the language of science. Element names in chemistry, species names in biology and so on have Latin roots;
- For centuries, Latin was the lingua franca of the ruling class of Europe.
The short of it is that being able to speak, read and write Latin in medieval and Renaissance Europe was power. More to the point, if you didn't know Latin, you were essentially excluded from many things (as many people were). Knowing Latin had as much power and influence as literacy in general.
So what the author is saying is the ability "speak" the language of computers, the ability to communicate with them and make them do things, is the 21st century version of the thrall once held by Latin.
Many have spoken about how expensive it was to launch a dot-com company in the 90s and how that cost has essentially decreased by two orders of magnitude in a decade. One might have thought this would make engineers less valuable as our skills would've been commoditized to some degree.
The converse has happened. While other costs have largely vanished, more businesses became possible that never were before. There seems to be an insatiable demand for engineering talent, at least for the short to medium term.
Last century the dream was the 21st century would be about space exploration and an otherwise "Star Trek" like future. Instead I believe the story about the 21st century will be what incredible things we do with computers. Genetic engineering, curing diseases, artificial intelligence, you name it.
This may go so far as to essentially stratify society. It's hard to overstate just how importance computers will be in the next century (IMHO).
"Coding - the new Latin" is a marketing slogan. And if it breeds misunderstanding, or has to be explained, then it's not a good marketing slogan. I design software and write code. My initial reaction to the phrase was "so you're telling people it's hard and they should give up before they get started?" After that, I decided I had to read the article to get the meaning.
Perhaps it's a dead ringer of a slogan in the UK. But it won't get kids a-codin' in my corner of the globe.
I want to avoid getting into any flamewar with someone whose StackOverflow karma is measured in exponents. (I made no point on the importance of training people to program computers, the second theme of your comment.)
What I was saying is that I believe Latin for one hundred years has involved nearly ZERO speaking.
There are some very scholarly latin speakers with an English/Vatican pronunciation divide. But they are the exceptions.
Yes there is Vatican City, but I think we can both agree that it would be best if there are more people who can program computers than the population of the Vatican (832).
Yes Latin isn't spoken, and nothing is created in it today, but that wasn't true hundreds of years ago.
Programming is like Latin 400 years ago.
In this sense, learning Latin or Greek is similar to learning Lisp: sure you'll not use it in your daily life (I know, many will differ on that), but, boy, does it open your mind up.
Unfortunately, these languages are taught by people who are generally English majors, not Linguistics or CS majors and so focus on the literature as opposed to cool grammar. The goal of my two semesters of Greek was just as a prelude to read Plato, so everything was jammed down your throat. I was surprised to learn that our TA, who was writing his PhD dissertation on Ancient Greek drama didn't know how to say "it's raining" or the name of the color green. Think of learning English just to read Shakespeare!
Mathematics - is a creative craft where you take a formal system (a structure purely of the mind) and create something (a new theorem, an addition to the structure) that never existed before.
That is what mathematics is. That is why there are math majors. If it were all rote nonsense, computers would be doing all of it by now; computers are cheaper than people for rote nonsense, after all.
So, to tie this back to the topic, teaching programming correctly would be much easier if we taught mathematics correctly.
As to your last sentence, I completely agree.
Basic computer skills need to be taught. Coding? It should possibly be a required semester in university for all majors. ...beyond that? Does everyone really need to know about recursion?
Some papers on that:
http://www.bogost.com/writing/procedural_literacy.shtml
http://dm.lcc.gatech.edu/~mateas/publications/MateasOTH2005....
http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing0...
Does everyone really need to know about recursion?
Does everyone really need to know the basics of calculus? Or how about genetics? Does everyone really need to know French? I had classes for the above in my high-school. In fact I can't think of any class I took in high-school that isn't useless to a large portion of high-school graduates.And I can't think of many examples that are more useful than grasping the concept of recursion.
One of the most horrifying pieces of Perl I had to work on was written by a biologist who knew just enough Perl to translate certain information from File Format A to File Format B. Or at least, he thought he knew just enough Perl....
A lot of businesses depend on complicated Excel spreadsheets whose authors don’t realize that they are programming.
Yes, and I'd argue indirection as well. If you teach coding without recursion, you're just teaching basic logic coupled with arithmetic, we have classes for that already. (As an aside, I think iteration should be introduced as a special case to recursion.)
Coding (especially for high schoolers) doesn't have to be "sitting in front of a computer alone all day", in fact if this is how it's presented that's totally the wrong approach. That comes in the pro stage. At he early stage you have to stress the creative and social aspects of coding.
Now... how many people in the industrialized world don't spend at least part of their day interacting with programmable devices?
Recursion is taught in gym class through the game of dodgeball. Consider the following C-like pseudocode:
void throw(int *ball, int hits)
{
if (hits < NUMBER_OF_PLAYERS)
throw(ball + angle(), hits + *ball);
else
return;
}
The question then becomes, do people need to learn specific computer languages, or is teaching the underlying concepts in abstract ways enough?I'm sorry to be a jerk, but I found your code pretty tough to decipher. Here's my thought process:
NUMBER_OF_PLAYERS could be, say, 6.
the caller calls: throw(ball, 0);
0 < 6, so throw(ball+angle(), 0+dereference(ball));
So, what is ball? It's either an integer and you're just passing its address around for no particular reason, or it's an integer array and you're using angle() to move around inside the array somehow? Then what exactly is stored in that array, the positions of people? Let's imagine it's 1s and 0s to denote a person or not.After making that leap of logic, your code starts to make sense. You're adding "some amount" to the address, and then whatever is at that address (1 for hit, 0 for nothing) to hits, and passing them into the next invocation, as long as it's less than the necessary number of hits. Could easily be a while loop, but I'll get to that in a minute. I have some other points:
- Ball isn't a great name for the list of the positions of the players.
- It isn't clear that ball is an array.
- There's a pointless 'else return'.
- You never address the "I don't have a ball" situation!
This code requires explanations of arrays, pointers, and addresses before you can talk about recursion. I'd express how to play dodgeball to a new programmer as follows: throw(angle, enemy_positions):
# This function takes an angle and a list of
# the spots where other people are, removing
# them from their spot if it registers a hit.
# Returns true if it's a hit, false if a miss.
find_ball():
# Tries to find a ball; returns the number
# which you found -- 0, 1, or 2.
load_enemy_team():
# Returns a list of the spots where other players are
enemy_positions = load_enemy_team()
players_on_other_team = enemy_positions.length()
ball_count = 0 # all balls start in the middle!
while players_on_other_team > 0:
if ball_count > 0:
angle = get_throw_angle() # user inputs this
hit = throw(angle, team_positions)
if hit:
shout("Yahoo!")
players_on_other_team -= 1 # they're down a guy!
else:
ball_count += find_ball() # reload
That should cover it - though I'm sure there's problems with my code too. :)The biggest point I want to make is that this example is trivially easy to represent without recursion. While recursion can be used in place of any loop, a non-programmer's mind will likely arrive at iteration first for tail-recursive examples. And once someone understands how to solve a problem one way, teaching them a totally different way can be tough.
I personally think people do pretty well at understanding how recursion applies with respect to exploring a maze, which is almost as universal an experience as dodgeball.
From a code maintainability point of view, yes. I would never write code like this for a real application. However, for analogizing the game in code, I have to strongly disagree.
Ball is not a list of players. It is, just as in the game, a pointer to a location in space. Players may or may not occupy that space. If the player does, a hit occurs. The hit test is based on the intersection of the location in space and the occupation of that space.
I chose to represent my code in a C-like manner because it makes that spacial representation easy to write. People are not thinking about the game in terms of lists and objects, that I am sure.
def dodgeball(players, balls)
until players.all? { |p| p.is_hit? }
throw(nearest_ball(balls), nearest_player(players))
end
end
Most people think like this. Dodgeball teaches while loops, not recursion.Latin was funner for me in some ways though since it has a pattern-matching or puzzle-solving feel to it at times with all the word endings and no reliance on word order. I don't think it's as neat as Arabic but it's a somewhat similar feeling. I agree that overselling things as fun is a great way to kill any fun that might have existed.
Programming is fun if it's taught well, which is why it must always be taught poorly, if at all. After all, education and play are two mutually-exclusive concepts for humans, like they are for all somewhat-intelligent mammals.
Of course, I am highly involved in computer science, so its effect on me is disproportionate. However, I think that everyone would benefit from at least a cursory understanding of the big ideas behind CS, particularly abstraction. If I had to choose one, single concept that has affected me more than any other it would be abstraction. Apart from this, the highly logical programming mindset is also healthy. Some of the discipline that comes from writing your ideas in a form even a computer can understand is invaluable.
Additionally, programming is a creative endeavor with a very low barrier to entry: this is imperative for certain types of people. In my arrogance, I view myself as a relatively creative individual; however, I am also fairly lazy. I do not think I would have pursued engineering or art nearly to the extent I did programming (I was exposed to all three at relatively early ages) simply because they required so much more. To build something, I would need materials, tools and space; the same is naturally true of drawing a picture. To program all I needed was a computer, and since they were common by the time I was in elementary school, this was not an issue. This allowed me to make cool stuff without going out of my way.
Computer science really is something that opens the mind. I fervently believe it should stand with subjects like math and literature, not just for practical reasons but because it is immensely valuable for personal development.
But lately, I am gaining some appreciation for the detail-focused mindset. It's just two ways to look at things.
Sure, there are some hard concepts in coding, but for loops and conditional statements are hardly more difficult to understand than a lot of the math which gets taught in junior high.
Speaking of that, why is it essential for young people to learn algebra but not to learn for and if?
-numeracy: how much is 1 million/1 billion/1 trillion, etc.
-common cognitive biases.
-logical fallacies.
-basic science.
-basic coding.
-De Bono's 6 thinking hats.
-how the brain works.
-meditation (ie not thinking).
-how to learn stuff faster and better.
-how to remember stuff: memory palace and the like.
-etc
I could think up a HUGE list of stuff in this genre that would be very helpful.
The 12 or so hours I spent in those lectures were among the most valuable hours I invested in anything, ever.
There is still, to this day, a large number of people who think education needs to be repetitive rote drill in order to be... real, or legitimate, or even 'useful' by some warped definition of that concept.
It's tied into the notion of hazing, or "If I had to waste my years in school tied to a desk memorizing stuff I don't use, so should you! Builds character!"
And, finally, the idea that if the next generation does it, too, maybe your time doing it wasn't simply wasted.
That way they get a good notion of what programming actually is.
I'm only now getting into functional programming. I would not have grokked it very well when I was like 12 years old.
I think the problem is that people are /used/ to imperative programs, and aren't given real practice in functional programming.
There are also FP zealots, some of whom maintain that learning IP first causes damage. I think this attitude is toxic and doesn't actually help their "cause" (as if good tools needed a "cause" -- good tools should just be good tools).
Real-world computer programs exist in a large set of arbitrary, often unintuitive rules that are both absolute and malleable, and change between languages and platforms. They have complicated requirements that seek to solve real-world problems that are often ill-defined. They have to cope with unexpected input, hostile input. They are large, comprising hundreds, thousands, even millions of lines of code. They have a multitude of paths that a given piece of input might take, they display emergence.
Coding is not just a simple math problem. It requires clear, detailed reasoning about complex systems operating within arbitrary sets of rules and an unpredictable world.
Related questions might be "Why do people have trouble doing their taxes by hand?" and "Why do people have such a poor understanding of the legal system?". Also, chess.
And, indeed, that's part of the problem. You really can't claim to be teaching anything of value if all you teach is programming-language syntax. One has to teach people to write some kind of actual program. And that's like teaching prose writing, except that schools and teachers have spent literally thousands of years learning to teach prose writing whereas programming was invented in living memory.
That does also require having free time. There's a trend lately towards assuming that any free time students have is wasted time in which they could be learning instead of goofing off, which I'm not sure is the right way to look at it.
Fun story: The first time I was truly speechless in CS in high school was when my teacher, looking at my code, told me that, for a boolean variable foo, it's not necessary or reasonable to write
IF foo = TRUE THEN // whatever; "=" is comparison in Pascal BTW
but rather you can just write IF foo THEN // whatever
It seems trivial, even stupid now, but at the time it was an eye-opener.Using LOGO in Primary School was far better.
The reason I don't think CS is being widely adopted is because many students have been conditioned to accept ICT as a good computer course and have no clue as to what you can achieve with proper training and a computer. My classmates aren't interested in CS because they think it's way to difficult and has no tangible effect on society. On top of that, both of my previous ICT teachers had no clue how to program: those days were spent editing movies and making animations in Flash.
Glad to see the powers that be finally take some initiative to solve this problem...
To echo number of the other comments here (and try and respond to some of the criticisms of those comments):
I think that's a terrible slogan.
The point of a slogan is to be immediate - something appealing that gets the point across in a catchy and unambiguous fashion.
I think that the associations (and slogans are about associations) Latin has for most people is a language that is presently irrelevant and of no practical purpose.
It may have once been really significant, and it may have played an important role in the world becoming what it is today, but such details are not the things that the term "Latin" immediately invokes for most people, and what it immediately invokes is what matters for a slogan.
Being a great analogy does not make it a great slogan.