Qualifikationen des Softwareentwicklers

Werbung
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
Herunterladen