Η ανάγκη για την αποτελεσματική ανάπτυξη και συντήρηση λογισμικού έχει εντοπιστεί εδώ και αρκετό καιρό στο σχετικό κλάδο της Τεχνολογίας Λογισμικού. Σήμερα, ωστόσο, με την εισαγωγή νέων πρακτικών ανάπτυξης λογισμικού και πρωτοβουλιών λογισμικού ανοικτού κώδικα, τα δεδομένα λογισμικού που μπορεί να βρει κανείς στο διαδίκτυο είναι άφθονα, επομένως η πρόκληση που προκύπτει είναι η αποτελεσματική αξιοποίησή τους για την παραγωγή καλύτερων προϊόντων λογισμικού. Και η πρόκληση αυτή αποτελεί στην πραγματικότητα ένα πρόβλημα επαναχρησιμοποίησης. Στο πλαίσιο αυτής της διατριβής προτείνουμε μια ενιαία προσέγγιση που περιλαμβάνει την εφαρμογή τεχνικών εξόρυξης δεδομένων σε δεδομένα τεχνολογίας λογισμικού για τη διευκόλυνση της επαναχρησιμοποίησης σε διάφορες φάσεις του κύκλου ζωής του λογισμικού. Η μεθοδολογία μας προτείνει λύσεις για τη φάση του καθορισμού των απαιτήσεων και της εξαγωγής προδιαγραφών, τις φάσεις της σχεδίασης και ανάπτυξης λογισμικού, ενώ συμβάλλει επίσης στην αξιολόγηση της ποιότητας και τον έλεγχο του λογισμικού. Αρχικά εστιάζουμε στη φάση του καθορισμού των απαιτήσεων και της εξαγωγής προδιαγραφών, όπου κατασκευάζουμε κατάλληλες οντολογίες για την αποθήκευση απαιτήσεων λογισμικού. Χρησιμοποιώντας ένα σύνολο από εργαλεία που σχεδιάσαμε, ο μηχανικός απαιτήσεων μπορεί να εισάγει στο μοντέλο μας λειτουργικές απαιτήσεις γραμμένες σε φυσική γλώσσα, γραφικά σενάρια και διαγράμματα UML. Η μοντελοποίηση που προτείνουμε επιτρέπει την επικύρωση των απαιτήσεων, την εξαγωγή προδιαγραφών, καθώς επίσης και την εφαρμογή τεχνικών εξόρυξης δεδομένων με σκοπό την επαναχρησιμοποίηση απαιτήσεων. Επιπρόσθετα, παρουσιάζουμε μεθοδολογίες για την επαναχρησιμοποίηση απαιτήσεων μέσω τεχνικών κανόνων συσχετίσεων και τεχνικών αντιστοίχησης. Όσον αφορά τη φάση της ανάπτυξης λογισμικού, εφαρμόζουμε τεχνικές για την επαναχρησιμοποίηση κώδικα σε διαφορετικά επίπεδα. Αρχικά, παρουσιάζουμε τη σχεδίαση μιας μηχανής αναζήτησης κώδικα που είναι προσανατολισμένη στην επαναχρησιμοποίηση. Η μηχανή μας βασίζεται σε ένα ευρετήριο κώδικα που επιτρέπει την αναζήτηση σε επίπεδο τμημάτων κώδικα (components), σε επίπεδο snippets και σε επίπεδο έργων λογισμικού (π.χ. για αναζήτηση αρχιτεκτονικών προτύπων). Στη συνέχεια, προτείνουμε ένα σύστημα προτάσεων κώδικα που αφορά την επαναχρησιμοποίηση οδηγούμενη από ελέγχους (test-driven reuse). Το σύστημά μας χρησιμοποιεί τεχνικές ανάκτησης πληροφοριών, ενώ επιπλέον λαμβάνεται υπόψη η σύνταξη του κώδικα για την επιστροφή τμημάτων που είναι σχετικά με το ερώτημα και εφαρμόζονται κατάλληλοι μετασχηματισμοί για την ενσωμάτωσή τους στον κώδικα του προγραμματιστή. Τα αποτελέσματα εξετάζονται επίσης χρησιμοποιώντας ελέγχους προκειμένου να διασφαλιστεί ότι καλύπτεται η επιθυμητή λειτουργικότητα. Η επόμενη πρόκληση που αντιμετωπίζουμε είναι η σύνδεση των τμημάτων κώδικα, που πραγματοποιείται συνήθως με τη βοήθεια παραδειγμάτων (snippets). Σε αυτόν τον άξονα, προτείνεται ένα σύστημα που δέχεται ερωτήματα σε φυσική γλώσσα και κατεβάζει παραδείγματα κώδικα, που στη συνέχεια ομαδοποιούνται με βάση τις βιβλιοθήκες που χρησιμοποιούν. Οι βιβλιοθήκες και τα παραδείγματα κατατάσσονται με βάση την προτίμησή τους από την προγραμματιστική κοινότητα. Τέλος, για την περαιτέρω βελτίωση των τμημάτων κώδικα που ανακτήθηκαν (ή γενικά που αναπτύχθηκαν από τον προγραμματιστή), προτείνουμε μια μεθοδολογία επικύρωσης κώδικα με βάση πληροφορίες από υπηρεσίες ερωταπαντήσεων. Αναλύεται το πρόβλημα της εύρεσης χρήσιμων αναρτήσεων σε τέτοιες υπηρεσίες, και συγκεκριμένα προτείνεται η χρήση κώδικα για την εύρεση σχετικών snippets. Ο τρίτος άξονας αυτής της διατριβής είναι η αξιολόγηση της ποιότητας των ανακτηθέντων τμημάτων λογισμικού. Προς το σκοπό αυτό, παρουσιάζεται αρχικά ένα σύστημα προτάσεων κώδικα που αξιολογεί τα τμήματα λογισμικού τόσο από λειτουργική σκοπιά, όσο και για τη δυνατότητα επαναχρησιμοποίησής τους. Το σύστημα περιλαμβάνει έναν μηχανισμό αντιστοίχησης ερωτημάτων σε τμήματα κώδικα με βάση τη σύνταξη, καθώς και ένα μοντέλο μετρικών στατικής ανάλυσης που αξιολογεί την επαναχρησιμοποιησιμότητα κάθε τμήματος. Στη συνέχεια, σχεδιάζουμε ένα πιο λεπτομερές μοντέλο αξιολόγησης της επαναχρησιμοποιησιμότητας τμημάτων κώδικα με βάση την προτίμησή/επαναχρησιμοποίησή τους από την κοινότητα. Το μοντέλο μας, που κατασκευάζεται χρησιμοποιώντας τεχνικές μηχανικής μάθησης, είναι σε θέση να αξιολογήσει την ποιότητα τμημάτων κώδικα όπως γίνεται αντιληπτή από το χρήστη. Συμπερασματικά, στην παρούσα διατριβή βασιζόμαστε στην εφαρμογή κατάλληλων τεχνικών εξόρυξης δεδομένων σε δεδομένα τεχνολογίας λογισμικού, ούτως ώστε να παρέχουμε μια ολοκληρωμένη λύση για την εφαρμογή τεχνικών επαναχρησιμοποίησης στις διάφορες φάσεις της ανάπτυξης και συντήρησης λογισμικού. Η λύση αυτή στοχεύει στη δημιουργία καλύτερου λογισμικού με ελάχιστο κόστος και προσπάθεια, επηρεάζοντας έτσι σημαντικές οικονομικές και κοινωνικές πτυχές της καθημερινής ζωής.