Verfasst von: bletra | 7. März 2016

Meeting C++

C++ hat sich in den letzten Jahren bewegt und viele neue Sprachfeatures aufgenommen. Von der Konferenz Meeting C++ gibt es einen guten Youtube-Channel, schauen Sie mal rein. Was sind die besten Videos?

Verfasst von: bletra | 30. Dezember 2014

2014 im Rückblick

Die WordPress.com-Statistik-Elfen haben einen Jahresbericht 2014 für dieses Blog erstellt.

Hier ist ein Auszug:

Die Konzerthalle im Sydney Opernhaus fasst 2.700 Personen. Dieses Blog wurde in 2014 etwa 20.000 mal besucht. Wenn es ein Konzert im Sydney Opernhaus wäre, würde es etwa 7 ausverkaufte Aufführungen benötigen um so viele Besucher zu haben, wie dieses Blog.

Klicke hier um den vollständigen Bericht zu sehen.

Verfasst von: bletra | 7. Juni 2014

Agil durch und durch

Eben bin ich auf einen interessanten Blog gestoßen, der auf vielen verschiedenen Ebenen beleuchtet, was Informatikerinnen und Informatiker heute als Kompetenzen brauchen, wie Teams lernen agil zu denken etc. also alles rund um agil finden Sie unter: http://blog.agile-moves.de

Verfasst von: bletra | 5. März 2014

Ferienlektüre

Eben bin ich über zwei lesenswerte kompakte Artikel gestoßen:

Agile software development methodologies and how to apply them und
 eine sehr kompakte Darstellung nützlicher Features in C++11: Ten C++11 Features Every C++ Developer Should Use

Viel Spaß  beim weiteren Stöbern auf der Seite 🙂 — die gut bewerteten oder ausgezeichneten Artikel sind insb. im .Net-Bereich oft lesenswert.

Verfasst von: bletra | 9. September 2013

Ferienzeit nutzen

Die vorlesungsfreie Zeit neigt sich dem Ende zu und Sie möchten die verbleibenden Wochen nutzen, um Sie interessierende Themen aufzuarbeiten? Dann schauen Sie doch mal bei folgendem offenen Kursmaterial herein, vielleicht ist etwas für Sie dabei? Haben Sie mit anderen Anbietern gute Erfahrungen gemacht?

Sehr gut ist auch das Angebot unseres Kompetenzzentrums.

Artikelserie:

  1. Einleitung
  2. Literaturrecherche
  3. Literaturverzeichnis
  4. Gliederung
  5. Diskussion und Ausblick
  6. Abstrakt
  7. Feinschliff  (dieser Post)

Dieser Post ist der letzte Artikel dieser Serie. Wenn Sie Ihre Arbeit komplett geschrieben haben und bevor Sie sie zum letzten Korrekturlesen an eine dritte Person geben, gehen Sie selbst noch einmal kritisch über Ihre Arbeit. Selbst, wenn Sie gegenüber Ihren eigenen Worten betriebsblind sind, können Sie folgende Checkliste durcharbeiten:

  • Sprache:
    • Lesen Sie die Arbeit laut vor, sperrige Sätze/Doppelungen fallen so leichter auf.
    • Welche Zeitform verwenden Sie, mischen Sie, bleiben Sie im Präsens?
    • Sind die Sätze kurz und verständlich?
    • Verwenden Sie wenige Passivsätze?
    • Streichen Sie Füllwörter wie ‚ziemlich, eigentlich, sehr, relativ, meistens‘ heraus.
    • Ist der Schreibstil klar verständlich, korrekt (nicht flapsig oder ungenau)?
    • Verwenden Sie die Fachterminologie und verwenden Sie die Begriffe korrekt?
    • Rechtschreibung und Zeichensetzung.
  • Struktur/Inhalt:
    • Ist der rote Faden klar erkennbar? Schweifen Sie ab (diesen Teil können Sie ggf. in den Anhang auslagern).
    • Haben Sie deutlich herausgearbeitet, wie Sie methodisch/systematisch vorgegangen sind?
    • Enthält jedes Kapitel eine sinnvolle Einleitung?
    • Wird durch Wiederholungen und Zusammenfassungen der Fokus nach detaillierten Ausarbeitungen wieder auf den roten Faden gelenkt?
    • Ist die Argumentationskette klar und lückenlos?
    • Vollständigkeit, erfüllen Sie die formalen Kriterien (Erklärung, …)?
    • Ist klar erkennbar, auf Grundlage welcher Fakten die Schlussfolgerungen gezogen werden,  auf welche Ergebnisse Anderer Sie sich berufen, was Ihre eigene Ergebnisse sind?
    • Sind die Ergebnisse objektiv, klar und nüchtern dargestellt?
    • Wurden alle Begriffe etc. ordentlich eingeführt?
    • Wird jede Behauptung belegt, jedes Argument begründet?
    • Sind alle Verzeichnisse aktualisiert?
    • Werden alle Abbildungen im Text erläutert, passen die Bildbeschriftungen zum Bild?
    • Unterpunkte wie 4.1 ohne 4.2 entfernen.
    • Werden komplexe Sachverhalte visualisiert? Halten Sie sich bei der Visualisierung an Standards? Versuchen Sie zu viel in eine Abbildung zu pressen?
  • Layout:
    • Flatterrand, Silbentrennung prüfen.
    • Gute Auflösung der Graphiken?
    • Literaturverzeichnis kritisch prüfen, einheitliche Formatierung, Vorgaben beachtet?

Diese Liste ist nicht nach Priorität sortiert. Weitere Anregungen/Checklisten enthalten diese Folien eines Kollegen.

