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:
- Update (Wie ein fetch)
- Lokal Dinge ändern
-
Update (Vor dem Hochladen muss man nochmals fetchen)
Lokal merge konflikte lösen (die Person die hochlädt ist verantwortlich → commiten viel anstrengender)
- 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:
- Clone Repository
- Lokal Dinge ändern
- Lokal commiten
- Merge: Push + Pull request (öffnet eine Diskussion über Code und ob es geeignet ist, Merge erst nach Code Review)
Umgang mit Konflikten (SCM)
-
Locking
Zugang zur Branch während man daran arbeitet für alle anderen sperren
-
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.
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:
- Entwickler erstellt neue Version im SCM (Commit, Pull-Request...).
- CI Werkzeug reagiert auf dieses Ereignis, lädt die entsprechende Version.
- Build Tool wird gestartet, compilierter Code wird mit einem Test-System automatisiert getestet.
- Entwickler wird mit Bericht verständigt.
Continuous Delivery + Continuous Deployment
Definitionen
Build means to compile the project.
Deploy means to:
- Compile the project
- Publish the output, meaning copy it to a target directory, upload it to an FTP server etc
Zusammengefasst:
-
Continuous Integration
- Build
- Test
- Merge
-
Continuous Delivery
- Automatisierter Release in ein Repository
- Deployment nach manueller Freigabe
-
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
- 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(): } }
- 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); } }
- 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) } }
- 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