Lucid has hosted multiple programming competitions and is about to host our biggest one yet in March—Code Kerfuffle—with $50,000 in prizes. Here are some things I’ve learned from helping plan and run Lucid’s programming competitions.
1. Define your purpose
The first thing to keep in mind when planning competitions is “why?” Why do you want to run a competition? Is it to increase your company’s publicity? Is it to raise awareness of a social issue? Or to increase your potential pool of hires? The answer to “why?” will influence everything else.
2. Form your team
For a competition to be successful, you need a well-organized team. When we start planning a competition at Lucid, usually one person volunteers to be the competition organizer. Their job is to coordinate efforts to make the competition a success.
First, the organizer needs to assemble a team. They recruit others to help write problems and run the competition. At Lucid, posting a message in the #dev channel on Slack has been most effective. This call for help instantly leads to a team of interested people who can meet to go over logistics. Sometimes one person sets up the venue, while another person runs the coding part of the competition on HackerRank. Your team can generate, write, and proofread ideas for problems. With various team members running different parts of the competition, one person isn’t left doing all the work.
3. Determine the location
Since the office parking lot probably doesn’t have tables, power, and a good Internet connection, it’s important to find a place that will work for your competition. This could be a school, university, company, or any place with a large gathering room with good Internet access and enough charging outlets. Of course, you could eliminate the venue altogether by having the competition be entirely online and letting people program wherever they want, but having everyone together in one location can add to the energy and excitement.
Consider whether you want to use a computer lab or if people should bring their own laptops. Make sure there is space for everyone… and pizza.
When we run the Lucid Programming Competition at different universities, we coordinate with different groups on campus (like ACM-W) to find rooms and advertise the competition. If you’re lucky, those groups might also help run the actual event. In any case, the location has a big impact on contestants’ experience.
4. Set rules
The rules are extremely important, both for creating problems and running the competition. Make sure the contestants know exactly what is and isn’t allowed. Here are some things to consider:
- Is it an individual competition, or can people work in teams?
- How many computers can each team use?
- What online resources are allowed, if any? Language documentation? Everything?
- How are problems scored? Are there points for partial solutions that pass some test cases, or is it all or nothing? Are problems timed? Do wrong submissions add to participants’ final time?
5. Write the problems
When designing the competition problems, think about the target audience. Is the competition aimed at middle schoolers who just took a summer programming course, or is it geared towards professional programmers with years of experience?
In either case, problems should be written to the participants’ level but cover a wide range of difficulty within that level. Whatever the group is, it may be good to have a problem or two everyone can solve, as well as problems tailored for more advanced participants.
You may also want to consider creating a theme around your competition problems. Will your competition questions all relate to nature, computer games, food, or something else? Does your competition’s purpose logically lead to a theme, or do a bunch of the problem ideas have something in common? Or, do you not want a theme at all? Advent of Code is a great example of a competition with a Christmas theme.
When I’ve helped plan competitions, generally the planning team comes up with a set of problems, each problem’s difficulty is rated, and then a selection is chosen. If there are too many problems at one difficulty level, problems can be simplified or made more difficult, or the team can think up additional problems.
In addition to including a variety of difficulty levels, it’s important to consider a range of programming topics, principles, algorithms, and data structures. There may be cases where a good problem has multiple solutions, but naive solutions will not pass all the test cases or will time out, while more elegant and efficient ones that use the correct data structure or algorithm will cover edge cases and quickly pass all the tests.
Once the problems are chosen, programmers on the planning team write the problems, including solutions and test cases. Like all code at Lucid, our competition problems are reviewed and modified until everything is awesome.
6. Host the competition
While there are multiple ways to run a competition, HackerRank is an easy and popular service that takes care of the scoring, timing, and other aspects of the competition.
Once the problems have been written, consider having a practice competition. Lucid frequently hosts internal competitions before running actual competitions. Doing this helps assure quality and allows us to find and remove ambiguity from problems if there is any. If there are kinks in any part of the process, they can be ironed out before the actual competition.
Whether in a practice run or the actual competition, there are a few administrative details you’ll want to communicate to competitors. Make sure that participants know whether or not they can ask questions. Will any help be given and under what circumstances? Will answers be posted publicly when there are legitimate concerns so that no one gets an unfair advantage? Also, consider whether or not the scoreboard should be public throughout the competition. Should participants know which teams are leading and how individuals are doing, or will it all be revealed at the end?
It may also be helpful to post some sample problems before the competition. Sample problems can help answer most of the competitors’ questions about the format and other expectations, as well as provide everyone with a chance to practice.
7. Give away prizes
Prizes are an important part of getting people excited about a competition. One thing that has been successful for Lucid in the past is holding a raffle at the end of the competition in addition to giving prizes to the winners. This encourages people to keep competing and stay to the end, and adds a bit of fun for everyone. Consider your budget and what your audience will be most interested in. A few ideas for prizes might be an Amazon gift card, a board game, a nice keyboard, two tickets to a sports game, or gift cards to a nice restaurant.
8. Follow up
Depending on what your initial purpose was, see if you have some quantitative measure of how successful the competition was. How many participants and spectators attended? Do you have potential hires to follow up with? Did you raise awareness for a good cause? Consider how your programming competition went and what you can change in the future to make it even better.
In Russian, there is a saying that goes, “Repetition is the mother of learning.” The best way to become a good programmer is to see good examples and to practice. The best way to run a programming competition is to see other competitions and then go ahead and run your own.
If you want to participate in an awesome programming competition and see how it’s done, Lucid will be hosting a massive one with $50,000 in prizes this March. Check it out at codekerfuffle.com.