Freitag, 20. April 2012

Wie ich im ersten Jahr mit meinem Startup nicht auf die Fresse fliege


Am Anfang jeder Gründung steht der Business Plan. Sollte er zumindest. Selten wird dieser jedoch aus eigener Motivation heraus geschrieben. Formale Vorgaben wie Mindestseitenanzahl machen das Schreiben eines Business Plans zu einem ähnlichen Vergnügen wie das Schreiben einer Abschlussarbeit. Zumal das Verfassen eines Dokumentes den Eindruck vermittelt, es handelt sich hierbei um einen bürokratischen Prozess, der zwar durch Aufteilung in einzelne Abschnitte kollaborativ und damit etwas lebendig gestaltet werden kann, aber schlussendlich nur das stumpfe Befüllen von Seiten ist. Doch das Gegenteil ist der Fall. Ein Businessplan ist der lebendige Fokus eines Unternehmens. Die einzelnen Bestandteile müssen von allen Beteiligten in enger Zusammenarbeit erdacht, verstanden und letztendlich auch zu Papier gebracht werden. Was in dieser engen Zusammenarbeit entsteht, ist kein Plan, sondern das Modell eines Unternehmens.



Ohne ein solches Modell ist ein Start-Up allem Enthusiasmus zum Trotz zum Scheitern verurteilt, denn ohne ein Business-Modell gibt es kein Gesamtziel für das Unternehmen. Ihr werdet eine Produktidee und vielleicht schon einen ersten Kunden haben, aber noch lange keine klar formulierte Strategie für die ersten Monate eures Unternehmens. Mit einem gut durchdachten Business-Modell seid ihr davor gewappnet in der Anfangsphase ins Leere zu laufen, oder anders ausgedrückt, auf die Fresse zu fliegen.

Business Plan vs. Business Modell


Was beim Verfassen eines Business-Plans am meisten ausbremst, ist die Benennung selbst. Ein Plan. Was für ein Plan? Ein Ein-, Zwei- oder vielleicht Dreijahresplan? Ein Unternehmen kann man nicht planen. Ein Unternehmen muss man leben. Nicht in den Tag hinein, aber mit klar definierten Zielen. Und Ziele sind letztendlich eine von vielen möglichen Realitäten - sie sind ein Modell der Zukunft. Und das ist es, was eigentlich bei der Erstellung eines Business Plans passiert: die Modellierung eines Unternehmens. Solch ein Unternehmensmodell (Business Model) hält fest, welche Ziele ein Unternehmen in welchem Kontext erreichen will.

Business Model Canvas


Ein Werkzeug, das uns bei orderbird besonders in der Startphase geholfen hat, Unternehmensziele und auch ihren Kontext zu formulieren, ist die Business Model Canvas (BMC).


Die BMC ist ein Werkzeug, um Business-Modelle zu erdenken und zu analysieren. Vor allem liefert sie uns aber eine gemeinsame Sprache, um Business-Modelle klar darzustellen. Diese Sprache besteht aus 9 Konzepten, die ich euch in 10 Minuten nahe bringen werde. Ich werde jedes Konzept mit praktischen Beispielen aus orderbirds Gründungsphase untermalen.

Kundensegmente (Customer segments)



Stellt euch die Frage, an wen genau ihr euer Produkt/Lösung verkaufen wollt - segmentiert den Markt. 



Gerade zu Beginn ist eure Zielgruppe nicht genau definiert. Je genauer ihr aber in der Lage seid, euren Kunden zu beschreiben, desto passendere Lösungen könnt ihr ihm verkaufen.


Für orderbird haben wir u.a. die Segmentierung nach folgenden Kriterien vorgenommen:
  • Rolle im Unternehmen: Wird ein Inhaber, Oberkellner, oder Kellner unser Produkt kaufen?
  • Art des Unternehmens: Verkaufen wir an Restaurants, Bars oder Cafes
  • Größe des Unternehmens: Wieviele Angestellte, wieviele Tische haben die?


Wertversprechen (Value Proposition)



Was wollt ihr euren Kunden verkaufen, welches Problem löst ihr?



