Your SlideShare is downloading. ×
Woher kommen Software-Fehler?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Woher kommen Software-Fehler?

1,993
views

Published on

Jeder Programmierer kennt die Situation: Ein Programm läuft nicht so, wie es soll.  Ich stelle Techniken vor, die automatisch …

Jeder Programmierer kennt die Situation: Ein Programm läuft nicht so, wie es soll.  Ich stelle Techniken vor, die automatisch

(a) die Ursachen eines Fehlverhaltens finden - indem wir genau die Aspekte isolieren, die das Zustandekommen eines Fehlers verursachen;
(b) Programmfehler finden - indem wir aus dem Code "normale" Anweisungsfolgen lernen und nach Abweichungen suchen; und
(c) vorhersagen, wo in Zukunft Fehler auftreten werden - indem wir maschinell lernen, welche Code- und Prozesseigenschaften bisher mit Fehlern korrelierten.

Fallstudien an echten Programmen mit echten Fehlern, von AspectJ über Firefox zu Windows demonstrieren die Praxistauglichkeit der vorgestellten Verfahren.

Andreas Zeller ist Professor für Softwaretechnik an der Universität des Saarlandes in Saarbrücken.  Sein Forschungsgebiet ist die Analyse großer Software-Systeme und deren Fehler.  Sein Buch "Why Programs Fail - A Guide to Systematic Debugging" wurde 2006 mit dem Jolt Software Development Productivity Award ausgezeichnet.

