Originariamente inviato da MisterBean
In generale i passi da seguire sono:
1) Analizzo il problema che mi è dato, e preparo una lista di requisiti che l'applicazione deve soddisfare (senza pensare a come implementarli!).
2) Comincio a creare la struttura del progetto e a pensare alle varie classi che possono servire per implementare le funzionalità.
3) Scrivo codice.
4) Testo il corretto funzionamento del tutto.
I punti 2 e 3 sono soggettivi, si affidano in gran parte all'esperienza e alle capacità di ognuno nel problem-solving.
Esistono però delle best practices chè è opportuno seguire, come concentrarsi sull'estendibilità del codice (in sostanza, cercare di sfruttare al massimo ereditarietà e polimorfismo) e sulla sua manutenibilità (quindi prestare attenzione alla modularità).
Se ti è chiaro ciò che devi realizzare, inizia a preoccuparti di come strutturarlo in maniera "furba", in modo che sia facilmente estendibile. La stesura di un class diagram allora verrà naturale, ma è solo la conclusione di un percorso di progettazione, non l'inizio.

Ho già i requisiti funzionali belli e scritti nella traccia. Mi sono scritto, in maniera spero corretta, i casi d'uso.

Ora questo strutturare in maniera più riutilizzabile possibile mi sfugge.

In poche parole il progetto è un programma per cellullare, che legge da un file di testo in input (che dovrebbe simulare dei sensori wirless che trasmettono dati, ma non avendo questi sensori facciamo finta che leggiamo ogni tot di tempo dal file di testo), e:

Visualizza a schermo i valori letti utilizzando un opportuna formattazione;
Da delle cromatizzazioni dello schermo se i valori letti vanno oltr una soglia e riproduce anche un suono di allarme;

Memorizza su un file di journaling questi dati e, all'utente che utilizza il cellullare ogni giorno gli permette di visualizzare solo le ultime 100 stringhe del file di journaling, ad un autorità di controllo (un'altra tipologia di utente) permtte di visualizzare l'intero storico.

Il progetto prevede anche due successive reimplementazioni ovviamente atte ad incasinarti nel caso hai progettato male la prima.

A questo punto che faccio? non sapendo che mi aspetta per il futuro cerco di fare classi più specifiche possibili così alla peggio non mi tocca stravolgere il codice?

Mi tocca farlo in c# con compact framework per i cellullari, dove posso trovare una guida rapidissima? mi serve anche grossomodo capire che tipo di ereditarieta supporta, perchè queste cose le ho studiate in linea generale e poi le ho applicate in java, ma per il c# proprio non saprei.

E' anche vero che il progetto si deve slegare dal codice, però se so già che lo devo sviluppare in c# e metti caso che il linguaggio non supporta l'ereditarietà multipla, magari evito di fare certe cose nella progettazione.