Wenn das oder die Kundensegmente klarer umrissen sind, ist es viel leichter zu entscheiden, ob euer Unternehmen mit seiner Lösung wirklich ein Problem der Kunden lösen kann.


Für orderbird sieht das so aus:
  • Inhaber: Will die volle Kontrolle über seine Mitarbeiter, von überall aus - "Wie viel Umsatz wurde bis jetzt in Filiale 2 gemacht?"
  • Oberkellner: Will Konflikte im laufenden Betrieb schnell aufklären - "Wer hat 100 Schnitzel mit Nutella bestellt?"
  • Kellner: Will genau wissen, wieviel Geld er am Ende des Tages verdient hat - "Ich muss mir sicher sein können, dass meine Kasse stimmt."


Kanäle (Channels)



Wie kann euer Unternehmen seine potentiellen Kunden erreichen? Viel wichtiger: Wie wollen sie erreicht werden? 



Wenn ihr euch über die Erreichbarkeit eurer Kunden Gedanken macht, geht in fünf Schritten vor:
  1. Wie erregt ihr Aufmerksamkeit?
  2. Wie erlaubt ihr euren Kunden eure Lösung zu beurteilen?
  3. Wie können Kunden euer Produkt kaufen?
  4. Wie wird es geliefert?
  5. Wie betreut ihr eure Kunden nach dem Kauf?
orderbird:
  1. Gastronomie Magazine, v.a. aber Mund-zu-Mund
  2. Kostenlose Variante im App Store
  3. Online Shop (Hardware und Lizenz)
  4. Software als CD vertrieben, Hardware mit der Kutsche ;)
  5. Telefon-Support


Kundenbeziehung (Customer Relationships)  


Wie behaltet ihr einen guten draht zu euren Kunden? ... sie sollen ja wieder kommen und mehr kaufen! 

Bei den Kanälen steht v.a. die Frage im Vordergrund wie die Kunden erreicht werden wollen. Das gilt verstärkt bei der Kundenbeziehung. 

Je nach Kundensegment müsst ihr eine andere Strategie umsetzen. 

Wie wir bei orderbird gemerkt haben, erwarten fast alle Inhaber einen telefonischen Support, wenn nicht sogar Vor-Ort-Service. Kellner sind meist jünger und haben kein Problem damit, im Online-Handbuch nachzuschlagen. 

Die falsche Strategie bei der Kundenbeziehung kann euer Wertversprechen unter Umständen stark abschwächen, da sich die Kunden allein gelassen fühlen.

Einkommensströme (Revenue Streams)



Klar. Wie wollt ihr Geld machen? Nehmt aber auch hier wieder die Perspektive eurer Kunden (Segmente) ein! Für was sind sie bereit zu bezahlen?



Hier ist eine gut durchdachte Kundensegmentierung sehr hilfreich. Wenn ihr wisst, wem ihr was verkaufen wollt, könnt ihr auf jeden Fall in Erfahrung bringen, was eure potentiellen Kunden zur Zeit ausgeben. Wenn ihr wisst, was sie für ihre jetzige "Lösung" bezahlen, habt ihr einen Anhaltspunkt um herauszufinden, für was sie bereit sind zu bezahlen und wie sie bezahlen.

Es gibt verschiedene Arten von Einkommensströmen:
  • Einmaliger Verkauf
  • Verbrauchsgebunden - je mehr ein Kunde verbraucht, desto mehr bezahlt er (z.B. Datenflatrates eines Mobilfunkanbieters)
  • Abonnement - für eine z.B. monatliche Gebühr kann ein Kunde einen Dienst so oft benutzen, wie er will (z.B. Musik-Streaming-Dienste)
  • Vermietung
  • Lizenzierung - ein Kunde darf eure Technologie in seinen Produkten verwenden

Wichtig ist, dass ihr euch hier noch keine Gedanken über ein konkretes Preismodell macht. Dies ist generell eine der herausforderndsten Aufgaben und in der Anfangsphase eures Unternehmens noch schwieriger zu lösen als später.

orderbird:

Wir möchten Inhabern ein Abomodell anbieten - sie können unsere Dienste wie z.B. das Online-Reporting für x Euro so oft benutzen, wie sie möchten. Dieses Modell kommt allerdings nicht besonders gut an - obwohl es für unsere Kunden flexibler wäre, möchte sie lieber einmalig den 100fachen Betrag bezahlen, um ein Gefühl der "Sicherheit" zu haben - der Markt hat seine eigene Logik.


