dinsdag, november 29, 2005

06:00

Zes uur, zo laat sta ik elke dag op. Als ik ergens aan moet wennen in mijn nieuwe baan is het dat wel. 5:25 gaat de wekker. Ik stel het moment nog een half uur uit, dan: douchen, aankleden, ontbijten en hup de auto in!

6:45 zit ik in de auto en elke dag rijd ik langs mijn oude werk. Waar alle lampen nog uit zijn: luiaards! om 8:00 uur ben ik op mijn werk. Om 12:00 een half uurtje pauze en om 17:30 stap ik weer in de auto om rond 18:30 mijn lieve vriendin weer te begroeten.
Koken, eten, charmed kijken en het is al weer 20:00! Nog 2 uurtjes te gaan voordat ik weer ga slapen.

Had me een paar jaar geleden verteld dat mijn week er zo uit zou zien en ik had je voor gek verklaard ;)

dinsdag, november 22, 2005

Software maken, zo moet het!

Ik zit nu vier dagen bij een klant en nu weet ik weer hoe je software moet maken. Ik ben via mijn werk gedetacheerd bij een klant die medische apparaten maakt. En het zal niemand verbazen dat er strenge eisen aan hun producten zitten. Een gigantisch programma, met 10 man wordt er aan gewerkt. En toch wordt de deadline zonder stress gehaald. Dat noem ik nog eens projectmanagement!

Hoe doen ze dat? Heel simpel: ze hebben een lijst opgesteld met requirements, en hebben heel veel use-cases beschreven. Bij een use-case kunnen weer supplemental requirements horen. Elke milestone worden een aantal requirements geimplementeerd met de bijbehorende use-cases. Hiervoor wordt via de "delphi" manier een requirement ingepland: een aantal mensen schatten onafhankelijk een requirement in. Deze worden naast elkaar gelegd en beschreven. Tijdens het programmeren heeft iedereen een takenlijst. Als je een taak af hebt bied je hem ter revieuw aan aan een andere programmeur. Als hij hem geodkeurt komt hij pas in de hoofd release.

Elke nacht wordt de laatste versie uitgebracht en automatisch gebuild en ge-unit test. Lukt het builden en lukken de Unit testen dan wordt dat de nieuwe versie. Mislukt het dan blijft de versie zoals het was. Zo heb je altijd een buildende en unit-geteste versie in je source control. Daarnaast hebben ze issues, die worden toegewezen aan programmeurs voor analyse. Bij de analyse wordt bepaald wat het probleem precies is en wat er moet gebeuren om het op te lossen. Daarna wordt pas besloten of en wanneer het probleem opgelost wordt (in welke milestone).

Per usecase zijn ook testcases gedefinieerd die alle requirements afdekken. Bij elks milestone release wordt de applicatie volgens die testcases getest. Het kan zijn dat je een change request krijgt en dan moet je eerst de requirements en use-cases aanpassen. Ook dat wordt gereviewed en moet goed gekeurd worden.

Het klinkt heel ingewikkeld, maar het werkt erg soepel. Alles is vooraf gespecificeerd. Alles wordt goed getest. En zomaar wijzigen is er niet bij. Alle issues worden bijgehouden en ingepland. Zo is het project managable en enige vorm van stress heb ik nog niet gezien :) en dat terwijl de volgende milestone over 4 weken af moet zijn en het geen simpel applicatie en wijzigingen zijn. Software maken? zo moet het!

(en ja een website is ook software ;) )

Website development

Als je ergens midden in zit zie je vaak goed de details. Maar je moet afstand nemen om de grote lijnen te zien. En op die manier heb ik na kunnen denken over het maken van een websites, maar nu van een afstand ;)

Hoewel UML prima geschikt is voor OO ontwikkeling is er geen model specifiek voor web-development. Terwijl er toch een groot aantal webapplicaties ontwikkeld worden. Een van de grootste krachten van UML zijn de use-cases. Samen met de klant kun je zo op een hoog abstract niveau de functionaliteit van een systeem bepalen. En als je eenmaal die overeenstemming hebt weet je iig dat je het over hetzelfde hebt.

Nu zijn use-cases voor een website niet erg handig, het gaat vaak niet alleen om wat een gebruiker kan, maar ook waar en hoe het eruit ziet. Daarom wordt er vaak een design gemaakt. En wordt het design leidend gemaakt in het ontwikkel proces. Echter is een design vaak toereikend. Uitzonderingssituaties worden vaak niet gevonden of ontworpen. Eigenlijk zou je het moeten combineren met use-cases. En zo blijf je bezig. Er zijn verschillende tools die het mogelijk maken om een website te ontwerpen. Maar die gaan vaak uit van een statische boomstructuur waarop je componenten als tekst, plaatjes, javascript en formulieren kunt zetten. Vaak hebben ze nog een optie om onderlinge links aan te geven. Maar daar houd het al snel op. Veel te gedetailleerd en absouluut niet flexibel of handig voor dynamische sites.

