Werkzeuge

Kommunikation im Team

Synchron

In Person, Telefongespräch, Messenger

Asynchron

Email, Wiki, CMS, Mailingliste / Forum

Issue-Tracker (Bug tracker, Project tracker)

Erfassung von Bugs, Änderungswünsche

Ist in Github integriert, ansonsten auch Externe Programme die es tun

Kulturen

Linux: „Benevolent dictator governance model“

Apache: „Meritocratic governance model“

OPS4J (Open Participation for Java): „Open Contribution“

Developement Pipeline: Commit → Deployment

Früher hat man shell scripts geschrieben, heute leichter.

Ziel: Automatisierung von

  • Code quality checks (macht die IDE automatisch indem sie dinge markiert)
  • Überprüfung von sourcecode
  • Code generation (kann die IDE auch machen)
  • Kompilierung (macht Maven und installiert dazu alle dependencies)
  • Testausführung
  • Daten Sammeln für Reports, Artefakten
  • Packaging
  • Deployment
  • Dependency Management

Source Code Management Systeme SCM

Feature:

  • Versionierung
  • Parallele Entwicklung mit Branches
  • Kollaboration (locking oder merging)

Versionierungssysteme

Für parallele Projektentwicklung (auf mehreren Zweigen), Zugriff auf ältere Versionen

Eignen sich auch zur Verwaltung von Dokumenten, nicht nur sourcecode.

Verwaltung von Artefakten (Source-Code, Dokumentation, Diagramme)

Terminologie

  • Check-out (clone): Lokale Kopie von einer Version anlegen
  • Check-in (commit): Änderungen seit dem letzten Update (changeset) in das Repository übernehmen mit commit message
  • Tagging: Markieren eines bestimmten Zustandes
  • Merging: Änderungen aus einem Branch in einen anderen übernehmen
  • Branching: eigener Strang
  • Pull: Requesting main branch to pull your commit
  • Push: Pushing your commit onto your branch

Zentrale SCM Systeme

Server speichert Versionen → Bottleneck

Beispiele: concurrent version system CVS, Subversion SVN

Ablauf auf SVN:

  1. Update (Wie ein fetch)
  1. Lokal Dinge ändern
  1. Update (Vor dem Hochladen muss man nochmals fetchen)

    Lokal merge konflikte lösen (die Person die hochlädt ist verantwortlich → commiten viel anstrengender)

  1. Commit

Verteilte SCM Systeme

Lokale Operationen, offline Arbeiten möglich

Projektmanager mit main-repository

Jede Komponente in eigener repository (Anzahl der Repos hat vor und nachteile)

Beispiele: git, mercurial, bitkeeper

Ablauf auf Git:

  1. Clone Repository
  1. Lokal Dinge ändern
  1. Lokal commiten
  1. Merge: Push + Pull request (öffnet eine Diskussion über Code und ob es geeignet ist, Merge erst nach Code Review)

Umgang mit Konflikten (SCM)

  1. Locking

    Zugang zur Branch während man daran arbeitet für alle anderen sperren

  1. Merging

    Vereinen und Konflikte einzeln beheben

Code Reviews / Pull Requests (SCM)

Festgelegte Workflows in Versionierungssystemen (SCM)

manche Branching-Modelle erzwingen Code Reviews

  • Erstellung von Pull-Requests, Merge nach Review

    Vorteil: Qualitätssichernde Maßnahme, Wissenstransfer

Build Management System

Ist ein Teil der Continuous Integration.

Maven (Build Management System)

Compiled code aber hat viele Zusatzfeature

  • dependency management (auch transitive Abhängigkeiten, Versions-Konflikte)
  • deployment
  • dokumentationen aus javadoc erstellen + code quality reports
  • testen - reporting
  • reporten
  • ...

Ant

Ähnlich wie Maven

Convention over Configuration in Maven

Convention over configuration → Man hält sich an Konventionen und muss dafür nichts mehr konfigurieren außer Dinge in der pom.xml Datei (project object model).

legt Bibliotheken aller Projekte in einem zentralen Verzeichnis ab.

\cdot Archetypen zum schnellen Einstellen

Continuous Integration CI

= eine Reihe von Best-Practices, die empfohlen werden für build management:

