1. Dezember 2008 23:26

kleinscheiss vs. enterprise

von robert 1. Apr 2007 18:56 (vor 610 Tagen) ~ comments(0)

viel beratungszeit verbringe ich mit erklärungen, warum lösung xy soviel zeit in anspruch nimmt, vermeintlich teuer ist etc. liebe leutchen sage ich dann immer: „das ist enterprise.“ ich habe nun eine kleine arbeitsgruppe gebildet, die diesen unterschied anhand von real world scenarios erklären will.

die aufgabenstellung lautet eine software für den betrieb einer bäckerei zu erstellen.

fall 1

exwurstbudenbesitzer detlev hauser ist mit seiner php-hauser gmbh auf den internetzug aufgesprungen und präsentiert folgendes programm:


include_once("frameset.php");
include_once("kopf.php");

class Baecker{
    var $brote=120;
    var $kasse=100;
    var $preis=3;

    function brot($wieviel, $kunde){
        if(($this->brote-$wieviel >= 0) &&
            $cash=$kunde->bezahl($this->preis*$wieviel)){
            $kunde->einstecken($wieviel);
            $this->brote-=$wieviel;
            $this->kasse+=$cash;
            return true;    
        }else{
            return false;
        }
    }
}

class Kunde{
    var $geld=500;
    var $brote=0;

    function bezahl($preis){
        if($this->geld-$preis >= 0){
            $this->geld-=$preis;
            return $preis;
        }else{
            return false;
        }
    }

    function einstecken($wieviel){
        $this->brote+=$wieviel;
    }
}

$b=new Baecker;
$k1=new Kunde;
$k2=new Kunde;
$b->brote(1, $k1);
$b->brote(5, $k2);
$b->brote(1, $k1);
$b->brote(8, $k2);

include_once("schweissfuss.php");

aufwand: 2 MT (in rechnung gestellt, eigentlich nur 1 tag, der andere wurde einem bordellbesuch gewidmet)

der kunde war grundsätzlich zufrieden. das programm läuft seit einem halben jahr stabil.

unsere arbeitsgruppe fand 36 fehler in der anwendung, wovon aber scheinbar nur einer relevant ist. der fiel bereits am 2. tag nach inbetriebnahme auf.

bei der lösung gibt es viel zu kritisieren. da ist zum einen das hartkodierte mapping der produkte auf objektfunktionen. das ist ein sehr kurzsichtiges vorgehen und für die erweiterbarkeit des programms nicht sehr hilfreich. in spätestens 120 jahren wird sich der kunde ärgern, dass er mit dem bereits jetzt absehebaren spagetticode in eine sackgasse geraten ist. zum anderen versucht der programmierer mit einer pseudolustigen fusszeile individualität zu demonstrieren und die tatsache zu verwischen, dass der kunde hier nur noch-ein-weiteres-produkt-von-der-stange erhält.

fall 2

die mit der rüstungsindustrie großgewordene agentur powerofbeans.com setzt in ihrer mittelstand division voll auf offene standards wie java. nach guten erfahrungen mit dem spring framework, entschied man sich diesen weg weiterzugehen und die erfolgsgeschichte der agentur fortzuschreiben. hier ein auszug aus ihrer lösung (wegen diverser NDAs kann leider nur ein teil veröffentlicht werden).


package com.powerofbean.shop.bakery.model;

import java.util.HashMap;
import java.util.Map;
import java.io.InputStream;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.springframework.util.StringUtils;
import org.springframework.util.Assert;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

import com.powerofbean.struts.common.Constants;

/**
 * This abstract class defines the method used for reading and writing the
 * object's labels (internationalising) and other important properties
 * look at bakery.properties for further info
 * @author 
 */
