## Programming on a Collaborative Project

### Written by Stéphane Richard (Mystikshadows)

### INTRODUCTION:

As the title suggest this article will try to cover everything you need to know about collaborative efforts and group projects. SOme of you might believe that working as a group is as easy as getting a few of your friends and start coding. THis might work for very small projects but definitaly not if you want to make a good detailed elaborate project that warrants team development. For this reason, you need to organize things and people alike. This is what I'll try to convey during this article, how to know what exactly a project is all about, what it needs, and how people fit in the team and take it all the way to selecting the right people for the job at hand.

We'll start this off by taking a sample project, describe it, break it down so to speak because in the case of projects big enough for team development, if you don't plan you're either killing the project or slowing it down so much that you end up thinking "I should have done this myself". Lack of planning (atleast minimum planning but the more planning the better) is one of the key elemnents that can break a project no matter how good the idea of the project is because let's face it, a big project just isn't that easy to just split in X amount of coders and then patching it all together in the hopes that it all works out. So let's start this collaborative journey and see where it can go shall we?

### OUR SAMPLE PROJECT:

For the sake of justifying this example we'll create an imaginary huge project. This will be a game, a huge game that has many different sections and coding and whatever else to do. This game we will call it Quest For Collaboration. We'll use alot of things for this game as you'll read below. Basically a project so big it would be ludachrist to even think of doing it alone. Here is the ron down of what Question For Collaboration needs to be able to accomplish.

- Coded to work with either DirectX or OpenGL:
  This is a prerequisite as some OS make better use of one of these and others don't. You want this project multi-platform and you want it to rock on all supported OSes. Hence you decided that this was a necessary step.
- 100% Original Graphics For Everything:
  You want people to remember your game or the awesome graphics that were created just for that game. To do that you'll need to think of alot of things and alot of different types of arts. There's more than one of course and they all have to fit together under the main theme of your game. Some people are good at creating characters, others are better at creating background landscapes, to each his own.
- Needs to Have a Good List of Songs and Sound Effects:
  You're a copyright paranoid and and want everything created by you and your team. Since you realize not everyone might enjoy your type of music you also need to create a system that let's them pic their own playlist from the players own files if they so wish to.
- A Very Elaboration Scripting Engine:
  Think of this as almost a programming language in itself. From this language you want to be able to completely control every other parts of the game. From sound to graphics to textures to you name it. You want to be able to do anything you want in this language. So it's a good engine in itself that you can then use in future projects.
- Two distinct Evolved A.I. Systems:
  By that I mean one for your enemies and one for your allies. They both need to perform different types of evaluations and you chose to keep them independant for that reason, just too different to be in the same engine.
- A Brand New conversational system:
  Basically, you don't want the conversations in this game to look like or feel like the classic Zelda games. And you can't find a suitable Open Source alternative to some of the conversational and dialog systems that some of the better games have. Hence, you need to make your own.
- Internet Enabled And Chat Facilities:
  What good game doesn't have this feature? If you're going to go against these big boys this needs to exist as you can understand. Two things basically are needed here. The first is checks for updates and update downloads so the player can be sure to be playing with the latest version. The next one is an IRC Client for the users as well as an IRC server for you (or for the central server that will host the chats).
- A Database System
  Sure some might question this in a game. But what if your game's purpose is to simulate a real world situation like a collaboration project? There is alot of data that needs to be shifted left and right from one module to another. You might be able to use binary files, but a Database system will typically give you your results alot faster and presorted of your queries are formulated right.
- Strong Statistics, Trend analysis features:
  with this you can evaluate certain things from how the player is playing and adjust the AI of your characters accordingly. There's more than one criteria to consider, some of which can only be obtained by a good statistically based trend analysis.

Of course you might look at this and think that you could use this or that to take care of this or that part and you might be right. But for the sake of this project let's say that there's nothing premade that can be used. Or you're stubborn and want everything originally made for this game. Now that we know a bit more about this imaginary project, we can start asking some questions.

### WHAT'S WHAT IN ALL THIS:

You'll notice here that so far I didn't talk about other coders or anything. I can say that the first step to a big collaborative effort like this one isn't to call your friends up front and tell them to get ready to code on your ultimate game project. The first thing to do is to split this project into sections that can then be split into tasks and start thinking about what type work each of them mean. Once you have that (as we'll attempt to do below, then you can start thinking about who does what. So for now, let's enumerate the different types of tasks so that we understand a bit more of the actual work involved.

- DirectX and OpenGL Support Engine What we're talking about here is a high level Interface between these two low level 3d Engines. Something that will detect what's on the player's machine and given the right options as it finds them available. This interface should be able to perform the same jobs on both engines in the most optimal way so that the graphics are nice and smooth no matter which Engine is being used. this engine should also be able to create windows, insert objects, attach materials, adjust camera and lighting and other needed functionality expected from a 3D Engine.
- Graphics and other Artwork this means of course the title pages, sceneries, characters, creatures, things to find this to fix or solve (depending on the game). basically, in a good detailed game like this you're probably looking at a good 300 to 500 original arts, textures and the likes (maybe even in the thousands). Added to that is any cinematographics that you might want added in there as well as visual special effects. No programming here just art and creativity.
- Music and Sound Effects Today, a good game has music (themed music) and sound effects. Depending on how elaborate the game is, this can easily mean a couple 100 sound files and atleast 3 theme songs, one for the introduction, one for the game play itself and typically one for each type of ending the game can have. After that, any more music is usually appreciated by the players, hence, icing on the cake. For this project, let's say there's about 10 themed songs to do.
- Evolved Scripting Engine As mentionned above, the scripting engine should be sophisticated enough to control all aspects of the game from all AI systems to graphics, to music to any events and interactions that can occur between the player and the other characters, allies or enemies, as well as interactions between diffferent elements inserted into the world created in the 3D engine. This way it's a good head start for future games that can make use of this scripting system.
- Enemy and Allie A.I. Systems Remember here that these aren't simple AI engines. And that Enemies and Allies are two different entities in what they would actually have to do in relationships to themselves, against each other, in relationship to the player and to the environment they are in. Diffierent enemies will have to behave differently in all these circumstances and so will the allies. Truly not a small thing to do right.
- Sophisticated Conversational System I guess here that this can be indirectly tied to the A.I. systems. By using a 3 level understanding of the player's input and interactions it would be possible to create a completely independant and surprisingly sophisticated conversation system that could just be plugged in where needed and let it do the rest after you pass it a sentence. How detailed you want to go in this engine depends completely on how much dialog you want to see occur in a typical encounter of two characters (regardless of if the encounter is with an enemy or an allie).
- Internet And IRC Support These two are in the same engine but internally they are two different things. What we need on the internet side is to be able to upload/downloads either updates on the games, new maps, whatever is made possible at a given time. Maybe you'll want the players to be able to create a profile of themselves and upload it to the central server so others can see who they are and how well they are doing in the game so far. On the IRC (Internet Relay Chat) system it's about creating an environment where people can meet up and talk to each other during the game play itself. This means connecting to some IRC server, joining rooms (called channels) and sending messages, sometimes files, other times private messages between two players and other standard chat features like that.
- Database System I won't be a masochist here. You're allowed to use MySQL or some other database system if you want. What I mean by database system is the entire set of tables and queries in those tables to allow you to do typicaly database work like creating databases and tables, inserting records, updating information, deleting records and the likes. Hence you'll need to create these standard SQL queries to do these jobs for each of the table you need in the database system. All this plus the code to connect to the database and execute these queries in the programming language of your game.
- Statistics and Trend Analysis Though this is summarized as two elements, it can ramify itself into a very complex engine. First thing it depends on is exactly what you are trying to get from the data you're analysing and what you plan on doing with those results. What you'd like to do is be able to compare a user's performances in the game against the following: 1. The true right way to act or react in a given situation (which you should know since you're creating the game), 2. Compare things to how the majority of users would and should react in this situation, 3. Evaluate how bad (how far away from the right path so to speak) the player is at all times. There's more, but the object is to learn about the player's way of playing the game because you want the game to adapt to how the player is playing. You'd want that either so you can make the game a bit harder (if he's doing good) or maybe just know what kind of hint to give him to set him back on the right path. doesn't sound all that sime does it? but that's ok, you're going to be a team anyway.

