• Je natürlicher und intuitiver eine Software oder Applikation bedienbar ist, desto höher ist die Akzeptanz und Zufriedenheit der Kunden. Gerade für Apps, die ein kurzes On-Boarding verlangen und die „schnell, nebenbei“ verwendet werden, ist eine einfache Bedienung in Kombination mit einer flachen Navigation durch die einzelnen Funktionen elementar. Entgegen diesem Paradigma soll eine App trotz ihrer trivialen Bedienbarkeit (Stichwort Usability) einen angemessenen Funktionsumfang bieten und möglichst alle Bedürfnisse des Nutzers abdecken. Erschwerend kommt hinzu, dass bei Mobile Apps bedingt durch die Displaygröße der Platz für Informationen und Funktionselemente sehr beschränkt ist und die Applikation dadurch sehr schnell „überladen“ wirkt. Fühlt sich infolgedessen ein Nutzer überfordert und kann die gewünschte Funktion nicht innerhalb weniger Augenblicke finden, so stellt sich eine geiwsse Ablehnung gegenüber der App ein. Dieses Phänomen behandelt auch Yu-Kai Chou in seinem Buch „Actionable Gamification“:

    "Far too often, Onboarding experiences for products feel confusing, too hands off, or too complex. This results in the user feeling stupid. If your user feels stupid during Onboarding, then you’ll be fighting an uphill battle along with the user (think Google+)." http://yukaichou.com/gamification-study/4-experience-phases-gamification-2-onboarding-phase/

    Um diesem Problem entgegenzuwirken setzen wir verstärkt auf die Verwendung von Sprachsteuerung in Apps. Damit kann eine Applikation zentral bedient werden, ohne dass das Userinterface zu überladen wirkt. Beispielsweise kann man dadurch eine komplexe Filterfunktion einer Shopping App für den Nutzer stark vereinfachen. Mit dem Satz: „Ich will Angebote von Lebensmitteln im Umkreis von 10 km“ oder „Obst von Edeka, Rewe und Netto“ können sehr schnell die Filterparameter für Kategorie, Ort oder Markt gesetzt werden.

    Eine intuitive Sprachsteuerung lässt sich für weitaus mehr Use Cases nutzen. Besonders interessant ist ein Arbeitsumfeld, welches durch hohe Fluktuation, Saisonarbeit oder eine geringe Vertrautheit mit den IT-Prozessen gekennzeichnet ist. Hier kann durch Sprachsteuerung eine einfache und schnelle Bedienung komplexer Aufgaben bewerkstelligt werden. Ein Lagermitarbeiter könnte ohne genauere Kenntnisse in der Logistik mit dem Worten „Zeige mir Wareneingangsschein für Bestellnummer 123“ die entsprechenden Daten auf einem stationären oder mobilen Display angezeigt bekommen - ohne vom Stapler absteigen zu müssen.

    Ein weiterführender Artikel in diesem Zusammenhang beschäftigt sich mit der Entwicklung einer Sprachsteuerung und der Integration in einer React-Native App: Sprachsteuerung mit Api.ai in einer React-Native App

     

  •  

    Hintergrund: Das Backend unserer Produktidee „croGoDeal“ basiert in Teilen auf dem serverless Framework und Amazon Web Services (AWS). Wir nutzen hinter dem API Gateway eine AWS Lambda Funktion, die als GraphQL Schnittstelle dient. Die komplette Nutzerverwaltung wird mit dem AWS Dienst Cognito abgebildet. Damit wir die Schnittstellen in den einzelnen Entwicklungsstufen hinter dem API Gateway testen können, ohne, dass wir die Autorisierung ausbauen müssen, haben wir ein Desktoptool mit Electron entwickelt, dass uns JSON Web Tokens (JWT) generiert. 

      

    Funktionsweise 

    Der Screenshot zeigt die Funktionen der Applikation. Als Input sind lediglich der Cognito UserPool, die ClientId sowie die Benutzeranmeldedaten nötig. Der Token wird nach der Anmeldung rechts angezeigt und kann in ein anderes Entwicklungswerkzeug kopiert werden. Um nicht bei jedem Start die Daten eingeben zu müssen, werden die Einstellungen im Anwendungskontext persistent gespeichert. 

    Technologien 

    Die Anwendung wurde komplett mit der JavaScript-Bibliothek React programmiert, mit der man normalerweise Single Page Applikationen entwickelt. Um eine React App auf einem Desktop-PC nutzen zu können, verwenden wir das Framework „Electron“.

    Electron liefert unsere React-App mit Hilfe von Chromium und Node.js als Desktopapplikation aus. 

    Für die Anbindung zum AWS Cognito Service verwenden wir das offizielle aws-sdk für JavaScript. 

    AWS Cognito Token Generator Software Architektur

     

    Die Datenhaltung und Zustandsänderungen in der Anwendung werden durch Redux nach der Flux-Architektur umgesetzt.  Damit die Eingabedaten persistent erhalten bleiben, werden sie via Key-Value Paaren in den JSON-Storage geschrieben. Dies übernimmt immer der jeweilige Redux-Reducer bevor er den neuen Zustand zurückgibt: 

    // user reducer 

    export default function user(state: any = {}, action: actionType) { 
      switch (action.type) { 
        case SET_USER: 

          if (!action.data.rememberPassword) { 
            delete action.data["password"]; 
          } 

          // save user state persistently 
          storage.set("user", action.data, (err) => { if (err) { console.log(err) } }) 
          return action.data 

        default: 
          return state; 
      } 

    Bei diesem Vorgehen muss man bedenken, dass jede State-Änderung auch einen Schreibzugriff auf die Festplatte mit sich zieht. Sobald man eine App mit sehr vielen State-Änderungen und evtl. großen Objekten entwickelt, sollte man besser auf eine periodische Datenspeicherung zurückgreifen, so wie es auch das Framework redux-persist macht. 

    Der Sourcecode des Projekts ist OpenSource und auf unserer GitHub Seite verfügbar. 

     

    https://github.com/innFactory/aws-session-token-gui  

  • In dem Artikel "Das Potential von Sprachsteuerung" haben wir die Bedeutung von Sprachsteuerung erläutert. Nun wollen wir uns der technischen Seite widmen und erklären, wie man mit Hilfe von Api.ai Sprachsteuerungen entwickelt. Api.ai hat sich seit 2014 auf Sprach- und Chatbots spezialisiert und gehört seit 2016 zu Google. Mit der angebotenen Technologie lassen sich Konversationen zwischen Mensch und Maschine designen und in verschiedenste Dienste wie Alexa, Slack, Twitter, Facebook und viele weitere integrieren. Api.ai setzt im Hintergrund Maschine Learning ein, um die genaue Intension einer Sprach- oder Texteingabe zu verstehen. Dadurch bietet Api.ai eine erstaunliche Interpretationssicherheit und bildet eine ideale Basis auch für unternehmerische Anwendungsfälle.

    Umsetzung eines UseCases in Dialogflow (Api.ai)

    Für die ersten Schritte in Api.ai Dialogflow, wie die Erstellung eines Projekts bzw. eines „Agents“ wird eine ausführliche Dokumentation angeboten. (https://api.ai/docs/getting-started/basics)

    Richtig spannend wird es bei der Erstellung sog. „Intents“. Ein Intent ist gewissermaßen die Definition einer Funktionssignatur. Wird ein Sprach- bzw. Textbefehl von einer Benutzeranwendung an Api.ai gesendet, findet Api.ai mit Hilfe seiner Machine Learning Algorithmen die entsprechende Signatur und sendet den Namen der Funktion und ggf. die zugehörigen Parameter zurück an die Benutzeranwendung. Die Benutzeranwendung kann danach die Funktion ausführen und dem Benutzer das gewünschte Ergebnis liefern.

    Um den Ablauf zu veranschaulichen nehmen wir als UseCase eine Shopping App, in der der Benutzer Angebote von unterschiedlichen Märkten einsehen kann. Im folgenden Screenshot sieht man, wie ein Intent in Api.ai aussehen kann:

    Als erwarteter Sprachbefehl wird „Angebote von Rewe“ festgelegt, wobei Rewe einen Parameter darstellt und somit variabel ist. Durch das Machine Learning versteht Api.ai auch verwandte Aussagen, wie z.B. „Deals von Rewe“ oder auch „Schnäppchen bei Rewe“. Als Rückgabe wird der zugehörige Funktionsname (Action) „search_deals“ mit dem Parameter „Shop = Rewe“ zurückgegeben.

     

    ApiAi.setConfiguration("4xxxxxxxe90xxxxxxxxc372", ApiAi.LANG_GERMAN);

    Neben Englisch und Deutsch werden viele weiter Sprachen unterstützt. Eine Auflistung befindet sich in unserer GitHub-Dokumentation: https://github.com/innFactory/react-native-api-ai#supported-languages Als nächstes wird mit dem simplen Aufruf von „startListening“ der Sprachbefehl aufgenommen und direkt mit Api.ai verarbeitet:

    ApiAi.startListening(result=>{ console.log(result); }, error=>{ console.log(error); }); 

    Fazit

    Mit Api.ai ist es möglich professionelle Sprachsteuerungen zu entwickeln. Unsere React-Native Library „react-native-api-ai“ liefert dazu eine einfache Integration für entsprechende Mobile Apps. 

  • Das Team von innFactory war vergangene Woche in Lissabon auf der größten Technologie Messe der Welt. An drei Tagen präsentierten sich hier Startups in sämtlichen Wachstums- und Finanzierungsphasen mit ihre Ideen in Form von Messeständen und Pitches. Der beste Pitch gewann dabei ein Preisgeld von 50000 EUR, das von Mercedes Benz zur Verfügung gestellt wurde. Auch wir hatten als Startup am Dienstag einen Messestand für unseren Chatbot croGo. 

    Neben den vielen Startups waren auch die meisten großen etablierten Big-Player wie Amazon Web Services, Facebook, Google, Uber, Slack, Microsoft, BMW, Mercedes Benz und noch viele weitere aus allen möglichen Branchen auf der Websummit vertreten. Sie präsentierten sich ebenfalls mit Messeständen.

    Zusätzlich wurde die Messe durch eine Vielzahl von Vorträge von über 1200 internationale Topspeaker begleitet. Thematisch deckten die Talks alle erdenklichen Themenfelder die für Startups relevant sind ab. Von sehr technischen Schulungen für Cloud-Computing und modernen progressive Web Apps mit React und React-Native, über die Zukunft von Methoden wie Lean-Startup, bis hin zu futuristischen Ankündigungen, wie den fliegenden Taxis von Uber war auf der Messe alles vertreten.

    Da auf der Messe tausende Investoren aus allen Länder unterwegs waren, hatte auch wir als junges Startup die Chance auf eine 4-Augen Gespräch mit einem Topinvestor und konnte somit unser persönliches Profil weiter schärfen und uns durch Mentoring verbessern.

    Die Messe konnte uns somit in vielerlei Dingen unterstützen und wir planen auch 2018 wieder teilzunehmen.

    Weiter Bilder zum Messebesuch befinden sich auf unserer Instagram Seite (innfactory)

  •  

    Wir bei innFactory setzen von Beginn an auf Microservices im Backend. Die technologische Unabhängigkeit und die flexible Skalierbarkeit zwischen den einzelnen Services sind in unseren Augen unschlagbar. Zusätzlich lassen Frameworks wie Lagom (Scala) das „Mehr-Overhead“ Argument verstummen.

    Letzte Woche war ich im Rahmen der Veranstaltung „Microservices“ als Dozent zu Gast an der Hochschule Rosenheim und habe mich der Frage gewidmet, inwiefern sich das Frontend an die Microservice Architektur im Backend anpassen und integrieren lässt.

    Der "klassische" Ansatz

    Das Frontend wird beim klassischen Ansatz als Monolith belassen. Nach unserer Erfahrung ist das auch bislang der gängigste Weg, um ein Frontend an ein Backend mit Microservice Architektur anzubinden. Das Entwickler Team besteht dabei meist ausschließlich aus Frontend Spezialisten, die das Backend über einen sogenannten „Aggregation Layer“ (das Backend) einbinden. Der Aggregation Layer sorgt für eine spezielle API, zugeschnitten auf die jeweiligen Bedürfnisse. So kann beispielweise die App und die Website mit einer genau passenden Schnittstelle bedient werden, um den Datentransfer gering und die Klarheit hoch zu halten. Um dieses sogenannte „Backend for Frontend Pattern“ dynamischer umzusetzen, verwenden wir bei innFactory überwiegend GraphQL als Abfragesprache für die API.

    Single Page Microservice UI
    Klassische Microservice UI

    Der "FullStack" Ansatz

    Im Gegensatz zur klassischen Architektur führt der FullStack Ansatz die Idee hinter den Microservices weiter bis in das Frontend. Zwar sind die einzelnen Services nach wie vor zwischen Back- und Frontend getrennt, jedoch ergeben sich technologisch gemischte Entwickler Teams, die auf einen bestimmten Use Case gerichtet sind. Meist wirkt sich das sehr positiv auf den Knowhow-Transfer innerhalb des Entwickler-Teams aus, allerdings entstehen im Frontend auch erhebliche Hürden, die weiter unten unter „Probleme bei der UI-Ausarbeitung mit einer Microservice-Architektur“ erklärt werden.

     

    FullStack Microservice UI
    FullStack Microservice UI

    Vergleich: Klassisch – FullStack

    Folgender Vergleich soll die Tendenzen aufzeigen, nach denen sich die beiden Ansätze unserer Erfahrung nach unterscheiden:

    "Klassisch"

    • Best Practise – geringes technisches Risiko
    • Schnellere Einarbeitung neuer Entwickler
    • One team, one user experience

     

    "FullStack"

    • Größerer Wissenstransfer im Team
    • Flexiblere Entwickler (+ oft höhere Eigenmotivation für FullStack Projekte)
    • Fokus komplett auf einen Service gerichtet

    Technische Probleme bei der UI-Ausarbeitung mit einer Microservice-Architektur

    Eine besondere Herausforderung stellt der Austausch von UI-Komponenten zwischen den einzelnen Teams dar. Dies liegt allen voran daran, dass, wie in einer Microservice Architektur üblich, jedes Team unabhängig ihre Komponenten warten und deployen können soll. Einen interessanten Ansatz verfolgt OpenTable mit ihrem serverless GUI-Framework OpenComponents (https://github.com/opentable/oc).

     

    Microservice UI Problems
    Microservice UI Probleme

     

    Im Backend sind die einzelnen Microservices technisch vollkommen unabhängig. Diese Unabhängigkeit auch im Frontend bereit zu stellen und jedem Team frei zwischen Frameworks oder Libraries, wie React, Angular oder Ember wählen zu lassen, ist nur schwer realisierbar. Hinzu kommen darüber hinaus viele verschiedene Versionen der genannten Frameworks sowie anderen Javascript Erweiterungen. Der Browser wäre bei clientseitigem Rendering gezwungen unzählige Javascript Dateien zu laden, was die Geschwindigkeit auf einen inakzeptablen Wert drücken würde. Aber auch serverseitiges Rendering mit z.B. next.js ist mit unterschiedlichen Libraries und Versionen aus Gründen der Kompatibilität nicht umsetzbar.

    Different UI Libs
    Unterschiedliche UI Frameworks

     

    Um trotzdem eine Microservice Architektur zu realisieren bleibt nur eine einheitliche technische Basis aller Teams. Dies kann ein einziges Framework sein oder auch die Entwicklung in reinem Javascript, CSS und HTML. Ein vielversprechender Ansatz ist der WebComponents Standard, auf den sich die großen Browserhersteller derzeit vorbereiten.

    Fazit

    Die Frontend Architektur der Microservices anzupassen verspricht gerade bei sehr großen Projekten Vorteile in der Teamstrukturierung sowie klare Verantwortlichkeiten der Services. Technologisch wird diese Herausforderung am besten mit dem Verzicht auf externe Frameworks und Libraries bewältigt. Eine Überlegung ist, in naher Zukunft eigene HTML-Tags mit WebComponents zu implementieren, um die gewünschte Unabhängigkeit zu erreichen.