Schauen Sie auch mit den Augen Ihrer Referentin auf die Arbeit. Ich orientiere mich an den Kriterien der Kollegen:

  • Titel: Ist der Titel aussagekräftig? Klar oder mehrdeutig? Trifft der Titel wirklich das, was in der Arbeit steht?
  • Kenntnisse und Fähigkeiten: Beherrschen Sie Ihr Themengebiet? Können Sie mit den Techniken, die Sie im Studium gelernt haben, umgehen? Verwenden Sie Standards (bei der Darstellung und im Code)?
  • Systematik und Wissenschaftlichkeit: Ist der Aufbau / das Vorgehen systematisch? Ist die Arbeit schlüssig? Ist der rote Faden erkennbar? Sind die Themen in sich abgeschlossen?
  • Qualität der Ergebnisse: Ist die Darstellung ordentlich (Text, Rechtschreibung, Grafiken)? Ist die CD vollständig (Arbeit, Quellcode, Onlinequellen als PDF)? Sind die Literaturverweise aussagekräftig?
  • Fragestellung – Leitfragen der Arbeit: Klar und prägnant formuliert, abgegrenzt oder schwammig – zu allgemein – hat sich der Autor zu viel vorgenommen?
  • Zielsetzung der Arbeit: Gut herausgearbeitet – gleich zu Anfang ersichtlich? oder unklar?
  • Umgang mit Begriffen: Klare Fachbegriffe und Definitionen – konsequent verwendet? Fachsprache oder Umgangssprache?
  • Wissenschaftlichkeit: Differenzierte Diskussion und Argumentation – sinnvolles Einarbeiten von Quellen? Werden Zitate und Literatur zum Belegen kompetent verwendet – nicht als Ersatz für eigene Gedanken? Formal in Ordnung? Alle zitierte Literatur im Verzeichnis enthalten und alle Literatur aus dem Verzeichnis im Text referenziert?
  • Lösungsansatz: Klar beschrieben? Auf Problemstellung Bezug genommen? Alternativen betrachtet? Ist der Lösungsweg beschrieben? Klare, nachvollziehbare Methoden? Systematisch hergeleitet?
  • Praktische Umsetzung / Prototyp: Löst der Ansatz tatsächlich das Problem? Nachweisbar?
  • Zusammenfassung und Fazit: Mehrwert der Konzeption / des Prototyps aufgezeigt? Auf Schwächen, gemachte Erfahrungen und mögliche Grenzen bzw. Alternativen eingegangen?
  • Kreativität und Originalität: ‚Nur’ gute Aufbereitung des aktuellen Standes in einem Themengebiet oder erkennbar eigene Beiträge?

Ich hoffe, diese Artikelserie hilft Ihnen eine gute Thesis abzugeben. Fehlt etwas, gibt es andere für Sie hilfreiche Quellen? Ich freue mich über Anregungen/Rückmeldungen.

Artikelserie:

  1. Einleitung
  2. Literaturrecherche
  3. Literaturverzeichnis
  4. Gliederung
  5. Diskussion und Ausblick
  6. Abstrakt (dieser Post)
  7. Feinschliff

Im letzten Artikel dieser Serie habe ich die Bedeutung und den Inhalt einer Diskussion, allgemein eines guten abschließenden Kapitels einer Thesis dargestellt. Sie haben nun eine gute Version Ihrer Thesis erstellt. Jetzt können Sie eine erste Fassung eines Abstrakts schreiben. Ein Abstrakt wird immer veröffentlicht, auch wenn Vertraulichkeit vereinbart wurde. Abstrakts erscheinen typischerweise in entsprechenden Datenbanken und sind die Grundlage für eine Suche. Bei einer Thesis stellt ein Abstrakt eine klare Zusammenfassung dar, setzt die Leser ins Bild.  Ein Abstrakt ist nicht länger als eine Seite und enthält typischerweise folgende Abschnitte:

  • Motivation/Bedeutung: Wenn Sie ein allgemein bekanntes Problem behandeln, dann fangen Sie mit der Problembeschreibung an und stellen klar, welches Teilproblem im Gesamtzusammenhang in der Thesis bearbeitet wird. Sonst beschreiben Sie in der Motivation, warum Ihre Arbeit wichtig ist und welche Folgen eine erfolgreiche Bearbeitung haben kann.
  • Problembeschreibung: Was ist das Problem? Unter welchen Nebenbedingungen betrachten Sie das Problem (Scope). Warum ist das Problem interessant – sofern das nicht aus der Motivation heraus klar wird. Formulieren Sie eine klare Frage, die Sie in der Arbeit beantworten möchten.
  • Herangehensweise: Wie haben Sie das Problem bearbeitet (Simulation, Prototyp, Analyse)? Haben Sie eine spezielle Applikation als Argumentationsgrundlage gewählt oder verschiedene Programme in verschiedenen Sprachen analysiert? Welche variablen Größen haben Sie variiert oder gemessen?
  • Ergebnisse: Was haben Sie erreicht? Wie lautet die Antwort auf die in der Problembeschreibung aufgeworfene Frage? Ist Ihre Lösung x Prozent, y-fach schneller, billiger oder in Bezug auf welche andere Größe besser als andere Lösungen? Formulieren Sie die Antworten möglichst klar, gerne mit genauen Zahlen, vermeiden Sie unklare Formulierungen wie etwas/sehr.
  • Fazit: Welche allgemeingültigen Aussagen, welche Folgerungen oder Verallgemeinerungen lassen sich ableiten? Eventuell auch, hat sich die Herangehensweise, der verfolgte Ansatz als sinnlos erwiesen? Welche Message soll die Leserin mit nachhause nehmen?

Jeder Abschnitt umfasst ca. einen oder zwei Sätze. Die Abschnitte werden nicht durch Überschriften hervorgehoben. Der Abstrakt ist ein einfacher Text, der sich in Absätze gliedert, sonst jedoch keine Hervorhebungen, keine Formeln und auch keine Referenzen enthält. Es handelt sich um einen Text, den Sie komplett in Ihren Worten und mit Ihren Ideen und Gedanken füllen.

Nehmen Sie sich Zeit für den Abstrakt, überarbeiten Sie ihn mehrfach. Der Abstrakt ist der Abschnitt einer Arbeit, der häufig darüber entscheidet, ob die Arbeit selbst gelesen wird.

Artikelserie:

  1. Einleitung
  2. Literaturrecherche
  3. Literaturverzeichnis
  4. Gliederung
  5. Diskussion und Ausblick (dieser Post)
  6. Abstrakt
  7. Feinschliff

