Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Κάνω αυτό το thread γιατί ήθελα να μοιραστώ κάποιες σκέψεις, και ένα μάθημα που έμαθα καλά.

Κυκλοφορούν στο διαδίκτυο κάποια έτοιμα plugins και υπο-συστήματα. Δε ξέρω σε ποιο βαθμό και σε τι ποιότητα κυκλοφορούν σε άλλους τομείς, αλλά στο χώρο του game development με τον οποίο ασχολούμαι κυκλοφορούν πάρα πολλά, στο σημείο που υπάρχουν ξεχωριστά online μαγαζιά που διαθέτουν δεκάδες ή και εκατοντάδες χιλιάδες έτοιμα πράγματα για να χρησιμοποιήσεις. Άλλα δωρεάν, άλλα επί πληρωμή, άλλα σε συνεχή βελτίωση, άλλα "as is" χωρίς να λαμβάνουν ενημερώσεις... Αυτό που σου τάζουν είναι ελκυστικό: "Χρησιμοποίησε το εργαλείο μας στο project σου και γλίτωσε χρόνο με το να φτιάξεις μόνο τα υπόλοιπα που χρειάζεσαι!" Αποφάσισα να χρησιμοποιήσω 2 τέτοια plugins-υποσυστήματα, και το μετάνιωσα και στις δύο περιπτώσεις. Το μάθημα που έμαθα είναι να είμαι εξαιρετικά επιφυλακτικός και να μην εμπιστεύομαι κώδικα τρίτων, εκτός και αν παράχθηκε από μεγάλες, εδραιωμένες, γνωστές εταιρίες του χώρου, με συνεχή ΑΑΑ υποστήριξη.

Το τελευταίο πράγμα που θέλεις όταν φτιάχνεις ένα μεγάλο project, είναι να ανακαλύψεις ότι όχι μόνο χρειάζεται να ανησυχείς και να ξεμπαγκάρεις το δικό σου κώδικα, αλλά και κώδικα τρίτων. Κώδικα που δεν έγραψες εσύ και έτσι δεν έχεις ιδέα πως δουλεύουν τα εσωτερικά του, για να έχεις μια πρώτη ιδέα για το από που να ξεκινήσεις να ψάχνεις για την αιτία των σφαλμάτων του. Επιπλέον πρόσθεσε σε αυτό πως πολλές φορές τα εργαλεία τρίτων είναι bloated και υπερβολικά περίπλοκα χωρίς λόγο (Keep it simple stupid!). έχουν ένα σωρό αχρείαστα πράγματα, και επίσης ο τρόπος συγγραφής του δημιουργού ίσως να είναι τέτοιος που παλεύεις να καταλάβεις πως και γιατί έχει κάνει το κάθε τι.

Η πρώτη μου εμπειρία ήταν με ένα πακέτο βοηθητικών εργαλείων για το inventory menu του παίκτη. Θέλοντας να γλιτώσω χρόνο το κατέβασα, εγκατέστησα, και ακολουθόντας το υποτυπώδες documentation άρχισα να το χρησιμοποιώ. Αργότερα εμφανίζονταν κάτι bugs και αποφάσισα να ρίξω μια ματιά στο κώδικα του πακέτου. Χάος. Παρασύρθηκα και πέρασα ώρες μελετόντας χωρίς να βγάλω άκρη. Αποφάσισα να φτιάξω το δικό μου λοιπόν αντίστοιχο απ' την αρχή. Σε ένα απόγευμα έκανα το βασικό σχεδιασμό στο χαρτί, και μετά από 2 ημέρες είχα το κώδικα μου λειτουργικό, και τεσταρισμένο. Χάρηκα πολύ που ξεφορτώθηκα εκείνο το ακατάλυπτο, αχρείαστα βαρύ και πολύπλοκο πακέτο.

