Et personligt spørgsmål

Tags:    diverse

Hej (igen*200) folkens ! :)

Lige nu sidder jeg og programmerer på et større system i .NET til at styre mit værelse. Og lad mig begynde med at sige det ikke længere bare er en lampe der kan tændes med en knap, men at det inkluderer alt fra RFID scanner til en nyeligt opsat computer med touchskærm.

Jeg har egentlig meget godt styr på det tekniske, jeg sørger for at fange exceptions, jeg sætter mig altid ind i stoffet før jeg tilføjer noget nyt, og jeg bruger selvfølgelig objektorienteret programmering og satser på sikkerhed og best practice.


Men projektet er begyndt at nå til en grænse hvor det kan være ret svært at overskue det hele på en gang. Jeg har lige siddet og brainstormet 5 sider A4 hvor jeg har trukket streger mellem "blokke" af funktioner, for hver enkelt computer der deltager i systemet. Det skal siges at jeg har programmeret i 3½ år efterhånden og har en bred vifte af sprog under vingerne og også er godt på vej ind i c++. Så det tekniske er altså ingen begrænsning.


Nu vil jeg så bare spørge jer. Hvad er jeres foretrukne måde at overskue sådanne projekter? Når i ikke længere kan have tingene i hovedet på en gang, hvad bruger i så af hjælpemidler?

- Og nogle der har erfaring med subversion? For det er tydeligt at jeg meget snart får brug for en Subversion server (har en Windows Server 2008 R2 stående parat til det. Og ja den er faktisk lovlig.)



EDIT:
Slog lige mig selv at jeg nok var lidt af en torsk og ikke give mere info ud. Måske selvom det tekniske ikke er det vigtigste aspekt her, så kan det være det kan hjælpe med at få fisket nogle gode råd hjem.

Den primære kerne af systemet (som er den mest uoverskuelige og komplekse), kører på en Windows 7 Professional maskine som er koblet til en række hjemmelavet elektronik til at interagere med omverdenen. Den har en (mere eller mindre) avanceret form for logistik / A.I. som hjælper med at håndtere regelsæt for temperatur og lys, fx basseret på min nuværende GPS position, men også om min bærbare fx er i brug. (Ja, jeg er så stor en nørd at det er den letteste måde at se om jeg er i lokalet ;p).

Den har også en multitrådet TCP server som håndtere (og validerer / authoriserer) indkomne forespørgsler fra andre computere.

Og så har den en "service" jeg selv har fundet på, som jeg kalder HSP Network Discovery. Det fungerer lidt ligesom Apples Bonjour og er basseret på UDP til at lade en computer tilbyde en service. Så kan andre computere finde frem til den service helt automatisk via UDP broadcasts. Denne computer hoster en enkelt service som kun er brugt til at finde computerens ip og sende den tilbage til spørgeren. (For brug ved TCP.)

Den har også en alarmservice som kører op mod en database og holder styr på mine notifikationer og vækkeure (som selvfølgelig kan indstilles efter dage og tidspunkter.)

Og jeg fortsætter (gaaaab...)
Der er også en tråd som starter af sig selv, dedikeret til at håndtere objekter i "arbejdskøen" som venter på at blive eksekveret. (Pga vi kommunikerer via Serial kommunikation med de eksterne interfaces til omverdenen. For at undgå at ting bliver tabt bliver de eksekveret sekvensielt, hvilket er ligegyldigt fordi det sker så hurtigt.)

Og jeg kunne blive ved og ved omkring hvordan der er funktioner til at administrere RFID tags / brugere, logning af kommandoer og logning af forsøg på misbrug og tale syntese og..... Ja jeg stopper bare her...