Soms moet je iets simpels maken om het beheersbeer te maken. Als je op een hoog niveau naar een website kijkt is het niets anders dan een aaneenschakeling van pagina's. En elke pagina heeft content en acties die de gebruiker op deze pagina uit kan voeren. Elke actie heeft een reactie op het systeem (anders is het geen actie).

Als je op deze manier met een klant om tafel gaat zitten kun je per pagina bepalen wat er op moet komen en wat welke acties de gebruiker kan doen. Per actie beschrijf je kort wat er gebeurd. Daarna kan dit model dienst doen als bron voor het design, als uitgangspunt bij bepalen van de usecases en calculatie van de kosten.

woensdag, november 16, 2005

Wisten jullie dat?

Ja ik blijf posten vandaag ;)

Maar wisten jullie dat design patterns eigenlijk gebaseerd zijn op de idee-en van een echte architect?

Vast niet ;).
Zijn motto: "Je moet een gebouw laten ontwerpen door de mensen die er in moeten wonen/werken."
Ik kom hier later nog uitgebreid op terug.

'SQL' in je code, wel doen!

Ondanks dat ik grote tegenstander ben van het opbouwen van SQL strings in je code door een hoop string concats. En een groot voorstander van OR mappers zoals NHibernate schrijf ik nu toch een blog met de titel: "'SQL' in je code wel doen!" raar he ;)

Maar kijk eens naar deze code:

public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from n in numbers
where n < 5
select n;

Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums) {
Console.WriteLine(x);
}
}
ResultNumbers < 5:
4
1
3
2
0


Vaag he, maar wel mooi! Niet meer handmatig door je array lopen, maar gewoon zeggen wat je wilt! In C# statements.. Nu is dit nog een simpel voorbeeld maar hier: http://msdn.microsoft.com/vcsharp/future/linqsamples/ staan er nog 100 meer.

We noemen het: Linq hou het in de gaten!

Blog comments

Vanwege blog spamming heb ik een image check aangezet op het plaatsen van commentaar. Dat neemt niet weg dat ik de vele reacties niet waardeer! Ik waardeer het zelfs heel erg!

Blijf je commentaren, suggesties en tips plaatsen!
Mocht je interressante onderwerpen voor een blog hebben, kun je me natuurlijk ook altijd mailen :)

edit: typo, tnx Jeroen ;)

Refactoring in Visual Studio 2005

We kennen het allemaal wel, je krijgt code van iemand anders die je aan moet passen. Of misschien wel code van jezelf van een tijdje terug en je schrikt je helemaal lam. Naamgeving van variabelen waar je niets mee kunt. Method body's die meerder a4-tjes beslaan. Slecht gebruik van interfaces en OO design.

Nu kun je met find & replace een boel rechttrekken, echter ben je dan nooit zeker dat je alles te pakken hebt en of de code nog goed werkt. Als je dan compiled en je krijgt 150 compile erros zakt de moed je in de schoenen. Nu heeft 1 van de grootste in de OO wereld dit probleem ook onderkend en refactoring bedacht.

En wat doet Microsoft heel slim? Ze bouwen refactoring in in Visual Studio.net 2005. In VS2005 kun je nu met een paar muisklikken bijvoorbeeld: method signatures veranderen; methods extraheren (selecteer een aantal regels code in een method, maak daar automatisch een andere method van en vervang die regels code in de originele method voor de aanroep naar de nieuwe method); variabelen hernoemen en interfaces extraheren.

Al met al een grote stap voorwaarts. Met alle andere verbeteringen van C# 2.0 kan ik alleen maar zeggen: Snel overstappen je bent het waard!

dinsdag, november 15, 2005

Attributes de verborgen kracht van C#

Iedereen die programmeert in C# heeft ze vast wel gezien: attributes. Stukjes metadate bij methods om bepaalde functionaliteit aan te geven. Of om bepaalde zaken mogelijk te maken bijvoorbeeld [dllImport("kernel32.dll")] [browsable(true)] en nog meer dat soort zaken.

Via NUnit kwam ik erachter dat je ook zelf attributes kunt maken en gebruiken in je code. Zo gebruikt NUnit [TestCase] en [Test] om aan te geven dat een bepaalde class testen bevat. En welke methodes dan deze testen zijn. Maar door een gebrek aan tijd heb ik nooit meer naar gekeken. Tot nu. Bij het doorlezen van de features van C# 2.0 kwam ik deze link tegen:
http://msdn2.microsoft.com/en-us/library/z0w1kczw(en-US,VS.80).aspx

Wat blijkt, eigenlijk is het heel erg simpel. Je kunt je eigen types aanmaken en plaatsen in je code. Daarna kun je via Reflectie de attributen van een class of een method uitlezen. Wat dus erg handig is voor late-binding van code. Zo kun je makkelijk een framework maken en zorgen dat het met toekomstige DLL's kan werken zonder dat je een bepaalde interface afdwingt een erg flexibel en krachtige oplossing is. Nee zo dom zijn ze nog niet bij Microsoft ;)