public abstract class BakeryBean extends AbstractBean
    implements ShopModel, 
        OpenableShop, 
        UnableToOpenUnbuffered,
        TaxBeanModelPropStrut, 
        SchiessMichTotOverideLaterGrussEgon,
        CustomTemplateResizer, 
        AuthorizeServiceBus
        {

    private Map labels;

    private int ProductsTotalCount;

    private int ProductsBeforeSell;

    private int ProductsAfterSell;

    private HashMap ProductItems;

    ... 

    /**
     * Returns the labels.
     * @return the labels
     */
    public Map getLabels() {
        checkLabels();
        return labels;
    }

    /**
     * Set the labels.
     * @param labels the labels to set
     */
    public void setLabels(Map labels) {
        this.labels = labels;
    }

    public void setLabel(String key, String value) {
        checkLabels();
        this.labels.put(key, value);
    }

    private void checkLabels() {
        if (labels == null) {
            labels = new HashMap();
        }
    }

    public String getLabel(String language) {
        checkLabels();
        String label = labels.get(language);
        if (!StringUtils.hasText(label)) {
            label = labels.get(Constants.DEFAULT_LANGUAGE);
        }
        return label;
    }
    /**
     * Set the ProductsTotalCount.
     * @param total to set
     */
    public void ProductsTotalCount(int total) {
        this.ProductsTotalCount = total;
    }

    /**
     * Get the ProductsTotalCount.
     * @param total to set
     */
    public void GetProductsTotalCount(){
        return this.ProductsTotalCount;
    }

    /**
     * small helper to increment ProductsTotalCount with just 1 entity
     * @param total to set
     */
    public void IncrementProductsTotalCount(int total) {
        this.ProductsTotalCount += 1;
    }

    /**
     * Set the ProductsTotalCount.
     * @param total to set
     */
    public void SetProductsBeforeSell(int total) {
        this.ProductsBeforeSell = total;
    }

    public void GetProductsBeforeSell(){
        return this.ProductsBeforeSell;
    }

    /**
     * small helper to increment ProductsBeforeSell with just 1 entity
     * @param total to set
     */ 
    public void IncrementProductsBeforeSell(){
        this.ProductsBeforeSell += 1;
    }
    /**
     * Set the ProductsTotalCount.
     * @param total to set
     */
    public void SetProductsAfterSell(int total) {
        this.ProductsAfterSell = total;
    }

    public void GetProductsAfterSell(){
        return this.ProductsAfterSell;
    }

    /**
     * small helper to increment ProductsAfterSell with just 1 entity
     * @param total to set
     */
    public void IncrementProductsAfterSell(){
        this.ProductsAfterSell += 1;
    }
    ...

    ...
}

...


aufwand: 450 MT (davon 50 MT für bordellbesuche - nur key account manager -)

der kunde ist sehr glücklich mit der lösung. erste tests ergaben hohe geschwindigkeiten. das deployment steht leider noch aus, da einer der senior application developer (egon sch.) kurzfristig ausgeschieden ist und das projekt unter verzug geriet.

unsere arbeitsgruppe erkannte auf 863 fehler, allesamt von niedriger relevanzstufe.

die lösung wird von uns für den javac-s design award vorgeschlagen, weil sie den spagat zwischen high performance product delivery und direct to market product design principles of customer und andererseits enterprise service bus seemless continuos integration services hervorragend bewältigt.


Kommentare

Kommentar
Dein Name *
Deine E-Mail-Adresse * (nur für die Redaktion, wird nicht veröffentlicht!)
Deine Internetseite
Angaben für weitere Kommentare merken?
 

About
alotta-log is your friendly blogserver. multiuser - multiblog - php/my/xorc based.

currently this is a beta version. stay tuned.
Impressum
Disclaimer
"this site looks best if you come over here and look at my monitor."
 
Themen
neu auf dem server
Unser T-Shirt
tags
neueste eintraege in diesem blog
mixtape

1 DJ T / Robot Riot - Electric Press Remix

2 Bucci Bag / More Lemonade - Sparkling Version

3 Soto / Hootenanny - Original Mix

4 Joe Galdo / Keef - Original Mix

5 Myagi / Subversion - Price Cuts Remix

6 DJ Fixx / Electric - Original Mix

7 DJ Fixx / Push Em Up - Original Mix

8 Klaus / Big Man - Original Mix

9 Jesse Saunders / Everybody - Slapin Breaks Remix

10 Soto / Manic - Soto Remix

11 Chikinki / Like It Or Leave It

www.flickr.com
Administration

rss/xml xorc based
hintergrund von squidfingers
alotta-in-the-middle, 2005