Og det var kun den ene computer! De andre computere (min mors, min bærbare og så touch pc'en - Alle Windows 7 Professional) har også hvert deres klientprogram. Min egen bærbare til at udføre fjernkontrol af værelset og fx slukke / gå i dvale / standby / slukke skærmen / justere lyden, efter kommando fra den primære computer.
Touch pc'en har et lækkert GUI og fungerer som fjernkontrol med lidt ekstra blær.
Min mors computer sender info om systemstatus ind og tillader mig at lave fjernlukning (nej, ikke til at drille de gamle. Mere fordi det kan være smart af og til.)

Så er der selvfølgelig også serveren som hoster en webfrontend og anvender TCP til at vidersende kommandoer / trække info ud af systemet.

Alt i alt blev denne her uddybelse nok alt alt for lang til at nogle gider at læse den, men så kan i vel så pointen



Indlæg senest redigeret d. 07.01.2011 20:05 af Bruger #14381
Brug git. Meget mere overskueligt og enkelt en svn.

Jeg plejer faktisk at bruge, som du, helt blanke sider papir, når jeg skal designe de systemer jeg bruger. Du kan selvfølgelig bruge UML osv. til mere advanceret design af systemet med class'es osv. men A4 fungere helt fint ;)



Brug git. Meget mere overskueligt og enkelt en svn.

Jeg plejer faktisk at bruge, som du, helt blanke sider papir, når jeg skal designe de systemer jeg bruger. Du kan selvfølgelig bruge UML osv. til mere advanceret design af systemet med class'es osv. men A4 fungere helt fint ;)


Tak for svaret!
- Skal kigge ind i det.


Kan også være det bare er øvelsen. Men jeg er stadig åben for forslag.



Brug Subversion. Meget mere overskueligt og enkelt end git.

Hvilket system man bruger er en smagssag, så mit råd er bare at vælge et. Men det skal man så også gøre, for det gør livet som programmør meget bedre.

Store systemer er komplekse, nær umulige at udvikle, så tricket er, at dele dem op i mindre dele, som er lettere at overskue.

Du kan endda dele systemet op i flere programmer. Det gør jeg med store systemer.

Tegn det op på et stykke papir. Drop UML diagrammerne på computeren, for det tager for lang tid. Kuglepen og papir, det rykker. Og forestil dig så, at dine opgaver skal løses af mennesker. Vil det give mening, at alle opgaver løses af samme person ? Eller skal 10 opgaver fordeles på 10 forskellige personer ? Hvordan skal de så kommunikere med hinanden ? Skal de overhovedet det ? Måske de bare skal have en fælles leder, som alle kommunikerer med, og som så styrer slagets gang.



Lyder som et meget spændende og ambitiøst projekt :-). Det er godt at høre at der er nogle der har nogle projekter de brænder for.

Personligt bruger jeg SVN til alt kode jeg skriver og tjekker ofte ind. Det gør det også nemmere at tage backup, for jeg tager bare en backup af hele SVN repositoriet.



Jeg bruger Git.

Til at overskue sådanne ting, laver jeg tit kalde diagrammer for de enkle funktionskald. Jeg laver også diagrammer computere imellem, og jeg prøver at lave små "tegninger" af forskellige use cases. Alt dette laver jeg inden jeg går igang med at kode. Mht kodning, så bruger jeg TDD.

Hertil lægger selvfølgelig at jeg prøver at lave user stories og klassediagrammer for det vigtigste, hvor jeg sørger for at nummere det hele så jeg altid kan tage fat i en user story, og finde de centrale dele til den (kalde diagrammer, klassediagrammer og andet vigtig).





Indlæg senest redigeret d. 07.01.2011 22:53 af Bruger #1151
Jeg takker for svarene! :D

Robert Larsen:
Jeg tror også stadig jeg går for Subversion. Jeg kiggede på både Git og Subversion og jeg må indrømme sidstnævnte lyder mest attraktiv i mine øre.

Det med at dele det op i flere programmer ønsker jeg ikke... Jeg har haft prøvet det koncept før og jeg har ikke fundet det tilfredsstillende. Og så syndes jeg også at det er lidt "hacket". Det vil også blive væsentligt sværere at styre den (synes jeg.)

Desuden er alting allerede inddelt i class'es så det er noget af det samme. Jeg har lige nu og her 12 - 16 class filer hvis jeg husker korrekt, hvori jeg definerer en af hver klasse øverst i programmet og så bare bruger den ned gennem procedurene... (Nostalgi - aaarh version 1 af kontrolsystemet. Alt sammenrodet i en stor fil! - Er ved at lave v3 nu. Version 2 var stor, den her bliver enorm.)