Vortrag der GI Regionalgruppe Rhein-Neckar 2008-06-19

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,993
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
25
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Woher kommen Software-Fehler? Andreas Zeller • Universität des Saarlandes
  • 2. Eine F-16 (Nördliche Halbkugel)
  • 3. Eine F-16 (Südliche Halbkugel)
  • 4. F-16 Fahrgestell
  • 5. Flughafen Denver
  • 6. Airport opened 16 moslater;Soft ware firm (BEA) gotbankruptOverall damage 1.8 bln
  • 7. // Get #years, #days since 1980days = ...;year = 1980;while (days > 365) { if (IsLeapYear(year)) { if (days > 366) { days -= 366; year += 1; } } else { days -= 365; year += 1; }}
  • 8. Der erste Bug 9. September 1947
  • 9. Der erste Bug 9. September 1947
  • 10. bug.aj@interface A {}aspect Test { declare @field : @A int var* : @A; declare @field : int var* : @A; interface Subject {} public int Subject.vara; public int Subject.varb;}class X implements Test.Subject {}
  • 11. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 12. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 13. bug.aj@interface A {}aspect Test { declare @field : @A int var* : @A; declare @field : int var* : @A; interface Subject {} public int Subject.vara; public int Subject.varb;}class X implements Test.Subject {}
  • 14. ajc Stack Tracejava.util.NoSuchElementException at java.util.AbstractList$Itr .next(AbstractList.java:427) at org.aspectj.weaver.bcel.BcelClassWeaver .weaveAtFieldRepeatedly (BcelClassWeaver.java:1016)
  • 15. weaveAtFieldRepeatedlyfor (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... }}
  • 16. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de mozilla.csvMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.dePremraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.deReindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813025069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.deSliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.deZimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  • 17. Vereinfachen• Proceed by binary search. Throw away half the input and see if the output is still wrong.• If not, go back to the previous state and discard the other half of the input. mozilla.csv ✔ ✘
  • 18. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de FehlerursacheMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.dePremraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.deReindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813025069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.deSliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.deZimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  • 19. Lenhof, Hans-Peter,, +49 681 302-64701, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9378406, +49 681 302 7790, lindig@cs.uni-sb.de FehlerursacheMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6894 890037, +49 681 302-78099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-64020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-7070, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130264011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6794, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968171827, +49 6813022436, wjp@cs.uni-sb.dePremraj, Rahul, +44 7796973711, +49 681 302-64013, premraj@cs.uni-sb.deReindel, Erich, +49 6371 912842, +49 681 302-78091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-64026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813027069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6894 383698, +49 681 302-4713, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-64011, office@st.cs.uni-sb.deSliwerski, Jacek, +491741333208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 71 32, +49 681 302-3830, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 670 391 9186, +1 408 486 2788, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 782770, +49 681 302-7311, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-4399, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 3710467, +49 681 302-64011, zeller@cs.uni-sb.deZimmermann, Tom, +49 871 71742 (Eltern), +1 403 210 9470, zimmerth@cs.uni-sb.de
  • 20. Problem:Vereinfachen von Hand ist grausam!
  • 21. Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 von 8,721 Änderungen in GDBThreads: 1 von 3.8 bio Thread-Wechsel in Scene.java➔ Automatisierte Fehlersuche
  • 22. Problem:Benutzeraktionen simulieren ist umständlich!
  • 23. Isolieren Relevanter Aufrufe Schritt 1: Aufzeichnen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 24. Isolieren Relevanter Aufrufe Schritt 2: Abspielen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 25. Isolieren Relevanter Aufrufe Schritt 3:Vereinfachen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 26. Isolieren Relevanter Aufrufe Schritt 4: Testfall erzeugen ↯ testVector() { Text Vector v = new Vector(); v.remove(obj); } JINSI
  • 27. Columba ContactModel ↯ ContactModel() setSortString()setFormattedName() setNickName() c: ContactModel setFamilyName() setGivenName() und 18732 weitere…
  • 28. Columba ContactModel ContactModel()getPreferredEmail() c: ContactModel ↯
  • 29. Unit TesttestContactModel(){ ContactModel c = new ContactModel(); String s = c.getPreferredEmail();}
  • 30. getPreferredEmailpublic String getPreferredEmail() { Iterator it = getEmailIterator(); // get first item IEmailModel model = (IEmailModel) it.next(); // backwards compatiblity // -> its not possible anymore to create a // contact model without email address if (model == null) return null; return model.getAddress();}
  • 31. Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 von 8,721 Änderungen in GDBThreads: 1 von 3.8 bio Thread-Wechsel in Scene.javaAufrufe: 2 von 18738 Methodenaufrufen 99,8% Verringerung des➔ Automatisierte Fehlersuche Suchraums
  • 32. #1 inSoftware Engineering BooksAlgorithms BooksSoftware Design Books
  • 33. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 34. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 35. AspectJ Columba• Ungültige Benutzung von Iteratoren: vor next() sollte hasNext() kommen• hasNext() ist operationale Vorbedingung
  • 36. Problem:Vorbedingungen spezifizieren ist aufwändig!
  • 37. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 38. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 39. Methodenmodellepublic Stack createStack () { Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; while (i < n) { s.push (rand (r)); i++; } s.push (-1); return s;}
  • 40. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; while (i < n) { s.push (rand (r)); i++; } s.push (-1); return s;}
  • 41. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); return s;}
  • 42. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n return s; i++;} s.push (rand (r));
  • 43. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n i < n return s; i++;} s.push (-1); s.push (rand (r));
  • 44. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n i < n return s; i++;} s.push (-1); s.push (rand (r));
  • 45. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; i < n i < n i++; s.push (-1); s.push (rand (r));
  • 46. Benutzungsmodelle Stack s = new Stack (); s.push (-1); s.push (rand (r));
  • 47. Benutzungsmodelle s.<init>() s.push (_) s.push (_)
  • 48. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; i < n i < n i++; s.push (-1); s.push (rand (r));
  • 49. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); s.push (rand (r));
  • 50. Benutzungsmodelle r.<init> () r.nextInt () Utils.rand (r)
  • 51. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 52. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 53. Anomalien entdecken Temporale Eigenschaften start ≺ lock ≺ eof ≺ stop unlock close get() ✘Methoden open() hello() parse()
  • 54. Ein Defektfor (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... sollte iter2 sein }}
  • 55. Noch ein Defektpublic void visitNEWARRAY (NEWARRAY o) { byte t = o.getTypecode (); if (!((t == Constants.T_BOOLEAN) || (t == Constants.T_CHAR) || ... (t == Constants.T_LONG))) { constraintViolated (o, "(...) +t+ (...)"); }} sollte “+t+” sein
  • 56. Ein FehlalarmName internalNewName (String[] identifiers) ... for (int i = 1; i < count; i++) { SimpleName name = new SimpleName(this); name.internalSetIdentifier(identifiers[i]); ... } sollte unverändert ... bleiben}
  • 57. Ein Code Smellpublic String getRetentionPolicy (){ ... for (Iterator it = ...; it.hasNext();) { ... = it.next(); ... return retentionPolicy; } ... sollte repariert werden}
  • 58. AspectJDefekte Code smells Fehlalarme 16 42 242
  • 59. Fehler finden Table 2: Summary of the results for the experiment subjects. (See Section 5.2 for a discussion.) # Violations Program Total Investigated # Defects # Code smells # False positives Efficiency A-Rʙ 0.8.2 25 25 2 13 10 60% Aʜ T 6.0.16 55 55 0 9 46 16% AʀɢUML 0.24 305 28 0 12 16 43% AJ 1.5.3 300 300 16 42 242 19% Aʀ 2.5.0.0 315 85 1 26 58 32% Cʟʙ 1.2 57 57 4 15 38 33% Eɪ 4.2 11 11 0 4 7 36% 1,068 562 23 121 417 26% String getPreferredEmail () {erator it = getEmailIterator (); • The tools we have used (JADET and Cʟɪʙʀɪ) couldmailModel = (IEmailModel) it.next (); fective. We think this is very improbable, especially f. ɪʙʀɪ, whose implementation is publicly available [28] JADET as well as the OP-Mɪɴʀ code, we have u thoroughly validated it, so we believe that any defects17: Another defect in Cʟʙ. Missing call to hasNext fect only a small number of OUMs and violations a
  • 60. OP-MinerOP-Miner lernt operationale Vorbedingungen –wie man Argumente gewöhnlich konstruiertLernt aus gewöhnlicher Benutzung – allgemein und projektspezifischVollautomatischDutzende bestätigter Fehler gefunden
  • 61. 201,321,237200,000,000 8,000 6,097150,000,000 6,000100,000,000 4,000 50,000,000 2,000 0 0 Codezeilen C-Projekte
  • 62. Ein Defekt conspire-0.20 (IRC client)static int dcc_listen_init (…) { dcc-sok = socket (…); if (…) { while (…) { … = bind (dcc-sok, …); } /* with a small port range, reUseAddr is needed */ setsockopt (dcc-sok, …, SO_REUSEADDR, …); } listen (dcc-sok, …); muss vor bind() stehen}
  • 63. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 64. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 65. Problem: Wie können wir ausunseren Fehlern lernen?
  • 66. Fehler Versionen
  • 67. Fehler auf Code abbildenFehler Versionen
  • 68. Fehler in AspectJ
  • 69. SicherheitslückenWoher kommen diese Fehler? in Firefox
  • 70. Sind es die Entwickler? Macht Je mehrErfahrung einen Erfahrung, desto Unterschied? mehr Fehler!
  • 71. Oder die Geschichte?Wir haben hier Dann sind dort viele Fehler noch mehr! gefunden…
  • 72. Wie steht es mit Metriken? Korrelieren Metriken mit Fehlerdichte? Manchmal!
  • 73. Programmiersprache? Sind gotos Keine Korrelation! schädlich?
  • 74. Ok. Problembereich?Welche Tokens import • extendssind relevant? • implements
  • 75. ✘ ✘ ✘ ✘ ✘ ✘ ✘ ✘nsIPrivateDOMEvent.h ✘ ✘ ✘ ✘ ✘ ✘ ✘ nsReadableUtils.h ✘ ✘ ✘ ✘
  • 76. Vorhersage Komponente Tatsache 1 nsDOMClassInfo 3 2 SGridRowLayout 95 3 xpcprivate 6 4 jsxml 2 5 nsGenericHTMLElement 8 6 jsgc 3 7 nsISEnvironment 12 8 jsfun 1 9 nsHTMLLabelElement 18 10 nsHttpTransaction 35
  • 77. • Wissen, wo die Fehler sind• Kalibrieren der Fehlervorhersage• Wissen, wo die nächsten Fehler sind• Vollautomatisch!
  • 78. Software-Archive• enthalten komplette Projektgeschichte• gepflegt durch Programmierumgebungen• automatischer Zugang• frei verfügbar durch Open-Source Projekte Fehler Versionen
  • 79. Modelle Specs Code Traces Profile Testse-mail Fehler Aufwand Navigation Versionen Chats
  • 80. Modelle Specs Code Traces Profile Testse-mail Fehler Aufwand Navigation Versionen Chats
  • 81. Daten sammeln
  • 82. Studien Make this Actionable! Rosenberg, L. and Hyatt, L. “Developing An Effective Metrics Program”European Space Agency Software Assurance Symposium, Netherlands, March, 1996
  • 83. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 84. Diagnose Erkennen Vorbeugen ZELLER WHY PROGRAMS FAIL WHY PROGRAMS FAIL A Guide to Systematic Debugging ANDREAS ZELLERWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes