QplQyer
Legacy Member
Na het lezen van een tekst op de site van kwitters (http://dewitters.koonsolo.com/sejoke.html), die lijnrecht tegenover mijn ideëen ingaat, moet ik wel reageren. En aangezien hier misschien wel een interessante discussie uit voortvloeit, leek het mij gepaster om het in een thread te gooien.
De tekst:
Mijn antwoord hierop:
"Engineering betekent volgens de "free dictionary" het volgende:
"The application of scientific and mathematical principles to practical ends such as the design, manufacture, and operation of efficient and economical structures, machines, processes, and systems."
Nergens wordt in de definitie van engineering verwezen naar de noodzaak aan fysische processen of enig ander. Het enige wat een ingenieur onderscheidt van een ambachtelijk persoon, is dat de ingenieur wiskundige modellen gebruikt om dat te beschrijven wat hij wenst te implementeren, waar de ambachtspersoon een systeem zal bouwen op basis van ervaring en "trial-and-error". Een ingenieur gaat daarentegen, voor hij het systeem bouwt, de specificaties omvormen naar een ondubbelzinnige specificatie (weg van de natuurlijke taal), in een wiskundig model, waarmee hij kan redeneren. Nadat hij de gewenste specificaties in het model heeft gestopt en de benodigde berekeningen uitgevoerd, zal hij de resultaten uit het model in de werkelijkheid transformeren.
Een klein voorbeeld:
De gemeente wenst een brug te bouwen over een rivier, die ruimte moet bieden voor 2 rijstroken en 2 fietspaden.
Een bouwkundig ingenieur zal deze specificaties omvormen naar een wiskundig model, door hier bijvoorbeeld 1m te nemen voor de breedte van een fietspad en 3m voor de breedte van een rijstrook. Deze parameters zijn ondubbelzinnig, en kan hij gebruiken in zijn wiskundig model, waarmee hij het aantal liter beton dat hij nodig heeft, welke betonsoort, en dergelijke meer gaat berekenen.
Nadat hij alles heeft berekend, wordt de brug gebouwd op basis van zijn berekeningen.
Zouden we dit voorbeeld ambachtelijk doen, dan zouden we wat beton bij elkaar klutsen op goed geluk, testen, het lijkt een week lang te blijven staan, het zal dus maar goed zijn (en drie maand later stort het in).
"Software engineering" beoogt het bovenstaande proces te gebruiken om software te ontwikkelen. In jouw tekst schrijf je dit af als op voorhand mislukt omdat het hier niet om concrete zaken gaat. Echter, het al dan niet concreet zijn van een zaak is geen voorwaarde om het bovenstaande proces te kunnen aanvatten. De enige voorwaarde is dat we waar we mee bezig zijn kunnen vatten in een wiskundig model (wat we bij software kunnen met behulp van de "formele methoden").
Software "engineering" momenteel gebeurt jammer genoeg inderdaad op de ambachtelijke methode, men schrijft een stuk code, men test het, ziet een fout, en verbetert de fout. Talloze uren gaan naar debuggen, testen en na deployment het fixen van de bugs die nog niet gevonden waren tijdens het testen (in plaats van naar nieuwe features te bedenken en te implementeren).
Met echte software engineering zou dit niet het geval zijn, daar zouden we de specificaties ondubbelzinnig kunnen neerschrijven in ons model, en kunnen controleren of het programma dat we hebben neergeschreven, er wel degelijk aan voldoet.
Conclusie: software engineering is geen op voorhand gefaald paradigma, maar een noodzaak om het softwareproductieproces betrouwbaarder te maken. We moeten afstappen van het "kunstige", of beter "gekunstelde" software-maken en overstappen naar een professionelere manier van software bouwen.
Enkele referenties:
http://klabs.org/richcontent/verification/holloway/nasa-97-16dasc-cmh.pdf
http://www.cs.ou.edu/˜beseme/besemePres.pdf
--
De discussie is dus: kan software development tot een "engineering practice" gemaakt worden.
De tekst:
Koen Witters zei:Software Engineering is a Joke.
During my studies at the university we had a course called "Software Engineering". The professor of this course strongly believed in the fact that software development would soon evolve in an engineering practice, with strong rules and metrics that will make the development itself more controllable. A specified process will guide all people involved and will eventually guarantee quality. This quality would then be evaluated with other metrics and stuff.
Unfortunately for him and for everyone who wants to become a "Software Engineer", software development and engineering are, even at the most fundamental parts, completely different. Engineering is the practice to develop something touchable, something that obeys the laws of physics. This implies that the product produced can be evaluated with the laws of physics. You can make all kinds of statistics, strength calculations, etc on the product. Engineers can therefore define their requirements with physical attributes, and so they can also be evaluated this way.
Software on the other hand, doesn't obey the laws of physics, by the simple reason because it can't be touched. Sure, it has physical parts, but those physical parts are not that important. Do you think you click on buttons in your desktop environment? Think again, the only thing you click is the button of your mouse, and the virtual push on the button projected on your monitor is just an illusion. Yet it looks, feels and even smells like a real button, great isn't it?
Programmers, just like artists, try to represent the world. They don't model or create real physical objects, they just try to capture a part of the world in an illusion. Programmers do this in both the source code and the final program. The better you can capture the world in your source code, the more understandable it will be. Source code only makes sense if you can imagine what it represents, what it does. Programs only make sense when the user knows what everyting represents: a button, a folder, a help manual. These are all representations of real world objects in a virtual environment, nothing more than an illusion.
The confusion of software engineering probably comes from the fact that programmers often have the same intelligence as engineers, and most of the time share the same interests. It's sometimes hard to make a distinction between programmers and engineers because of their simularities, but that doesn't mean that programming is therefore an engineering practice.
So to conclude: as a software developer you need the brains of an engineer, the writing capabilities of a poet and be able to represent the world like a painter. So don't believe the software engineering hype! So called "Software engineering techniques" can be applied and may be useful to you, but don't believe that they encompass everything. Painters, musicians and writers also use well known techniques, and engineering has nothing to do with it. Your knowledge, skills and most important your creativity and imagination are your greatest programming strengths, use them, because software is created, NOT ENGINEERD!
Koen Witters
Mijn antwoord hierop:
"Engineering betekent volgens de "free dictionary" het volgende:
"The application of scientific and mathematical principles to practical ends such as the design, manufacture, and operation of efficient and economical structures, machines, processes, and systems."
Nergens wordt in de definitie van engineering verwezen naar de noodzaak aan fysische processen of enig ander. Het enige wat een ingenieur onderscheidt van een ambachtelijk persoon, is dat de ingenieur wiskundige modellen gebruikt om dat te beschrijven wat hij wenst te implementeren, waar de ambachtspersoon een systeem zal bouwen op basis van ervaring en "trial-and-error". Een ingenieur gaat daarentegen, voor hij het systeem bouwt, de specificaties omvormen naar een ondubbelzinnige specificatie (weg van de natuurlijke taal), in een wiskundig model, waarmee hij kan redeneren. Nadat hij de gewenste specificaties in het model heeft gestopt en de benodigde berekeningen uitgevoerd, zal hij de resultaten uit het model in de werkelijkheid transformeren.
Een klein voorbeeld:
De gemeente wenst een brug te bouwen over een rivier, die ruimte moet bieden voor 2 rijstroken en 2 fietspaden.
Een bouwkundig ingenieur zal deze specificaties omvormen naar een wiskundig model, door hier bijvoorbeeld 1m te nemen voor de breedte van een fietspad en 3m voor de breedte van een rijstrook. Deze parameters zijn ondubbelzinnig, en kan hij gebruiken in zijn wiskundig model, waarmee hij het aantal liter beton dat hij nodig heeft, welke betonsoort, en dergelijke meer gaat berekenen.
Nadat hij alles heeft berekend, wordt de brug gebouwd op basis van zijn berekeningen.
Zouden we dit voorbeeld ambachtelijk doen, dan zouden we wat beton bij elkaar klutsen op goed geluk, testen, het lijkt een week lang te blijven staan, het zal dus maar goed zijn (en drie maand later stort het in).
"Software engineering" beoogt het bovenstaande proces te gebruiken om software te ontwikkelen. In jouw tekst schrijf je dit af als op voorhand mislukt omdat het hier niet om concrete zaken gaat. Echter, het al dan niet concreet zijn van een zaak is geen voorwaarde om het bovenstaande proces te kunnen aanvatten. De enige voorwaarde is dat we waar we mee bezig zijn kunnen vatten in een wiskundig model (wat we bij software kunnen met behulp van de "formele methoden").
Software "engineering" momenteel gebeurt jammer genoeg inderdaad op de ambachtelijke methode, men schrijft een stuk code, men test het, ziet een fout, en verbetert de fout. Talloze uren gaan naar debuggen, testen en na deployment het fixen van de bugs die nog niet gevonden waren tijdens het testen (in plaats van naar nieuwe features te bedenken en te implementeren).
Met echte software engineering zou dit niet het geval zijn, daar zouden we de specificaties ondubbelzinnig kunnen neerschrijven in ons model, en kunnen controleren of het programma dat we hebben neergeschreven, er wel degelijk aan voldoet.
Conclusie: software engineering is geen op voorhand gefaald paradigma, maar een noodzaak om het softwareproductieproces betrouwbaarder te maken. We moeten afstappen van het "kunstige", of beter "gekunstelde" software-maken en overstappen naar een professionelere manier van software bouwen.
Enkele referenties:
http://klabs.org/richcontent/verification/holloway/nasa-97-16dasc-cmh.pdf
http://www.cs.ou.edu/˜beseme/besemePres.pdf
--
De discussie is dus: kan software development tot een "engineering practice" gemaakt worden.

.
) blijft dit allemaal maar theorie. In mijn wereld krijg ik te maken met klanten die niet weten wat ze willen, en als ze het weten zullen ze wel van gedacht veranderen. Ik moet interfaces schrijven die "intuitief" aanvoelen en die "fijn" zijn om mee te werken. En voor games moet ik dingen "fun" maken. Ik moet code schrijven die makkelijk te begrijpen is voor andere programmeurs, die flexibel is voor toekomstige, ongekende requirements/systemen/ports etc. Om dan nog maar te zwijgen over allerhande afwegingen die je moet maken: maak ik de code robuust of correct, maak ik de code leesbaar of optimaal, welke programmeertaal is het meest geschikt, welke library gebruik ik best, ... . Als jij wiskundige formules weet om zaken te berekenen zoals "intuitieve interface", "fun factor", "flexibel naar toekomst toe", "begrijpbare code", "optimale library", etc, dan mag je die mij altijd vertellen.
.