Bis hierhin habt ihr die wichtigsten Punkte, um einen guten Pitch auf die Bühne zu bringen. Ihr wisst genau, wem ihr was verkaufen wollt, wie ihr eure Lösung in den Markt bringt und wie ihr Geld einnehmen wollt. Die noch folgenden Konzepte der BMC setzen sich mehr mit der Umsetzung eures Business Models auseinander.

Schlüsselresourcen (Key Resources)


Was braucht ihr, um eure Lösung anzubieten, sie zu entwickeln, Kanäle zu bedienen, die Kundenbeziehung aufrecht zu erhalten?

Bei orderbird sind Schlüsselresourcen:
  • Softwareentwickler
  • PR und Sales Team
  • Hardware Supply Chain

Schlüsselaktivitäten (Key Activities)



So banal es klingen mag, aber was sind die wichtigsten Schritte, um eurer Business Modell umzusetzen? Eure Schlüsselressourcen kosten euch viel Geld. Setzt sie gewissenhaft ein.



In der täglichen Arbeit verliert man sich schnell in Kleinigkeiten. Hier hilft ein täglicher Blick auf die Liste der Schlüsselaktivitäten, um den Fokus nicht zu verlieren. Diese Liste sollte nicht mehr als 5 Einträge enthalten und sollte wöchentlich aktualisiert werden, um sich immer wieder zu fragen, was eigentlich wichtig ist.

Hier mal eine unserer Listen mit den Fragen, die wir uns stellten, ob unsere gerade ausgeführten Aktivitäten wichtig sind:
  • Reports für das Controlling entwickeln 
    (Muss das User Interface der App verbessert werden, wenn noch nicht alle wichtigen Reports eingebaut sind?)
  • Hardwarelieferanten in unser Router-Konfigurationswerkzeug einweisen 
    (Müssen wir jetzt Angebote für die Schutzhüllen einholen? Ohne unsere Einweisung kann die Hardware nicht konfiguriert und ausgeliefert werden.) 
  • Messeauftritt vorbereiten 
    (Müssen wir jetzt die Webseiteninternationalisierung mit der Agentur besprechen? Wir brauchen doch noch Flyer und Aufsteller.)  
  • Serveradministrator rekrutieren 
    (Müssen wir uns jetzt Serverangebote einholen und auswerten? Das kann doch der Admin machen.) 
  • Support-Telefonanlage konfigurieren 
    (Müssen wir uns jetzt Gedanken über die Warteschleifenansage machen? Alle Supportanrufe kommen gerade auf nur einem Telefon an.)

Schlüsselpartnerschaften (Key Partnerships)



Bei der Kundensegmentierung und der damit einhergehenden Verfeinerung des Wertversprechens werdet ihr häufig feststellen, dass ihr nicht alle Schlüsselressourcen für die Umsetzung im Unternehmen habt. Ihr braucht also Partner. Versucht alles auszulagern, das nicht von eurem Team professionell erledigt werden kann.

Bei orderbird war dies zum Beispiel der Hardwareversand. Wir hatten kein Lager und auch keine Erfahrung mit Warenwirtschaft. Also raus damit.

Cost Structure



Was kosten euch eure Schlüsselressourcen, Schlüsselaktivitäten, Kanäle etc.? Wie viel Geld benötigt ihr, um euer Business-Modell am Laufen zu halten? Können die Einkommensströme die Kosten abfangen?



An diesem Punkt wird oftmals ersichtlich, ob es realistisch ist, euer Modell umzusetzen. Wenn nicht, beginnt ihr an den verschiedenen Stellschrauben zu drehen. Für höhere Einkommensströme muss ein anderes Segment mit einem anderen Wertversprechen bedient werden. Ein anderes Segment erfordert unter Umständen einen anderen Kanal, der wiederum andere Kosten verursacht ...

Das ist die Business Model Canvas. Hier noch eine Kurzfassung:


Uns hat die BMC extrem geholfen, uns unsere Strategie für die Anfangsphase klar zu machen. 