Die Diskussion ist das Herzstück Ihrer Arbeit. Hier bewerten Sie die Ergebnisse Ihrer Arbeit kritisch. Um dies tun zu können, müssen Sie eine erneute Literaturrecherche ausführen. Im Diskussionsteil argumentieren Sie, stellen Zusammenhänge dar, analysieren Ihre Erkenntnisse und vergleichen diese mit allen wichtigen Ergebnissen anderer Publikationen (Verweise zu anderen Arbeiten); stellen Sie Bezüge zum Denken und Forschen anderer her; erläutern Sie die Bedeutung Ihrer Ergebnisse und bewerten Sie diese; die Diskussion ist zum großen Teil Literaturarbeit; jede Behauptung und jedes Argument benötigt einen Beleg. Sie evaluieren kritisch, welche in der Einleitung genannten Ziele und Fragen in welchem Maß erreicht bzw. beantwortet sind. Arbeiten Sie den Nutzen Ihrer Arbeit heraus, warum ist Ihre Arbeit für andere Wissenschaftlerinnen wichtig? Welche Erkenntnisse/Ergebnisse Ihrer Arbeit schließen welche in der Literatur dargestellte Probleme/Lücken? Warum bringt Ihre Arbeit die Wissenschaft voran?   Welche Einschränkungen unterliegen Ihre Ergebnisse? Arbeiten Sie heraus, was noch offen ist. Dies mündet in einem Ausblick: Stellen Sie dar, welche Fragestellungen/Probleme/Lösungsansätze sich sinnvoll an Ihre Arbeit anschließen, wie könnte es weiter gehen? Was ist noch offen?

Artikelserie:

  1. Einleitung
  2. Literaturrecherche
  3. Literaturverzeichnis
  4. Gliederung (dieser Post)
  5. Diskussion
  6. Abstrakt
  7. Feinschliff

Eine wissenschaftliche Arbeit ist systematisch gegliedert und stellt das Ergebnis eigenständiger Forschung dar. Daher wird eine wissenschaftliche Arbeit ergebnisorientiert gegliedert, die Gliederung spiegelt also nicht die notwendigen chronologischen Arbeitsschritte wider, sondern orientiert sich an einer stimmigen Argumentation, einem roten Faden, einer Systematik.

Neben den Formalien wie Titelblatt, Erklärung, Abbildungsverzeichnis etc. finden Sie prinzipiell folgende Elemente in einer wissenschaftlichen Arbeit der Informatik. Die hier aufgeführten Elemente dürfen in Ihrer Gliederung durchaus andere Namen haben.

  • Abstrakt: vgl. Teil 6 dieser Serie
  • Einleitung: Einführung, Motivation, Problembeschreibung, Rahmenbedingungen, Ziele, Kurzfassung Ihrer Idee
  • Grundlagen: Führen Sie Methoden, Werkzeuge und Termini, die zum Verständnis notwendig sind und nicht zum Allgemeinwissen eines Informatikers gehören, ein. Führen Sie in das Basiswissen ein, auf dem die Idee Ihrer Arbeit aufbaut. Schreiben Sie aber kein Lehrbuch. Die Arbeit muss in sich verständlich sein. Die Expertin soll die Arbeit jedoch auch nachvollziehen können, ohne das Grundlagenkapitel gelesen zu haben.
  • Stand der Forschung: Beschreiben Sie vorhandene Systeme /Applikationen / Lösungsansätze; Basis dieses Kapitels ist eine gute Literaturrecherche: Fassen Sie hier Lösungsideen und Methoden zusammen, die andere in einem ähnlichen Kontext oder einem vergleichbaren Problemfeld veröffentlicht haben, verdichten Sie die Kernaussagen. Stellen Sie die vorhandenen Lösungen und Verfahren vor und diskutieren Sie sie anhand der Fragen: Welche Elemente dieser Lösungen sind gut und warum sind sie gut? Welche Elemente sind nicht gut und warum sind sie nicht gut? Schließen Sie den Abschnitt mit einer kurzen Zusammenfassung / Evaluation ab, was noch nicht gut geht und auch, auf was Sie zurückgreifen können, was also schon gut geht.
  • Hauptteil/Eigenanteil: Stellen Sie Ihr System dar; evtl. Anwendungsfälle, Architektur. Stellen Sie jedoch keine ewig langen Listings dar, diese gehören in den Anhang oder auf die CD. Wählen Sie spannende Teilprobleme und deren Lösungen aus. Der Hauptteil kann sich aus mehreren Kapiteln zusammensetzen, die aussagekräftige Titel haben. Sinnvoll ist eine Unterteilung in Konzept und Realisierung:
    • Konzept: Skizzieren Sie Ihre Idee/Ihr Verfahren/Ihre Anwendung, allerdings unabhängig von der konkreten Implementierung/der technischen Umsetzung. Gehen Sie die Argumentationskette durch und analysieren Sie systematisch, ob es Alternativen zu dem von Ihnen gewählten Vorgehen gibt und wenn ja, warum Sie sich für Ihren Weg entschieden haben.
    • Realisierung: Beschreiben Sie hier die konkrete Umsetzung Ihres Konzepts. Wo mussten Sie Abstriche machen, was lies sich warum nicht verwirklichen?
  • Ergebnisse / Zusammenfassung: Stellen Sie die Ergebnisse Ihrer Arbeit dar (nicht die Ausführung). Fassen Sie zusammen, was Sie gemacht haben. Hier beziehen Sie sich auf Ihre Arbeit und können auf Unterkapitel der Arbeit verweisen, i.A. jedoch nicht auf andere Publikationen. Stellen Sie Ihre Ergebnisse übersichtlich, geordnet z.B. in Form von Tabellen dar. Formulieren Sie hier verallgemeinerbare Aussagen, was lässt sich aus der prototypischen Implementation ableiten (Blick vom Konkreten um Allgemeinen)? Auch negative Ergebnisse sind Ergebnisse und ersparen anderen Irrwege. In der Mathematik ist ein Gegenbeispiel genau so wertvoll wie ein Beweis.
  • Diskussion und Ausblick: vgl. nächster Artikel, Teil 5 dieser Serie