Overigens vind ik de generics implementatie van C# 2.0 ook erg krachtig. Doordat je af kunt dwingen dat een Object die je gebruikt van een bepaalde base class moet zijn heb je toch de beschikking over de methods van die baseclass. Nu kun je natuurlijk zeggen dat je daar geen generics voor nodig hebt. Inderdaad door een class te maken die de baseclass gebruikt dwing je dat ook af en heb je ook beschikking over de methods van de baseclass. Echter verlies je dan weer het grote voordeel van Generics: het niet meer hoeven casten van objecten naar het juiste type (en daarmee @ runtime moet controleren of de cast valid is) Met generics kan dat allemaal @ Compiletime waarmee je fouten eerder zult zien :)

BruuD goes Vegas!

Jaja,

Goed voorbeeld doet goed volgen: mijn ex-collega BruuD is ook aan het bloggen geslagen: http://bruud.blogspot.com/

Graag horen we al je succesverhalen Ruud!

maandag, november 14, 2005

De frustratie van een workaround..

Afgelopen weekend ben ik druk bezig geweest met het programmeren in Delpi, en hoewel het niet mijn "moedertaal" is. Kan ik er toch redelijk mee uit de voeten al zeg ik het zelf...

Het enige wat ik niet voor elkaar kreeg was het omzetten van een Single (zeg maar float) naar een integer. Uiteindelijk na heel veel denken en googlen heb ik maar een workaround geimplementeerd: Ik converteer de single naar een string. Daarna zoek ik de punt en kap alles na de punt eraf. Tot slot converteer de string naar een int. Werkte perfect totdat...

Totdat ik het programma op een andere pc ging testen. Elke keer kreeg ik de foutmelding: '"40,0000033" could not be converted to an integer'. Na ruim een uur zoeken zag ik het. Ipv een punt werd er hier een komma gebruikt als decimaal scheidingsteken. Na de method aangepast te hebben zodat hij of zocht op een punt of op een komma. Werkte alles naar behoren... Hoe een workaround frustrerend kan zijn...

p.s. Ik ben nog steeds op zoek naar een goede manier op van single naar een int te gaan...

vrijdag, november 11, 2005

C#? F#!

Altijd druk bezig met het bijhouden van de nieuwste trends:
F# http://blogs.msdn.com/dsyme/ een nieuwe krachtige taal voor het .NET platform. Wat je ermee kan? Geen idee! Maar daar komen we wel achter!

Op je handen tellen voor gevorderden.

Tot 5 tellen op 1 hand kunnen we allemaal.
Tot 10 tellen op 2 handen kunnen we ook.
Maar tot 32 op 1 hand en tot 1024 op 2 handen?

Dat is op je handen tellen voor gevorderden... Rara hoe doe je dat?

(hint)

Tijd voor Tijd

Kortgeleden ben ik mijn nieuwe baan begonnen bij een detacheerder in de techniek branche. Leuke baan, veel verschillende klanten & veel verschillende kansen om bij te leren zowel op technisch als op persoonlijk vlak.

Waar ik echter niet bij stil heb gestaan: soms heb je geen job. En toch moet je je tijd nuttig besteden. Na alle nieuwsites, alle strips, online games en forums bezocht te hebben wil je toch iets nuttigs doen. En wat blijkt de wereld van de informatica heeft niet stilgestaan. In de 2 jaar dat ik van school ben is er veel veranderd. Zoals de introductie van UML 2.0 en CMMi. Om nog maar te zwijgen van .NET 2.0 en Java 1.5.

Daarnaast heb ik flink veel tijd om domein kennis op te doen, en nieuwe collega's te leren kennen. Ik moet wel toegeven het vraagt een hoop discipline om bezig te blijven. Maar met een beetje geluk heb ik binnenkort een job en kan ik weer doen waar ik voor aangenomen ben: programmeren.

In de tussentijd kan ik in mijn hoofd rustig de applicaties analyseren die ik nog wil bouwen en denken aan "the movies" die vandaag in de winkel ligt (Kopen!). En natuurlijk mijn blog vullen met posts als deze ;)

maandag, november 07, 2005

Mindmapper

Al langer loop ik met een idee in mijn hoofd. Ik wil een tool maken waarmee je idee-en in je hoofd kunt uittekenen, opslaan, aanpassen en kunt doorgeven aan iemand anders. Maar bij gebrek aan zo'n tool zal het me niet lukken een dergelijke tool te maken! ziehier een klassiek voorbeeld van het kip-ei probleem.

Surfend over het internet kwam ik echter op dit tooltje uit: http://www.mindjet.com/eu/products/index.php MindMapper! Hiermee kun je je gedachten en brainstorm sessies visualiseren! Ik moet zeggen het ziet er interressant uit. Ik ga het zeker proberen!