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