Erstellen Sie eine erste Gliederung und überarbeiten Sie diese ständig. Fragen Sie sich immer, was ist Ihr roter Faden und folgt die Gliederung und Argumentation diesem roten Faden? Fassen Sie die Idee Ihrer Arbeit in einem Satz zusammen (These). Diese These ist der rote Faden Ihrer Arbeit.

Weitere Gliederungsvorschläge mit ausführlicher Erläuterung, was wo rein gehört und weiteren Tipps finden Sie unter:

Artikelserie:

  1. Einleitung
  2. Literaturrecherche
  3. Literaturverzeichnis (dieser Post)
  4. Gliederung
  5. Diskussion
  6. Abstrakt
  7. Feinschliff

Ihre Literaturrecherche hat Ihnen wertvolle Quellen geliefert, diese müssen Sie in einem Literaturverzeichnis aufführen. Sie müssen alle fremden Gedanken mit entsprechenden Quellen ausweisen, d.h. bei allen Textabschnitten/Argumenten/Abbildungen, die nicht von Ihnen originär stammen, fügen Sie einen Verweis hinzu und führen die Quelle im Literaturverzeichnis auf. Dies gilt auch für nicht kopierte, aber „nachgemalte“ Abbildungen. Spätestens seit diversen Plagiatsverfahren ist bekannt, welche Folgen fehlende Verweise haben können. Jede Behauptung und jedes Argument müssen Sie entweder aus Ihrer eigenen Arbeit ableiten oder mit entsprechender Literatur belegen.

Viele Hochschulen geben vor, wie das Literaturverzeichnis auszusehen hat, d.h. wie Bücher, Online-Quellen etc. zitiert werden müssen. Gibt es keine klaren Vorgaben, dann empfehle ich den Harvard Style oder den Style von IEEE. Die University of Queensland stellt auf der Seite Referencing Style Guides eine gute Darstellung verschiedener Styles (auch Harvard und IEEE) zur Verfügung.

Am besten, Sie legen sich gleich ein korrektes Literaturverzeichnis an. Wer mit Latex arbeitet, bekommt hierbei das Format geschenkt. Bei ACM Digital Library, IEEE Xplore oder CiteSeerX  können Sie als Export-Format BibTex wählen. Nun müssen Sie nur noch den entsprechenden Style (vgl. Übersicht Latex-Stildateien) einbinden. Abschließend sollten Sie  die Einträge der Vornamen prüfen (Vor- und Nachnamen werden teilweise unterschiedlich exportiert und müssen in den einzelnen Styles unterschiedlich angegeben werden).

Wichtig ist, dass Sie in das Literaturverzeichnis nur die Quellen aufnehmen, die Sie in Ihrem Text auch verwenden. Sie fügen also keine Quellen auf, die Sie nur zur Erarbeitung einer  Technologie verwendet haben. Auch dabei hilft Ihnen Latex, d.h. Sie können alle Quellen in der bibtex-Datei speichern und Latex übernimmt nur die in das Literaturverzeichnis Ihrer Thesis, die auch im Text referenziert werden.

Übrigens sind nicht alle Quellen, die Sie als PDF online finden auch als Online im Literaturverzeichnis aufzuführen. Einige dieser PDFs sind so in Konferenzbänden o.ä. veröffentlicht. Bei einem PDF, das die Form eines wissenschaftlichen Artikels zeigt, kann die Suche des Titels bei CiteSeerX sinnvoll sein. Eine URL eines Suchtreffers bei ACM ist ebenfalls keine Online-Quelle, sondern Sie müssen hier immer Konferenz/Journal/…, Autoren, Jahr, etc. im richtigen Format angeben.

In einem Literaturverzeichnis finden Sie häufig Kürzel der Art [Maier2013a], dies wird dann notwendig, wenn der Autor im gleichen Jahr mehrere Publikationen erstellt hat, die Sie in Ihrem Literaturverzeichnis aufführen. Wenn Sie innerhalb Ihrer Arbeit auf verschiedene Seitenzahlen derselben Publikation verweisen, so bleibt es dennoch derselbe Eintrag im Literaturverzeichnis — also keine mehrere Einträge, die mit a, b etc. ergänzt werden.

Mehr gibt es aus meiner Sicht zum Literaturverzeichnis nicht zu sagen, bzw. Details werden in den einzelnen Styles wie z.B. Harvard klar dargestellt.  Im nächsten Artikel gehe ich auf typische Gliederungen von Arbeiten in der Informatik ein.

Artikelserie:

  1. Einleitung
  2. Literaturrecherche (dieser Post)
  3. Literaturverzeichnis
  4. Gliederung
  5. Diskussion
  6. Abstrakt
  7. Feinschliff

Nachdem ich im letzten Artikel den Begriff „Wissenschaftliches Arbeiten“ eingeführt habe und ausgeführt habe, wie wichtig eine gute Fragestellung ist, gehe ich nun auf die Literaturrecherche ein — einem wichtigen Standbein Ihrer Thesis.

Welche Literatur suchen Sie wofür? Die Grundlagen erarbeiten Sie sich mit Büchern, Skripten, Tutorials, Blogs, Podcasts, etc. Suchen Sie sich viel Material, auf das Sie dann zurückgreifen können. Bücher für die Grundlagen finden Sie in der Bibliothek, in der Firma, in der Fachgruppe, bei Ihrem Referenten. Sie können auch Ihre Firma oder Ihren Referenten fragen, ob sie ein neues Buch bestellen können. Wenn Sie sich mit dieser Literatur die Grundlagen erarbeiten, dann halten Sie fest, welche Abbildungen, Ideen aus welcher Quelle stammen — wenn Sie später das Grundlagenkapitel auf Basis Ihrer Notizen und Zusammenfassungen schreiben, können Sie sonst nicht mehr oder nur mit Zusatzaufwand referenzieren, woher beispielsweise die Idee für eine bestimmte Abbildung kommt.

Eine erste Literaturrecherche kann Ihnen auch helfen, die Fragestellung einzugrenzen oder zu konkretisieren. Erarbeiten Sie sich mit der Fachliteratur den aktuellen State of the Art. Schauen Sie insbesondere nach rechts und links (vgl. nächste beiden Absätze).

