Over de start, de ontwikkeling, aanpak en implementatie van een hopelijk succesvol project.

De eerste stappen en mislukkingen

Door pinna_be op woensdag 12 maart 2014 21:56 - Reacties (4)
Categorie: Project, Views: 4.607

Inleiding
In deze blog wijd ik verder uit over het software project waarvan ik al een tijd geleden had verteld dat ik het zou starten. Het starten is begonnen en er zijn een paar zaken duidelijker geworden. We hebben een eerste vergadering gehouden, waaruit we een klein beetje dichter staan bij wat we gaan doen.

license
Na veel wikken en wegen hebben we gekozen voor de GPL3 license. Het was reeds vroeg het plan om het project opensource en gratis aan te bieden.
We hebben hiervoor gekozen omdat we ervan overtuigd zijn dat we onder deze license het makkelijkst onze hoofddoelgroep, namelijk studenten en dergelijke, kunnen bereiken. Ook is het blijkbaar mogelijk om onze code onder een andere license uit te geven voor commercieel gebruik, moest dit ooit interessant worden.
Een belangrijke reden is ook dat dit het makkelijker maakt om gebruikt te worden in andere projecten, het is de bedoeling dat code die we schrijven makkelijk gebruikt kan worden in andere opensource projecten. (bvb Stel we maken een efficientere matrix vermenigvuldiging, dan zouden we deze code eveneens kunnen contributen aan projecten zoals octave).
Ook stelt dit ons in staat om andere gpl3 projecten te gebruiken, echter is het dan niet meer mogelijk om een andere license te verschaffen in eventuele latere stadia, maar deze keuze kunnen we alsnog later maken.

tools
documentatie: Eerst en vooral gebruiken we docygen voor de documentatie die naar de programmeur gericht is. Dit omdat dit snel te maken is, er snel proper uitziet en redelijk dicht bij de code staat. We zullen ook een wiki/website starten en onderhouden, waarin we eerder op user-niveau documentatie zetten.
Ook zullen we in ons projectdocument een oplijsting van functionaliteiten geven, zodat het ook mogelijk is om in pdf-formaat een overzicht te downloaden als referentie. In de documentatie zal ook meer info staan over de gebruikte algoritmes.

communicatie: Interne communicatie zal via een licht gemodereerd forum verlopen. Dit omdat het gemakkelijk is om discussie per threads bij te houden en achteraf kan je in de beginpost de conclusie van de discussie zetten. Dit forum hosten we zelf.
Externe communicatie zal verlopen via een website/wiki en zal vooral typische zaken zoals de documentatie, downloads en dergelijke bevatten.

development We werken met cmake zodat iedereen vanuit elk platform en vanuit de meeste IDE's mee kan werken aan het project. Bovendien zullen we git gebruiken als tool voor version management en voor issue tracking.

testen We zullen gebruik maken van google test om onze testcase te maken. We hebben hier allemaal ervaring in en het werkt ook gewoon goed.

specificaties
globaal het project zal bestaan uit 3 lagen:
1) een low-level api : dit is de eigenlijke library waarin we alles implementeren. Hier zal de meeste aandacht gaan naar performance, features (hoeveelheid algoritmes voor een probleem) en herbruikbaarheid. Deze library zal waarschijnlijk niet erg aangenaam zijn om als bioloog of gelijkaardig te gebruiken.
2) een high-level api : in deze laag geven we een eenvoudige interface die het makkelijk moet maken om onze library te gebruiken. Dit zal gebeuren door de gebruiker toe te staan functies te definiŽren in een wiskundige syntax, welke dan gecompileerd zal worden naar c++ code. We hebben deze vorm gekozen bovenop een constructie met wrapperfuncties en typedefs, omdat we zo lekker veel optimalisaties kunnen doorvoeren. Bovendien moet er dan ook minder zaken dynamisch berekent worden, aangezien we een deel van de bewerkingen reeds op voorhand kunnen vereenvoudigen.
3) een gui: we maken ofwel een standalone gui of wel een plugin voor bestaande tekstverwerkers/IDE. Hierin geven we de gebruiker de kans om aan rapid prototyping te doen in onze eenvoudige syntax. Dit is handig voor wanneer het eerder gaat om numeriek gedrag te bestuderen in plaats van daadwerkelijk een project te maken. Ook zal deze gui een export hebben die een header file en een (gecompileerde?) cpp file output, zodat je je functie kan gebruiken in je project.