Το δεύτερο και πιο πρόσφατο (χθεσινό) περιστατικό ήταν και αυτό που με έκανε να μάθω το μάθημά μου. Αργώ αλλά μαθαίνω. Το σύστημα αυτό προορίζεται για τους διαλόγους που μπορεί να κάνει ο παίκτης με χαρακτήρες. Κάποια στιγμή βλέπω null reference exceptions να έρχονται απ' το κώδικα του υπο-συστήματος αυτού. Το component το οποίο αποφασίζει πότε θα εκτελείται το κάθε node διαλόγου δεν έβρισκε τα nodes. Τα nodes είχαν διαγραφεί σε ανύποπτο χρόνο οριστικά, μαζί με τα δεδομένα τους (τα strings των διαλόγων που θα εμφανίζονται στο GUI). Γκουγκλάροντας το πρόβλημα βγήκα στο υποτυπώδες support forum του δημιουργού, όπου κάποιος ανέφερε το ίδιο πρόβλημα με εμένα. Η απάντηση του δημιουργού ήταν πως όταν για οποιοδήποτε λόγο κρασάρει η Unity (η game engine η οποία είναι host του κώδικά μου, και των plugins όπως αυτού), θα πρέπει να περιμένω πως όσα αντικείμενα έχω δημιουργήσει με τις κλάσεις του, και τα δεδομένα τους, να χάνονται, και η συμβουλή του ήταν "τακτικά backups". Ναι, και αν το τελευταίο backup στο οποίο δεν είχαν σβηστεί τα δεδομένα ήταν πριν από 1 βδομάδα ; 1 μήνα ; Θα χάσω όλη την εργασία που έκανα ως τότε ; Τα δεδομένα αποθηκεύονται σε αρχεία .meta, που δημιουργούνται αυτόματα από την engine, και για ονόματα έχουν ακατάλυπτα αλφαρηθμιτικά, και είναι εκατοντάδες μέσα σε κάθε backup. Θα πρέπει να ελέγχω ένα-ένα το κάθε ξεχωριστό από τα εκατοντάδες τέτοια αρχεία για να το επαναφέρω... Καθόλου παραγωγικό ή βολικό, αχρείαστα χρονοβόρο. Να πω πως πράγματι η engine είχε κρασάρει. Αλλά αυτό είναι μέσα στο plan. Τα αντικείμενα και δεδομένα όμως τα οποία έχω γράψει εγώ απ' το 0 δεν διαγράφονται μετά από το κρασάρισμα. Αλλά τα έχει πιάσει η "Save", και φορτώνονται κανονικά όταν ανοίξω ξανά το project στην engine. Είναι μόνο ο ξένος αυτός κώδικας που σε κάθε crash διαγράφει παντελώς τα αρχεία απ' το δίσκο σου που είχες κάνει save. Με αυτά και μ' αυτά, αποφάσισα να σταματήσω να χρησιμοποιώ αυτό το σύστημα, και να σχεδιάσω απ' το 0 το δικό μου αντίστοιχο. Και αργά κατάλαβα πως έπρεπε να το είχα κάνει απ' την αρχή. Το πόσο νευρίασα δε μπορώ να το περιγράψω. Ίσως αν ήταν απλά errors να μην έπαιρνα μια τόσο σοβαρή απόφαση και να προσπαθούσα να ξεμπαγκάρω και το κώδικα τρίτου εκτός απ' το δικό μου, αλλά η ανύποπτη διαγραφή όλων των δεδομένων που έχω περάσει αν κάποτε τύχει και hangάρει το host, είναι πράγμα που δεν αποδέχομαι. Το ρίσκο είναι πολύ μεγάλο για να συνεχίσω να χρησιμοποιώ αυτό το έτοιμο υπο-σύστημα.