And now we have a better understanding of what and how much work we're dealing with. Depending on the project it might be a good idea to detail this even more than I did here. When you're dealing with any project of bigger sizes, the more you can document and fully understand, the better it is for the success of the project. So then what's the next step? You know what you're dealing with in your project at this point. Now comes the time to take it a step further and start seeing how to involve people in there somehow. So let's talk about this side of a collaboration shall we?

### WHO CAN DO WHAT HERE:

Before you start throwing names in the air. The very first thing you need to establish is if your friends or the people you know best can help you with any of this. You created this project, I'm assuming at this point that you actually want this project to be realized, to see the light of day, hence, to succeed. In that frame of mind, the first question is not "who's gonna do what?" but rather, "Is there anyone (known or not) that can do one of these things, or more?". unless your friends with thousands of people chances are there isn't enough people that you know to fill in all the gaps of the project. Some of your friends or whoever you'd want on the team right now might be able to do some of it. Maybe you know a musician, maybe you know an excellent graphic artist, that's all great if you do. But if you don't, it's not like you can just take graphics out of your project so what can you do?

Indeed, your friends shouldn't necessarily be the first in the list unless you know that a. they can do the kind of job you want them to do, b. they will have time and want to do that particular job. Once you do know the particular kinds of job (as listed above) then you can start asking your friends if they'd like to work on the project and do what you'd like them to do on it. Once you have the answers from those people, you list yourself whatever is not checked in the list so you know what's left to do. For those jobs not yet assigned to anybody you have more than one possibility. The first of which is if you can do it or not. If you can't, can you learn it fast enough for your own deadlines? If not that either, can you get someone else, that knows that stuff, to do it for you? What's the best way to get people to do help you out? Let's look at that right now.

### ASKING FOR THE RIGHT HELP FROM THE RIGHT PEOPLE:

Most of those reading this right now will probably think "ask for help, yeah right!". Well, one thing I can say is if your game sounds intesting enough, that alone might entice some people. Of course, it doesn't stop there. You've seen some people ask for help before, you've seen some of the replies they got too. So why did they get that reply? Let's review some of the possible reasons and try to bring some solutions to them.

- Don't be a stranger:
  Sound weird maybe? This is for the regulars and the newcomers too, this one is addressed at the newcomers if you want help for a project, don't ask and dissapear for a few months. That's the first sign that your project is not going to be realized, atleast it's the first conclusion we can come to when we read your request for help. You have to keep people posted. Let's say you asked for help in 4 different forums and from one of those forums you got the people you needed. Go ahead and let that fact known to the other forums. So we're not all just looking at it for months with "yup, I knew it, another vaporware!" in our heads. If you didn't find anyone yet, go ahead and repost as a reply to your original post. So we know you're still looking for help. We don't have a crystal ball, we can't know these things unless you tell us. This alone shows you have interest in atleast attempting to finish your project and who knows it just might make the difference you need.
- The project is way over their head and will never be realized:
  Sound familiar? I thought so too. That's probably the most common type of conclusion people jump to when they see a request for help on a game. My first suggestion here is to two one of two things in your request for help. 1. You can show that you can do it (no the game is not over you heard) or 2. You can show that you have the people that can do it. No one here is stupid per se. People can read and they can see, if you post it right, that you're not a newbie, this is or isn't vaporware because you either have the know how or the organization and group to make it happen.
- The project is too big way too many things to do even if you know how:
  Well, anyone reading this want to create their own complete 3D flight simulator? That's a huge project and if you look online it's been done, by groups of people. Here again the fact that you are a group and that you want more members shows your dedication to the cause. in a lot of cases, tasks like those described above can be brokem down into independant engines that can be created simultaneously and independantly of each other. If you can spot them and assign people to these independant tasks you successfully cut down the development time of your project. To show this without having coded yet, you need a website or a page that shows how the organization is done. Showing this also shows how ready you are for this big project.
