If you want to program something in a particular language to prove that you can, chances are good that this will be a learning experience for you. Every now and then, I'll see someone online ask "What should I build to learn how to program?" The answers are always lame.
"Build something useful to you."
"Find something you really like."
"Scratch your own itch."
"It doesn't matter. Just build something."
This is lazy thinking and terrible advice. The answers don't add anything to the discussion. Obviously if they could think of something useful, they wouldn't be asking. Can you imagine the person sitting at their computer, with a list of personal projects that would be useful to them, but deciding instead to broadcast a question to the internet?
Let me ask you this: when is the best time to learn to cook a new style of food? When you're hungry? For the important dinner with your boyfriend's parents? No.
The best time to learn to cook is when you're not hungry. When the meal is not that important. A lot can go wrong. But the risk is not the most important part of the equation.
Learning something new takes experimentation. It takes time. And it takes a certain amount of leisure. You can't get that leisure when you're under the pressure of an important deadline like a mealtime or because you really need the functionality.
I'm going to give a list of ten projects at the end of the email. But I have a warning: it's easy to overcomplicate these things. Your goal is to present something finished and deployed. If you're trying to learn a new language, or you want to learn some new aspect of it, by all means work on a project. But don't make it something so vital that you can't afford to mess up. You will struggle and maybe wind up hating the language. The best thing to do is something small and whimsical.
Grand adventures start with a bold, but tiny, first step. Hello, World! Is a good first program for a reason. There's so much to learn at first. The build tool, the command to run it, input + output, so much! At the beginning, getting all of that settled is hard enough without dealing with bugs in your program.
Of course, you'll want something slightly bigger than Hello, World! on the command line. But think for a moment: what's the equivalent of Hello, World! for web apps? What's the equivalent for Twitter Bots? That's what you should build first. Deploying something small is much better than never deploying anything. You can always add to it later if you need to.
The most impressive early works of artists come out of a very free exploration of a medium. Sure, masters can make even ugly colors look beautiful. But let's face it. At the beginning, we're all bad at that. The reason Hello, World! Is so great is that it captures that frivolous spirit of the artist. What could be more unnecessary than a program that says "Hello"?
The whimsy is what lets you produce something, anything, even if it's worthless. Deploying something that works is better than a failed grand vision that doesn't do anything. Whimsy is what lets you change course when you realize your idea won't work. What's something silly that could work? Whimsy avoids boredom and dead ends. It dodges perfectionism and welcomes serendipity. And after the fact, nobody knows what you had planned to do before you started.
Okay! With that warning out of the way, here are ten projects you can keep small and probably do over a weekend. But each can then be a platform for adding to later, if needed. I've also included the skills that each project demonstrates and some possibilities for expansion. Keep in mind that you have a choice for the platform these run on. For instance, your weather app could be a mobile app or a web app.
This is a classic exercise from the early days of the web. Serve pages out of a database based on the URL.
- Skills: Database, HTTP server, HTML
- Expansion: User login, frontend editing, build an API, search
2. Twitter Bot
- Skills: API access (including OAuth), error handling
- Expansion: Generate Markov statuses, use a database of pre-written tweets, timing, respond to other users' messages
3. Weather App
- Skills: API access
- Expansion: User can interact with weather over time, notify you of bad weather
4. GitHub Notifier
Listen for events from GitHub and notify you.
- Skills: HTTP server (for post hooks)
- Expansion: Rules engine for deciding when to notify you
5. TODO App
- Skills: UI work
- Expansion: Backend (api design), database
6. Twilio Bot
Twilio is an API for text messages and phone calls. Make a bot you can call that will tell a joke.
- Skills: API access
- Expansion: Connect it to TODO list, Connect to GitHub Notifier, Connect to Weather App
7. Meme generator
Basically, put text onto an image!
- Skills: Graphics, file IO
- Expansion: Preview, submission to social networks
8. RSS aggregator
Poll RSS feeds for new articles and make a new feed that combines them.
- Skills: XML, database
- Expansion: Frontend (add new feeds, list of article titles), filtering, saving for later, share buttons
9. Food log
Keep track of everything you eat with a simple submission form.
- Skills: Database
- Expansion: Show trends, search, filter by date, database of known foods
10. Google Map
Make a website that shows places on a Google Map.
- Expansion: UI to add/remove places
These are just some projects doable in a weekend. Remember to keep them small and whimsical. If you're serious about your functional career, you're going to do better with some support. Sign up for PurelyFunctional.tv and you'll get step-by-step lessons teaching you the skills you need to build real projects to prove you can ship with Functional Programming.
And what's better than making a project? Sharing it with others. That's what we'll talk about in the next part. If you haven't done so yet, sign up at the bottom of this page to get all of the parts delivered to you.
Action for the day:
After trying to tweak your resume for each job, you've probably noticed some holes that can be filled in with a small side project. Carve out a block of 3 hours on the weekend. Then do some light planning to find a small project you can build in that time.