Also, schnappt euch einen Stapel Klebezettel, druckt euch mehrere Examplare der Business Model Canvas aus, setzt euch in den Park und fangt an zu modellieren! Die BMC gibt es hier.

Alle Bilder und Information gibt es auf www.businessmodelgeneration.com.

Dienstag, 27. Dezember 2011

orderbird - more than a POS


During christmas, I had a conversation with my uncle about orderbird which started like this:

my uncle: "Why should someone invest in orderbird? orderbird is just a Point of Sale (POS) system!"

me: "Because its not just a POS system. It will be THE platform provider for the gastronomy."

my uncle: "Platform Provider? Are you going to produce oil rigs?"

me: " ... No ... and ... No.
        orderbird will bring together all stakeholders relevant to gastronomy: gastronomists, guests,  suppliers.

All of them will do their daily business with orderbird:

  • Gastronomists run their restaurants with orderbird.
  • Guests reserve tables, place orders, and pay with orderbird.
  • For an optimal supply chain, suppliers and gastronomists work hand-in-hand with orderbird.
"

.. Ok, Ok, .. I must admit that the last elevator-pitch-part was added to make the dialog more appealing.



Seriously, orderbird's business model can be classified as a Multi-Sided Platform (MSP).
It does not strictly follow the MSP pattern as defined in BMG. Here's why:

Using a plain MSP business model, a MSP-company can hardly run profitabel without having customers that cover ALL customer segments that make up the MSP. Related to orderbird, this means that orderbird's business model would not work if orderbird only had gastronomists, only had guests, only had gastronomists and suppliers, and so forth.

This is only partially true. Ok, if orderbird only had guests and suppliers, the business model should surely be adapted. But in some settings it can be built and scaled incrementally. While bringing one sutomer segment onto the platform, profits can be made without having to wait for another customer segment to enter the platform.

Consider the current state of the evolution of orderbird's business model.
orderbird has entered the german gastronomy market successfully having the 100st customer reachable at the end of the beta phase. Until a critical mass is reached, orderbird will improve its POS system to help gastronomists getting even more out of their business and tapping on the revenue streams generated from its POS system.

While creating more value for gastronomists, orderbird is sketching and evaluating market entry strategies for bringing guests onto their platform. If a critical mass of customers is on the platform, the MSP model starts kicking! While offering guests an uncomplicated ordering and restaurant experience, gastronomists can profit from a better capacity utilization. And orderbird … orderbird is tapping on a new revenue stream: guest ordering. For every placed order orderbird will receive a turnover percentage. If guests pay via orderbird, a turnover percentage on these transactions is imaginable, too.

Besides the synergies among gastronomists and guests, the platform allows for better integration of gastronomists and supplier operations. Gastronomists will be able to choose from a variety of suppliers of beverages, food, and other goods they need to run their business. Suppliers can offer their products and services to a much broader audience.

Let's sum things up. If you thought about investing in orderbird, do not base your thoughts and calculations on the assumption that you will invest in a company that simply delivers a POS system. orderbird's business model follows the pattern of a Multi-sided Platform (MSP): orderbird will bring together all relevant gastronomy stakeholders. This consolidation of stakeholders will give orderbird the possibility to get a share on multiple gastronomy related markets: POS systems, guest orders and reservations, guest payments, and supply chains. The orderbird platform will be THE marketplace for the gastronomy.

Furthermore, what makes orderbird unique besides its business model is its team. The founder's talent and experience ranges from a deep understanding of the gastronomy market, to the planning and implementation of marketing and financial strategies, to a customer focussed development of software products. The founders are supported by a great team of software engineers, sales & support people, designers, partners and board of directors. The spirit and success of orderbird is reflected by the awards we earned so far.

I never felt so much enthusiasm and energy in a company!!

Rock on!

Sonntag, 20. November 2011

Xtext Serialization: Challenges serializing enums.

For the Xtext based modelling tool chain to model objective c (iPhone, iPad) applications for orderbird I needed to manipulate an Xtext model programmatically and serialize it back to disk.
I did encounter some challenges while serializing enums and want to share my experience in this post.

Here is a snippet of the grammar I am using for the well known use case of entity modelling:

EntityModel:
    (entities += Entity)*
;

Entity:
    (annotations+=Annotation)*
    'entity' name=ID '{' '}'
;

Annotation:
    '@' option=ConfigOption (':' value=ConfigValue)?
;   

enum ConfigOption:
    persistency
;   
   
enum ConfigValue:
    CoreData | FMDB
;

So, entities can be annotated to determine with which technology they will be stored persistently.

At first glance, serialization does not seem to be a hassle. Having an IResourceSetProvider, I can get the model from its XtextResource:

@Inject
private IResourceSetProvider provider;

private EntityModel loadEntityModelFromFile(IFile file) {
       
    ResourceSet xrs   = provider.get(file.getProject());
    URI uri           = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
    Resource resource = xrs.getResource(uri, true);
    EntityModel em    = (EntityModel)resource.getContents().get(0);
   
    return em;
}

Now I can programmatically change the model and then serialize it back to disk by saving it in a XtextResource:

private void save(EntityModel em) {
   
    ResourceSet xrs  = provider.get(getProject());
    XtextResource xr =
        (XtextResource) xrs.getResource
                (URI.createPlatformResourceURI(getModelPath(), true) , true);
   
    xr.getContents().set(0, em);
               
    Map options = new HashMap();
    SaveOptions.defaultOptions().addTo(options);
    xr.save(options);
}

Serializing this model:

@persistency:CoreData
entity Foo {}

I get:

@persistencyentity Foo {}

The ConfigOption is missing! Hmmm, why? Xtext somehow assumes the ConfigOption to be transient (not serializable).

The Xtext documentation says "The default transient value service considers a model element to be transient if it is unset or equals its default value." and "By default, EMF returns false for eIsSet(..) if the value equals the default value."

Looking at the generated java code for the ecore meta model, the 'CoreData' literal is defined as the default:

/*
 * @generated
 */
public class AnnotationImpl extends EObjectImpl implements Annotation {
    //...   
   
    protected static final ConfigValue VALUE_EDEFAULT = ConfigValue.CORE_DATA;
    protected ConfigValue value                       = VALUE_EDEFAULT;
   
    //...
}

In order to tell Xtext which model elements can be considered as (non) transient, an instance of ITransientValueService has to be specified in your DSL's guice runtime module. This seems to be an easy task: Inherit from DefaultTransientValueService and overwrite isTransient(…) to yield the correct semantics:

public class DataDslTransientValueService extends DefaultTransientValueService {
   
    @Override
    public boolean isTransient(EObject owner, EStructuralFeature feature, int index) {
        if (owner instanceof Annotation && DataDslPackage.ANNOTATION__VALUE == feature.getFeatureID()) {
            return false;
        }
        return super.isTransient(owner, feature, index);
    }
}

… and hook it into the guice module:

public Class bindITransientValueService() {
    return DataDslTransientValueService.class;
}

Damn! Still the same errorneous output:

@persistencyentity Foo {}

A little bit of code archeology and debugging reveals that Xtext has two distinct hierarchies of the ITransientValueService interface.
One in the package org.eclipse.xtext.parsetree.reconstr and the other in the package org.eclipse.xtext.serializer.sequencer.

My DataDslTransientValueService implemented org.eclipse.xtext.parsetree.reconstr.ITransientValueService. But this does not seem to be sufficient. Thus, I also implemented org.eclipse.xtext.serializer.sequencer.ITransientValueService:

@SuppressWarnings("restriction")
public class SequencerTransientValueService extends TransientValueService {
   
    public ValueTransient isValueTransient(EObject semanticObject, EStructuralFeature feature) {
        if (semanticObject instanceof Annotation && DataDslPackage.ANNOTATION__VALUE == feature.getFeatureID()) {
            return ValueTransient.NO;
        }
       
        return super.isValueTransient(semanticObject, feature);
    }
}

My DSL's guice runtime module contains these two bindings for ITransientValueService:

public Class bindITransientValueService() {
    return DataDslTransientValueService.class;
}
   
public Class bindITransientValueService2() {
    return SequencerTransientValueService.class;
}

And finally the serialization yields the correct result!


