Slashdot Mirror


Guide For Small Team Programming?

dm writes "I run a small design shop and have been doing more and more web development, including fairly involved back-end programming of what's now essentially become our own CMS. Up to now I've been doing all the programming myself. Now we are working with a second programmer for the first time. I already use version control (SVN) and an issue-tracking system, and I guess we are both decent at what we do — although self-taught, but we both lack experience programming in a team context. Is there a useful guide for this? Most of the tutorials I have seen for Subversion are surprisingly organized from a single coder's perspective. Where else should I look?"

30 of 220 comments (clear)

  1. Experiment by Joebert · · Score: 3, Informative

    Nothing beats getting together with team mates and toying with things in your spare time.

    Past that, I suppose just add new people to the mix slowly.

    --
    Wanna fight ? Bend over, stick your head up your ass, and fight for air.
  2. Staggered shifts FTW! by BladeMelbourne · · Score: 4, Funny

    I assume you're the boss, so you could work 9am-5pm and he could work 5.30pm-1.30am.

    That way you can still code naked.

  3. Two obvious ones by Bogtha · · Score: 5, Informative

    Both excellent books for this situation, in my opinion.

    --
    Bogtha Bogtha Bogtha
    1. Re:Two obvious ones by zybak · · Score: 3, Informative

      The Seven Habits of Highly Effective People Very good book..... ----- Drayton

  4. For the love of god - DON'T! by Andreas(R) · · Score: 4, Funny

    The optimal programmer team size is 1.

    1. Re:For the love of god - DON'T! by Anonymous Coward · · Score: 5, Interesting

      That answer depends on the goals for the team.

      Studies and statistics have shown that 3 is actually the best number of programmers on a project. I can't find the reference now, but for a 5M line group of programs where I worked previously, we captured stats on all sorts of things. 3 was definitely the best optimization for productivity, quality, and simplicity. A team produces something better than the sum of the parts.

      1 works if you are an expert on everything (or think you are) or working on a fairly trivial program or have lots of time to finish. Best of all, there's nobody else to point out your mistakes.

    2. Re:For the love of god - DON'T! by hattig · · Score: 5, Insightful

      Only if you're some freaky self-motivated person.

      Otherwise you'll surf the web all day after getting up at 1pm and watching Daytime TV for a few hours.

      Two people will motivate each other. Three people might even get the time to do other business essential things, like the accounts! Also nicer for pub lunches, two people is a bit one-on-one.

      More than three and I think that you start getting communications issues, unless you are all working on very different projects rather than the same codebase. Once you're in the meeting room, with the projector, and the Wii, you'll end up playing Mario Kart, which kills productivity. Also there's enough people to not have the focus on your own work, so you'll surf the web unless you're self-motivated enough or have a deadline.

    3. Re:For the love of god - DON'T! by emjay88 · · Score: 4, Funny

      A team produces something better than the sum of the parts.

      +1 Avoided buzzword "Synergy"

      --
      1178161 is prime...
    4. Re:For the love of god - DON'T! by wellingj · · Score: 3, Interesting

      I agree with the 3 man team idea. It's the same idea as the surgical team from the Mythical Man Month. However, as is proposed here the original idea of the surgical team has changed. The best way to make a surgical team these days is to follow OOP and section of your product in manageable packages with everyone knowing what vaguely goes on in each package, but have a designated person that is known as an 'owner' or 'maintainer'. At least that's what works best for our group at work. I work on an embedded system at John Deere. We have 3 Programmers (one EE, one CE, and one CS), a Control Theory/MechE/Systems (Group Lead), and one Testing Technician (functional hardware testing). This works out really well for us. YMMV

  5. Talk to each other by erikharrison · · Score: 4, Insightful

    There are lots of things I could throw out, sure, but most of them came from principle numero uno - talk to each other. Learn each other's strengths and weaknesses, learn how each other works, learn when a process isn't working for one of you, and learn to evaluate each other's code. Process is really about leveraging communication to improve the product. So start building that communication.

    1. Re:Talk to each other by zappepcs · · Score: 4, Insightful

      Wow, there are probably a few posts going to be about some program that a user loves, but this one is perfect. I've worked the last 8 years in an environment with two coders and 5 managers. What worked for us is exactly what this guy suggested and we did that in spite of what the managers wanted. We developed a perl/cgi template that all the code worked under and it worked so that either of us could look at any of the code and work with it, sharing routines and snippets. Now I'm in charge of maintaining all of it, and it's more or less like I wrote it originally. No matter what programs or coding styles are sold to you, the ONLY thing that will work is what works for the two of you and that will probably not fit into some white paper. Just find what works for you by talking and analyzing what each of you are good at. When you find it, write a paper and go on the talk circuit.

    2. Re:Talk to each other by Jester99 · · Score: 5, Interesting

      There are lots of things I could throw out, sure, but most of them came from principle numero uno - talk to each other.

      I second that. And don't just "talk to each other." There's a lot of different ways you can communicate with one another. For instance:

      Do you both work independently and then regularly schedule periodic code reviews 2x a week? Or do you do code reviews on a more demand-driven basis when someone feels they have a particular milestone to show the other? Or do you sit next to one another and work in a pair-programming team?

      Do you put documents in a shared place that define the design of things? When you discuss designs together face-to-face, do you take notes?

      One of these answers isn't inherently better than any other, but what you should probably be striving for is to take a step back and analyze the process of developing and communicating with your partner itself, and adapt that as you, your project, etc evolve as well. So always try to communicate better this month than you did last month, where defining "better" is specific to you two. Then when the third programmer comes along, you'll have a framework to work with him in as well.

      One concrete suggestion though: For your design docs and instructions on how to build and test things, start a wiki. You might be in charge of 3--5 people before you know it, and the "tacit knowledge" of how to operate your system will be continually harder to pass on without something like this.

  6. partner learning by can.you.feel.my.808 · · Score: 4, Interesting

    when i was taking a class on java programming our teach had us do the following and it was really helpful: the two people would come up with a design draft and then we would take turns where one person would type code while the other partner watched and scanned the code to catch any typos or bad code. we would switch off maybe every 20 minutes or so. this way no one person gets tired and burned out from typing or error checking. this process worked very well for me. it was very helpful to have someone there to catch any mistakes or make any on the fly suggestions they have that might make the programming better or more sleek.

    1. Re:partner learning by Torvaun · · Score: 3, Informative

      Sounds like an excellent way to keep anyone from getting into the flow.

      --
      I see your informative link, and raise you a pithy comment.
    2. Re:partner learning by Anonymous+Brave+Guy · · Score: 3, Informative

      You should read the actual studies before trusting everything you see on Wikipedia. Almost all remotely scientific studies of pair programming effectiveness to date have been conducted with rather non-representative samples of the programming population, e.g., college students. They also tend to compare full time pair programming with no collaboration at all, which is unrealistic because most programmers will naturally seek a second opinion from a colleague at the times when it is most useful anyway. There is precious little research to date comparing the efficiency of two skilled and experienced programmers doing full-time pair programming with what they produce working alone except when they feel the need to collaborate in real time, and what there is isn't nearly as favourable.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
    3. Re:partner learning by Malvolio · · Score: 4, Informative

      There is precious little research to date comparing the efficiency of two skilled and experienced programmers doing full-time pair programming with what they produce working alone except when they feel the need to collaborate in real time, and what there is isn't nearly as favourable.

      One interesting data point is the study Evaluating Pair Programming with Respect to System Complexity and Programmer Expertise by Erik Arisholm et al. from Simula Research Laboratory, published in the February 2007 issue of Transactions on Software Engineering. There's a good summary on the Catenary blog.

      This study is more realistic in that the research subjects were professional Java consultants, rather than college students. However, it appears the study did not allow the subjects to collaborate with anyone outside the pair (or at all, for the solo subjects).

      The abstract of the study:
      A total of 295 junior, intermediate, and senior professional Java consultants (99 individuals and 98 pairs) from 29 international consultancy companies in Norway, Sweden, and the UK were hired for one day to participate in a controlled experiment on pair programming. The subjects used professional Java tools to perform several change tasks on two alternative Java systems with different degrees of complexity. The results of this experiment do not support the hypotheses that pair programming in general reduces the time required to solve the tasks correctly or increases the proportion of correct solutions. On the other hand, there is a significant 84 percent increase in effort to perform the tasks correctly. However, on the more complex system, the pair programmers had a 48 percent increase in the proportion of correct solutions but no significant differences in the time taken to solve the tasks correctly. For the simpler system, there was a 20 percent decrease in time taken but no significant differences in correctness. However, the moderating effect of system complexity depends on the programmer expertise of the subjects. The observed benefits of pair programming in terms of correctness on the complex system apply mainly to juniors, whereas the reductions in duration to perform the tasks correctly on the simple system apply mainly to intermediates and seniors. It is possible that the benefits of pair programming will exceed the results obtained in this experiment for larger, more complex tasks and if the pair programmers have a chance to work together over a longer period of time.

  7. Communicate with your coworker. by burni · · Score: 5, Informative

    Sorry it's not about the perfect solution for your problem, but keeping
    things in mind about the new context can improve things.

    These are the lessons I learned from jobs and life either.

    a.) be precise what you are talking about
    - missunderstandings tend to poison the atmosphere at work

    b.) clear missunderstandings as early as you can

    c.) keep in mind that you now have a coworker
    - trust him, he can do things on his own

    d.) keep in touch with him
    - this means you also report to him what you are doing
    "primus inter pares" first within a group of similars,
    you are the leader? dont behave like "the Führer"

    e.) if you recognize anger, missunderstandings etc.. talk about

    f.) keep in mind two programers are two human beings

    g.) give him all the information you have
    - if information is being held away, he would feel "pissed off".

    h.)
    - "smile"
    - behave
    - use "please" and "thankyou"
    - commendation (wisely used)

    g.)
    let him bring some of his ideas in, discuss ideads,
    if commendation comes from your boss, be modest and inform your boss if it was
    your coworkers idea.

    Communicate! The basic need for team work is comminication.

    These are aspects I learned, when followed, it is allready team work, you don't need
    a special conception for team work.

  8. Re:Move to CVS by Joebert · · Score: 4, Funny

    Google Code uses SVN.


    Subversion wins, fatality.

    --
    Wanna fight ? Bend over, stick your head up your ass, and fight for air.
  9. Re:Move to CVS by StrawberryFrog · · Score: 4, Insightful

    For the love of Dog, please don't move from SVN to CVS.

    SVN was designed as a "compelling replacement" for CVS. And it succeeds.

    I've yet to see a compelling reason to move to SVN.

    That doesn't mean that there's a reason to move back. If you don't see the benefits of atomic commits, keeping version history over file moves an renames, and rapid branching then by all means, stay with your CVS. Just don't drag other people back down with you.

    If nothing else, CVS is pretty much a dead end. The next version of CVS is SVN. SVN has a development roadmap, CVS has migration-to-svn utilities.

    --

    My Karma: ran over your Dogma
    StrawberryFrog

  10. Git and Getting Real by Anonymous Coward · · Score: 4, Informative

    A couple of things -

    1. I've had a lot of luck with git, as opposed to SVN. The ease with which it allows you to branch is a huge boon, and might save you some headaches as you work with other guys on your team. You might check it out.

    2. I think the 37signals guys have a lot of good stuff to say on this in their book "Getting Real", which you can read for free on their web site(http://gettingreal.37signals.com/toc.php).

  11. My tips by dubl-u · · Score: 4, Insightful

    Here's what I'd suggest:

    • Work together - Sit near one another, within easy conversational distance.
    • Integrate frequently - Update and check in every few hours.
    • Write tests - Good nit and acceptance tests are documentation that a computer can verify. Make the computer do the work of making sure the other guy hasn't broken anything.
    • Use a continuous integration server - A CI server will wake up on every checkin and run all the tests. That way you discover problems early, when they're easiest to fix.
    • Work out common standards - Every time you notice a difference in style, have a nice chat about it. Eventually you shouldn't be able to tell who wrote what.
    • Release early and often - The best way to do something well is to do it often. Even if it's an internal or beta release, the more often you guys ship, the smoother working together will be.

    I hope that helps!

    1. Re:My tips by dubl-u · · Score: 4, Funny

      Oops. That should be "unit tests", not "nit tests". I definitely don't recommend checking your fellow programmer for louse eggs. Unless you're both chimpanzees. Then it would be fine.

  12. Re:Move to CVS by StrawberryFrog · · Score: 3, Insightful

    Because of this one point of difference I still don't believe SVN is a mature product.

    I don't think it's because the SVN team are incompetent or haven't finished the basic feature set yet and their product is "immature".

    It's about priorities - Oddly enough, the SVN developer team and community don't seem to have prioritised the feature of a revision-tracking system totally losing track of a revision. Priorities, as in "that's very far down on most people's list of priorities".

    --

    My Karma: ran over your Dogma
    StrawberryFrog

  13. break it down by djhertz · · Score: 5, Interesting

    I run a small dev team for a company of 12 people. 2 of us are 'senior' dev guys, 1 is a graphics guy in marketing, and the 4th is a guy still in school. The rest are professional services or customer reps. My company does web crawling (lots of SQL, perl, automation) and then some web stuff to display the results and various reports. Pretty much I meet with the owner once a week and we make sure we are on the same page as to what the big projects we are working on (more news coverage, some cool new chart system, etc.) then we have a really quick tech huddle every morning at 9:00. Pretty much roll your chair over and we all look at the whiteboard, what did you do yesterday, what are we working on today. Are we on track to get X done for Monday? And y done for next Monday? Every piece of every project is on the board assigned to somebody. We use source control and have a ticket system, here's a good example of how we worked on a recent project together.

    We needed to write a new mail system. We mail out a few thousand reports a day to clients but our old one was prone to errors and failures. I work mostly with SQL, perl, and architecture, I suck at web/interface stuff. I know enough about it to throw a table up but it is ugly. The other senior guy is great at interface stuff, slick javascripty boxes and he's OK with backend stuff but it's never optimized and will bog down. We know what each other is good at and we like it that way! So I sat down in a conference room with my senior guy and we mapped out how to do this. A queue system, this talks to this, we need a template here, this should be stored in a db, this should be in the code, etc. Broke it all down into pieces. I took on the details loading up of the queue system, the other guy took on the reading out of the queue to send the mails. With that he gave the graphics guy the task of "Write up all the CSS to make 4 templates of daily reports, make them look cool". He would then take that CSS and dump it into the mailing code he had written. I had our Jr. guy write internal reporting of the queuing system to track when mails go out and an internal dashboard of it.

    Once it was decided what we were doing nobody had to waste time in meetings or anything, just needed to talk once in a while, "Hey, I'm going to put this flag in the queue tell you which template to use, how do you want to receive it on your end?" Each piece of the project is compartmentalized, I don't even need to think, "gee, I hope the graphics line up" or "Oh man, I'll need to write an internal report for this", it's all been delegated. I just do my part, everybody does there's and when it's all done we test and I just make sure the end product is solid. "Ok, reports going out now? I'll reboot the mail server, let's see if we lose any repots, the queue handles that right?" Not having to worry about all the details makes doing my part much easier. I worried about the details when we designed it, so now it's just getting it done. In the end I'm the director and it's up to me to make sure it's done but I act a lot more like a peer as I do as much work as the other guys, but I also handle all the meetings with the other groups. My team can focus on code and banging that project out while I deal with any BS that would just slow the team down. I've found this is a huge help on moral, how bad is it when the marketing guy wants his cake and eat it too and then the whole dev team just goes back to there desk and bitches about it. Instead I just go to the meeting 1 on 1 and will say, "I think you just wanted to cake here, no eating." That way he doesn't look silly and I can go back to my team and say, "Ok, we are baking a cake." and there is no confusion. I'd say half of being a good dev leader is understand wtf the people really want (not what they ask for) and then translating that to the rest of the dev guys, "Hey, let's be solution providers, not coders."

    I've found using a ticket system is helpful for people outside my department for putting requests in, for

    --
    Modest doubt is called the beacon of the wise - William Shakespeare
  14. Re:Move to CVS by Rayban · · Score: 4, Informative

    svnadmin dump

    (edit dump file)

    svnadmin restore

    A repository is a consistent history. If you want to change the history, you need reconstruct it.

    I've been working with CVS and SVN for ~a decade and have never needed to delete one revision. The closest I've had to come to this is extracting a new repository from a subset of an old one. "svnadmin dump" let me do this without any trouble.

    What's the stop the admin from reading the confidential info just before doing cvs admin, anyways?

    --
    æeee!
  15. Re:Move to CVS by Cyberax · · Score: 3, Insightful

    There's svndumpfilter - it can completely obliterate selected files. A complete dump/load cycle requires a bit of time, though.

    See: http://subversion.tigris.org/issues/show_bug.cgi?id=516

    Frankly, that's a pretty stupid reason to chose CVS over SVN.

  16. From 25 years of team programming... by Organic+Brain+Damage · · Score: 5, Interesting

    1. Keep the team small. 2-4 people is best.
    2. Ignore heavyweight Methodologies and Methodists.
    3. You need a specification, a small document in the language of the customer, that describes what the customer hopes to accomplish with the software you're writing. If the customer cannot understand the spec, you're doing it wrong.
    4. You need some white boards.
    5. You need to get good with a pretty-printer so you don't have to waste hundreds of hours arguing about coding styles.
    6. If you have documents that describe the programs and they are constantly getting out of sync with the code, write clear code with decent names and throw the documents away. On 99% of the projects I've seen (mostly Fortune 500 co's), the documentation outside the code quickly becomes actually misleading and slows people down if they read it first in their attempt to understand the code.
    7. 1 talented, motivated, socially adept programmer is worth 1,000 mid-range unmotivated socially inept programmers.

    Peopleware is pretty good. Mythical Man Month is better.

    Good luck.

  17. Re:Move to CVS by Jack9 · · Score: 3, Insightful

    How about the backing storage? If shit happens, I'd rather try to recover from text files than binary chunks

    You are correct that a text-storage would make recovery easier, although I have doubts that it's at all possible to recover from the Berkley DB in most cases. My question is what kind of failure partially damages a repository that you want to recover whatever part of it you can? I assume a hardware failure. SVN stores text files, binary files, directories. A text recovery for these things would never really be possible anyways. The only way to recover such data would be from a backup regardless of the version control method. SVN is backed up by simply zipping the directory and putting a copy somewhere. I do this daily & weekly. This is how recovery is usually done which is indifferent to filetype. This same approach is done with CVS but causes some serious issues when trying to get everyone back on a restored copy.

    Why would we want granular access to text files in storage? If 'recovery' is high enough on the list to warrant "the primary reason", your revision control needs to have access to the backend storage, the system must have a high failure rate and I would tag it unreliable. I don't know of a reason to want access to the backend storage directly. If SVN were somehow aberrant in this regard, I would admit it, but there are lots of utilities that do not have flatfile backends and it only seems to be an issue with revision control. Sourcesafe, GIT/Bazaar with its hashed key/values or god forbid its crypto hashes, means you can't access their files directly either. Is it really assumed to be a good thing?

    I believe the point of version control is to track all changes, regardless of intent (bad commits count). This does not speak to anything else including recoverability method. I find it mildly disturbing that you can or would alter the history in CVS. In SVN you basically have to dump the entire repository history to make a change to the history. The number of times I've had to restore an SVN backup is 1. That was to do a test of the integrity of the zipped repository over the last 3 years, 12 repositories and near 10000 commits. SVN is stable enough for me.

    In the case where you want or need the peace of mind to be able to alter the "backend storage", I hope you have a long and prosperous career with CVS. We just have different goals.

    --

    Often wrong but never in doubt.
    I am Jack9.
    Everyone knows me.
  18. Re:Move to CVS by muszek · · Score: 3, Funny

    You just have do draw a line somewhere. I for one always have some garlic, a crucifix and a wooden stake in the glove compartment, even though it's quite possible I'll never need them.

    You don't and I'm not gonna hold it against you. I'm not even going to say your car isn't properly equipped.

  19. Re:What I require for my team by thegrassyknowl · · Score: 4, Insightful

    1. Standardized IDE. Everyone use the same thing and you will be able to do builds, deployments, and fix bugs quicker. Eclipse/Zend/VC++ whatever.

    That is the dumbest thing I have ever heard. Horses for courses. I was an Emacs guy until recently when I switched to Vim. We have a couple of other Vim people and an Eclipse guy here. Everyone gets by using whatever 'IDE' that they want. The IDE does nothing except provide them an editor. Forcing the same IDE on everyone is asking for reduced productivity.

    Standardized build and deployment. ANT/Bash scripts/whatever

    With this you don't need an IDE preference. We have Makefiles and Ruby scripts that do everything we need. SCM actions are mangled into scripts so branching, merging, etc are all handled and the right comments (according to our policy) are inserted into the repository. Releasing to production and staging servers is handled and everything works neatly.

    If you get this part right you won't have the headache of forcing a GUI guy to edit code on the console and you won't have the loss of productivity when you get a console guy to try and use a graphical (read: crap) IDE.

    --
    I drink to make other people interesting!