beginplan
We beginnen met de basis voor ons project: een numerieke library. In het begin zullen we ons vooral focussen op zaken uit de (numerieke) lineaire algebra, waar we dus vooral met matrices, vectoren en dergelijke zullen werken. Later zullen we meer functies toevoegen uit calculus, verzamelingenleer, getallenleer enzovoort.
-> Onze library zal niet enkel een resultaat geven, maar zal voor zover mogelijk ook een bovengrens op de fout op dit resultaat weergeven.
-> Onze libary zal de gebruiker de keuze geven welk algoritme te gebruiken en indien dit niet gekozen is, kiezen wij automatisch de meest performante keuze, voor zover we er inzicht in hebben.
-> We willen multithreading ondersteunen en zullen onderzoeken of opencl een grote meerwaarde bied op vlak van performantie en wat de kost is op vlak van draagbaarheid. Niemand van ons heeft reeds ervaring met opencl, maar we gaan hier zeker prototypes van maken om toepassingen te verkennen en te testen.
-> dependencies worden vermeden en indien toch nodig zo veel mogelijk beperkt. Het project moet hoe dan ook eenvoudig te installeren zijn en er zullen voor meedere platforms installers geschreven worden.

vorm
De specificaties zullen geleverd worden in het input/output formaat. Tevens zullen we trachten onze algoritmes zo vaak mogelijk te bewijzen en indien de bewijzen reeds bestaan, ze toe te voegen.

design
Zoals meerderen erop wezen tijdens de vorige blog willen we zeker geen design-up-front, omwille van tijdsefficientie. We kiezen dan ook voor een incrementeel design, waarbij we per stap een archiectuur opstellen, specificaties opstellen, prototypes maken, testen en implementeren in ons project. We zullen dus een soort weekly version hebben, buiten dan het feit dat het niet wekelijks zal zijn.

versie 0.1
We beginnen hier met het begin: we willen een klasse Number, Vector en Matrix implementeren en alle basisbewerkingen: "+, -, *, /" moeten ook geÔmplementeerd zijn. We houden hier alvast rekening met de fouten op de resultaten (conditiegetal, absolute fout en relatieve fout) en het effect van de bewerkingen hierop.
We zullen in het begin uitgaan van floating_point arithmetiek om snel een werkende versie klaar te hebben en zullen dan een number ontwikkelen die gebruik maken van exacte arithmetiek die dezelfde interface biedt als onze floating_point Number.
Ook willen we al nadenken over optimalisatie zoals: wanneer je 2 diagonaalmarices hebt, kan de som veel efficienter gebeuren, echter moet omzetten van diagonaal naar gewone matrix ook snel en efficient kunnen gebeuren.

Het probleem
Hier hoop ik van invoer van jullie kant, maar er is een groot probleem. Ik krijg mijn groepsgenoten niet warm om voluit te gaan voor het project. Velen willen niet betrokken zijn in fases zoals design en dergelijke terwijl anderen gewoon heel sporadisch willen meewerken. Met andere woorden, ik ben de enige die er met volle kracht voor wil gaan.
Hoe kan ik dit oplossen? Is het beter dat ik het project start als een eigen project, waar ik dan mense toelaat om bij te dragen. te forken (zodat ik alvast kan beginnen, want nu moet ik wachten op de rest)? Moet ik een rangorde opstellen in bevoegdheden in het maken van beslissingen, zodat we al heel snel kunnen beginnen en taken kunnen verdelen over degenen die enkel willen implementeren? Alle input is welkom!

Het begin van een hopelijk succesvol softwareproject

Door pinna_be op zaterdag 4 januari 2014 00:10 - Reacties (14)
Categorie: Project, Views: 6.981

Inleiding Wie is de schrijver?
Hey,

Ik ben een student Informatica met een voorliefde voor wiskunde. Ik studeer momenteel aan de universiteit te Antwerpen (3de Bachelor) en heb een enorm tekort aan plezierige uitdagingen.

De studies zijn erg interessant, maar het eerste enthousiasme begint wat te vervliegen. In het begin dat ik leerde programmeren schreef ik programmatje's die priemgetallen genereren, grafieken plotten, en zelfs 3d-afbeeldingen konden plotten aan de hand van eigengeschreven configuratiefiles met belichting en al.

Echter de laatste tijd krijgen we steeds minder voldoeninggevende opdrachten en neigen we meer naar de theoretische kant toe. Al wat we programmeren zijn zaken zoals numerieke algoritmes, snelle programma's om software engineering technieken op te testen, implementatie van kleine gedistribueerde fileservers, .... Allemaal dingen die bijzonder leuk en interessant zijn, maar geen van deze dingen kan mijn honger naar voldoening stillen. Zelfs voor het Bacheloreindwerk moeten we gewoon software die reeds bestaat aanpassen en vervolledigen.