Für den eigentlichen Inhalt und die Diskussion suchen Sie nach Publikationen, die sich mit einer ähnlichen Fragestellung beschäftigen, Ihr Problem aus einem anderen Blickwinkel betrachten, die Methode in einer anderen Branche anwenden, eine alternative Strategie/Technologie/Methode/Algorithmus beschreiben, ein Teilproblem lösen, Ihre Argumentation/Bewertung stützen, etc. Schauen Sie sich die Ergebnisse und noch offenen Fragestellungen der Publikationen genau an. Selbst, wenn Ihnen spontan nur eine Technologie/eine Lösung zu Ihrer Fragestellung einfällt, liefert eine gute Literaturrecherche Alternativen, die Sie evaluieren müssen oder auf die Sie sich in Ihrer Arbeit beziehen können.

Wie suchen Sie wo? Über das Netz der Hochschule haben Sie üblicherweise vollen Zugriff auf wissenschaftliche Literatur. An der h-da steigen Sie über die verfügbaren Literaturdatenbanken  ein und suchen beispielsweise bei ACM Digital Library, IEEE Xplore oder SpringerLink — vergessen Sie nicht, den Suchzeitraum einzugrenzen. Versuchen Sie prinzipiell Quellen zu verwenden, die einem Qualitätssicherungsprozess unterliegen — dies ist bei Blogs/Foren nicht der Fall. Suchen Sie zunächst nicht zu speziell. Wenn Sie Treffer gefunden haben, bekommen Sie sicher auch Anregungen für weitere Suchbegriffe, außerdem können Sie auf den Seiten der Autoren nach weiteren Projekten und Publikationen suchen oder den aufgeführten Referenzen nachgehen. Dokumentieren Sie Ihre Suche, d.h. wo haben Sie nach welchen Stichworten mit welchen Restriktionen gesucht. Ihre Betreuer können Ihnen so Tipps für eine ergänzende Suche geben. Erstellen Sie ein Mindmap der wesentlichen Begriffe, damit verschaffen Sie sich einen Überblick, erzeugen eine Struktur und bekommen vielleicht Ideen, welche Kombinationen von Suchwörtern noch sinnvoll sein könnten.

Lesen Sie die Publikationen und fassen Sie die Kernaussagen und Methoden zusammen. Überarbeiten Sie Ihre Gliederung. Schreiben eine Rohfassung des Grundlagenkapitels. Selbst, wenn Sie am Ende das Grundlagenkapitel wieder kürzen oder Teile in den Anhang auslagern, hilft Ihnen das Schreiben zu einem tieferen Verständnis der Methoden/Theorien/…

Im nächsten Artikel geht es um die korrekte Auflistung der verwendeten Literatur, dem Literaturverzeichnis.

Aktuell betreue ich erstmalig Bachelorarbeiten. Dabei und auch schon beim Vorbereitungsseminar und der Praxisphase zeigt sich immer wieder, dass es Unklarheiten bzgl. „Wissenschaftlichem Arbeiten“ in der Informatik gibt. Was ist damit gemeint, wie schreibe ich eine Bachelor-Arbeit, wie gehe ich vor, … Das sind Fragen, die sich viele Studierende stellen. Mit dieser Artikelserie möchte ich versuchen, einige Fragen zu beantworten. Wenn Sie Tipps und Links haben, dann freue ich mich über Kommentare.

Die Artikelserie adressiert folgende Themen:

  1. Einleitung (dieser Post)
  2. Literaturrecherche
  3. Literaturverzeichnis
  4. Gliederung
  5. Diskussion
  6. Abstrakt
  7. Feinschliff

Zunächst eine sachliche Definition, wie sie  Sie beispielsweise in (Balzert et al. 2008) finden:

Wissenschaftliches Arbeiten ist planvoll geordnetes Vorgehen mit dem Ziel, neue Erkenntnisse und neues Wissen zu gewinnen sowie Praxisprobleme zu lösen.“

Es gibt viele (ähnliche) Definitionen zum wissenschaftlichen Arbeiten und mit dieser vorangestellten Definition wissen Sie, worauf sich diese Artikelserie bezieht. Sie sollten auch zentrale Begriffe Ihrer Arbeit mit Definitionen unter Angabe von Quellen einführen.
Zentral bei einer Thesis ist die Fragestellung, das Problem. Dies wird häufig unterschätzt. Eine zentrale Frage dient jedoch als Orientierung, als roter Faden, um diese Frage dreht sich die gesamte Arbeit. Es ist wichtig, die Frage klar zu stellen und einzugrenzen.
Cédric Villani (Mathematiker) hat im Interview mit der Frankfurter Rundschau auf die Frage des Interviewers, ob „Wie können wir Armut abschaffen“ eine richtige Frage sei, geantwortet:

„Wie können wir Armut abschaffen, ist eine sehr vage Frage. Bevor wir hoffen können, sie zu beantworten, müssen wir sie präziser formulieren. Was ist Armut?“

Auf die Nachfrage, ob das leichter zu beantworten sei, sagte er:

„Nein, aber ein erster Schritt. In der Wissenschaft gehen wir so vor: Zuerst beschreiben wir die Situation, dann versuchen wir, sie zu verstehen und erst dann handeln wir. Bevor wir handeln können, müssen wir erst verstehen, was Menschen arm macht, wann sie sich als arm betrachten usw. Dann fangen wir an, die Hypothesen, die wir bei der Beantwortung dieser Fragen formulieren, zu überprüfen. Vielleicht macht der Kapitalismus die Leute arm, vielleicht der Kommunismus, vielleicht ist es eine Verteilungsfrage, vielleicht eine der Gesetzgebung. Identifiziere, definiere die Frage! Wie kann ich feststellen, ob es eine Frage der Gesetzgebung ist? Wir haben Tausende von Gesetzen. Ich muss feststellen, was relevant sein könnte. Wenn Sie diese Unterfragen abgearbeitet haben, kommen Sie vielleicht der Sache näher. Sie entdecken aber auch Kausalitäten, die das Verständnis wieder erschweren und erst recht die Therapie.“

In dem Interview gibt es auch noch eine gute Antwort auf den angeblichen einsamen Wissenschaftler im stillen Kämmerlein:

„Niemand forscht für sich allein. Sie zeigen ihre Ergebnisse Kollegen, Freunden, bitten sie um Kommentare, um Kritik, setzen sich wieder darüber, schreiben um, suchen, finden dann womöglich an einer ganz anderen Stelle eine Lösung, aber es war die Kritik, die sie bewegt hat.“

Dies gilt auch für Ihre Arbeit, diskutieren Sie mit möglichst vielen verschiedenen Leuten Ihre Ideen, die Fragestellung, Methoden, Probleme, …

Das Verfassen einer wissenschaftlichen Arbeit braucht Zeit, insbesondere die erste Arbeit dieser Art. Man braucht Zeit, um zu analysieren, was das Problem ist, welche möglichen Lösungen es gibt. Man braucht Zeit, um seine Gedanken zu ordnen, eine Lösung zu erarbeiten und diese präzise zu formulieren. Diskutieren Sie Ihre Ideen und Gedanken mit verschiedenen Leuten (immer wieder), dabei kommen Ihnen neue Ideen, Strukturen werden klarer.

Planen Sie für Ihre Arbeit folgende Phasen:

  • Grobgliederung, vgl. Gliederung
  • erste Literaturrecherche und Auswahl geeigneter wissenschaftlicher Arbeiten
  • Literaturstudium: Vergleichen Sie die gefundenen Quellen, versuchen Sie Unstimmigkeiten zu entdecken und entwickeln Sie eine eigene Meinung
  • Darstellung der aktuellen Forschung und Entwicklung: Fassen Sie die wissenschaftlichen Arbeiten zum Thema zusammen und arbeiten Sie heraus, auf welchen Ergebnissen Sie aufbauen.
  • Entwickeln Sie eigene Ideen und stellen Sie diese dar. Fassen Sie diese Idee Ihrer Arbeit in einem Satz zusammen (These). Diese These ist der rote Faden Ihrer Arbeit.

Im nächsten Post gebe ich Tipps zur Literaturrecherche.

Literatur:

Balzert, H, Schäfer, C, Schröder, M & Kern, U 2008, Wissenschaftliches Arbeiten: Wissenschaft, Quellen, Artefakte, Organisation, Präsentation, Birkach: W3L.

Verfasst von: bletra | 31. Dezember 2012

2012 in review

Die WordPress.com-Statistik-Elfen fertigten einen Jahresbericht dieses Blogs für das Jahr 2012 an.

Hier ist ein Auszug:

4.329 Filme wurden beim Cannes Film Festival 2012 eingereicht. Dieses Blog hatte 26.000 Besucher in 2012. Wenn jeder Besucher ein Film wäre, dann würde dieses Blog 6 Film Festivals füllen

Klicke hier um den vollständigen Bericht zu sehen.

Verfasst von: bletra | 12. Oktober 2012

VS2010: Code-Snippets

Code-Snippets sind nützliche Codefragmente, die häufig verwendet werden. Gibt man im Editor beispielsweise ctor TAB TAB ein, dann wird der Code für einen Konstruktor eingefügt. Ich verwende während der Entwicklung von Vorlesungsbeispielen o.ä. häufig System.Diagnostics.Debug.WriteLine(„info“); Selbst mit Codevervollständigung sind das einige Buchstaben und Tabs, die ich einzugeben habe. Also baue ich mir ein passendes Code-Snippet:

  1. Ich wähle ein passendes Basis-Snippet aus der vorhandenen Liste, in diesem Fall cw. Dazu schaue ich mit Tools->Code Snippet Manager, in welcher Datei das Snippet hinterlegt ist. Dieses öffne ich und kopiere den Code in eine neue Datei diag.snippet. Im Code Snippet Manager schaue ich, wo das Verzeichnis für My Code Snippets liegt.
  2. Ich passe den Code entsprechend an und speichere ihn in dem Verzeichnis von My Code Snippets ab. Fertig.