Lesson learned: Μην βασίζεσαι ποτέ σε components τρίτων, και φτιάξε όσα περισσότερα πράγματα μπορείς μόνος σου, για να περιορίσεις τα dependencies που έχεις εσύ ως προγραμματιστής σε τρίτους. Θες το χρόνο σου να τον περνάς ξεμπαγκάροντας το κώδικά σου, όχι το κώδικα τρίτων, και στη τελική, σε πολλές περιπτώσεις θα γλιτώσεις περισσότερο χρόνο αν το φτιάξεις μόνος σου απ' το να χρησιμοποιήσεις την έτοιμη επιλογή, γιατί θα μπορείς να διαβάζεις το κώδικα πιο εύκολα μιας και έχεις συνηθίσει το coding style σου, και να κινηθείς ενστικτωδώς εντοπίζοντας σφάλματα πολύ πιο γρήγορα από ότι θα το έκανες σε κώδικα τρίτων.

Καλή σας ημέρα!

Επεξ/σία από Alithinos
  • Like 3
Δημοσ.

Συμφωνώ 110% με αυτά που λες.

Απλά για τη κουβέντα να συμπληρώσω ότι τις περισσότερες φορές με τον τόσο έντονο «ανταγωνισμό» το ποιός θα βγάλει πρώτος κάτι, οι developers αναγκάζονται να χρησιμοποιήσουν έτοιμα πράγματα.

Προσωπικά όποτε έχω χρησιμοποιήσει κάτι έτοιμο, στη πρώτη ευκαιρία προσπαθώ (ακόμα και ικανοποιητικά να δουλεύει) να το αλλάξω με δικό μου κώδικα και ας κάνει 5 πράγματα λιγότερα.

  • Like 1
  • Moderators
Δημοσ.

Γι' αυτό το λόγο θέλει μεγάλη προσοχή τι χρησιμοποιείς και γιατί. Πριν ξεκινήσεις να χρησιμοποιείς ένα plugin πρέπει να δεις προσεκτικά πώς είναι γραμμένο και τι support παρέχεται (ειδικά δε αν είναι επί πληρωμή, να είσαι 100% σίγουρος ότι το χρειάζεσαι κλπ...). Όταν έκανα την πρακτική μου, ήταν να μπει replay system στο παιχνίδι όπου θα μαγνητοσκοπούσε κάποιες συγκεκριμένες περιοχές του παιχνιδιού και στο τέλος της πίστας θα τις ξαναέπαιζε. Ε αφού πάλευε ο ένας προγραμματιστής για κάμποσο καιρό (δε θυμάμαι πόσο ήταν, δυο βδομάδες, κάνας μήνας;) με αυτή τη μαλακία, το παρατήσαμε και τελικά το έφτιαξα από την αρχή εγώ. Εκεί είδα για πρώτη φορά στην πράξη ότι κάποιο επαγγελματικό προϊόν μπορεί να μην είναι και το πιο καλογραμμένο. Όταν με είχαν καλέσει κι εμένα να δούμε πώς σκατά θα το κάνουμε να δουλέψει, ζήτησα να μου στείλουν το documentation να ρίξω κι εγώ μια ματιά και γελάγανε.

Πάντως αυτό που λες για τελευταίο backup μια βδομάδα και ένα μήνα πριν είναι αδιανόητο. Commit τουλάχιστον μια φορά τη μέρα.

  • Like 1
Δημοσ.
5 ώρες πριν, Kercyn είπε

 

Πάντως αυτό που λες για τελευταίο backup μια βδομάδα και ένα μήνα πριν είναι αδιανόητο. Commit τουλάχιστον μια φορά τη μέρα.

Κάνω κάθε μέρα. Αλλά απ' τη στιγμή που θα γίνει το σφάλμα και θα διαγραφούν τα δεδομένα μέχρι να το πάρεις χαμπάρι ίσως περάσει κάποιος καιρός, όπου εργαζόσουν σε άλλα πράγματα. Φαντάσου πως τα δεδομένα τα έχεις σε μια scene, και για Χ χρονικό διάστημα δουλεύεις σε μια άλλη, και το ότι διαγράφτηκαν το αντιλαμβάνεσαι αφού έχεις τελειώσει την εργασία σου στη 2η και επιστρέφεις μετά από Χ χρονικό διάστημα στην προηγούμενη.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...