Speaking as a non-coder, but as one who did minimal things with programming-like higher-level stuff ranging from the old DOS batch files to VBA and some dabbling with SQL, I am curious whether real engineers believe the idea of broad literacy in coding truly would be valuable and, if so, how exactly.
I am not speaking as a skeptic, just as one who does not readily see the point and wants to know.
Of course, we are in a digital age and there is incredible value in knowing how to code for the person who really masters this skill. And, among those who do master it, you will of course have various gradations in skill level ranging from profound to excellent to good to competent to serviceable, and these in turn will give the bearer of such skills a range of opportunities commensurate with the acquired skill level (and, when I say skill, I don't mean mere technique but also inspiration, insight, imagination, and whatever else it takes not only to pound something out but to do it in ways that stand out).
That said, however, if I were to look, say, at 100 random friends and acquaintances, I would question what good it would do for them to learn a few basics about the syntax of some programming language, to learn a few things about programming objects, and to learn a few things about control structures if the sum total of all those few things is simply to understanding minimal things about how coding works without being able to apply that knowledge effectively to anything in their real-world lives. In my own case in having hacked through some minimal interpretative stuff, I at least had some professional uses for this sort of thing (e.g., using VBA to systematize a few MS Word functions needed in our office). But, even at this level, most of the people around me - being non-programmers - would run in horror from the idea of even getting into that level of trying to interact with a computing environment. For the most part, they were content to know as little as possible about any of the inner workings of a computer and were totally uninterested in delving any deeper. And these are the people who are out there by the millions who have always been drawn to the simplest ways of interacting with their computers (e.g., mouse and not keyboard). In my experience, unless people naturally have a mathematical or engineering "bent," they simply would rather not deal with understanding how something like a computer works beneath the surface but want only to grasp its benefits at the highest level with the least effort possible.
If most people are indeed like that (and I believe they are), how would it benefit them in a practical sense, say, for future educational curricula to mandate taking a prescribed course in learning to code. Even if this sort of thing were required, wouldn't this be just like a prescribed foreign language course in middle school that one has but a fleeting acquaintance with, only to have little or nothing stick beyond getting past the requirement for the purposes of passing a class. What residual value would stick from such fleeing interactions with the rudiments of coding?
It seems to me that, if one is to derive true value from learning to code, one needs to devote a significant level of dedicated hard work toward that effort and, if one fails to get beyond a minimal threshold, the only value gained is that of a very generalized form of knowledge that has little practical use in the real world. And I would suspect that most people really do not want to devote such an effort to this task. A good many do, of course, and, as noted, this does have huge value in our digital age for those that do. But why expect it of most people?
There is nothing wrong, of course, with our political leaders encouraging young people to learn to code and this may inspire some to do so. But coding is not really like, say, writing, where gaining a minimal proficiency leaves one in a much better position than not knowing how to do it at all. It seems that, if most people can't get beyond some minimum threshold to make the endeavor worthwhile, learning to code would not help the great majority of people who are not interested in making the sort of dedicated effort that only a relatively minority will in fact make to justify the effort in practical terms.
That is my layman's view. Do those who really know this stuff agree or is this just some disconnected elitist view of people that doesn't fit with modern understanding? I would genuinely like to know because, to me, it does not seem like a close question. Am I just being prejudiced here?
Just like the "prescribed foreign language course in middle school", a bit of programming practice may widen your horizon, and help demystify these seemingly opaque machines and networks.
It's about practice, not "knowledge" per se. Basic tasks, like: I have a folder full of files, how do I get the filenames into a text file or e-mail? Five-liners in high-level languages, the equivalent of asking for directions in a foreign tongue.
Of course, that idea comes from a time when one would own a universal computer, and own one's own data. You can argue that for many people, the filenames and text files I'm talking about are already a thing of the past, that it's all pinch and swipe, plus cloud storage.
The irony about your very valid benefits of having basic programming knowledge is that music programs, which have been proven to provide benefits in math and language and just general smartyhood, are the first to get their budgets cut in any given budget battle. That said, how many working people have ever had to face the problem of getting a list of filenames into an email?
> That said, how many working people have ever had to face the problem of getting a list of filenames into an email?
Few, because when tasked with a problem that this could solve, most people would immediately throw up their hands and give up. This is the biggest obstacle of all.
"Which pictures are you missing?"
"I don't know, I'm not going to flip through them all!"
edit: I did not know this- I just posted it because it is but one answer. For what it is worth, I agree with you- basic knowledge of programming is something everyone should know.
I have to laugh at this. I worked in strategy consulting, where my coworkers were all MBAs from Harvard, Stanford or, in our office, Tokyo University. We had many cases where people had tasks of various sorts that they would handle with the equivalent of this screenshot-of-the-data approach. I, a fellow consultant, often groaned when I saw such things and wrote little utilities for them, figured out how to dynamically generate PDFs for their presentation data, or whatever.
At one point, the general mgr of our office, said that these things were so valuable to everyone, and I was so good at it and seemed to enjoy it so much, that he was wondering if it wouldn't make more sense for him to take me off of my own consulting cases and make IT projects my only case. Of course, IT people were thought of as lowly support staff for the elite consultants, so it would mean a pay cut and end my consulting career. This wasn't a warning; he was just thinking that this might better serve the needs of the firm.
That day I stopped being a valuable IT resource for my coworkers and reserved my dev skills for my giving myself a "sustainable competitive advantage" in my own work on my own cases.
You should package up your tools and sell it to them on a subscription basis per consultant head. Make sure the total price is at least your gross salary and bake in a minimum subscription period. Quit your job, build all the tools you ever wanted and sell it to all other consultancies and their offices.
The powerpoint extensions I used in consulting were created by ex-consultants so it's not unheard of to do this.
And yeah, that's an option that I've considered it in the past, but never been able to validate it because it'd take me less time to just transcribe it (or I can find a glob pattern from their screenshot, etc.).
A lot of it is also the mental structures you form, so you understand what a computer can and can't do easily instead of thinking it's all magic.
You may not have the specific chops to write a program to do it, but you know that doing something to (x) files is just a loop with a if thingy inside of it.
I think part of the "learn to code" movement is also hope that currently non-tech-literate people will learn to help themselves. Once you've googled "how do I do this in python" and found answers enough times, you (hopefully) gradually replace "All of this computer stuff is confusing! I need someone to help me with it. My cousin is good with computers. I'll call him." with "I got this shit. What up, google."
I would say a general computer knowledge course would serve people better than trying to learn a programming language they'll probably never use, or want to use. Basic IT, networking, security, and simple scripting would probably serve the general public best.
And that's something that can be done in a single line at the terminal in Windows, OS X, or *nix. Learning how to use that effectively before learning how to code would already be a big step.
(Appending this to my own comment as a way of acknowledging the comments made in response to my question)
I stand convinced that, though the majority of people will not be necessarily learn to code in the sense of developing full-fledged programs, there is much to be gained by exposing young people generally to the concepts behind programming and to encourage them to learn these concepts: this will inspire some to make programming their work and it will benefit all by giving them at least a basic working literacy about how the digital world around them actually works.
Thanks to all for your thoughtful and instructive responses. HN is truly a great forum.
I have put a great deal of effort into improving the level of automation that can be performed without writing code, or working with graphical mathematical structures (such as wiring together nodes in a graph, or building a flow chart).
The work done on Logo, a language designed to teach children how to program, has been particularly helpful. In the system I'm developing, everyone is using a "debugger" (without knowing that's what it's called) even in the process of getting onto the system.
A lot of the progress we've made has involved aggressively simplifying the development process into something that's at the level of using a spreadsheet (and just as concrete for the user). For example, if you have to develop an API, you've already excluded most of the people from being able to use your tool. API design is hard and takes a great deal of experience. That's the opposite of what it takes to get productive value from a spreadsheet.
I agree that there's a huge amount of benefit a user can get from being able to automate their own work, and to be able to easily and effectively share that automation with others. Today's scripting languages aren't even close to the "spreadsheet" ideal I think is possible.
For better or worse, our educational system is centered around the idea of exposure to potentially worthless experiences. Everyone knows people who haven't had to think about concepts from trigonometry or algebra 2 since school. Children are required to take music classes, art classes, physed. We don't teach these things because they are practically useful in any way, but because 1 out of every N kids discovers that they are really good at something.
I hated all of the effort wasted in the modern educational system. But when you see a kid's eyes light up when they blow into a recorder for the first time, or see how they respond to praise of their art class drawing, or see their face when they score the winning touchdown, you can see the value and importance. We can't take that away from people. So we study things that might not matter. I don't see any reason why computer programming shouldn't be that list of experiences. There are people in the world who would be rock star hackers if only they'd been given an early opportunity. Even a modest increase in the number of technically literate people can have great benefits to society.
There is a clear trend toward automation. We all know people who wouldn't benefit at all from computer programming experience. But that might not be true in twenty or thirty years. Even lawyers might need to learn more about data structures and server management in the coming decades. The ideal case is that we end up in an automated world in which everyone can pitch in a little programming to make things better. Making some technical knowledge universal might be the first step.
Mankind has been automating since we could automate. The moment there is technology available to automate something we automate it. The invention of wheel was automation. The invention of the cart was automation and so on.
The moment there is knowledge, tools and technology to reduce human effort, we invent newer tools that reduce human effort. Which leads to further knowledge that reduces human effort further and so on.
Programming is a new tool in this never ending endless task that human kind has taken since it could think. Programming enables a device to make decisions, based on some conditions and send those decisions to mechanical devices.
Its hard to predict how this will pan out in the future, if the past is any indication. The future is hard to predict.
I disagree completely that they're potentially worthless experiences geared only for the 1 in N who embrace the subject. The content of the material is in many cases mostly irrelevant - it's the fundamentals behind that content that matters. Claiming that it 'doesn't matter' because you don't actively utilise it in your job later on misses the point entirely. For example:
Maths - teaches logic and critical analysis of problems. No one cares if you don't remember SOHCAHTOA or the like. If you can think about using knowns to resolve an unknown, you've got the main thrust of maths classes as they stand for non-Engineering, non-Science people.
Physical Ed - teaches healthy habits, ideally. No one cares if you remember the rules to field hockey or rugby or learn to run faster. The idea is that you learn/are exposed to healthy exercise habits and (ideally) healthy nutrition/etc. if it includes that too.
Music - teaches quite similar stuff to maths, in fact. No one cares if you can't re-draw the circle of fifths, however understanding the patterns in music and why they exist (e.g.: why you don't tie the 2nd and 3rd beats of the 4/4 time signature) gives you insight in to the mathematical underpinnings of music and lets you appreciate it more to boot. Not to mention playing music engages and assists the brain areas used at maths, problem solving, etc.
Art - You learn to understand and appreciate design better. You learn to appreciate culture. No one cares if you can't remember what primary colours to blend to produce a certain new colour, but understanding the role of shadows for contrast, or vertical lines in e.g.: paintings of architecture, help you appreciate the world around you.
Science - Again like maths, logical intuition and problem solving. e.g.: for physics, no one cares that you can't recite the equations of linear motion, but understanding why something goes up and then falls down, intuitively, is a good way to teach critical analysis of problems.
The second benefit of all of this is that you then also get exposed to this content, which means you get a general introduction to those fields. As you say, it helps bring the fruit to bear whereby people find out they enjoy/have talent in something, but additionally it means that because you sat through music in school you probably at least understand why some songs sound sad (minor scales) and others sound happy (major scales) so you can appreciate it more.
I absolutely agree with you that programming should be in there. Again, it's not about learning how to declare variables in python in particular, but rather about the logical underpinnings of code structure and understanding how that all works. The benefit isn't going to be that 100% of kids can read some javascript dump and work out why the webpage doesn't load properly. It'll be that when they're sitting down in excel and they're trying to assemble that data their boss wants in a particular way, they'll be more capable of logically stepping through each component step of the equations required and understanding exactly how it must be built up to produce the result they're after.
Very nice answer and much appreciated. One additional bit which I only saw lightly touched on is the correlation between breadth of knowledge and general intelligence / creativity. Exposure to a wide range of subjects helps build the mental linkages for students so that they can form the equivalent of mental analogies about new material and solve new problems by reference to solutions in other areas. Coding has a lot of potential in this area, as the fundamental concepts of algorithms and machine logic are broadly applicable to a wide range of subjects. In addition, the solutions you see in programming (barnes hutt trees, steepest decent, network theory, binary search, ect...) are optimized solutions to fundamental questions of how the world works. Once those solutions have been seen in programming, the understanding of the world they communicate can then be taken and applied to comprehend and solve problems in other areas of life.
I think the value of learning to code is learning how to break down complex problems into simpler steps, determining the order in which those steps need to happen, and thinking carefully about your upfront needs to get some the desired, distant result. Coding isn't the only place to learn these skills. For example, working in a commercial kitchen, you might learn these skills quickly: what do I need to do make this dish? What ingredients are each dish's element? What ingredients do I have on hand vs what I need to order? Is everything going to come together in the end, and at the same time?
However, coding is increasingly accessible (~$0) to everyone (all ages/geos) at a massive scale (smartphones/netbooks) and may have practical benefits for some people who choose to go beyond the basic steps. Some might even call it fun.
>>I think the value of learning to code is learning how to break down complex problems into simpler steps
How is that any different than any other branch of engineering? Repairing a car engine requires thinking and application of effort that is the very same as that required in programming/debugging. Same with building a house. Or fixing tube lights.
I see car repair more like hardware repair on a computer. Graphic chip fried, pull out the graphic card, and pout in a new one. Certainly doesn't require the levels of abstraction that I use in my day to day work building / maintaining the database for an organization.
For exactly his last point: it costs nothing to code. You only need time (which you would need to do any other activity). If you make mistakes, you can start over with press of a button. You can do it anywhere, any time and increasingly using any device. Summary: accessibility.
For other people, they still have to buy a computer. Get an internet connection. And I will be very frank with you, programming is not the same as building web pages. Learning stuff like embedded systems(Which actually teaches true programming, which is of some real value in the real world compared to cat picture sharing sites) costs money in IDE's, hardware investment and other components.
Learning programming costs money, and some one has to teach the kids. Its not like those kids can download a Python tutorial and get going. Or even adults for that matter. Why should any one do that. We don't learn mechanical engineering, why do we expect others to show such deep interests in our areas of work.
Without good problems to solve and the right approach to teaching taken. Programming is as boring as Math.
Which brings me to the point. If you are teaching Math well, you have already taught kids problem solving. If you haven't, how is teaching another Math like subject in the wrong way going to be of any help.
>>And I will be very frank with you, programming is not the same as building web pages.
Totally disagree. Let's assume you're just talking about HTML/CSS, as Javascript is clearly a programming language. Many fundamental concepts that you would learn by understanding HTML and CSS are also foundational in programming languages. You have to understand abstraction, and the use of textual markers to represent those abstractions. HTML attributes are pretty similar to parameters in functions and the tag names would be like function labels. With just learning markup you discover the power of using text to represent things and how the computer/browser can interpret that data to actually do stuff.
Of course there is plenty of things missing, loops and conditionals, state management, functions as data, etc. but 1) if you're teaching how to build a web page properly you will be covering javascript and these concepts and 2) even if you don't cover Javascript just learning html/css is still a start towards those other concetps. I've recently started teaching high schoolers how to code and it's amazing the sort of fundamental concepts you completely take for granted as a developer that these kids have simply never been exposed to. These are the low hanging fruit that you're assuming is not important.
Also, embedded systems are becoming increasingly cheaper to develop with, Raspberry Pi's and Arduino's cost $25 and that space is also becoming more and more open. There is a long way to go but it's certainly happening.
Finally, of course computers and internet connections cost money but these are things that people acquire regardless of whether they want to learn how to code or not. I'm not naive enough to say everyone has easy access to these things even in affluent countries, but they are goods that are acquired for many more reasons then just learning how to code. The idea that it's free and more accessible comes from that aspect, that the same tools you use everyday to browse Facebook or do a Google search are all you need to become proficient at coding. Most other engineering disciplines have higher barriers to entry then that.
Again I don't see how this is in any related only to programming.
Programming was introduced to me in school and was the most boring subject of all. Because the problems we solved looked totally irrelevant to not just me, but every kid in the school. I was glad I opted out of it and did physics experiments instead. It made whole lot sense. Had I continued working on brain dead sorting, and arithmetic problems I would have developed permanent hatred towards programming. I was already learning simultaneous equations, quadratic equations in the Math classes without understanding why and what they even meant. Why learn another such subject?
Physics was a place where I saw application of pure mathematics to real life scenarios.
Skills that you need to be a good programmer by and large the very same that you need to indulge in any creative activity. Clear definition of the problem, deconstructing it into smaller parts, apply a definite science in assembling smaller solutions, going into a build-feedback-correct cycle etc. You will have to do the same if you do physics, chemistry, biology, math, painting, music, history and may be anything on earth.
Programming doesn't make much sense unless there is a larger context and scope of your learning in helping solve some meaningful problems gets visible. Other wise the kids will just be doing yet another routine boring math kind of work without knowing its true application.
Remember kids building tree houses, That requires nearly the same kind of stuff required to be good programmer, or to take part in a science exhibition. Or a essay writing competition. What is important is to teach kids learn to discover how to work on creative problems.
When I think about the practical skills that I learnt in my education, years later there were only a few key concepts which really mattered: rudimentary arithmetic in Mathematics, good writing/reading skills from English, understanding of empiricism from the Sciences.
I think the question is: is there a foundational skill or concept that learning coding gives you?
I think perhaps there is and it's something to do with the application of symbolic logic, however I am not sure whether I had this before or after I started coding. (I do, however, feel that I grasped it far better from constant practical application than I did from mathematics lessons.)
I suspect it has more to do with problem-solving and analysis. In theory students should gain this kind of knowledge from mathematics, but I don't think that seems to work out in reality for most people.
Most people won't acquire great problem solving skills with programming either. You need only look at a few new questions on StackOverflow to see that. I think your parent is onto something though, that the unique skill available by basic programming in symbolic logic, and perhaps logic in general. It won't come to everyone, but without programming it may be even less likely. The problem of course is that it takes patience and attention to detail--two other skills not everyone has in abundance. Programming is not a freestanding skill, it requires much foundation.
I don't think it's about skill as such, rather about increased productivity.
People are generally expected to be able to drive, and for many, this ability comes with benefits. I don't see why basic programming (file system, lists, loops, conditionals) should be any harder, or less useful.
Driving is physical activity: you turn the wheel the car turns. You see it you feel it. Programming is all dealing with abstractions, and for many that is really hard.
Reading, writing, 'rithmetic are about the only really useful things taught in schools. The rest is important for "education", broadening the mind, and practicing learning.
Learning a second language is not only important for "broadening the mind", but it also helps you to see your native tongue objectively - with more than one instance, you gain an concrete inkling of what is general, what is specific.
We shall not cease from exploration
And the end of all our exploring
Will be to arrive where we started
And know the place for the first time.
Arguably, a programming language can do this directly, or at least lay some foundations. Like natural language (and arithmetic expressions), it has a grammar.
I think there is a deeper purpose of high school education (which seems to be completely unrealized): becoming acquainted with the human heritage of how to know things. That is, maths as a way of proving truth, not just of practical use. Programming has a role, in show how we can make things work - like mechanics and forms of government. Of course, this is philosophy, and not for everyone. But I think everyone is entitled to a taste, so they can make up their own mind.
All that said, actual programming is probably pretty useless. A law student I knew took CS 101 and sincerely believed that the discipline was about knowing all the control codes. Sadly, that is a huge part of what we do - programming requires a whole of nonsense, of arbitrary escaping rules, inconsistent tool and ridiculously arcane procedures for getting anything done - and if you get a little bit wrong, the whole thing fails! - and it's impossible to tell what went wrong unless you already understand it. [source: tutored first year CS students]
The programming tool that ordinary people cope with best, that has minimal nonsense, and also has enormous practical benefit is not thought of as programming at all - the spreadsheet.
Do you think, as a lawyer, it would be helpful for everyone to know a little bit of law? To be able to more effectively navigate day to day things like contracts, leases, understanding of rights etc.?
I'm not a lawyer but I do think that knowing the basics of day-to-day law like you said would actually be really nice. Maybe it would have helped people who were signing up for extremely risky mortgages around 2007 to better understand their real contractual obligations for re-payment, at a time when the banker they were dealing with was probably failing to highlight the fact that the payments would dramatically increase beyond the introductory period? I'm just speculating.
Not just law. That's what an education means - you are educated, if you have a broad general knowledge of just about everything. Plus some specilization in your field. Education these days seems to focus too narrowly on the specialization, without the general knowledge.
So many people live in bubble with no connection to the real world; insulated by religious dogma and partisan ignorance. Debating need not concern with actual provable, reliable facts, but soundbites and appeals to authority. But you can't fool the computer. You can beg and plead, you can say your teacher tells you that it should work, but ultimately you can't make it work unless you actually do.
You can fake your chemistry results, you can argue over the oxford comma, but your loop for(i=1;i<10;++i){} will never run 10 times.
However, I do believe at least the basics of both you mentioned should be taught as well. If you can't fix a damaged wooden door frame or change the o-rings in a faucet by 18, you haven't been prepared for life.
Reading, writing, and mathematics have long been considered fundamental skills.
Obama is suggesting 'computer science' as now being a new fundamental skill. I would change that to 'programming'.
Most people do not question whether math is a fundamental skill. Programming is actually very similar to some types of math work in school, but with a heavy focus on practical problem solving skills using technology.
So the question you ask is similar to the question that many people ask about their algebra or calculus classes. But in the case of computer programming, I think it is even easier to see how it can be directly applied in many fields.
Basically the observation is that people need strong technology skills to contribute, since technology is core to nearly every aspect of life now, and programming develops core skills that can help with many types of technologies.
Programming is absolutely useful on all levels of your understanding.
1. More programmers
There is going to be subset of people that will discover a new passion for programming through introductory courses. There are a lot of very smart people that never would have thought they could be programmers without the proper serendipitous encounters with the subject.
2. Cursory knowledge is useful for your career
Even if you decide not to pursue programming as a career, understanding the basics of how computer programs work can help you in many ways in many walks of life. A lot of careers use computer programs on a daily basis, by building some of your own programs perhaps this will help you become more proficient at using other people's programs.
Additionally, a lot of careers in the future are going to involve pseudo-programming skills such as Excel. Knowing how to program has helped me grasp concepts like pivot tables, excel functions (SUM, AVG, IF, etc.) more easily.
Finally, understanding what computer programs are will help you understand high level strategies for what your company can or cannot do to accomplish goals with computers. Knowing what to build is just as important as knowing how to build.
3. Cursory knowledge is useful for life
Programming is a great way to think about problem solving at large. It teaches a lot of generic techniques that can be applied to all problems in life. Breaking up problems into smaller pieces makes it easier to digest. Applying a couple conditional statements can quickly showcase the logical outcomes of a situation.
I pretty much agree with everything you wrote. I'm not a professional coder, but I program as a hobby.
I'm of the opinion that broad spectrum exposure to programming is a good thing, much like exposure to foreign languages in high school.
I don't expecting everyone to take to programming, or German, but without some exposure, you may never know this wonderful world exists. And without knowing, your latent talents might go to waste.
My sister and I had the same exposure to computers as children. I learned to program shortly thereafter, and she never did. I think the main difference there being that I am a self-learner, and she was an other-learner. Meaning she did better in a teacher/student environment and I did better figuring stuff out on my own, asking questions only when I was ready for the answer.
If a brief course in programming had been taught in school when we were growing up, she might have discovered a knack for it. Who knows. Maybe not. She's a doctor now, delving in that messiness that is people, so maybe programming wouldn't have been attractive to her.
I couldn't not program though. I read Neuromancer in 4th or 5th grade, and while I had been programming before then, that book sealed the deal for me.
I picked up Neuromancer recently and for the first time in a while I stopped reading it a little less than half way because it was so bad. I just could not get into it. I like the topic and genre and all, but it was just not grabbing my attention.
Let's assume you're paying a developer $100k per year - not atypical in this day and age. As a business, I want that developer, who is likely making more than anyone else in the organization, to be working on "the most important thing" in our business at a given time. This might mean a new checkout flow, making sure the online shopping cart works, or scaling a website to accomodate 1000 users at once.
There are many tasks which engineers can easily do, and which most non-technically people are loathe to perform, but are not the most important thing that an engineer ought to be doing in a business. The easiest example is reporting.
A given marketing department will want sales information. They'll want charts and graphs describing conversion rates, customer acquisition costs, etc. There are far more ways that the marketing department will want to slice-and-dice data for analysis than a team of developers can possibly produce.
Engineers don't want to be relegated to creating reports. And anyway, the report you just asked your engineer to create may have just cost you $1000.
So if we were able to bring these marketing people to a level of proficiency where they could use SQL to generate reports, Excel to manipulate that data, and VBA to do analysis (which I believe could be accomplished with 80 hours of training - a drop in the bucket over the course of one's career), then we can let the engineers do the things they are good at ("make sure passwords are secure") and the marketing folks have the minimum proficiency they require to do their jobs.
This is common in companies like Amazon; "the engineers wouldn't help me run reports, so I had to learn myself."
Nowadays, business decisions are based on numerical analysis of behavior. (Click-through rates of advertisements. Conversion rates from campaigns. Number of lawns per high school student per summer.) This trend is unlikely to go away.
In practice, "numerical analysis" means "schlepping data into Excel and running the numbers." And that skill of "running the numbers" without having to ask an engineer (who is both expensive and uninterested) seems, to me, of great practical value.
Obviously I have cornered one specific example that I consistently deal with. But it is not too difficult to imagine that these tools of analysis can help automate any number of tasks, in many disciplines. It is not uncommon for linguistics (graduate) students to learn programming to better analyze the meter of poetry. Optimistically, I hope that "non-technical" will be able to use the tools of our trade in new and interesting ways that we never imagined - the same way a carpenter might use everyday materials in ways that are very innovative to laymen.
As a counter argument to that, many of the non-technical users in my organization like Excel. We have wasted countless hours by sticking to excel as a data input / manipulation tool, as it is incredibly error prone. Non technical users don't see the difference between a 2 and "2" and a " 2". It looks right to them, and much of the time they seem incapable of reading a sensible error message and fixing it the problem themselves.
I've also noticed this countless of times. If you leave data sets to be designed by a non-engineer - it will cost you hours and hours of parsing and changing the format constantly depending on who slapped the excel sheet together. Literally one of the worst experiences on a job was dealing with a big corporations excel sheets and trying to convert them into usable data.
I suppose so. Experienced developers already have that education. An introduction to programming class is not likely to provide that. I look back at technical decisions I made ten years ago, when I started coding, and I see how much cleaner and more elegant my solutions current solutions are likely to be (when a clean solution is possible).
Perhaps a side effect of "everybody" learning to program will be the demand for more programming tools that are easy to use. Excel and VBA both developed due to use demand.
I've seen lots of people, from engineers to workers on the loading dock, use Excel to create convenient tools for their own use.
My client, he doesn't know what "FTP" is, and does not know how to upload his revised version of the current Excel calculation sheet which he designed, and is core-business, and coupled to an application form.
He knows the ins and outs about Excel, from formulas to shortcuts, and i'm a total novice when he's explaining stuff to me.
I'm interfacing with his Excel sheet through PHP, and he does not have to change the way he works, and I don't.
I don't need to know all the ins-and outs, I just need to know which cell needs what data, and the cells that are calculated and need to extract data from.
I'm now building a management backend for him in Rails, and it will work the same way. Maybe later those Excel calculations will be ported to the database, but for now there is no reason to bother my client with learning a new interface and changing the way he works.
I work with bioinformatics, who are generally fairly smart, and self taught coders. The quality of code they produce is often terrible. Having to interact with some of that code is painful, and it is often easier just to rewrite "properly".
I think it would be far more use to encourage people to learn how an OS works, and understand the concepts (rather than blindly clicking things until it does what you want). Understand some database concepts. Understand a bit about how the internet works.
I am often asked to fix problems with Excel or Word, despite the fact I work on a Linux box, and don't touch either of these pieces of software given the choice. I can make things like that work (some of the time), not because I have any training in how to use them, but because I understand some underlying concepts that non-technical users don't. Teaching these things would be of far more use than teaching people how to write some basic scripts.
At the high school level, I think your analysis is generally correct. Most students who aren't already interested in computer science will have the same attitude toward a programming course as they have toward foreign language courses.
However, in college, the paradigm is different. At my university, programming is taught from two distinct perspectives: theoretical (as in the computer science major) and practical. I'm in the business school, and we have courses that teach VBA, SQL, Python, and Matlab. These courses focus on using these languages as tools to solve problems and gain competitive advantages through optimization, efficiency, and data analysis (think of Steve Jobs' bicycle analogy). For example, one course teaches Python and Matlab in the context of text analytics -- students use Python's text handling capabilities to parse text and collect data, then use Matlab to visualize the data and detect trends. VBA and SQL are taught together as tools which increase productivity in business, where scripting Excel can save countless man-hours and being familiar with databases can make interfacing with data analysts and IT people easier. These courses are taught with a distinct "hacker" or "scripter" mindset.
Students inevitably have difficulty with syntax, logic, etc but get past that with practice over the course of the semester. Programming is perceived by students as a problem-solving tool, like a TI-84 calculator helps them solve math problems and graph functions. They will not be creating enterprise applications or studying theory, but learning to script measurably enhances productivity -- and that's where the value is.
(Anecdotally, I'm not a programmer but am familiar with Ruby as well as the languages listed above. While doing an academic research project this semester, knowing Ruby made it trivial to quickly organize and manage a trove of 10,259 text documents. Without programming knowledge, that task could have taken quite a few hours.)
I think he did preface "anyone can learn how to code" with the phrase "...with some hard work and a little math & science understanding".
I do believe that broad literacy in programming would be beneficial. Going beyond my obviously biased opinion that programming helps you understand your world better, I believe that broad literacy in programming will advance our technology faster and bring us further than we could have ever imagined, because we'll have more people per capita who are able to maintain and understand the way our increasingly-complex world works.
The fact that not everyone who wants to be a programmer actually sticks with it enough to become one is also a good thing. It's certainly not for everyone. But there are plenty of people, especially kids, who might find this kind of stuff interesting, but aren't being exposed to it enough for it to be a reality.
I've got a classical education in computer science, an engineering degree, and plus/minus about a decade in my coding skill being a major contributing factor in my ability to eat on a daily basis.
On the one hand, I concur with you, in that ability to produce a working system ex nihlio is both a) much, much harder than anyone suggesting the general populance Just Learn To Code expects and b) of limited utility to many people. To pick an example at random from the front page, there is virtually no problem with being severely poor in NYC that would get alleviated with any of the participants Just Learning To Code, unless that in the process transformed one of the involved adults into a responsible member of society. (There being many, many people in the story who could use that in addition to the obvious choices.)
Learning to code might assist people into having a better mental model of computers and a lot of computer-like systems which they interact with on a daily basis.
For example, you're a lawyer, and you have practical experience with how law and bureacracy works on a nuts and bolts level. I assume you've occasionally met people who believe that law/bureacracy operate in an entirely random and capricious fashion which cannot be influenced by their own behavior. Dealing with people who think that is a little trying, right? Both because it is wrong and because, more to the point, it causes them to take self-destructive courses of action. (To see many examples of this, see again the article on being extremely poor in NYC, where consequences are predictable based on past behavior seems to be as foreign as trying to explain thunderbolts as something-other-than-the-wrath-of-an-angry-god to ancient Greeks.)
If people had a mental model of how computers (and similar systems worked), it would improve their -- for lack of a better word -- digital citizenship. Paypal probably didn't freeze your account on a whim any more than the probation officer has decided to "violate" you based on personal animus. There was probably a heuristic triggered by behavior. More importantly, a) that behavior can be avoided in the future, b) that heuristic can probably be overridden by appeal to the relevant authorities, and c) that heuristic was probably instituted due to it achieving goals most of the time rather than as an instrument of oppression.
We could look back to a time in the not-too-distant past and say that, for the average citizen, knowing the nuts and bolts operation of the law was probably unnecessary: they didn't have touchpoints with the State that frequently and when they did the operation was well-understood by all parties. You don't have to understand the inner operations of magisterial courts all that well if you can appreciate that killing people is generally a bad idea. Recent years, however, have gotten the State into substantially more lines of business than just regulating who gets to kill who when. The average citizen can now expect to run into laws and their consequences quite frequently. At your job. At your doctor's. At your school. At your bank. When the government sends you a check. When you send the government a check. The average citizen is now expected to be able to make consequential decisions based on the law. There are many possible decisions which are wrong ones.
Similarly, in the not-too-distant past, you could have been totally ignorant about how computers operated. Computers were, after all, mostly maintained by other people and they didn't come into contact with your life that frequently. When they did, they were pretty easy to anticipate the function of even if you had no clue what Deep Magicks were invoked to cause it. The computer keeps a record of your bank balance, which it does via addition and subtraction, so you'd best assure addition and subtraction sums to greater than zero. As long as you do you'll have no problems with computers.
This is not the world we live in in 2013, and I would not bet that computers and similar systems become less relevant over time, any more than I'd bet that law suddenly decide to recede from its historically novel importance to people.
Computers operate consistently. Their rules are written in advance. It is easy to make mistakes in writing those rules. The symptoms of those mistakes will (generally) be predictable and consistent. Since computers operate according to rules, given the rules, we can make certain confident predictions about their behavior in advance of seeing it. Since computers operate according to rules, we can learn the rules they operate under by observation, and therefore make confident predictions about their future behavior by observation.
Everything I just said is something that you'll know in your bones by the time you've made your first substantial program, and yet they're Deep Magick to most people. Seriously. I think I could poll a family gathering of the McKenzies, whose average educational attainment is a master's, and probably get less than 20% of the family to agree that "Computers operate according to rules." My family, like most users, assumes that the devil box just does whatever it feels like and this is so frustrating when it stops them from getting their grant applications in on time.
Everything you mention can be done by a non-programmer.
- Copy and paste your list of charities into MS Word and print it
- Not sure what that is about
- Create a blog on one of the many readily available platforms like Wordpress or blogger. Plenty of non-coders already doing this
- Getting a grasp on technology has nothing to do with coding
What if your list is 10,000 and they are links on a paginated search results page? Cut and paste does not work here -scrapping sure will. Now think about what happens if the page is supported by dynamic tools like AJAX ?
How often does this actually need to be done? I know beginner coders who struggle with this, esp when it comes to AJAX. I very much doubt that someone with no interest in coding who is forced to code because of some government initiative for one semester is going to fare any better at that task.
The point is, unless you have some self interest in the subject then there is no point in forcing you to learn it, it is going to be of no benefit to you in your future life.
At work, I had a spreadsheet. Technical people, coders even, had a hard time finding the solution: convert to CSV, cut -f, awk print, in order to tack a hostname onto a column with relative HTTP paths. (No error checking required.)
If you were using Excel, you code have just written a VBA macro to do it, or created another column with formula =CONCATENATE("http://domain/",A1) if that's what you mean
I think learning to code is beneficial for purely non-techical reasons.
Programming is one of few activities left where you can't bullshit your way out of the problem. You have to make yourself actually understand the problem, figure out what needs to be done and do it diligently. And you have to repeat these three steps over and over. Either that or you fail in such a clear way that you can't bullshit yourself that it actually wasn't a failure.
Coding is in modern world the most interesting and accessible manifestation of physics. It's the best opportunity to learn firsthand the spirit of quote "For a successful technology, reality must take precedence over public relations, for Nature cannot be fooled."
It's not so much about learning to code, as about learning how to solve problems using algorithms. Coding is a natural application of that. It surely is a very useful skill and teaching that in school makes perfect sense.
But, even at this level, most of the people around me - being non-programmers - would run in horror from the idea of even getting into that level of trying to interact with a computing environment.
Even if one does not go on to do significant software development, learning to deal with a computer at the level of programming it teaches a person something about rigorous thought. At first, a lot of effort is often needed to fix a fiddly off-by-one error or a crashing program.
Basic understanding of coding (which you apparently already have) helps people get to grips with the world around them, which is essential for having a functioning democracy.
Simple example: non-coders had no clue what could possible be wrong with voting machines.
Code can be simple or complex just like writing. Last night my girlfriend was using a WYSIWYG editor for WordPress and getting very frustrated. I suggested using the HTML editor, and she was blown away at how much easier to make simple changes.
Besides what others have mentioned with respect to helping people discover an otherwise undiscovered talent for engineering, coding, if only at a more basic level, has a tremendous impact on average office workers' productivity.
Consider a company I am intimately familiar with, which is a typical manufacturing company. There are accountants, customer service, salespeople, production schedulers, marketers, inventory managers, production foreman, maintenance technicians, material buyers, human resource staffers, and so on. A typical set of functions that could have been picked from any number of hundreds of small or medium sized manufacturing companies. Due to the company's size there are no dedicated programmers as might be found in a larger company's IS or IT department.
But in nearly all work areas, a person's productivity is greatly leveraged to their familiarity and comfort with technology, including the ability to develop a set of instructions to assist in automating tasks within the computer. And because their productivity is leveraged to technology, those who are more capable with that automation are typically also paid more.
It is surprising how many opportunities there are for at least basic levels of programming in many different areas. Consider the following examples:
- A material buyer needs to know anticipated raw material needs by product, based on order backlogs. She develops a little VB script to tell her how much to order of each type of raw material, based on types of products in the order backlog. She then enhances it to consider price discounts, shipping quantity breaks, supplier lead times, and additional factors, to maximize material inventory turns while minimizing the material outages.
- An accountant develops a basic script to assist in forecasting cash flow to the business, to help manage the company's operating line of credit, lowering the business's interest costs and identifying potential cash flow issues well ahead of time.
- A maintenance tech develops a database to track issues with machines, replacing paper tracking. After six months, he uses database queries to begin identifying patterns among the hundreds of maintenance issues, to help create a set of preventative maintenance procedures to minimize expensive downtime.
Are any of these using Ruby on Rails? Are they using algorithms that one would learn in a Computer Science curriculum? Likely not. Many of these tasks are on the wrong side of what the audience here would even consider "coding": it is just creating a simple database, or using some simple VBS, or maybe even nothing more than some more complex than usual formulas in Excel. And yet they are skills that are woefully absent from the vast majority of the population, and yet which would greatly enhance their productivity and earnings.
Would the majority of workers benefit from formal training of computer science theory? That is debatable. If done the way many CS 101 classes are done, it could even hurt, by creating fear of the topic at an early age.
But there is a basic level of competence that would enhance the productivity of a great many number of workers, that is absent today. That basic level of competence would include the introduction of how a database works, basic office automation scripts, perhaps mixed in with some fundamentals of simple data analysis with computers.
A typical office or production candidate demonstrating even these simple skills is highly attractive in an interview, and I believe that any country's industry would be far more competitive with a population with these skills than without.
Exactly. This is the kind of stuff I talk about when I am talking with those who use technology every day to accomplish their jobs, but see it as a box that they perform tasks in and do not take part in automating their tasks.
I recently showed an account manager at my job how to use autohotkey. With that they (with very minor help) created a way to automate some irritating web form crap they do all the time to make their life simpler, faster, and with less annoying drudgery.
I think it is a part of the "dont know you dont know", where if they have the basic concepts, not a cs education, they can make the computer work for them instead of the other way around.
as a "real engineer"(tm), (more usefully, someone who codes both for a living and as a hobby) let me give a very concise answer (I'd be willing to be more verbose, I have a lot to say on this matter, but I really think the core point is braindead simple Edit: don't mean to imply braindeadedness if you don't see it, but that once I saw it, it seemed elegantly and stupidly simple.):
Programming is more than any language, tool, or algorithm, it is a way of thinking.
As a person with a lot of software ideas, learning to code really helped me explore my ideas. It also really helped me develop more refined problem solving skills.
Maybe the question should be: why should we teach trigonometry over programming? Which one is more likely to be useful to your career and life in the modern world?
I'm a purebred software developer so to speak and I think it would be good for normal non-technical people to learn the basics of programming, much like how many consider that it is good for them to learn the basics of math.
This is not so much about doing real software development, but rather the ability to control your environment, your tools, should you need to do so.
For example, for simple needs, developers/designers can cut down on the metaphors and interactions required to use the GUI and maybe reduce those to things that users are already accustomed to (like moving objects around with your finger), but the more feature-full some piece of software gets, the more complex its interface becomes. And here we have a problem, because the status-quo of graphical interfaces is for users to navigate trees or graphs of options, in search for the right button to click, or the right form to fill. And designers can delay non-flat GUI hierarchies as much as they can, but at some point a complex tree or graph structure becomes inevitable. At which point, users resort to rote learning. This isn't even mentioning actual (and horrible) programming languages often hidden behind GUI metaphors, for more complex apps, because you know, not everything can be done by clicking a button and sometimes you need to specify boolean conditions that trigger actions and so on. You only need to watch normal users struggle with a complex piece of software, like Microsoft Word or Excel or Photoshop, to see what I mean. It's freakishly painful to watch.
Excel, one of the most popular pieces of software in history, has an embedded programming language that users can use. Excel wouldn't be Excel without it. And sometimes you need an embedded programming language to get shit done, because language is still the most potent form of communication and this extends to user interfaces too. And we can't communicate using natural language with our computers, yet, but even if we were, we'd still have to come up with clear specifications that the computer could make sense of.
People are so afraid of computers because computers are absolute black boxes to them. I'm not afraid of computers, because I've assembled my own PCs, I know how they work and whenever some piece of software doesn't work like I want it to work, I know that (should I need to) I can search for alternatives, or I can automate it, or I could implement something similar from scratch. Many times it's not feasible of course, but in terms of what I'm afraid to do or not, the feasibility of it is of no consequence. Programmers are fearless, whereas users are fearful. And companies are exploiting this, locking users into software packages or services that are suboptimal and overpriced.
Automating stuff is priceless. For example I've got tens of thousands of photos that I need to organize - I just wrote a script that splits those photos in directories named after a YYYY-MM pattern and eliminates duplicates. No need for shitty software that might delete my photos by mistake because I clicked the wrong button. This is another skill that comes with knowledge of programming - the ability to automate shit and this is also not software development and would be useful for normal people.
I am not speaking as a skeptic, just as one who does not readily see the point and wants to know.
Of course, we are in a digital age and there is incredible value in knowing how to code for the person who really masters this skill. And, among those who do master it, you will of course have various gradations in skill level ranging from profound to excellent to good to competent to serviceable, and these in turn will give the bearer of such skills a range of opportunities commensurate with the acquired skill level (and, when I say skill, I don't mean mere technique but also inspiration, insight, imagination, and whatever else it takes not only to pound something out but to do it in ways that stand out).
That said, however, if I were to look, say, at 100 random friends and acquaintances, I would question what good it would do for them to learn a few basics about the syntax of some programming language, to learn a few things about programming objects, and to learn a few things about control structures if the sum total of all those few things is simply to understanding minimal things about how coding works without being able to apply that knowledge effectively to anything in their real-world lives. In my own case in having hacked through some minimal interpretative stuff, I at least had some professional uses for this sort of thing (e.g., using VBA to systematize a few MS Word functions needed in our office). But, even at this level, most of the people around me - being non-programmers - would run in horror from the idea of even getting into that level of trying to interact with a computing environment. For the most part, they were content to know as little as possible about any of the inner workings of a computer and were totally uninterested in delving any deeper. And these are the people who are out there by the millions who have always been drawn to the simplest ways of interacting with their computers (e.g., mouse and not keyboard). In my experience, unless people naturally have a mathematical or engineering "bent," they simply would rather not deal with understanding how something like a computer works beneath the surface but want only to grasp its benefits at the highest level with the least effort possible.
If most people are indeed like that (and I believe they are), how would it benefit them in a practical sense, say, for future educational curricula to mandate taking a prescribed course in learning to code. Even if this sort of thing were required, wouldn't this be just like a prescribed foreign language course in middle school that one has but a fleeting acquaintance with, only to have little or nothing stick beyond getting past the requirement for the purposes of passing a class. What residual value would stick from such fleeing interactions with the rudiments of coding?
It seems to me that, if one is to derive true value from learning to code, one needs to devote a significant level of dedicated hard work toward that effort and, if one fails to get beyond a minimal threshold, the only value gained is that of a very generalized form of knowledge that has little practical use in the real world. And I would suspect that most people really do not want to devote such an effort to this task. A good many do, of course, and, as noted, this does have huge value in our digital age for those that do. But why expect it of most people?
There is nothing wrong, of course, with our political leaders encouraging young people to learn to code and this may inspire some to do so. But coding is not really like, say, writing, where gaining a minimal proficiency leaves one in a much better position than not knowing how to do it at all. It seems that, if most people can't get beyond some minimum threshold to make the endeavor worthwhile, learning to code would not help the great majority of people who are not interested in making the sort of dedicated effort that only a relatively minority will in fact make to justify the effort in practical terms.
That is my layman's view. Do those who really know this stuff agree or is this just some disconnected elitist view of people that doesn't fit with modern understanding? I would genuinely like to know because, to me, it does not seem like a close question. Am I just being prejudiced here?