Automatisiertes: Builden, Testen, Integration, Deployment

  • nur ein einziges Sourcecode-Repository verfügen, mit dem alle Entwickler arbeiten.
  • Ablauf möglichst schnell
  • Mindestens 1x täglich committen auf neutralem Rechner → "daily builds"

    „neutraler“ CI-Server automatisiert Build und Tests bei jeder Änderung im SCM-System

    Build-Automatisierungswerkzeuge:

    Entwicklerorientiert: Maven

    Server-basierte Integration: Apache Continuum, Hudson, OpenCIT

    CI Server mit: Apache Continuum oder Hudso

  • Danach Berichte erstellen und verschicken

Arbeitsablauf:

  1. Entwickler erstellt neue Version im SCM (Commit, Pull-Request...).
  1. CI Werkzeug reagiert auf dieses Ereignis, lädt die entsprechende Version.
  1. Build Tool wird gestartet, compilierter Code wird mit einem Test-System automatisiert getestet.
  1. Entwickler wird mit Bericht verständigt.

Continuous Delivery + Continuous Deployment

Definitionen

Build means to compile the project.

Deploy means to:

  1. Compile the project
  1. Publish the output, meaning copy it to a target directory, upload it to an FTP server etc

Zusammengefasst:

  1. Continuous Integration
    • Build
    • Test
    • Merge
  1. Continuous Delivery
    • Automatisierter Release in ein Repository
    • Deployment nach manueller Freigabe
  1. Continuous Deployment
    • Automatisches Deployment in einer Produktivumgebung

Komponentenorientierte Software-Entwicklung

Komponente

Eine Gruppe an Objekten die einer bestimmten Funktion gewidmet sind.

  • Grad der Entkopplung
  • Komplexität

Service

Komponente die über ein Netzwerk angeboten wird

Framework

Rahmenbedingungen für Komponenten (Persistenz-Framework)

Aufrufarten

indirekter =

komplexer, mehr "overhead"

weniger die Kopplung, bessere Widerverwendbarkeit

  1. Direkter Aufruf

    leichte Implementierung aber starke Kopplung

    binding bei compiling

    public class Main {
    public static void main (String[] args) {
    Handler handler = new Handler();
    handler.notify():
    }
    }
  1. Interface (Indirektion)

    Vorteil: leichtere Austauschbarkeit, contract (schnittstelle lässt sich beschreiben)

    binding bei compiling

    public interface TextImport {
    public Document read(String filename);
    }class A {
    TextImport ti = new HtmlImport();
    public processDocument(String filename){
    Document doc = ti.read(filename);
    }
    }
  1. Komponenten-Frameworks

    Kommunikation ist plattform-spezifisch ("remoting") → Austauschen der Implementierung ohne Änderung im Sourcecode

    class KlasseA {
    TextImport ti;
    }
    public KlasseA () {
    // pseudocode:
    ti = componentFramework.Component("htmlimport");
    public processDocument (String filename){
    Document doc = ti.read(filename)
    }
    }
  1. Service-Frameworks

    Benutzt Webservices um auf Komponenten zuzugreifen

    Remoting mit WSDL/SOAP, XML/REST

Inversion of Control IoC (Design Pattern)

Umkehrung des Kontrollflusses mit einem Hook .

Viele Varianten.

Hollywood Prinzip: "Dont call us, well call you"

Hohe Wiederverwendbarkeit durch zentrale Verwaltung, Einfaches Austauschen einer Implementierung.

Verwaltung zb im IoC Container möglich.

IoC Container Implementierungen

Java

  • Spring-Framework
  • Google Guice
  • Pico-Container
  • Apache Aries Blueprint

.NET

  • Unity Framework
  • Spring.NET

Direkter Aufruf der Komponenten ohne DI

