Mental Wealth: Professional Life 1 (IT Project) · CN4005
Εβδομάδα 2: Διαχείριση πηγαίου κώδικα και ανάπτυξη λογισμικού
Σημειώσεις μελέτης βασισμένες στις διαλέξεις της Εβδομάδας 2: «Διαχείριση πηγαίου κώδικα» και «Εισαγωγή στην Ανάπτυξη Λογισμικού». Οι διαφάνειες βρίσκονται στο Moodle.
Το πρόβλημα: πολλοί άνθρωποι, ένας κώδικας
Όταν μια ομάδα δουλεύει στα ίδια αρχεία (κώδικα, ιστοσελίδες, έγγραφα), προκύπτουν γρήγορα ερωτήματα:
- Πώς δεν σβήνει ο ένας τη δουλειά του άλλου;
- Πώς έχουν όλοι την πιο πρόσφατη έκδοση;
- Όταν κάτι χαλάσει, πώς βρίσκεις ποια αλλαγή το προκάλεσε, και πώς γυρίζεις πίσω;
Οι πρόχειρες λύσεις έχουν όλες κάποιο κόστος. Αν χωρίσεις τον κώδικα σε εντελώς ανεξάρτητα κομμάτια, κάποια αρχεία θα είναι πάντα κοινά. Αν απαγορέψεις στους άλλους να αγγίζουν μέρη του κώδικα, η δουλειά επιβραδύνεται. Αν καταγράφεις τις αλλαγές με το χέρι, η διαδικασία είναι αργή και γεμάτη λάθη.
Γιατί δεν αρκεί ένα Dropbox
Υπηρεσίες όπως το Dropbox ή το ownCloud είναι εύκολες στη χρήση και κρατούν παλιές εκδόσεις των αρχείων. Δεν είναι όμως φτιαγμένες για κώδικα. Αν δύο άνθρωποι αλλάξουν το ίδιο αρχείο ταυτόχρονα, το Dropbox δεν συνδυάζει τις αλλαγές: κρατά το ένα αρχείο και φτιάχνει ένα δεύτερο, «σε διένεξη». Κάποιος πρέπει μετά να τα συγκρίνει και να τα ενώσει με το χέρι.
Συστήματα ελέγχου εκδόσεων
Η σωστή λύση είναι ένα σύστημα ελέγχου εκδόσεων (version control, ή σύστημα διαχείρισης πηγαίου κώδικα, SCM). Κρατά τον κώδικα σε ένα αποθετήριο (repository), θυμάται κάθε αλλαγή που έγινε ποτέ και συντονίζει τις αλλαγές πολλών ανθρώπων.
Το βασικό πρόβλημα που λύνει είναι το εξής: η Άννα και ο Βασίλης ανοίγουν το ίδιο αρχείο. Η Άννα αποθηκεύει πρώτη. Αν ο Βασίλης αποθηκεύσει μετά τη δική του έκδοση, θα σβήσει χωρίς να το καταλάβει τη δουλειά της Άννας. Υπάρχουν δύο τρόποι να αποφευχθεί αυτό.
1. Κλείδωμα αρχείου (lock-modify-unlock)
Για να αλλάξεις ένα αρχείο, πρέπει πρώτα να το κλειδώσεις. Όσο είναι κλειδωμένο, οι άλλοι μπορούν μόνο να το διαβάσουν. Όταν τελειώσεις, το ξεκλειδώνεις και σειρά έχει ο επόμενος.
Είναι απλό, αλλά έχει προβλήματα:
- Κάποιος ξεχνά να ξεκλειδώσει ένα αρχείο, και οι άλλοι περιμένουν.
- Δημιουργεί άσκοπη αναμονή: αν η Άννα αλλάζει την αρχή του αρχείου και ο Βασίλης το τέλος, θα μπορούσαν να δουλέψουν μαζί χωρίς πρόβλημα.
- Δίνει ψεύτικη αίσθηση ασφάλειας: δύο αρχεία μπορεί να εξαρτώνται το ένα από το άλλο, και αλλαγές σε καθένα χωριστά να χαλάνε το σύνολο.
2. Συγχώνευση εκδόσεων (copy-modify-merge)
Ο καθένας παίρνει ένα αντίγραφο εργασίας και δουλεύει ελεύθερα. Όταν πάει να αποθηκεύσει, αν στο μεταξύ κάποιος άλλος έχει αλλάξει το ίδιο αρχείο, το σύστημα του ζητά πρώτα να συγχωνεύσει (merge) τις αλλαγές του άλλου με τις δικές του.
- Αν οι αλλαγές είναι σε διαφορετικά σημεία, η συγχώνευση γίνεται συνήθως αυτόματα.
- Αν επικαλύπτονται (π.χ. και οι δύο άλλαξαν την ίδια γραμμή), έχουμε σύγκρουση (conflict). Το σύστημα δείχνει και τις δύο εκδοχές, και ένας άνθρωπος αποφασίζει ποια κρατά ή πώς τις συνδυάζει.
Ακούγεται χαοτικό, αλλά στην πράξη δουλεύει πολύ καλά: οι περισσότερες ταυτόχρονες αλλαγές δεν επικαλύπτονται, και οι συγκρούσεις λύνονται γρήγορα. Γι’ αυτό σχεδόν όλα τα σύγχρονα συστήματα χρησιμοποιούν αυτό το μοντέλο.
Κεντρικά και κατανεμημένα συστήματα
| Κριτήριο | Κεντρικό (π.χ. Subversion) | Κατανεμημένο (π.χ. Git) |
|---|---|---|
| Πού είναι το ιστορικό | σε έναν κεντρικό διακομιστή | ολόκληρο σε κάθε υπολογιστή |
| Δουλειά χωρίς σύνδεση | περιορισμένη | πλήρης· συγχρονίζεις όταν συνδεθείς |
| Αν χαλάσει ο διακομιστής | χάνεται η κοινή πηγή | κάθε αντίγραφο είναι πλήρες αντίγραφο ασφαλείας |
| Πού το βρίσκεις | σε πολλές εμπορικές εταιρείες | στα περισσότερα έργα ανοιχτού κώδικα |
Στο Subversion (SVN), με πρόγραμμα-πελάτη π.χ. το TortoiseSVN στα Windows, η κύρια γραμμή ανάπτυξης λέγεται κορμός (trunk). Για μεγάλες ή πειραματικές αλλαγές ανοίγεις έναν κλάδο (branch), ώστε να μην ενοχλείς όσους δουλεύουν στον κορμό.
Στο Git κάθε μέλος της ομάδας έχει ολόκληρο το αποθετήριο. Επειδή όμως ο υπολογιστής του συνεργάτη σου δεν είναι πάντα ανοιχτός, συνήθως υπάρχει και ένα κοινό αντίγραφο σε έναν διακομιστή, όπως το GitHub. Το GitHub προσθέτει στο Git δικές του λειτουργίες: διαχείριση μέσα από τον browser, αναθεωρήσεις κώδικα (pull requests), εφαρμογή για υπολογιστή και σύνδεση με εργαλεία όπως το Visual Studio.
Μια τυπική ροή εργασίας στο Git:
git clone https://github.com/ομάδα/έργο.git # παίρνεις αντίγραφο
git switch -c nea-leitourgia # νέος κλάδος για την αλλαγή σου
git add index.html # διαλέγεις τι θα αποθηκεύσεις
git commit -m "Προσθήκη φόρμας επικοινωνίας" # αποθηκεύεις τοπικά
git pull # παίρνεις τις αλλαγές των άλλων
git push # στέλνεις τις δικές σου
Γιατί αξίζει
- Αν αποθηκεύεις (commit) συχνά, σε μικρά βήματα, οι συνεργάτες βλέπουν πώς εξελίχθηκε η σκέψη σου, και μπορείς να γυρίσεις πίσω σε οποιοδήποτε σημείο.
- Μπορείς να πειραματιστείς σε έναν κλάδο χωρίς να χαλάσεις τίποτα.
- Οι άλλοι βλέπουν και σχολιάζουν τη δουλειά σου, κάτι που βελτιώνει τον κώδικα.
- Με κατανεμημένο σύστημα, δουλεύεις και χωρίς δίκτυο, δεν περιμένεις κλειδώματα, και δεν υπάρχει ένα μοναδικό σημείο αστοχίας.
Εισαγωγή στην ανάπτυξη λογισμικού
Κατηγορίες λογισμικού
Λογισμικό είναι ένα σύνολο προγραμμάτων (δομές δεδομένων και εντολές) μαζί με την τεκμηρίωσή τους. Χωρίζεται σε κατηγορίες ανάλογα με τη χρήση του:
| Κατηγορία | Παράδειγμα |
|---|---|
| Λογισμικό συστήματος | λειτουργικά συστήματα, οδηγοί συσκευών |
| Λογισμικό εφαρμογών | πρόγραμμα λογιστικής, εφαρμογή τράπεζας |
| Λογισμικό παραγωγικότητας | επεξεργαστής κειμένου, λογιστικά φύλλα |
| Επιστημονικό λογισμικό | MATLAB, προσομοιώσεις καιρού |
| Λογισμικό τεχνητής νοημοσύνης | αναγνώριση φωνής, συστήματα συστάσεων |
| Ενσωματωμένο λογισμικό | το λογισμικό σε ένα πλυντήριο ή σε ένα αυτοκίνητο |
Ανάλογα με την άδεια, το λογισμικό μπορεί να είναι εμπορικό ή μη, ανοιχτού ή κλειστού κώδικα, και ελεύθερο. Το ΕΛ/ΛΑΚ (Ελεύθερο Λογισμικό / Λογισμικό Ανοιχτού Κώδικα) συνδυάζει την ελευθερία χρήσης με την πρόσβαση στον κώδικα.
Τα τρία βασικά βήματα
Η τεχνολογία λογισμικού οργανώνει την ανάπτυξη σε τρία μεγάλα βήματα:
- Ανάλυση: μαζί με τους τελικούς χρήστες ορίζεις τι ακριβώς θα κάνει το λογισμικό, ποιες λειτουργίες θα έχει και ποιους περιορισμούς. Αυτό λέγεται προσδιορισμός απαιτήσεων.
- Κατασκευή: χωρίζεται σε σχεδίαση και κωδικοποίηση. Η σχεδίαση έχει δύο επίπεδα: την αρχιτεκτονική σχεδίαση (ο «σκελετός» του λογισμικού) και τη λεπτομερή σχεδίαση (πώς οργανώνονται και επικοινωνούν τα επιμέρους κομμάτια).
- Έλεγχος: ελέγχεις αν το λογισμικό καλύπτει τις απαιτήσεις, αλλά και ποιοτικά χαρακτηριστικά όπως η αποδοτικότητα, η αξιοπιστία και η μεταφερσιμότητα. Ακολουθεί η συντήρηση σε όλη τη ζωή του.
Έργο και διαχείριση έργου
Κατά το Project Management Institute, έργο είναι ένα προσωρινό εγχείρημα (έχει καθορισμένο τέλος) που δημιουργεί ένα μοναδικό προϊόν ή υπηρεσία. Διαχείριση έργου είναι η εφαρμογή γνώσεων, δεξιοτήτων, εργαλείων και τεχνικών ώστε το έργο να ολοκληρωθεί μέσα στα όρια χρόνου, κόστους, ποιότητας και αντικειμένου. Τα εργαλεία διαχείρισης έργων (όπως το MS Project και το ProjectLibre) τα βλέπουμε στις επόμενες εβδομάδες.
Επικοινωνία στο διαδίκτυο
Πολλές εφαρμογές στηρίζονται σε γνωστά πρωτόκολλα, δηλαδή συμφωνημένους κανόνες ανταλλαγής πληροφοριών:
| Πρωτόκολλο | Για τι | Θύρα |
|---|---|---|
| SMTP | αποστολή email | 25 (587 για υποβολή από πελάτη) |
| POP3 | λήψη email (κατεβάζει τα μηνύματα) | 110 |
| IMAP | πρόσβαση σε email που μένουν στον διακομιστή | 143 (993 με κρυπτογράφηση) |
| FTP | μεταφορά αρχείων | 21 |
Άλλες μορφές επικοινωνίας είναι η τηλεφωνία μέσω διαδικτύου (VoIP, φθηνή αλλά εξαρτάται από τη σύνδεση και δυσκολεύει τον εντοπισμό του καλούντος σε έκτακτη ανάγκη), οι βιντεοκλήσεις, τα ομότιμα δίκτυα (peer-to-peer, π.χ. BitTorrent), ο απομακρυσμένος έλεγχος (π.χ. TeamViewer) και οι εικονικοί κόσμοι 3D.
Όλα αυτά στηρίζονται στο TCP/IP, που οργανώνει την επικοινωνία σε τέσσερα επίπεδα: εφαρμογής, μεταφοράς, διαδικτύου και πρόσβασης δικτύου. Τα πρωτόκολλα κάνουν μερικές κοινές δουλειές: χωρίζουν τα δεδομένα σε μικρά πακέτα και τα ξαναενώνουν, τα ενθυλακώνουν με πληροφορίες ελέγχου, δουλεύουν με σύνδεση (TCP) ή χωρίς σύνδεση (UDP) και χρησιμοποιούν διευθύνσεις για να βρουν τον παραλήπτη.
Υπολογιστικό νέφος
Το υπολογιστικό νέφος (cloud computing) σου δίνει μέσω του διαδικτύου πόρους, όπως διακομιστές, αποθήκευση και εφαρμογές, χωρίς να τους αγοράσεις και να τους συντηρείς ο ίδιος. Τα χαρακτηριστικά του: αυτοεξυπηρέτηση όποτε τη χρειαστείς, πρόσβαση από παντού, δυναμική κατανομή πόρων, γρήγορη προσαρμογή όταν η ζήτηση ανεβοκατεβαίνει, και χρέωση με βάση τη χρήση.
- Μοντέλα υπηρεσιών:
- IaaS (υποδομή ως υπηρεσία): νοικιάζεις εικονικούς υπολογιστές.
- PaaS (πλατφόρμα ως υπηρεσία): σου δίνεται έτοιμο περιβάλλον για να αναπτύξεις και να τρέξεις τις εφαρμογές σου.
- SaaS (λογισμικό ως υπηρεσία): χρησιμοποιείς έτοιμες εφαρμογές από τον browser, π.χ. το Gmail.
- Είδη νέφους: ιδιωτικό (για έναν οργανισμό), δημόσιο (κοινό για όλους τους πελάτες), υβριδικό (συνδυασμός τους), καθώς και κοινοτικό, διεθνές (InterCloud) ή πολυνέφος (multicloud).
Συγγενικό είναι το υπολογιστικό πλέγμα (grid computing): πολλοί υπολογιστές σε διαφορετικά σημεία δουλεύουν μαζί για έναν μεγάλο υπολογισμό.
Ερωτήσεις αυτοαξιολόγησης
1. Ποια είναι η βασική διαφορά ανάμεσα στο κλείδωμα αρχείων και τη συγχώνευση εκδόσεων;
Στο κλείδωμα, μόνο ένας άνθρωπος μπορεί να αλλάζει ένα αρχείο κάθε φορά, και οι άλλοι περιμένουν. Στη συγχώνευση, όλοι δουλεύουν παράλληλα σε αντίγραφα, και οι αλλαγές τους ενώνονται μετά· μόνο όταν επικαλύπτονται χρειάζεται να αποφασίσει ένας άνθρωπος.
2. Γιατί σε ένα κατανεμημένο σύστημα όπως το Git δεν υπάρχει «μοναδικό σημείο αστοχίας»;
Γιατί κάθε μέλος της ομάδας έχει ολόκληρο το αποθετήριο, με όλο το ιστορικό. Αν χαλάσει ο διακομιστής ή ο υπολογιστής κάποιου, το έργο υπάρχει ακέραιο σε όλα τα άλλα αντίγραφα.
3. Ποια πρωτόκολλα χρησιμοποιεί μια εφαρμογή email για να στείλει και για να διαβάσει μηνύματα;
SMTP για την αποστολή, και POP3 ή IMAP για τη λήψη. Με το POP3 τα μηνύματα συνήθως κατεβαίνουν στη συσκευή· με το IMAP μένουν στον διακομιστή, οπότε τα βλέπεις ίδια από κάθε συσκευή.
4. Μια εταιρεία νοικιάζει εικονικούς διακομιστές και εγκαθιστά μόνη της ό,τι χρειάζεται. Ποιο μοντέλο υπηρεσιών νέφους χρησιμοποιεί;
IaaS (υποδομή ως υπηρεσία). Αν αντί γι’ αυτό χρησιμοποιούσε μια έτοιμη εφαρμογή από τον browser, θα ήταν SaaS.
Πηγές: Διαλέξεις της Εβδομάδας 2 του μαθήματος· S. Chacon και B. Straub, Pro Git (δωρεάν online).
Ασκήσεις της εβδομάδας
Ασκήσεις Κατανόησης, Εβδομάδα 2
- Προθεσμία
- Χωρίς προθεσμία — για εξάσκηση
Εκφώνηση
- Κατηγοριοποιήστε το λογισμικό και αναφέρετε συγκεκριμένα παραδείγματα στις εξής κατηγορίες: Λογισμικό Συστήματος, Λογισμικό Εφαρμογών, Λογισμικό Παραγωγικότητας, Επιστημονικό Λογισμικό, Λογισμικό Τεχνητής Νοημοσύνης, Ενσωματωμένο Λογισμικό. Μπορούν να αναζητήσουν παραδείγματα από την καθημερινή χρήση ή να χρησιμοποιήσουν δημοφιλείς εφαρμογές και τεχνολογίες.
- Περιγράψτε τη δομή ενός Πληροφοριακού Συστήματος. Μπορείτε να επιλέξετε ένα παράδειγμα από έναν οργανισμό (π.χ. ένα σύστημα διαχείρισης βιβλιοθήκης ή ένα σύστημα ERP) και να περιγράψετε τα μέρη του, όπως δεδομένα, διαδικασίες, λογισμικό, και ανθρώπους.
- Αναλύστε τα πλεονεκτήματα του κατανεμημένου ελέγχου έκδοσης (DVCS) όπως το Git, σε σύγκριση με τα κεντρικά συστήματα όπως το Subversion. Πότε θα επιλέγατε ένα DVCS και πότε ένα κεντρικό σύστημα;
- Δημιουργία GitHub account. Σύνδεση και δημιουργία project. Χρήση του GitGUI σε Windows.