Hier mein Snippet:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>diag</Title>
      <Shortcut>diag</Shortcut>
      <Description>Code snippet for Diagnostics.WriteLine</Description>
      <Author>my name</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Code Language="csharp">
        <![CDATA[System.Diagnostics.Debug.WriteLine("$end$");]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Der Code ist nahezu selbsterklärend. SnippetType Expansion bedeutet, dass der Codeausschnitt an der Cursorposition eingefügt wird.

Weitere Links von Microsoft zu diesem Thema:

In diesem letzten Artikel der Reihe werde ich die besprochenen Codefragmente zu einer kleinen Demo-Applikation zusammenführen. Ich beginne mit dem ViewModel, das BaseViewModel, wie ich es in „WPF: Von Spaghetticode zu MVVM – Teil 6 von 9“ besprochen habe, erweitert. Das ViewModel verwendet die Klasse ExplicitlyObservableList, wie in Artikel „Multithreading in WPF (TPL, MVVM): Bindbare Collections (Teil 4 von 5)“ eingeführt.

using System;
using UBT.NetLecture.WPF.MVVMBase;
using System.Windows.Input;
using System.Threading.Tasks;

namespace DemoMVVMAsync
{
  public class ViewModel : BaseViewModel
  {
    private bool isRunning = false;
    private string folder = @"d:\tmp\images"; //eigentlich auch als Property für GUI
    private DelegateCommand cancelCmd;
    private ICommand doManyTasks;
    private ExplicitlyObservableList<ImageInformation> items;
    System.Threading.CancellationTokenSource cancelTokenSource;
    public ViewModel()
    {
      items = new ExplicitlyObservableList<ImageInformation>();
      doManyTasks = new DelegateCommand((param) => DoManyTasks(), (param) => !IsRunning);
      cancelCmd = new DelegateCommand((param) => CancelWork(), (param) => IsRunning);
    }
    public bool IsRunning
    {
      get { return isRunning; }
      set { isRunning = value; NotifyPropertyChanged("IsRunning"); }
    }
    public ICommand GetImagesCommand
    {
      get { return doManyTasks; }
    }
    public ICommand CancelCommand
    {
      get { return cancelCmd; }
    }
    public ExplicitlyObservableList<ImageInformation> Images
    {
      get { return items; }
    }
    private void CancelWork()
    {
      if (cancelTokenSource != null)
        cancelTokenSource.Cancel();
    }
    private void DoManyTasks()
    {
      //UI-Thread
      cancelTokenSource = new System.Threading.CancellationTokenSource();
      System.Threading.CancellationToken cancelToken = cancelTokenSource.Token;
      IsRunning = true;
      items.Clear();
      var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
      //start Hintergrund-Thread
      Task.Factory.StartNew(() =>
      {
        string[] imagePaths = System.IO.Directory.GetFiles(folder, "*.jpg");
        for (int i=0; i< imagePaths.Length; ++i)
        {
          if (cancelTokenSource.Token.IsCancellationRequested)
            return;
          Task.Factory.StartNew(() => { items.Add(new ImageInformation(imagePaths[i])); }, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
          if (i % 5 == 0)//nicht auf Basis von images.Count, da diese eben im ui-thread hinzugefügt werden und nicht hier
          {
            Task.Factory.StartNew(() => { items.Notify(); }, System.Threading.CancellationToken.None, TaskCreationOptions.None, uiScheduler);
            System.Threading.Thread.Sleep(500);//GUI etwas Zeit lassen, sich anzuzeige
          }
        };
      }, cancelTokenSource.Token).ContinueWith(
         (task) => {
           items.Notify(); //letze Änderungen mitteilen
           IsRunning = false;
         }, uiScheduler //in UI-Thread
      );
    }
  }
}

Die Oberfläche ist relativ einfach gehalten:

<Window x:Class="DemoMVVMAsync.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="MainWindow"
  Width="200"
>
<Window.Resources>
  <DataTemplate x:Key="ImageInformationTemplate">
    <Border BorderBrush="DarkBlue" BorderThickness="2" CornerRadius="3" Margin="5">
      <StackPanel Orientation="Vertical" Margin="3">
        <Image Source="{Binding PreviewImage}" />
        <TextBlock Text="{Binding Path=Title}" />
      </StackPanel>
    </Border>
  </DataTemplate>
</Window.Resources>
<DockPanel LastChildFill="True" >
  <StackPanel Width="150" DockPanel.Dock="Top" Orientation="Vertical" HorizontalAlignment="Left">
    <Button Content="start" Command="{Binding Path=GetImagesCommand}" Name="btnStart" IsDefault="True"/>
    <Button Content="cancel" Command="{Binding Path=CancelCommand}" Name="btnCancel"  IsCancel="True" />
  </StackPanel>
  <ListBox DockPanel.Dock="Bottom" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Name="lbImages" Background="Transparent" IsEnabled="True"  BorderThickness="1" ItemTemplate="{StaticResource ImageInformationTemplate}" ItemsSource="{Binding Path=Images, Mode=OneWay}" />
</DockPanel>
</Window>

Im Code-Behind-Teil passiert wie gehabt nicht viel:

namespace DemoMVVMAsync
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
      ViewModel vm = new ViewModel();
      this.DataContext = vm;
    }
  }
}

Mit Tasks können relativ einfach Aktionen im UI-Thread oder im Hintergrund ausgeführt werden. Typischerweise verwendet man ObservableCollections, um Daten eines ViewModels an eine Listbox zu binden. ObservableCollections sind jedoch nicht thread-safe, d.h. man kann nicht einfach von einem Hintergrundthread Elemente in eine Liste einfügen, die im UI-Thread erzeugt wurde. Beim Füllen einer Collection des ViewModels mit Bilder oder Informationen eines Webservices oder des Webs allgemein, wäre es praktisch, einfach auf die Collection zugreifen zu können, ohne sich darüber Gedanken zu machen, in welchem Thread man ist. Seit .Net 4.0 gibt es thread-sichere Listen, die genau das bieten.
Keine davon eignet sich jedoch zur direkten Datenbindung, da sie Änderungen nicht mitteilen. Microsoft stellt tolle Beispielprojekte zur Verfügung, die verschiedene parallele Mechanismen von .Net demonstrieren: Samples for Parallel Programming with the .NET Framework. Darin findet sich auch eine Bibliothek (ParallelExtensionsExtras) mit einer thread-sichere beobachtbare Liste: ObservableConcurrentCollection. Die Klasse kümmert sich selbst darum, die GUI-Controls, die auf Ereignisse lauschen im richtigen Thread darüber zu informieren. Verwendung in unserem Kontext im ViewModel:

//Klassen-Member
private IProducerConsumerCollection<ImageInformation> items;

//Command mit Hintergrundprozess
Task.Factory.StartNew(() =>
{
   //irgendein zeitaufwändiges Erstellen/Suchen eines Items -> item
   //direktes Hinzufügen ohne StartNew und uiScheduler:
   while (!items.TryAdd(item))
      System.Threading.Thread.Sleep(100); //add hat nicht geklappt, also warten und neu versuchen
   System.Threading.Thread.Sleep(500); //UI-Thread Zeit lassen, auf die Änderungen zu reagieren
}, CancellationToken.None);

Im konkreten Fall, der Iteration über viele Bilder, die in die Liste eingefügt werden funktionierte alles so lange gut, so lange ich mit Thread.Sleep(500); nach jedem Iterationsschritt gearbeitet habe. Beim Hinzufügen von 1000 Bildern werden jedoch 3000 Events mit Property-Änderungen im UI-Thread eingefügt und gefeuert. Dies ist anscheinend zu viel und führt zu Problemen.
Ich suche also nach einer Liste, die sich zur Datenbindung eignet, jedoch nur auf Aufforderung ein entsprechendes Event für die GUI feuert. Hierzu eignet sich folgende simple Eigenimplementation:

public class ExplicitlyObservableList<T> : List<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
   public event NotifyCollectionChangedEventHandler CollectionChanged;
   public event PropertyChangedEventHandler PropertyChanged;
   protected void NotifyPropertyChanged(string propertyName)
   {
      if (PropertyChanged != null)
      {
         PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
   }
   public void Notify()
   {
      NotifyPropertyChanged("Count");
      NotifyPropertyChanged("Item[]");
      if (CollectionChanged != null)
      {
         CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); //lädt alles neu, nicht nur letzte Änderungen!
      }
   }
}

