Heute behandeln wir drei Themen: Erfolgreiche Teamarbeit Ergänzende Hinweise zur Gestaltung der GUI Grundlagen Netzwerkprogrammierung Programmierpraktikum Wilfried Linder Arbeiten im Team Qualifikationen des Softwareentwicklers Abstraktionsvermögen: Nur mit Hilfe der Abstraktion können komplexe Systeme bewältigt werden. Kommunikationsfähigkeit: Gute sprachliche und schriftliche Ausdrucksweise sowie eine überzeugende Präsentation sind wichtig. Wille zum lebenslangen Lernen: - Wissen der Software-Technik verdoppelt sich alle vier Jahre, - Umfeld ändert sich permanent, z.B. Internet, mobile Anwendungen, … Kreativität: Es gibt kein breites Erfahrungspotential, aus dem man unbesehen schöpfen könnte. Hohe Belastbarkeit: Mitarbeiter müssen „stressverträglich“ sein häufig Überstunden (oft ohne Ausgleich). Programmierpraktikum Wilfried Linder Veraltetes (?) Bild eines Programmierers. Es fehlen noch wahlweise Kaffee oder Kaltgetränke, Zigaretten, Bücher, … „Sag mir dein Problem, dann mach die Tür von außen zu und komm in 14 Tagen wieder!“ Programmierpraktikum Wilfried Linder Motivationstypen • Aufgabenbezogener Typ: motiviert durch intellektuelle Herausforderung der Arbeit. - Selbstcharakterisierung als unabhängig, einfallsreich, zurückhaltend, introvertiert, energisch, wetteifernd, selbständig. - Mehrheit der Softwareentwickler ist aufgabenbezogen. • Selbstbezogener Typ: motiviert durch persönlichen Erfolg (gemessen in Geld oder Statussymbolen). - Selbstcharakterisierung als lästig, hartnäckig, dogmatisch, introvertiert, eifersüchtig, draufgängerisch, wetteifernd. - Zielerreichung vor allem im Management. • Interaktionsbezogener Typ: motiviert durch Zusammenarbeit. - Selbstcharakterisierung als friedfertig, hilfsbereit, rücksichtsvoll, besonnen, geringes Autonomie- und Statusbedürfnis. - durch anwenderorientierte Projekte angezogen. - Frauen sind häufiger interaktionsbezogen (Gründe offen). Programmierpraktikum Wilfried Linder Faktoren, die die Teambildung fördern • Team zu Erfolgen verhelfen gemeinsames konkretes Ziel notwendig - Keine abstrakten Firmenziele, sondern messbare, prüfbare Ziele. - Die Arbeit sollte so aufgeteilt werden, dass genügend oft Erfolgserlebnisse da sind. • „Elite-Team“ Mitarbeiter brauchen das Gefühl, einzigartig zu sein. Egal, worin sich die Einzigartigkeit ausdrückt, sie ist Grundlage für die Identität des Teams. • „Qualitätskult“ jedes Team braucht eine Herausforderung. - Mittelmäßige Aufgaben nehmen den Ehrgeiz, eine herausragende Leistung zu bringen. - Niemand ist stolz, an einem „Schundprojekt“ zu arbeiten. • Kein Overengineering: - Vergolden Sie keine Funktionen, nur weil es dem Team Spaß macht. - Perfektionieren Sie das Notwendige. Programmierpraktikum Wilfried Linder • Vielfalt steigert die Erfolgschancen. • Persistenz: “Never change a winning team“. • Vertrauen statt übermäßiger Kontrolle autonomes Arbeiten • Ein Team pro Nase: - Eingeschworene Teams entstehen nur, wenn die Mitglieder den größten Teil ihrer Zeit darin verbringen. - Mitgliedschaft in mehreren Teams erschwert die Teambildung und die Effizienz. • Echte Termine: Das Management darf nur Termine vorgeben, die auch einzuhalten sind. Alles andere zerstört Glaubwürdigkeit und Vertrauensbasis. Programmierpraktikum Wilfried Linder Teamorientierte Gruppenleiter… erkennen Kompetenz bei Mitarbeitern an. übertragen gewisses Maß an Freiheit und Verantwortung an ihre Mitarbeiter. gewähren einen Vertrauensvorschuss. lassen Teams sich selbst bilden oder räumen Mitspracherecht bei der Zusammensetzung ein. räumen administrative und organisatorische Hürden aus dem Weg. Teamorientierte Mitarbeiter… sind positiv zur Teamarbeit eingestellt. erkennen und respektieren die fachliche Qualifikation und persönliche Integrität anderer. verhalten sich partnerschaftlich und sind kritiktolerant. können widersprüchliche und voneinander abweichende Informationen verarbeiten. Programmierpraktikum Wilfried Linder Brainstorming („Kaffeerunde“) Spezielle Form einer Gruppensitzung mit dem Ziel, Ideen & Gedanken einer Gruppe frei fließen zu lassen und sie zu Neuem zu kombinieren. Brainstorming fördert die Kreativität • Freies und ungehemmtes Aussprechen von Gedanken. • Vorschläge sind weiterzuentwickelnde Anregungen. • Kritik während des Brainstorming vermeiden. • Quantität geht hier vor Qualität. Voraussetzungen: erfahrener Moderator, disziplinierte Teilnehmer, maximale Dauer: 30 Minuten. Programmierpraktikum Wilfried Linder Effiziente Besprechungen • Oft sind Besprechungen wenig produktiv; sie gleichen mehr - Laberrunden (alle reden durcheinander), - Selbstfindungssitzungen (ohne Ergebnis, „gut, dass wir darüber geredet haben“), - oder einem Haifischbecken (alle hacken aufeinander ein). • Nur dann tagen, wenn es keine Alternative gibt. Gibt es nichts zu besprechen, keine Zeit verschwenden. • Für jede Sitzung einen Moderator bestimmen (muss nicht der Gruppenleiter sein) • Pünktlich anfangen und Störungen vermeiden • Tagesordnung: Vor jeder Sitzung muss klar sein, worüber geredet werden soll, damit sich die Teilnehmer vorbereiten können. • Ergebnisse der Besprechung in einem Protokoll festhalten. Programmierpraktikum Wilfried Linder In der Praxis werden Sie um Teamarbeit nicht herumkommen! Wichtige Aspekte: Kommunikation (Telefon, Mail, regelmäßige Treffen) Klare Aufgabenverteilung Kameradschaftliche Grundhaltung („Teamgeist“) Konfliktfähigkeit Striktes Einhalten definierter Schnittstellen Vereinbarte Termine einhalten Stellen Sie sich vor, Sie arbeiten in einer 5er-Gruppe. „Arbeiten“ tun drei davon, die anderen beiden sind mehr oder weniger inaktiv. Was tun? Programmierpraktikum Wilfried Linder Einerseits… … haben wir gelernt, dass man nicht „petzt“. Außerdem sind wir gute „Kameraden“, also ziehen die Stärkeren die Schwächeren mit. Andererseits… … wächst bei den Aktiven der Frust, die Zeitplanung gerät aus den Fugen, Termine können nicht eingehalten werden, das ganze Projekt ist gefährdet. Abhilfe: Zunächst innerhalb der Gruppe versuchen, das Problem zu lösen. Wenn das nicht hilft, die zuständigen Leute informieren (Chef, Abteilungsleiter, …). Es geht dann nicht anders! Programmierpraktikum Wilfried Linder Und außerdem zu diesem Thema: Es ist ein Akt der Fairness, wenn Gruppenmitglieder, die sich nicht mehr beteiligen wollen, dies rechtzeitig allen anderen der Gruppe mitteilen. Arbeiten Sie probeweise mal zu zweit am PC – einer tippt den Quelltext ein, der andere sieht zu (im Wechsel). Sie werden merken, dass Fehler leichter und schneller erkannt werden! Teamarbeit hat nämlich auch den Sinn, dass nicht nur eine einzige Person den Quelltext versteht. Das ist wichtig, falls der Programmierer ausfällt. Und als kleiner Trost für eingefleischte „Einzelarbeiter“: Nachdem das Konzept steht und die Aufgabenverteilung erfolgt ist, kann man sich ja für die zugeteilten Aufgaben zurückziehen. Programmierpraktikum Wilfried Linder Quellenhinweis: Verwendet wurden Unterlagen der Vorlesung von Prof. Dr. Schöttner, HHUD (Sommersemester 2007) und von Prof. Dr. Zeller, Uni Saarbrücken (Sommersemester 2003). Link: http://ab.inf.uni-tuebingen.de/teaching/ss07/soft/script/02_teamarbeit_23April2007.pdf Programmierpraktikum Wilfried Linder Einige Ergänzungen zur Gestaltung der GUI Drei Grundsätze vorab: Halten Sie sich, wo immer möglich, an Standards. Das erleichtert dem Kunden die Einarbeitung und verhindert Fehlbedienungen. Achten Sie die Muttersprache des Kunden, vermeiden Sie „denglisch“. Gestalten Sie die Oberfläche so einfach, klar und logisch gegliedert wie möglich. … und bedenken Sie: Die besten Programme sind diejenigen, für die man kein Handbuch benötigt! („Intuitive Bedienung“) Programmierpraktikum Wilfried Linder Zu den (Quasi-)Standards gehören u.a.: Hauptmenüzeile Werkzeugleiste („tool bar“) ggf. Statuszeile unten Alle Parameter mit sinnvollen Voreinstellungen („defaults“) Fehlerhafte Eingaben unterbinden Buttons OK / Abbrechen verknüpft mit Eingabe- / Esc-Taste Stringente Anordnung und Beschriftung von Buttons Warnmeldungen (z.B. bei „Speichern“, falls die Datei bereits besteht) Online-Hilfe per Menüeintrag „?“ bzw. F1Taste Tipp: Sehen Sie sich vergleichbare kommerzielle Produkte an. Programmierpraktikum Wilfried Linder Schriftart, -größe, -farbe Es beginnt mit „Kleinigkeiten“ wie der Wahl von Schriftart und Schriftgröße sowie den Farben. Verwenden Sie eine gut lesbare Standardschrift (z.B. Arial), Schriftgröße mindestens 10 Punkt, und bleiben Sie dabei in allen Menüs bzw. Fenstern. Setzen Sie Fettdruck und Kursiv äußerst sparsam ein. Sorgen Sie für guten Kontrast. Optimal ist schwarze Schrift auf weißem Grund. Dies dagegen ist Murks. Sie finden zu diesem Thema viele Hinweise im Internet, z.B. hier: http://vsr.informatik.tu-chemnitz.de/proseminare/www05/doku/design/ (… bezieht sich konkret auf Webseiten-Design, ist aber auch für Ihre Aufgabe nützlich.) Programmierpraktikum Wilfried Linder Weitere Details: Startfenster (und weitere Fenster) skalierbar Nicht aktivierbare Optionen und Icons gegraut (oder gar nicht anzeigen) Unterstützung von Funktionstasten und Maus, soweit sinnvoll und üblich (Beispiele: F1-Taste für Online-Hilfe, gedrücktes Mausrad für Zoom bei Grafik) Unterstützung von Tastenkombinationen (z.B. Speichern aufrufbar auch per „Alt“- plus „S“-Taste Bei Programmen mit mehreren Werkzeugleisten sollte eine Auswahl getroffen und abgespeichert werden können („Konfiguration“) Spielereien vermeiden! (z.B. Hintergrundfarbe von Standardfenstern einstellbar). Merke: Man beschränke die Funktionen grundsätzlich auf das geforderte Minimum Programmierpraktikum Wilfried Linder Netzwerkanbindung Rechner kommunizieren im Internet über Protokolle, das Wichtigste und Bekannteste ist das TCP/IP (*). Socket: „Sockel“ oder „Steckdose“, Schnittstelle zu TCP/IP. Keine Hardware, sondern ein logisches Konstrukt für eine bidirektionale Verbindung. Jeder Rechner, der im Netz mitspielen will, implementiert zunächst ein Socket. Dabei unterscheiden wir zwischen „Clients“ und „Servern“: Client: Baut die Verbindung auf und sendet Daten Server: Wartet auf eingehende Verbindungen Dafür werden natürlich eindeutige Adressen benötigt (*) transmission control protocol / internet protocol Programmierpraktikum Wilfried Linder Server: Eindeutige IP-Adresse im Netz (z.B. 134.99.112.82 bei IPv4) Eindeutige Portnummer: 0 … 1023 sind Systemports (festgelegt), z.B. 20 = FTP, 80 = HTTP 1024 … 49151 sind „user ports“ 49152 … 65536 sind „dynamic ports“ und frei verfügbar Wenn die IP-Adresse die postalische Anschrift eines Hotels wäre, dann würde die Port-Nummer der Zimmernummer entsprechen. Client: Bekommt vom Betriebssystem beim Verbindungsaufbau eine (zufällige + eindeutige) Portnummer zugewiesen. Programmierpraktikum Wilfried Linder Die Kommunikation erfolgt über Protokolle Transmission Control Protocol (TCP) • zuverlässig • verbindungsorientiert • paketvermittelt • bidirektional Einfaches Fazit: Wir verwenden TCP. User Datagram Protocol (UPD) • unzuverlässig • unsicher / ungeschützt • gelegentlich schneller als TCP Programmierpraktikum Wilfried Linder Schematischer Ablauf, TCP-Sockets ServerSocket() accept() Socket() write() CLIENT Programmierpraktikum close() Anfrage Antwort Warten auf Verbindung read() write() close() SERVER read() Verbindung aufbauen Wilfried Linder Jetzt je ein Beispiel für den Client …: package netzwerk; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class TheClient { public static void main(String[] args) { Socket server = null; try { server = new Socket("localhost", 12345); Scanner in = new Scanner(server.getInputStream()); PrintWriter out = new PrintWriter(server.getOutputStream(), true); out.println("2"); out.println("4"); System.out.println(in.nextLine()); server.close(); } catch (Exception e) { } } } sendet Daten Programmierpraktikum Wilfried Linder … und für den Server: package netzwerk; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TheServer { static class HandleThread implements Runnable { Socket client; public HandleThread(Socket client) { this.client = client; } @Override public void run() { Scanner in; try { in = new Scanner(client.getInputStream()); PrintWriter out = new PrintWriter(client.getOutputStream()); String zahl1 = in.nextLine(); String zahl2 = in.nextLine(); out.println(Integer.parseInt(zahl1) * Integer.parseInt(zahl2)); out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } … Programmierpraktikum Wilfried Linder public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(12345); while (true) { try { Socket client = server.accept(); new Thread(new HandleThread(client)).start(); } catch (IOException e) { } } } } (Die Quelltexte stammen von Sebastian Krings, ProPra Sommersemester 2011) Programmierpraktikum Wilfried Linder Durch die endliche Übertragungsrate im Netz ergeben sich Zeitverzögerungen (Latenzen) zwischen dem Absenden und dem Empfangen von Daten. Das ist bei vielen Anwendungen ohne Belang, kann aber bei Netzwerkspielen zu Problemen führen. Ideal wären kürzeste Übertragungszeiten und synchron laufende Uhren bei allen beteiligten Rechnern (Clients, Server). Das Ganze kann bei Ihrem Spiel in dem Moment interessant werden, wenn es um spielrelevante Aktionen geht wie z.B. Tastatureingaben (Pfeiltasten zur Steuerung von Figuren). Bei Textnachrichten (ChatFunktion) spielen kurze Verzögerungen dagegen keine Rolle. Programmierpraktikum Wilfried Linder Hier ein eventuell hilfreiche Idee: Abschätzen der vermutlichen Position durch Vorausberechnung („dead reckoning“). Das Verfahren stammt aus der Navigation von Schiffen, Flugzeugen usw. Position zum Zeitpunkt tn Position zum Zeitpunkt tn-1 Programmierpraktikum Bekannte Positionen liefern Richtung und Geschwindigkeit, damit kann die Position fortgeschrieben werden. Wilfried Linder Das Vorausberechnen bzw. -abschätzen der aktuelle Position ist aber immer nur eine Näherung und auch nur dann hilfreich, wenn der Spieler keine allzu hektischen Bewegungen macht! Hier noch einige nützliche Links mit Quelltextbeispielen: http://www.javabeginners.de/Netzwerk/Socketverbindung.php http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_21_007.htm http://www.fh-wedel.de/~si/projekte/ss97/Ausarbeitung/4/3.doc.html http://cs.lmu.edu/~ray/notes/javanetexamples/ http://www.cs.hs-rm.de/~knauf/SWTProjekt2008/sockets/ Programmierpraktikum Wilfried Linder