views:

193

answers:

5

I am about to embark on a project mostly using C# that will involve client and server communication.

I'm wondering how to plan out a project like this.

I usually just jump into smaller projects and figure things out as I go because I have a diagram in my head.

How do I design a complex project before knowing everything it will require takes?

How do I know if I have a good design or a crappy one?

Sounds stupid, I know, but I have taught myself everything I know so I haven't really had any experience working in groups or with instructions.

+5  A: 

"How do I design a complex project before knowing everything it will require takes?"

If that's worrying you, then figure out everything it will require.

Read Walker Royce's Software Project Management.

Projects have four parts.

  1. Inception. Defining the Scope of effort and the things you will deliver. What you're doing now.

  2. Elaboration. Getting the details of "what" it's supposed to do. Determining "how" it will do that. What you need to do next.

  3. Construction. Architecture, Programming, Testing, Integration.

    How do you validate your design? Several techniques that you can apply.

    a. Technology Spikes, also known as a Spike Solution. Confirm the technology in depths as soon as possible.

    b. Test-Driven Development. Always plan for testing what you're building.

    c. Incremental, Agile development. Look at scrum. Build in pieces starting from the most important and valuable piece.

  4. Transition. Usually to production, but sometimes to other folks for integration.

S.Lott
+1  A: 

three steps:

  1. graph, what does what, what goes where

  2. outline and draw, outline what will happen, and how it will happen, draw any GUI's

  3. do it

if one and two match and make sense then it's a good design! If stuff is wasted then the design sucks

Matt S.
+1  A: 

one of my favorite quotes was from a co-worker, who once said "I like to do as much programming as possible before I start coding", and that's the attitude I've always taken towards it.

I like to start by doodling, writing things in plain english, then start writing detailed diagrams, UML or whatever you prefer. figure out the best way to structure the objects, what design patterns (if any) are applicable. once you have a strong idea of how the app is going to work, start coding!

GSto
too bad this style is out of fashion nowadays
+2  A: 

Before I start a large project I just sit down at a word processor and work out EXACTLY what I want the software to do. Then I compartmentalize the functionality into different areas. Figure out dependencies and write a specification detailing how it's all going to fit together and work (how the data will be structured etc).

All this if before I have written even a single line of code. By this point I know exactly what I need to write, how to write it and where it belongs.

Best of all, the written documentation is already mostly complete!

Tom Savage
+2  A: 
  1. Watch first 2-3 videos from Autumn of Agile. It covers brainstorming and writing down user stories, setting up PM software (TargetProcess, i love it!), defining tasks and iterations, etc.
  2. Read Functional specification blog posts from Joel Spolsky, where he explains what's the difference between functional and technical specs, and why you need them.
  3. and maybe i would also recommend reading Foundation of Programming short ebook, to get familiar with problems on building enterprise systems (well, it can be applied to almost any software development, in my opinion), why's agile good, what's DDD, etc. Really nice high level overview
Hrvoje
That Autumn of Agile stuff is really awesome!
There's Summer of NHibernate, which is also great learning resource.
Hrvoje