public class MyPersistence {
private MyBusinessLogic businessLogic = new MyBusinessLogic();
}
public class MyPresentation {
private MyBusinessLogic businessLogic = new MyBusinessLogic ();
}
public class MyBusinessLogic {
private MyPersistence persiistence = new MyPersistence ("path/to/db");
private MyPresentation presentation = new MyPresentation (300, 200);
}
public static void main (String[] args){
IPersistence persistence = new MyPersistence ( "path/to/db");
IPresentation presentation = new MyP resentation (300, 200);
IBusinessLogic businessLogic = new MyBusinessLogic (persistence, presentation);
persistence.setBusinessLogic(businessLogic);
presentation.setBusinessLogic(businessLogic);

Dependency injection DI

Abhängigkeiten werden von einem Container verwaltet, die Komponenten wissen nichts darüber → Die Abhängigkeiten werden injiziert.

Eine der vielen Arten von IoC.

Konzept

Die Verantwortung für das Erzeugen und Initialisieren von Objekten wird an eine zentrale Stelle (z.B. eine Klasse) delegiert.

Von der zentralen Stelle kann man die Abhängigkeiten zwischen den Objekten leichter überblicken und steuern.

Implementierung

Eine Komponente wird über einem Pointer / einer Referenz aufgerufen die urprünglich nicht initialisiert ist.

Kann mit Konstruktor, Setter, Annotation initialisiert werden.

Vorteile

  • Hohe Wiederverwendbarkeit
  • Einfaches Austauschen einer Implementierung
  • Verwalten von verschiedenen Konfigurationen (dev vs. prod)
  • Automatisiertes „verdrahten“, weniger Boilerplate-Code benötigt.
  • Verteilung von Aufgaben

Setter Injection

Abhängigkeiten durch "setter"-Methode gesetzt oder Annotationen

public static void main(String[] args) {
Factory factory = Factory.create();IPersistence myPersistence = (IPersistence) factory.getComp("persistence");
IPresentation myPresentation = (IPresentation) factory.getComp("presentation");
MyBusinessLogic myBusinessLogic = new MyBusinessLogic(myPersistence, myPresentation);
myPersistence.setBusinessLogic(myBusinessLogic);
myPresentation.set BusinessLogic(myBusinessLogic);
}

Bzw.

public static void main(String [] args) {
Resource res = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
IPresentation ui = factory.getBean("presentation", IPresentation.class);
ui.show();
}
  • Konfigurationsdatei (In Spring boot: beans = komponenten)
    <? xml version="1.0" encoding="UTF-8"?>
    <beans><bean class="MyPersistence" id="persistence">
    <property name="path">path/to/db</property>
    <property name="businessLogic" ref="businessLogic" />
    </bean><bean class="MyPresentation " id="presentation ">
    <property name="width ">300</property>
    <property name="height">200</property>
    <property name="businessLogic" ref="businessLogic" />
    </bean><bean class="MyBusinessLogic" id="businessLogic">
    <property name="persistence" ref="persistence" />
    <property name="presentation" ref="presentation" />
    </bean></beans>

    Bzw. mit Java Code

    @Configuration
    public class AppConfig {
    @Bean
    public IPersistence persistence () {
    MyPersistence myPersistence = new MyPersistence("path/to/db") ;
    myPersistence. setBusinessLogic(businessLogic());
    return myPersistence;
    }@Bean
    public IPresentation presentation () {
    MyPresentation myPresentation = new MyPresentation (300, 200);
    myPresentation.setBusinessLogic(businessLogic());
    return myPresentation;
    }@Bean
    public IBusinessLogic businessLogic() {
    return new MyBusinessLogic (persistence(), presentation());
    }
    }

Constructor Injection

Abhängigkeiten über Konstruktor definieren → Problematisch, gleiche Signatur

Beispiele: Pico, Guice, (Spring, Aries)

public class TestBean{
String id;
String internalLocation ;
String externalLocation;
public TestBean (String id, String internalLocation) {
this.id = id;
this.internalLocation = String internalLocation;
}
public TestBean (String id, String externalLocation) { -> gleiche Methoden-Signatur
this.id = id;
this.externalLocation = externalLocation;
}
}

Artefakte die in der Pipeline erstehen

Dokumente die im Deploy

Generelle Projektinformationen

– Version, Name, Beschreibung – Beitragende – Lizenz – Entwicklungswerkzeuge

Source Code (javadoc)

Code Quality Reports

– Test Reports – Checkstyle – Component Dependency Reports

Dokumente

– Architekturbeschreibung – Anwenderhandbuch – Website