- I don't want to see the results of my work in 5 years:
  This one is typical too, but this is for the readers actually. Sure you don't want to wait 5 years to see your results, in a way, you could help make that time shorted by perhaps seeing where else you could be useful and helping out even more. Your project isn't the only one out there. Perhpas with a bit more of a community effort both projects could be ended a lot sonner than intended or expected.
- Be polite and curdious, give credit where credit is due:
  This one goes to everyone, requested and replyers to requests. If you posted to request help. And you happen to not get any replies, don't go posting that we all suck for not helping you. It won't get you anymore help on your next great game project when you ask for help again. Sure it's no fun to not get replies, but it doesn't mean you won't get replies on your next project. And if you follow the previous three points, you just might get replies which nullifies this particular point. If you're a replier to a post for help. There are ways to reply. Saying something like "I won't participate because I think your game idea sucks!" isn't going to help anyone and especially not you if you ever do need help. You get what you deserve, if you're bad in replying, we'll be bad at replying to your requests for help. This isn't a complaint, simple base rules so to so speak for good relationships for future projects for all. And of course, if you do get help, make a good effort and not forgetting to credit those who helped you. That goes without saying.

So then with these points in mind, you can start to formulate your request for help. Don't post 6 pages long requests just because you want to tell them everything now that you've read this article. It's best to stick to the facts and link instead. Something like: "I'm creating this game which is a 3D realtime RPG. There is alot of work to do and if I'm to succeed in this effort, I'll need help. Here are the types of help I need:" Then you list the different help items on your list. and you can finish it with: "If you're interested in learning more about the game, here's where you can read the details as well as how things are organized for success so far.". And of course don't post that until you do have the page with the information you say it has. If we click on it we don't want to see an "Under Construction" sign, we want to read about your project. You can be quite surprised how much of a difference a little organization and preparation can make in your request.

Now that you have everyone you need, is your job done? The answer is no. The truth of the matter is that at this point, you're only about halfway there. Because once you have your people ready to help you. You need to keep yourself on top of your game (literally and figuratively speaking). For one thing, maybe you have part of the coding or design to do, you make sure you do it, do it well and do it promptly. But that's just the beginning. In the next section we'll look at what you need to take care of from now until the release of your game.

### THE PROJECT MANAGER TO DO LIST:

The first note I'll make here is that I do realize that this isn't a commercial effort, it's a game project you want to do. It doesn't mean that you can't apply some of the professional project management concepts to help you out. So no, I wouldn't expect everyone to get themselves something like Microsoft Project and use that. But there are ways to organize people and work that can play a big role in how long it could take to make the project and how good the chances are of actually making the project a sucess. Alot of them involve simple common sense and a bit of reasoning. The others are there mostly just you help you use your common sense. Here we're going to list some of the better ones to give you an idea and we'll describe what they are and what use you can make of them.

- The Infamous To Do List:
  Yes infamous because most coders don't want one of those. However, you're not most coders, you're the creator of this project of yours and in dealing with a group effort, this can prove to be one of your most powerful tools if done right. It's also a good way to get a quick view of recent progress made to the project. The list should be simple one item per line with a status column, here's a simple example:

  >                     Quest For Collaboration To Do List
  >                       As of Monday, August 27th 2007

  >     1. Arts and Graphics:

  >        Work Item             Resource            Status
  >        --------------------- ------------------- ----------------------
  >        Title Page            Mister X            In Progress (20% Done)
  >        3D Textures           Mister Y            In Progress (25% Done)

  >     2. Music and Sound Effects:

  >        Work Item             Resource            Status
  >        --------------------- ------------------- ----------------------
  >        Main Intro Theme      Mister A            Done
  >        In Play Theme         Mister B            Not Started
  >        Ending Theme (win)    Mister C            In Progress (50% Done)

  This can be done in a regular text file, in a webpage, in a forum post it doesn't matter where or how, the important thing is that it exists somehow somewhere for all members of your team to see. You put all the items you have in your files in this list. This way you have everything you need in one place and you can see what needs to be done next, what needs to be started and so on. As you can see, this is simple enough, and you fill in the status but not before talking to those doing the job of course. which brings us to our next item.