Jeg går efter fældes leder arkitekturen som så kører over den primære computer. Den er gearet mod minimalt nedetid i forvejen da jeg alligevel ikke kan tænde min sengelampe uden at den er online (no joke).


Kim Jensen:

Jeg takker ærbødigt for de rosende ord. For at gøre lidt reklame vil jeg løbende publicere mine projekter på min blog som kan ses i min signatur. Dog skal man ikke forvente at se hele sourcekoden frigivet på en gang da det er lidt "mit barn" og det alligevel er så meget tilpasset mit eget miljø.

Martin Slot:

Lyder som en interessant tilgang, kunne være den skulle prøves. Jeg slog lige TDD op og det viste sig at jeg åbenbart altid har brugt det uden at vide det... Når jeg laver en ny ting starter jeg altid med at teste den i et separat projekt, så konvertere den til en klasse, og dernæst integrere klassen ind i hovedprogrammet.

Jeg har også overvejet at få mig et whiteboard (ikke bare et fra Aldi men et stort et) og montere det bag mig. Hele mit liv er centreret omkring programmering alligevel, så fordi jeg har et 62" whiteboard med brainmap bag mig ville være ligemeget. Nåh vi må se hvad forældrene vil donere ;)



Alle:

Endnu engang tak for svarene, jeg vil stadig forblive åben over for yderligere respons.






EDIT:
Har måske ikke så meget relevans til mit originale spørgsmål men har lige købt det her whiteboard. 60 x 90 cm. Burde være nok til at jeg kan udfolde mig lidt det næste stykke tid :P

http://www.shopitonline.dk/INOUT-WHITEBOARD-TAVLE-MEMOPLAN-SLV-60-X-90-CM/cat-p/c/p2493453.html



Indlæg senest redigeret d. 08.01.2011 00:26 af Bruger #14381
Jeg bruger en blanding af Subversion og SourceSafe, alt efter hvad det er for nogle projekter.

Jeg har forskellige projekter, alt fra 5 filer til, til et projekt med omkring 1000 klasser, med hver klasse i hver sin fil.

Typisk laver man det jo lagdelt, således at hver lag kun arbejder med det lag under den selv. Det bruger man typisk namespaces til. Og de kommer autimatisk i Visual Studio når du tilføjer en mappe. Fx har jeg en mappe der hedder "Repository" fordi jeg bruger et repository pattern, inden i det har jeg to mapper, "interfaces" og "implementation" til henholdsvis mine interfaces og min implementation af disse interfaces. Så har jeg ofte en mappe/namespace der hedder BLL (Business Logic Layer) som indeholder forretningslogik, og alt efter hvilket projekt jeg arbejder på, så kan det godt være partial klasser. Hvis ikke man kan lide "Repository" tankegangen, så laver man typisk en "DAL" namespage (Data Access Layer) hvor man har alle de klasser der står for at hente data ud og pakke dem ind så man kan bruge dem.



TDD er altid godt at bruge. Ihvertfald i mine øjne. Men jeg gør også som Brian. Jeg har delt det hele op i flere lag. GUI, Model og DAO (Andre ord for det samme Brian nævner). I mine øjne er det vigtigt at man husker på at have høj samhørighed og lav kobling mellem alt man laver. Nogen gange er det svært at gøre, men som udgangspunkt skal man stræbe efter dette.

Jeg har faktisk også gået og puslet med det samme som dig Henrik :) I et år nu. Jeg har dog ikke haft meget tid til at implementere noget, og jeg har skrottet det hele et par gange. Men her for en uge siden faldt det sidste på plads, og efter den 14/1 går jeg igang med at udvikle mit. Jeg forsøger at lave det hele omkring HTTP protokollen, hvor jeg laver små "webservices" til hver controller. Til at opdatere og ændre controllerne vil jeg bruge APP, og derved forhåbentlig opnå at jeg kan sammenlinke de forskellige controllere. Jeg vil prøve at lægge mig så meget som muligt op ad en Ressource Orienteret Arkitektur.

Jeg er lidt nysgerrig. Hvad hardware bruger du (tænker på controllere osv)? Jeg bruger fx en Arduino som test, og skriver min controller kernel i C, hvilket forhåbentlig gør at jeg udenvidere kan portere den til en anden platform, hvis dette skulle blive nødvendig. Jeg bruger SCons til kompilering og CUnit til test, da disse er platformsuafhængige. Bruger du kun C# og .NET?



