Wednesday, April 09, 2008

Starting a Project

Most projects are quite similar in some way:
  • You have to create code;
  • You have to create some documentation;
  • You need to provide introductory materials for new members when they join the team;
  • You need to integrate parts of code created by different developers;
  • You need to make sure that recent changes do not break old functionality;
  • You need to track the progress;
  • etc.
This list can be extended or even detailed if we specify some restrictions, like the projects are in Java, or the projects are Windows applications, and so on. But, for now, let's treat it just as a simple argument in support of the fact, that even if two projects look quite different, they probably have a lot of common needs, which can be combined and described by a pattern.

Of course, it's not surprising, and there are already a lot of methodologies (or processes) describing the rules that have to be followed to cover some or other project needs. And I'm not going to invent just another one technique. All I'm going to propose are some steps, that can be done in the beginning of a project. These steps do not contradict popular existing methodologies, but help people to follow their best practices by focusing on them from the beginning.

So the steps are:
  1. Organize online collaborative environment for the project team (hereinafter, I'll be calling this environment wiki, however it's not the only possible solution). Having a place where every team member can write her/his comments about the project doesn't mean that all of them will provide valuable feedback by default, but if there is no such environment you can be absolutely sure that you'll miss documenting a lot of important information.
    Note: even, if you it's planned that only one person will work on the project, and this person is you, it's still worth thing to do. First of all, it will be a good place for yourself to store project references and materials. And the second, because the plans has a tendency to change :)
  2. Create a section in wiki, that have references to all other external project resources (version control system, file storage, dedicated project server etc.). From the beginning, this area can be about empty or even empty, but it has to be updated when new resources become added.
  3. Create a version control environment for the project. I believe it's not arguable ;)
  4. You'll need to define the workflow and track the progress, so create some To-Do in any format, that you are comfortable with and that conforms to your company practices. It can be MS Project Plan, SCRUM Product Backlog, one column with the tasks in a spreadsheet, anything... Nothing to write to the plan yet? No problem. Add just one item: "Do Work Breakdown and update the plan". Then start following your plan creating and updating new items when you got or explored new information.
    Note: it's a good idea to have some high level plan before step 1, because it's the good source for high-level project estimate.
  5. Organize bug/issue tracking environment.
  6. Need to create Software Requirements Specification? Do it... The only advice is to keep it together with all referred artifacts in wiki, instead of creating static Word document (if it's not contradict with existing company standards or with agreement with the customer)
  7. Ready to start development? Cool! Start it from creating readme.txt and whatsnew.txt files. If you plan to deploy the results to someone else one day, you'll need some supplementary project files anyway.
    Disclaimer: if you are sure you do not need them, then you do not need them... Never do unnecessary work.
    Note: There is a good principle in XP: You Ain't Gonna Need It (YAGNI), which says "never do the work, that is not required yet". So I've ignored it here... I've ignored it here, because actually these files are required already. See the next items.
  8. Create some fake project, add it to version control system, and build it (it can be simple "Hallo World" application).
  9. Update wiki, adding information about project/solution files location and any pre-configuration steps that are required to build the solution locally.
  10. Create the 1st deployment package. It's about empty... Anyway, create it.
  11. Create the one-click-script that knows how to compile complete deployment package.
  12. If you need to deploy your package to some place for testing purposes, create additional script that deploys the package to test environment automatically.
  13. Describe this simple build and deploy procedures in wiki.
  14. OK. So we have the 1st version of our application... 1st version?.. OOPS, we've just forgotten about a way, how this version can be identified on the test and production environment. Add the version info somewhere to the project in a way, it can be easily transferred to the target application. Make sure, that testers and users do always have a chance to find exact project build number that they are using.
  15. Find a way to keep version information consistent among all related files (e.g. project file, readme.txt, installation script file, etc.).
  16. If you are developing something, that should be installed by users themselves, it's a good idea to create simple installation scrip on this step, and include it to the build process. I mean to create it on this step :)
  17. Integrate unit testing environment into the project before creating actual source code
  18. Disclaimer: Actually, this step can be somewhere above.
    If it's a time to extend the team, you've got the 2nd team member, and have to make project introduction, then it's a time to create new wiki page: "Introduction into the Project". This page will be the start point for all new team members in the future. The content have to list all step-by-step instructions including but not limited to: project vision, link to a page with references to other external resources (version tracking; bug tracking; etc.), links to the materials that newcomer have to read. In other words, it should list all items that must be completed by new team member before he/she receives the 1st personal task.
    Important: Make sure, that each new person knows that she/he is allowed and encourage to add or modify the information in your team wiki, to create new issue records (bugs or ideas) in the tracking system, and to communicate with the rest team members.
  19. Before the 2nd developer starts writing source code, establish continuous integration environment.
Of course, completing this steps still doesn't guaranty project success. However, it gives a good basement for the future results, and will help if the team continues using the system.


P.S. By the way, it's possible to create so called "project templates" and use them when new project is being started instead of repeating counterparts of the steps described above.

4 comments:

Unknown said...

That it great, but here's the problem. Lots of projects start from POC, i mean, someone writes 1KLOC hack to check some idea and it turns out that it works. He goes on and shows it to the management and they say "add features x,y,... and then we'll see". By the time POC turns into a project it has 10-50KLOC, some weird build environment, almost no documentation, 2-3 developers (but surely, it has a DEADLINE =). Bringing project to normal shape now requires quite an effort and gives (it seems) no benefits in near future so almost noone is willing to do that.

;-(

Serge Stepantsov said...

That's why I've created this post ;)

It's usually too late and time consuming to clear all the mess after project has been developed for several month. So it makes sense to do all this simple stuff in the very beginning. All mentioned steps can be completed in a day or even quicker if they are being proceeded before there is too much code.

At the same time, I cannot but agree with the situation related to POCs. Almost every time, it seems too expensive to spend time to all these "trappings" if you even do not know that the project will be developed at all. But, usually you still have some good signals that say "It's a time".


Examples:

* Original idea works - it's a good time to document it and to store the code in a version control system.

* Management says "add features x,y,..." - it's a good alarm to start unit testing. Later will be too late.

* The team adds the 2nd developer - it's a good time to create introductory page, and to implement continuous integration strategy (This also means that you have to have an auto build system by this moment).

* There is a bug or idea that is not going to be processed immediately? - it's a good time to start using defect tracking system.

Unknown said...

However, this means that your guideline should be understand and followed by a person working on a POC, doesn't it? And we should educate developers who write POCs in the first place. Or should we place barriers for POCs in a bad shape?

Serge Stepantsov said...

Hm... Usually, developing POC is a non-trivial task, so it's a good idea to assign experienced developers to do this kind of work. I believe, that most of such developers already familiar with listed rules. So the only one thing that should be done is to persuade them following the process from the very beginning, which should not be too hard because those guys mostly agree with mentioned thoughts.

As of horizontal prototypes, which require more analyst skills rather than deep technical knowledge, I would recommend to develop them in a language, different than the language selected for final product. It eliminates the chance of reusing prototype code and structure on the project development phase.