- Set The Priorities Right:
  Sometimes this can be the trickiest. But this is also the task that relies on common sense more than most others. In your project, you can probably determine most (if not all) of what the really important elements of the project are. It's not impossible to start giving an order to things too. If you want the scripting engine to play sounds when issued the right command it's probably good common sense to be sure that the music and sound effects system is working before you start the scripting engine. This way you'll know the engine is there, and you'll also be able to make lists of function calls and their parameters so everyone else that will use this engine will know how to call things in what order to get their music or sound effects to play. This kind of ordered classification of tasks and engines is what I mean by priorities.
- Get Information From Your Team:
  This is good for the first item, the to do list. But it's also good to know if there are any bottle necks. If someone is working on an engine that is needed by 2/3 of your project you might want to see what you can do to make sure that particular engine gets done as soom as possible to avoid useless waits for 2/3 of your team and for you too. Constant progress is the best way to motivate you and your team to move forward and to get things done. If you don't ask the question for two months, you might cause a two month delay in the project. So it's good to ask around at regular intervals just to get a good idea of what's happening where.
- Give Information To Your Team:
  As the organizer of the project it's your responsibility to keep the team going. This means two things. 1. you don't want your team to be stagnent (immobilized by one person) basically, if you ask information from your team frequently enough you can see a bottle neck coming because that particular task just won't seem to be moving forward. Likewise, other members of your team might start telling you that they're waiting on this or that engine or system to be ready before they can start work on this other task. If they can, instead of just waiting, they could see if they can help the other user in some way so that the task gets done and the rest of the project can move forward.
