Sign up for our mailing list to be notified as new details arrive:
The computer has revolutionized the way that we study, work, and play. Yet a majority of students do not understand how computers work because they’ve never had the opportunity to learn how to program. Thanks to programmers, computers today can do everything from word processing to photo and video editing. Furthermore, previously unimagined applications for computers, such as Internet telephony and social networking, are sweeping the nation, lowering the cost of communication and improving our access to information. However, the traditional classes found in most schools make learning to program very difficult. I believe that programming can be taught more effectively. By taking this computer class, your son or daughter will be introduced to how they can take part in advancing this amazing technology.
Anyone Can Code is my name for this new initiative to bring programming to children who would love programming, but have never had the chance to really explore it. The class will be laser-focused on effectively learning computer programming, for a student who has never really tried it before.
Anyone Can Code is my name for the summer computer classes I will be teaching this summer. These are independent classes, taught by myself (and perhaps we’ll have a guest teacher, if I find one). The idea is to get young kids into programming, an extremely fun, creative, and useful endeavor which most people do not have the opportunity to do.
There’s a Chinese proverb that says: “Knowing and not doing are equal to not knowing at all.” I know that kids should have the opportunity learn how fun it is to program, so I’m taking action by starting this class.
I read an article today about Steve Wozniak, one of the co-founders of Apple. At the time the article was written, he was teaching computer classes out of his garage. As one of the chief innovators of the computer revolution, an having made a fortune of some $200 million from Apple, he chose to teach grade-school kids how to use instant messengers, chat rooms, etc. I would like to take that a step further. Kids have a fresh way of looking at things. That’s what I want to inspire in my classes.
What will we learn? Here are some preliminary ideas:
- Computer history: a brief overview from the abacus to digital electronics
- Computer architecture: how computers work using control units and memory
- Computer usage: modern operating systems, software, and networking (including the Internet)
- Computer programming: overview and specifics, Java, C++, Python, PHP
There are many possibilities for fun projects. The important thing is that I will be guiding students through the development process, and it will all be hands-on. When you get stuck, you will get help. That’s the most important thing. Many people try to learn programming in our traditional school system. That approach doesn’t work well. Students get stuck and stay that way, getting so discouraged that they simply drop out. I’ve even seen it in college. It’s absurd.
So what can we make? I’m open to ideas, but here are some initial proposals.
- Google Gadgets
- Tower Defense Games
- Star Patterns
- Word Game Assistants
- Open-Ended Projects
I’m most excited about letting students be completely creative. You can submit your proposals and ideas to me, and we’ll discuss how you would architect your program. We will reduce the scope of it, if necessary, to something that you can actually accomplish within a few days.
Tonight I’d like to write a bit about Dijkstra’s algorithm. If it’s possible to make Dijkstra’s algorithm easy, I hope to do it.
The name “Dijkstra” sounds technical. But in reality the algorithm is largely common sense. Dijkstra’s algorithm is simply a way of finding the shortest path between two nodes in a graph.
To begin thinking about it, we need some foundations. The first thing is what we call a “graph.” Graphs are a bunch of dots (nodes or vertices) connected by lines (edges). The edges have a length (or “weight”). We can make up a “path” through the graph connecting two nodes of our choosing. For complex graphs, there could be many possible ways of getting from point A to point B. We can use Dijkstra’s algorithm, a series of steps, to find the shortest way.
If there are multiple shortest ways, Dijkstra should give us one of them. In that way, it’s “nondeterministic:” we don’t really know which one of the ways it will give us.
The first step is to take the starting point (or node) and “expand” it. That means we list all the nodes that are connected to it by an edge. We label these edges with their weights, and label the nodes themselves with the weight, too. We mark a node “visited” after it’s expanded.
Then we expand each of these nodes, labeling the edges with their weights. But this time, the weight label on the nodes themselves will be the total weight of the edges we had to cross in order to get here. If we start repeating some nodes, that’s OK. We know that if there are multiple ways of getting to a node, the shortest path must use the shortest way. So we can “prune” (stop looking at, or stop expanding) duplicate node names which have a higher weight.
By repeating these steps, we’ll eventually find a path to point B. But don’t stop there. We need to keep going until every node has been visited, because one of the other nodes might show us a shorter path to B. This is tricky, because it’s the one place where you might stop too early.
Basically, you expand everything and go along the path that is the shortest. So there’s really no magic behind it; in my opinion, once you try it out a few times, you’ll see it’s common sense.
What’s a fun first project?
I have a number of ideas. You could go with a text-based RPG. This is what I started with. I used QuickBasic to create a Pokemon-themed text game.
Or you could build on a framework and make a shoot-em-up, like the space shoot-em-up Phoenix. This is definitely more advanced, but it makes use of graphics and allows for a lot more visual creativity.
Another possibility is making some kind of turn-based game. You could do tic-tac-toe, Connect 4, or checkers. This doesn’t happen in real-time, so there are no concerns about timing issues. It allows you to create your own creative rules, and build upon it with cool graphics.
My latest idea, though, is to make a Tower Defense game. I think it’s the coolest idea yet. It might be most conducive to learning Flash or some other web-based language, because that’s where it’s easiest to distribute– but it certainly doesn’t have to be that way. Tower Defense games have a lot of flexibility. You can have level-ups, different weapons, different bosses. I’m excited about this possibility, but I wonder if it might be too difficult. I’ll have to see someday if I can create a basic tower defense game in one day. If I can, I can probably teach it over the course of a summer. If I can’t, we’ll have to do something to make it easier.
And I’ve always thought programming should be made easier. Lowering the barrier to entry is not a bad thing.
What’s the best language for a beginning programmer?
I first dabbled in programming using BASIC, especially its various later forms such as QBASIC and QuickBasic. But I never got too far self-teaching myself this way. The true revolution for me came with the Cybiko handheld computer in 2001. I started programming games and apps for the Cybiko using Greg Smith’s B2C (Basic-to-C) compiler.
The Cybiko SDK uses the C programming language, but that was too advanced for me at the time. So I jumped into B2C, and by having lots of late-night IM conversations with Greg, learned about programming on a device with very limited graphics and CPU power.
Now, I’ve also programmed using Visual Basic, PHP, Java, C++, and most recently, Python.
Visual Basic is great for easily making GUIs. PHP is by far the best for easy web scripting. I love using Java for object oriented programming. And Python is great for newbies.
This past week, I helped a friend with his final project for CSCI 101. I was amazed by how little he was actually taught. It seems that I am right: introductory programming courses are almost always a failure. It is not the students fault. Rather, the teachers and curriculum are too assuming: the professors learned this 40 years ago, so how would they know how to teach an introduction?
The curriculum itself is not conducive to a good introduction. A good intro requires serious hands-on and 1-on-1 tutoring and mentoring, just like I had with Greg Smith. It also needs creativity: I would like students to come up with the own projects on what to make.
In my own past, I came up with some pretty neat ideas. First, a text-based Pokemon RPG, as part of my little website called “Gengar Studios”. Then, on the Cybiko, I created CyOS XP, which was a version of the Cybiko Operating System which looked more like Windows XP, which was really hot at the time. I also tried to recreate Phoenix, the classic space shoot-em-up for TI calculators. And of course, I loved trying to take full advantage of the 900 MHz wireless communications capabilities of the device.
Today, the Cybiko sells on eBay for somewhere around $10, even for a new model.
So where should we start?