Completing a project of this scale successfully usually requires that a team pay some explicit attention to managing the process. Management is a responsibility of the entire team, though the team leader will naturally shoulder an extra administrative burden and will need to provide a steady influence.
Here are some ideas that you might consider as you work on your project. They have proven themselves useful to many teams in taming the complexity and pressure of large projects.
Writing a compiler is like writing any other large program. Lessons learned in software development can be useful as you work on youir compiler over the course of the semester.
Most teams begin their project thinking that they don't need to identify a team leader. They'll just do everything democratically. As good as that sounds, most teams who try it end up wishing they had selected a team leader. As a result, I require that you select a team leader.
A team leader can coordinate communication among the team and with the instructor. He or she can keep an eye on deadlines and deliverables, freeing other members of the team to focus on substantive tasks. And a good team leader can provide a gentle nudge or sterner reminder when team members need some help getting to work.
I've benefited from working on projects with good team leaders and suffered from working on projects with poor team leaders. I have also learned a lot from being the team leader on a project. The project that taught me the most was probably when I worked on one of my most talented teams ever -- a project on which we failed to meet deadline!
Having an established time for the teem to meet on a regular basis accomplishes several things. It raises the project to a level of commitment, rather than leaving it subject to the other time demands in everyone's lives. It gives each team member a focal point for the work they are doing; each person knows that the team will be meeting to discuss the code or other work they are producing. Finally, it saves the team from spending time and energy to schedule the next meeting over and over.
In many ways, learning a new programming language is the part of this project for which you are best prepared. It is also one that many students do not take seriously enough, perhaps because they assume it will be easy. No amount of technology can change this job. You have to study the language's grammar and other documentation. You have to read programs written in the language. You have to write programs in the language. And you must do all of these carefully.
Managing code for a large project requires discipline on the part of every team member. Good development tools can help you, as well as make programming more fun.
Whatever language you use to implement your compiler, choose a supportive editor or IDE. You can certainly work in a solid text editor such as emacs or vi, though you may want to use extensions to help you manage a project of this scale. You can also choose an IDE that provides other kinds of support. Among some of your choices are:
No matter what implementation language you use, automated testing offers a lot of value on a project of this size. Use a testing framework such as JUnit, Python's built-in UnitTest, Racket's built-in RackUnit, or one of the several third-party tools. Often, your IDE comes with built-in support for one or more test frameworks.
Note: This section may change. I am considering a requirement that all students use a specific repository management tool.
Establish guidelines for maintaining team documents, from draft reports through design and source code to compiled executables. Assign librarian tasks to one or more team members (not the team leader) who will maintain archives and ensure that documents are added in accordance with team policy.
Use software to help you with these tasks to the extent you are able. Use a wiki or a shared Google document to record team notes and minutes and meetings.
Use a version control system to maintain your code and perhaps other docuuments. The department can provide you with access to a Subversion repository on student.cns.uni.edu. If you would like to use one, please let me know.
There are many free version control systems available on the web these days. Many UNI CS students use git as their version control tool, which is available for most OSes. Those who do often use github for an on-line repository.
Consider scheduling all-day work retreats, perhaps two or three over the course of the project. These can be scheduled for Saturdays or Sundays, over for long evenings. The key is to find a time when all team members can attend and devote their full attention to working on the project.
One retreat might be useful in making a huge dent in the parser, or finishing it. Another might be useful in making a huge dent in the code generator, or finishing it. Yet another might be useful for wrapping up the project deliverables and preparing the team's final presentation.
Why go to the effort? Big tasks require complete attention. Short meetings require a lot of warm-up and cool-down time, making them less efficient. A full-day meeting helps all team members to focus on the project and to get maximize productivity out of team time.