- Keep your team motivated:
  By this I don't mean to by the pizza every friday or the beer. I mean don't be affraid to show some gratitude. Especially on a project like this. People in your team are taking their time to help make your dream a reality. They don't have to even if they are your friends so letting them know their help is appreciated and valued is the least you could do, don't you think? This plus the points above (keeping them informed, keeping the work going, avoiding bottlenecks when you can, all that together promotes the success of your project.
- Know When It's Time To Switch Things Around:
  This means three things. The first is, if you follow the points above, and you can still see some serious dragging in the project, maybe it's time to talk to your people, see what's going on, it's a competence issue? Did someone throw himself into something above their heads when they told you they would do this or that task for you? If you just let it drag you won't know why things happened. And not knowing something in a project is one of it's greatest killers. Don't be mad if they did go over their heads, maybe they didn't know appriori that this task would ramify into such a big monster. It depends how you described it at first and what it is now. The second meaning to this is as I mentioned earlier, to make sure the bigger tasks are attacked first, and in group if you can. If it's over someone's head, maybe another member of that sub group might get an idea that will work. The third meaning is about you, the creator of the project. We all have the best of intensions when we start a project. If you get too many bottlenecks or you have one that just doesn't seem to be able to make it go away. It's time to take step back and see if the problem isn't one level up, in your level need to be broken down differently. If that's the case, don't keep your team in suspense and let them know so they don't bust their brains for too long for no reason. Better to take a week if you have to to replan that section than to let them try to figure it out for three or four months. Better for you, for them and of course for the project.

From these points I think that you can be very well equipped as far as what needs to be done before (all the documentation, organization and so on) and the start of during the creation of the project. In the next section I'll talk to you about some of the tools at your disposal during the creation of your project that are there to help you move things forward. Using this tools helps, but these are more stated in case you're curious because ultimately, with everone on your MSN lists a few emails and time you could probably do the job good enough for a good big project.

### THE TOOLS AT YOUR DISPOSAL:

There exists tools that have been specifically created with project collaboration in mind from the grounds up. So if you have time to familiarize yourself with them you might notice the many advantages they have when you're tackling a team project. It all depends on how you like to work too. This is why I'm listing more than one of these tools because one of them might allow you work exactly like you want to work while another one might be closer to how someone else likes to work. in essence they typically all have the features for group projects, it's all about which of them makes the most sense to you since you're the one that will be using it. But if you're considerate you might want to get your team to look at some of them to see who's confortable with which tool so you can reach a decision on which tool is the best for all team members. Here there are, in no particular orders. Note that all the tools listed here are freely available so don't be affraid to look at them.

- Open Workbench:
  If you happen to be one of those who know what Microsoft Project is, seen how it works, what it offers and you like it, this is the best Open Source alternative to it. It features probably all the features (though I didn't compare them feature for feature) that Microsoft Project has but it's open source and free. It's designed from the grounds up to give you everything that the other one offers and is a great application to work with. If you want to use it but don't know anything about it, I would guestimate the learning curve of this to be about 2 weeks max. which isn't all that bad considering all it offers.
- Task Juggler:
  If you know Microsoft Project and you want something different to manage your projects, Task Juggler just might be the tool you are looking for. It features a unique way of organizing people and resources all based on a grammar syntax file (a script almost) which allows for fast editing. From these files you can then create not only the classic Gantt chart like reports but also many other views of a project that reveal other very important factors of the success of the project.

These two seems to be the only applications (as in not web based) that are probably worth mentionning. What follows is the web based collaborative solutions available that I deemed worthy of mention.

- Dot Project:
  This is a website based collaboration application done in php. It is very much used in alot of collaborative efforts and it seems, by some of the evaluations, to really fulfill its promise to help organize group efforts.
- Active Collab:
  The first thing that hit me about active Collab is how simple a layout it had. It may lack some of the functionality of Dot Project but the layout and organization of information is very well done which might make it a better tool to use for someone starting out in a group effort like this.
- The Trac Project:
  This is one I noticed very recently. The unique thing about this system is that it's a wiki based project tracking system. We all know the advantages of a wiki in itself. Take those advantages and integrate them into a project management tool and you get Trac Project. I have to say that the way wiki is integrated into this tool makes it quite unique and adaptable to it's intended purpose.

Of course there are other groupware / collaboration tools, these are, in my opinion the top three. If you want to see more of them you can visit the Open Source C.M.S. website and check out their "Groupware" section where they list about 10 of them. These type of tools, when used right really help everyone involved (organizers, designers, graphics artists, musicians and developed under any and all of the sub projects involved get their job done without delay. For this reason, I would take a good look at them if you're planning on team development before crossing them out. You just might have that tool to thank for the success of your project so taking time to learn one might not be as bad an idea as you might thinnk. Aside that, if you plan on making your game open source as well, you have the Source Forge website which does offer some groupware features as most of you probably known by now.

### IN CONCLUSION:

A successful team depends on these tools, but they also equally depend on how good you and your team are at staying on top of things. Projects like these are based on good faith of all members of the team. They should also be based on keeping it real. Like I mentioned above, if something is over your head, don't be affraid to say so, right at the start or if you figure it out in the middle of the development, let it be known to the one organizing the project. If it's over your head but you really want to learn how to do it, let it be known too. You might still get to do it and learn what you want you wnat to learn and at the same time others won't expect things that fast from you if they know you're learning along. Simple things like that can really help make a project move forward smoothly and avoid alot of grey areas so it's important to consider this from the very start of a project whenever possible. And this of course can be accomplished with good communication from you, the organizer of the project and the team members. That is between you and team members, team members and you, team members and team members (in different engines for example). Communication is often the key to the success of projects like these so don't hesitate to communicate what happens when it happens. This means that If you know something's coming up that will cut your time available, let it be known right upfront as soon as you're aware of it so that the team can have a chance to adapt itself accordingly.

As with all my contributions, I hope that this was fun to read and most of all that you learned something that will help your next team project to move forward and succeed. That's the bottom line, if this can make your project work then my mission as the author of this article has been accomplished. So, if parts of this aren't as clear as they could be or if you believe you might have a good idea, be sure to contact me (my email is below in my signature) so we can talk about it and see how it can all work out. Until next time, happy reading and "team" coding.

MystikShadows
Stéphane Richard
mystikshadows@gmail.com