Jeg har lige nu og her 12 - 16 class filer hvis jeg husker korrekt


Ja ok, hvis vi er nede i den størrelsesorden, så ville jeg heller ikke dele op. Mine systemer har over 1000 klasser (eller hvad der svarer til klasser), og så er det meget nemmere at styre, hvis hvert ansvarsområde får sit eget program. Det er også nemmere at teste og skrive scripts til. Det er lidt af filosofien bag Unix, at hvert program skal kun kunne én ting men til gengæld gøre det godt: http://en.wikipedia.org/wiki/Single_responsibility_principle



TDD er altid godt at bruge. Ihvertfald i mine øjne. Men jeg gør også som Brian. Jeg har delt det hele op i flere lag. GUI, Model og DAO (Andre ord for det samme Brian nævner). I mine øjne er det vigtigt at man husker på at have høj samhørighed og lav kobling mellem alt man laver. Nogen gange er det svært at gøre, men som udgangspunkt skal man stræbe efter dette.

Jeg har faktisk også gået og puslet med det samme som dig Henrik :) I et år nu. Jeg har dog ikke haft meget tid til at implementere noget, og jeg har skrottet det hele et par gange. Men her for en uge siden faldt det sidste på plads, og efter den 14/1 går jeg igang med at udvikle mit. Jeg forsøger at lave det hele omkring HTTP protokollen, hvor jeg laver små "webservices" til hver controller. Til at opdatere og ændre controllerne vil jeg bruge APP, og derved forhåbentlig opnå at jeg kan sammenlinke de forskellige controllere. Jeg vil prøve at lægge mig så meget som muligt op ad en Ressource Orienteret Arkitektur.

Jeg er lidt nysgerrig. Hvad hardware bruger du (tænker på controllere osv)? Jeg bruger fx en Arduino som test, og skriver min controller kernel i C, hvilket forhåbentlig gør at jeg udenvidere kan portere den til en anden platform, hvis dette skulle blive nødvendig. Jeg bruger SCons til kompilering og CUnit til test, da disse er platformsuafhængige. Bruger du kun C# og .NET?


Nu er jeg da også interesseret, er altid interesseret i at høre hvad andre foretager sig ! (tjek evt. avbrand.com og projectjarvis.com for inspiration. Ikke noget source, men de to mennesker har simpelthen gået hele vejen! :D )

Anyway, jeg bruger en Arduino Duemilinove (stavet forkert) og en Arduino Mega. Mega'en har et protoskjold på hvor alle forbindelse er sat over til nogle stik så alt er modulært og kan skiftes hurtigt. Den har jeg blandt andet bygget nogle boards til at interface med fjernbetjente stikkontakter og en masse andet.

Den lille Duemilinove har et motorskjold på og styrer min varme og mine persienner.

Jeg har også nogle små standalone versioner jeg er ved at bygge som kan snakke med TV'et via IR og modtage fra fjernbetjeningen, hvor det bare er Atmega328/168 som er standalone med en krystal, og en billig kinesisk USB til TTL chip.

Og de er programmeret i standard "Arudinosprog" - primært fordi der er så mange eksempler på det.

Og ja jeg anvender kun .NET og så PHP / MySQL til frontend og API systemer som skal kommunikere ud af til via mine servere.
Og når jeg siger kun .NET så er det fordi der både er C# / VB, hvilket jo i bund og grund er lige meget fordi de kan det samme. Men selvom det måske lyder som en lidt "plat" årsag, så nogle gange bruger jeg VB til ting fordi jeg godt kan lide With funktionen til at gøre koden kortere / mere læsbar.

Anyway, der er faktisk også noget Java inden over, det er til min HTC Desire (den har sin egen klient) men det er en helt anden snak.




Til alle jer andre

Jeg kan kun gisne om hvordan det føles at have 1000+ klasser i et projekt. Skal så siges jeg også har nogle dll'er hvor jeg har flyttet noget af funktionaliteten over i, men stadig no where near 1000.



t