Don't learn to code. Learn to think.
Posted: Friday, July 11, 2014 by Tyler Durden in Labels: career , programming
Don't learn to code. Learn to think.
I think this is slightly misguided. Don't get me wrong - I do think the world would be better off if everyone had some familiarity with coding - but coding itself should not be the goal. Computers and programming are just tools. They are a means to an end.
The real goal should be to teach people a new way to think. In other words, we should be trying to teach computer science and not just coding. In this blog post, I'll explain the difference between the two, and why focusing on the right one is critical for the movement to succeed.
If you prefer a video explanation, I highly recommend Simon Peyton Jones' wonderful TED talkTeaching Creative Computer Science, which was the inspiration for this post:
Still here for the written version? Great. Let's get started by asking a key question: why should you care about coding or computer science at all?
To answer that, we'll take a walk.
Welcome to the real world
You're probably reading this blog post in Chrome or Firefox, running on Windows or OS X, on a laptop or desktop. I'm guessing you also spent some time today reading email, checking your friends' Facebook statuses, or watching a video on Youtube. Much of your life is on computers these days: your medical records are in a database; you resume is on LinkedIn; you use Google and Facebook to market your products; you use Amazon to buy them; you file your taxes online; you manage your bank account on a website; perhaps you even dabble in digital currencies.
Now, look up from your computer: in your pocket, purse, or on a desk nearby, you may have a smartphone. It's loaded with a GPS, camera, touch screen, and tons of apps. If you're in your living room, you might also have an LCD TV hooked up to digital cable, a DVR, DVD player, Apple TV, XBox, or PlayStation. The movies, music, and games you may play on those devices are packed full of computer graphics and digital audio processing.
Let's head outside. Did you walk past your car? Modern cars are designed using software, built in a factory full of robots, and stuffed full of computers. If you drive your car, you might use Google Maps to find your way around, Yelp to find a place to eat, or TripAdvisor to find a place to stay. Now, look up: somewhere above you, a plane will pass by that is controlled by auto pilot, has in-flight Wifi and entertainment systems, and is constantly communicating with other planes, traffic controllers, and its manufacturer. Somewhere above that, satellites and space stations are orbiting the earth, taking pictures, measuring the weather, and routing phone calls.
Software is eating the world. But this is only the beginning. Before you know it, you'll be wearing technology, locking your doors with computers, using robots to deliver goods and clean your house, building your own electronics, running your own manufacturing plant, living in virtual reality, traveling in self driving cars, and flying to space.
The matrix is everywhere
Now, just because a technology is ubiquitous doesn't mean you have to study it in school. For example, we all fly in airplanes, but getting your pilot's license is not part of the K-12 curriculum.
However, the tools you need to understand how to think about flying are part of the curriculum:
- Physics and math help you understand gravity, forces, pressure, velocity, friction, and lift.
- Biology teaches you what happens to the human body at high altitudes, with limited oxygen, and extreme cold.
- History explains how the airplane was developed, how it evolved, and its role in travel, commerce, and warfare.
For the same reason, we should focus on teaching computer science and not just coding: the former is a general purpose way of thinking, whereas the latter is a specific tool. Let's look closer at computer science to get a better understanding of the distinction.
What is computer science?
Computer science is the study of computation: that is, how to represent and process information. Here are just a few of the concepts you might study:
- Problem solving: you'll learn algorithms - that is, general strategies, such as divide and conquer, recursion, heuristics, greedy search, and randomized algorithms - that help you model, decompose, and solve any kind of problem.
- Logic: you will start to use precise and formal methods of thinking, including abstraction,boolean logic, number theory, and set theory, so you can solve problems in an air tight manner.
- Data: you will touch information theory and start asking questions like what is information? How do you represent it? How do you model the real world?
- Systems: how do you design and build complex systems that satisfy a set of requirements and constraints? Systems engineering is an essential topic in almost every business.
- Thinking: one of the best ways to understand the human mind is to try to replicate it. Topics like artificial intelligence, machine learning, computer vision, and natural language processingare at the forefront of not only computer science, but also biology, psychology, philosophy, and mathematics.
Note that the above list doesn't really mention coding or programming, because they are just toolsthat can perform computation: they are not, in and of themselves, computer science.
Computer science is no more about computers than astronomy is about telescopes, biology about microscopes, or chemistry about beakers and test tubes. Science is not about tools. - Michael Fellows and Ian Parberry
It turns out there is another tool that we rely on for computation even more: the brain! The goal of computer science is to teach your brain new, general purpose, and widely applicable ways to think. As technology becomes more and more ubiquitous, this new way of thinking will become just as important as physics, math, biology, and history.
All that said, thinking alone is not enough: we need to know how to apply it. In physics, you do experiments with scales, prisms, and magnets; in biology, you might use test tubes, plants, and petri dishes; in computer science, you learn programming.
What is programming?
All that said, thinking alone is not enough: we need to know how to apply it. In physics, you do experiments with scales, prisms, and magnets; in biology, you might use test tubes, plants, and petri dishes; in computer science, you learn programming.
What is programming?
Programming, or writing code, is how you instruct a computer to perform some operation. If you've never written code before, you're probably used to interacting with a computer by clicking on things in an existing app. Under the hood, this app consists of code that tells the computer how to display the application, where to store or retrieve data, and how to react to your clicks.
All of programming is based on the principles of computer science we discussed above. It is remarkable that the same set of concepts - logic, algorithms, data, systems engineering - can be used to build everything from the web browser you're using to read this post to the autopilot software on an airplane. Although programming involves lots of math and structure, it is also a remarkably creative exercise: you think products into existence, one line of code at a time.
Learning programming as part of a computer science education brings about a number of benefits:
All of programming is based on the principles of computer science we discussed above. It is remarkable that the same set of concepts - logic, algorithms, data, systems engineering - can be used to build everything from the web browser you're using to read this post to the autopilot software on an airplane. Although programming involves lots of math and structure, it is also a remarkably creative exercise: you think products into existence, one line of code at a time.
Learning programming as part of a computer science education brings about a number of benefits:
- DIY: if you can code, you can build things for yourself. You can start simple: create a script to rename a bunch of travel photos or an Excel formula to help calculate your taxes. Then, get fancier: create a website for your portfolio; create a mobile app for your company; build a game to play with your friends.
- Troubleshooting: once you've built a few apps yourself, figuring out other apps is easier. Once you stop fearing the computer - the unknown - you will become a master of tech support. As technology touches every part of your life, knowing how to navigate it will become as important as knowing how to read.
- Career: the goal of learning computer science is not to become a professional programmer. We all study math, physics, and chemistry in school, but we don't all become professional mathematicians, physicists, and chemists. However, if you do have a passion for it, you'll find that software engineering is one of the highest rated, highest paid, and fastest growing jobs out there.
Let's recap:
- Computer science is a new way of thinking. The concepts in it are useful for every single person in a technology-filled world.
- Programming is an essential part of learning computer science by applying the new way of thinking. However, by itself, programming is not nearly as general purpose.
"How [would] Michael Bloomberg be better at his day to day job of leading the largest city in the USA if he woke up one morning as a crack Java coder?"This is, of course, the wrong question. It is the result of public campaigns that suggest that learning to code, as opposed to learning to think, is the end goal. If even Jeff Atwood, an experienced and respected programmer, is fooled by this distinction, then the average person has no chance of getting it right. The question we should be asking is:
Would Bloomberg - or anyone else - be better at their job if they improved their ability to think by learning new problem solving strategies and developing a better grasp of logic?I think the answer here is obvious. As the world fills up with more and more technology, I think the answer becomes even more obvious. This is why we need to focus on teaching computer science and not just coding.
How to get started
The good news is that you don't need to wait for Code.org to get this message - you can start learning computer science right now! In fact, it's one of the easiest topics to learn, as all you need is a computer and an Internet connection, and if you're reading this post, you probably have both.
Here are some great resources to get you going:
University courses
Online tutorials
Communities and clubs
16 comments:
Good post.
To your list of useful education sources, please allow me to suggest Basicversity.com - a free tool to test and improve your basic knowledge of anything.
I have been programming professionally for almost 20 years, and for over 30 if you count my programming on my old Apple II+ as a child--and I don't mean just "hello world" programming back then. I learned logic very early on with my computer experiences as the old computers did not have IDE's and languages that did a lot of work for you.
Unfortunately modern computers, programming languages, IDE's, and code snippets available via a web search have given anyone the ability to create something and make it work--sort of. All of the software projects I've worked on were written by someone with a bright idea but with no ability to think and therefore code properly.
In the end every bit of code I've seen in my career is garbage and should have been thrown out or rewritten while still in its infancy. However, it was allowed to live on too long. I tried everywhere I worked to get the insanity to stop and to get things rewritten with some genuine thought put into the final product--no luck!
This post mentions the existence of so much code already that runs cars, airplanes, cell phones, ATM's, etc. Sadly I'm sure much of that code was written, as I have experienced, by someone with a good idea but with no programming skills--yes, even the autopilot on the plane in some cases I'm sure. I hope for the future's sake that logic and reasoning is indeed taught rather than just giving the hammer to every man, woman, and child to hit his or her thumb with so they learn the hard way.
I'm about done with software engineering as a career due to being worn out, feeling that way even as the industry grows and my options for better opportunities and income increase. It's sad, and I blame all the so-called-programmers out there that really should have their hammer taken away so they stop hitting MY thumb with it.
Sadly, there are a lot of bad programmers out there, but its the same with every other profession.
It's also sad that the blame is passed on to the fellow programmers - at your level if experience, you can take into teaching that logic and reasoning to the new breed of programmers.
That would be a better way of fixing the situation.
Cheers!
I would love for anyone who is a programmer or who interacts with programmers that reads this post or our comments to do a test at their workplace or school. Ask someone who claims to be a good computer programmer to write a hello world program. If they ask questions of you about what is needed, then that is a great first step and a plus for that person. Once verbal questions are answered and clarified, let them take the next step.
If they come back with a written hello world program, then never hire them anywhere, period. If they come back with a written specification or statement of work in the native language of the country one resides in (English, German, etc.) with details about the program, the GUI (if there is one) with mocked up screen shots or hand drawings, and how it all is going to work then you might just have yourself a very good computer programmer--a real "engineer" I guess you would say.
My guess is most will fail the first step and just get right to the keyboard and crank something out in 5 minutes (or less)--that's a big fail.
I would say I spend about 7 hours a day thinking and maybe 1 hour coding (ignoring meet time, etc.). The work I do rarely needs to be fixed or reworked again though I am only human and do still make mistakes.
I've worked on something for 10 workdays, only to feel the need to ask for another pair of eyes on the problem as I seem to be stuck. The other eyes sometimes "fix" things in 30 minutes and make me look slow. However, I say "fix" because one month or one year later their "fix" turns out to have broken something else in the software--the very thing I avoid that ends up making my work take 10 or 100 times longer than some other so-called programmer.
Such is the story of the life for 20 years. Again, too tired to keep it up. Thanks for the support.
(It doesn't help that no one has an uncontentious definition of computational thinking.)
Unfortunately in our field a lot of emphasis is placed on tools and they are perceived/advertised as the next silver bullet. There is false hope that the new language/framework will solve all the problems that were part of a previous project - without making this distinction that perhaps new thinking/approach rather than simply new tools maybe more of what is required. As it has been famously stated "A fool with a tool is still a fool".
Rather than programming, it is more important to impart the thinking of computer science (CS) than a specific implementation. Programming can be an end point for some students, but it is likely that programming itself will be increasingly automated, so that one needs more the general concepts common in CS. Even then, programming itself is to some degree a grunt task that one progresses beyond:
The following are typical components of a CS degree:
- algorithms & flowcharting
- systems thinking
- logical systems and set theory
- object-orientation & patterns
- probability, statistics, mathematics
All of the above can be useful in an increasingly automated and data-driven world.
Could you provide a list of resources so I could learn to think? I'm very serious about this. Books, classes, websites? I'm hoping you'll receive this so I could get a response..