Vandaar kwam het in mij op om een project te starten met enkele vrienden, het opensource te maken, te doen wat we willen. Vrijheid. Voldoening. Plezier.

zoektocht naar een project wat gaan we nu eigenlijk doen?
Nu is het niet makkelijk om een project te starten, aangezien je eerst en vooral een leuk idee nodig hebt. Graag had ik iets wiskundig gestart, omwille van mijn voorliefde hiervoor en later zou ik ook het liefst in de wetenschappelijke sector willen werken. Het idee mocht ook niet al meermaals geÔmplementeerd zijn, dit zou immers gewoon "het wiel heruitvinden" zijn, en dat wil niemand toch?

Uiteindelijk gaan we toch een wiel heruitvinden. We gaan een "numerieke library" ontwikkelen (voor c++) en hopen ons te kunnen onderscheiden door features aan te bieden die weinig anderen aanbieden.

reden keuze waarom gaan we het doen
Hoe dan ook zijn we van mening dat het project de moeite waard is, al was het maar omdat we het contact verbeteren met de theoretische wiskundigen op de campus en zo nieuwe mensen kunnen leren kennen of dat meer wiskundig inzicht vergaren of zelfs omdat we zo misschien wel een mooi project op onze cv kunnen zetten. Bovendien moesten we tijdens wetenschapelijk programmeren maken voor de goede, maar gebruiksonvriendelijke library GSL.

De software die we maken moet buiten eficient dan ook vooral gebruiksvriendelijk zijn. Hieronder verstaan we dat onze software gebruikt moet kunnen worden door ingenieurs, biologen, ... zonder al te veel kennis te moeten hebben van de programmeertaal waarin onze library wordt aangesproken.

Ook richten we ons op de Informaticastudent van morgen. Het plan is om alles uitgebreid te documenteren en wiskundig te onderbouwen. Wiskunde-onderwijs in het middelbaar zakt immers aan een constant tempo in niveau, en velen hebben hierdoor moeite met de korte verwoordingen die professoren soms gebruiken om iets uit te leggen.

aanpak eerste "ontwerpfase" IdeeŽn, we hebben ideeŽn nodig
Ook gaan we het project deftig aanpakken, we willen er met een 9-tal mensen aan werken in onze vrije tijd en van zodra het project opgestart is zullen we wellicht ook andere informatici aantrekken die mee willen werken aan het project. We gaan hier de standaard software technieken gebruiken, de nodige requirements ontwikkelen etcetera.

Momenteel zitten we in de fase waar we bespreken welke features we willen. Zo willen we al gauw matlabachtige functionaliteit bieden met vectoren en matrices, willen we exacte arithmetiek ondersteunen, willen we een op matlab gebaseerde syntax ondersteunen in een live interpreter die goed integreert in c++. Op termijn maken we misschien zelfs een precompiler, die op voorhand statische optimalisaties uitvoert. Deze ideeŽn zijn er maar enkelen en we kunnen er nog veel gebruiken.

We zijn op zoek naar nog veel meer ideeŽn, geen idee te veel, dus als je iets weet, stuur een DM om laat een reactie achter, geen idee is te gek.

Na de examens ( !!! blijft uiteraard belangrijker!!! ) gaan we goed bekijken welke ideeŽn we willen implementeren in een eerste versie, gaan we hier requirements en use cases uit formuleren, gaan we beslissen welke licensie we willen gebruiken, welke tools we gaan gebruiken voor ontwikkeling en management. Het wordt allemaal een beetje aftasten, en we kunnen hier alle input gebruiken die we maar kunnen krijgen, we hebben hier uiteindelijk slechts een theoretische kennis over.

over de blog zelf
De reden waarom ik deze blog schrijf is omdat ik voor mezelf wilde bijhouden hoe het ontwikkelt, kwestie van misschien ooit anderen te kunnen helpen een project op te starten en te kunnen leren of ik het bij een volgend project anders zou aanpakken. Zodoende de vraag: is het interessant genoeg om een blog met de ontwikkelingen on line te plaatsen?
Voor mij persoonlijk wel, ik hoop alvast op nuttige feedback en dat anderen in de toekomst misschien wel mijn blogs kunnen gebruiken als rode draad of hulp om zelf een project te starten (of dat ze zien hoe het niet moet :p ).

Offtopic, alvast mijn excuses voor mijn wellicht gebrekkig taalgebruik in mijn blog, dit is mijn eerste blog: suggesties zijn altijd welkom via DM, de comments zou ik liever ontopic houden.