Noch besser wäre es, diesen Ansatz mit IProducerConsumerCollection zu kombinieren. Da ich jedoch TryAdd auch etwas mühsam finde, reicht mir die vereinfachte Implementation und ich werde mir eben doch klar darüber, in welchem Thread ich was tue.

Im letzten Artikel werde ich die Code-Fragmente zu einer fertigen Applikation zusammenführen.Teil 1: Einleitung

Verfasst von: bletra | 28. September 2012

Multithreading in WPF (TPL, MVVM): Cancel (Teil 3 von 5)

Im letzten Artikel dieser Reihe habe ich die Tasks eingeführt, die eine Ausführung von Hintergrundprozessen einfach ermöglichen. In diesem Artikel zeige ich den Mechanismus, wie solche Hintergrundprozesse wieder abgebrochen werden können.
Ein Task, der auf Cancel reagieren soll, benötigt bei der Erstellung ein sogenanntes CancellationToken. Dieses CancellationToken ist an eine Quelle gebunden, so dass verschiedene Tasks einzeln oder auch zusammengehörend abgebrochen werden können.
Außerdem muss der Hintergrundprozess so aufgebaut sein, dass er auf ein Cancel reagieren kann, z.B. in Form einer Schleife (Eine gute Diskussion, warum Threads nicht einfach „abgeschossen“ werden sollen, finden Sie unter Is it possible to abort a Task like aborting a Thread (Thread.Abort method)?).
Insgesamt ergibt sich in MVVM folgendes Muster:

  1. CancellationTokenSource als Member deklarieren:
    System.Threading.CancellationTokenSource cancelTokenSource;
  2. Token vor Starten des Tasks erstellen:
    System.Threading.CancellationToken cancelToken = cancelTokenSource.Token;
  3. Token dem Task mitgeben und in diesem auf Cancel abfragen:
Task.Factory.StartNew(() => {
   //...
   for (...) {
      if (cancelTokenSource.Token.IsCancellationRequested)
        //Reaktion: return oder break oder ...
   };
}, cancelTokenSource.Token);
  1. Cancel einfordern (in MVVM: Cancel-Button mit DelegateCommand an folgende Methode binden):
private void CancelWork() {
   if (cancelTokenSource != null)
      cancelTokenSource.Cancel();
}

Dies ist nur ein Grundgerüst, wie es für den betrachteten Kontext ausreicht. Eine ausführlichere Darstellungen finden Sie in den folgenden Artikeln:

Eine Basis von MVVM ist die Datenbindung. Welche Schwierigkeiten diese Bindung einer WPF-Oberfläche an eine Collection (Liste) bei asychronen Prozessen aufweist, diskutiere ich im nächsten Artikel dieser Reihe.

Verfasst von: bletra | 24. September 2012

Multithreading in WPF (TPL, MVVM): Tasks (Teil 2 von 5)

Tasks sind für mich gut zu verwendende Threads. Ich will diese tolle Klasse nur in Hinblick auf WPF und Hintergrundprozesse anschauen. Hierzu einige Strukturen, wie ich sie häufig verwende:

Aktion/Statements, die in den Hauptthread nicht belasten sollen, also im Hintergrund ausgeführt werden:

Task.Factory.StartNew(() => { … Aktionen …});

Dies geht auch mit Rückgabewerten:

Task<double> pi = Task<double>.Factory.StartNew(
() => { Thread.Sleep(10000); return 3.14; }
);
//…
//An anderer Stelle:
if (pi.IsCompleted)
   Debug.WriteLine(pi.Result);

In Bezug auf WPF und MVVM habe ich folgende Situation: Ich bin im UI-Thread, beispielsweise in einem Command eines ViewModels, setze einige Properties des ViewModels (Vorarbeit), führe anschließend einen längeren Prozess im Hintergrund aus, der Updates an Daten (ViewModel) des UI-Threads vornehmen soll und abschließend, nach Beenden des Hintergrundprozesseses, eine Meldung im UI-Thread ausgibt. Hierzu nehme ich folgendes Programmgerüst:

//Vorarbeit
//ich bin im UI-Thread und merke mir dessen Context/Scheduler
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
//Hintergrundprozess starten
Task.Factory.StartNew(() =>
{
   //irgendwelchen zeitaufwändigen Aktionen
   //nun muss etwas im UI-Thread ablaufen
   Task.Factory.StartNew(() => { ... Zugriff auf ViewModel-Properties ... }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);
   //zurück im Hintergrundthread
}, CancellationToken.None).ContinueWith( //nach Beenden des Hintergrundthreads führe dies im UI-Thread aus:
      (task) => { ... }, uiScheduler);
//wieder im UI-Thread

Im nächsten Artikel geht es darum, einen solchen Hintegrundprozess abbrechen zu können (cancel).

Verfasst von: bletra | 18. September 2012

Multithreading in WPF (TPL, MVVM): Einleitung (Teil 1 von 5)

In .Net gibt es viele Möglichkeiten, eine Aufgabe im Hintergrund auszuführen:

Mit der TPL wird die Komplexität von Multithreading, wie sie sehr schön in dem Artikel „Was jeder Entwickler über Multithread-Anwendungen wissen muss“ beschrieben wird, vor den Entwicklern verborgen, d.h. mit einer relativ einfach zu lernenden Syntax bekommt man Multithreading geschenkt.

Ich habe mir innerhalb der TPL die Tasks angeschaut. In dieser fünfteiligen Reihe entwickel ich eine WPF-Applikation auf Basis von MVVM (vgl. WPF: Von Spaghetticode zu MVVM), die eine Listbox asynchron füllt. Dieser Prozess kann durch einen Cancel-Command abgebrochen werden.

An der Hochschule Ulm ist aktuell eine spannende Promotionsstelle zu besetzen. Das Promotionsthema verbindet die Fachgebiete Informatik und Medizintechnik auf dem Gebiet der Parkinsondiagnostik. Es handelt sich um eine befristete aber volle Stelle.

Bewerbungsschluss: 28.08.2012

Link der Stellenbeschreibung

Older Posts »

Kategorien