As you might have noticed I annotated the SequencerTransientValueService with @SuppressWarnings("restriction"). The class org.eclipse.xtext.serializer.sequencer.TransientValueService seems not be intended for public use. But obviously it is required to get the serialization to work correctly.


At the time of writing this post, I also realized that my grammar's enum ConfigOption only has one literal that is defined as default and should thus not be serialized by default. But in my implementations of the two ITransientValueService interfaces I only specified ConfigValue to be non-transient. However, ConfigOption is serialized without adding the corresponding semantics to the implementations of the ITransientValueService. Maybe this is due to the Annotation's option attribute not being optional in the grammar as the value attribute is. And maybe I should study the Xtext documentation in more detail. Maybe ..

Regards,

steven

Dienstag, 18. Oktober 2011

Xtext Objective C Formatter/Beautifier

This post shows how I integrated uncrustify into Xtext. At the end of this post you will be able to package uncrustify with your language UI plugin and run uncrustify as part of a MWE2 workflow (the described approach was tested with Xtext 2.0 on Mac OS X 10.7).

First, you have to get uncrustify. Unpack it, run ./configure and then make. The binary is located in the src/ folder and is named uncrustify - what a surprise. Create a folder formatting/ in your language's UI plugin. Copy the binary into this folder. To tell uncrustify how to format the code we have to supply it with a config file. A config file for objective c can be found here. Download this file and put it into the formatting/ folder. Besides the binary and a config file we need a shell script that runs uncrustify. Create a file formatSource.sh in formatting/. The shell script looks like this:
#! /bin/sh

touch files.txt
find . -name "*.[hm]" > files.txt

while read line; do
./uncrustify_osx -l OC -c ./uncrustify_obj_c.cfg --no-backup $line
done < files.txt  
rm files.txt 
This script will look for *.h and *.m files recursively down from its location, run over them, and format them without creating a backup copy.

Now that we have the necessary files for running uncrustify ... oh well ... we must be able to run uncrustify from within java. For executing shell scripts from within a java process - welcome platform dependency - check out my ShellCommandExecutor. This class is also used for making the shell script formatSource.sh executable after copying it to a language project:
private void copyFormattingFiles(final IProject project){
 Bundle bundle = SystemDslActivator.getInstance().getBundle();
 IPath scriptPath = copyFile("formatting/formatSource.sh"     , "formatSource.sh",      project, bundle);
 IPath binaryPath = copyFile("formatting/uncrustify_osx",       "uncrustify_osx",       project, bundle);

 copyFile("formatting/uncrustify_obj_c.cfg", "uncrustify_obj_c.cfg", project, bundle);

 //make script and binary executable
 try {
  ShellCommandExecutor.execute("chmod", "+x", scriptPath.toString());
  ShellCommandExecutor.execute("chmod", "+x", binaryPath.toString());
 } catch (Exception e) {
  //TODO: write to error log
 }
}
The above method can be found in this class. The execution of formatSource.sh in a MWE2 workflow component looks like this:
public class ObjectiveCFormatter extends org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent2{

private static final String SCRIPT_PATH = "./formatSource.sh";

@Override
protected void invokeInternal(WorkflowContext ctx, ProgressMonitor monitor, Issues issues) {
try{
 CommandResult cr = ShellCommandExecutor.execute(SCRIPT_PATH, new String[]{});

 if (cr.success){
  System.out.println("Formatting complete!");
 } else{
  issues.addError(cr.output);
 }
}catch (Exception e){
 issues.addError(e.getMessage());
}
}
}
If you add this component after your objective c generator in your workflow all *.h and *.m files will be formatted as described by the uncrustify objective c config file.

regards,

steven

Dienstag, 19. Juli 2011

LaTex: Linebreak, NewLine in Caption

I you want to have a line break, a.k.a. new line, in your latex document's captions import the package "caption" like this:

\usepackage{caption}


In your caption's you can add the \newline command:


\begin{figure}

\centering

\includegraphics{}

\caption{Bla Bla Bla \newline Bla Bla Bla after line break}

\label{fig:aLabel}

\end{figure}


regards

Dienstag, 15. März 2011

Montag, 7. März 2011

CoreData Performance Measurement

world,

check out this evaluation on CoreData Performance.


s