In bigger projects or projects where client relationships require more management it is good idea to have someone in the team who is able to play the role of a proxy between development team and client. It seems to me that this proxying is one of the main reasons to have organizational and technical parts of project management divided between two people. Of course organizational manager can have several other tasks as well. However in order to keep this topic within reasonable limits I will concentrate on that particular facet of management. This does not mean that several arguments would not apply equally well in the context of other responsibilities.
In normal situation team should be able to communicate freely with clients to gather requirements and to get feedback on implemented features. However there can be some special situations e.g developers are so overloaded with additional client requests that it starts to have significant negative effect on project schedule. In these cases it is needed to have someone in the team who can be the advocate of the whole team and deal with such issues so that others can focus on their own tasks.
Following is a short analysis of different role combination options for project manager.
1) pure project manager
Project manager has no other roles besides being advocate between development team and client.
As project manager has only this one primary role then he/she can concentrate 100% on solving raised problems without causing any additional bottlenecks by not being able full fill other tasks during crisis. This strength is however also the weakness of this option. It is difficult for project manager to be actively involved in development as he doesn't have any additional producing roles. However preceding means that he has to rely mainly on the information from developers or other team members when going to a "trial".
2) project manager as developer
This is basically to say that team lead and organizational manager are one person.
Although in small projects this may seem cost effective there are several difficulties involved in this solution. Firstly it is very hard to find such person who is good team lead and has all the necessary qualities to be successful project manager. Secondly this pattern scales even worse under pressure than project manager as tester. This is so because most often the input provided by developers plays most significant role in solving problems. However project manager-developer is not able to commit as much as needed to implementation tasks during crisis.
3) project manager as tester
In this case project manager is also playing the role of test engineer.
The good news is that by taking the role of tester project manager has direct access to the system and therefor doesn't need to rely only on information received from others. Also testing often enables one to get better overview of the system (as seen from user's perspective) compared with pure development tasks. Negative side of this approach is that if playing the role of proxy starts taking too much time then testing cannot be done that effectively anymore. That may cause additional problems in keeping project on track during crisis.
It seems to me that this option is the best one in most situations as it enables manager to be both good advocate and also an active member of development team.
Here's an interesting video about some cool syntax in the next C#:
http://channel9.msdn.com/Showpost.aspx?postid=236352
It gets interesting after the first 8 minutes or so, when they show a
demo in Visual Studio 2007. As a simple example, you can write SQL-like
queries on regular data:
int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};
var lowNums =
from n in numbers
where n < 5
select n;
Under the covers, this code uses anonymous functions (another new feature in C#). Such queries can also be used with O/R mapping (so you can literally use the same queries on arrays and database tables – good for unit testing, for example).
Personally I like that C# is adopting such language features. They have not been traditionally included in statically typed languages such as Java and C++, and C# is now implementing them quite nicely, without loosing type safety and with support for things like refactoring and IntelliSense.