Γιατί η Kotlin είναι φοβερή, αλλά εσείς θα μείνετε με τη Java ούτως ή άλλως
Marcin Perlikowski
Ανώτερος προγραμματιστής Java
Αν είστε προγραμματιστής Java, το πιθανότερο είναι ότι έχετε τουλάχιστον κάποια εμπειρία με άλλες γλώσσες προγραμματισμού. Κάποιοι από εμάς ξεκίνησαν την περιπέτειά τους στον προγραμματισμό με μια άλλη γλώσσα, όπως η C/C++, JavaScript, C#, Python ή ίσως ακόμη και με κάτι όπως η Pascal ή η Basic. Κάποιοι, όμως, ξεκίνησαν με τη Java και απλά δεν έδωσαν ποτέ ιδιαίτερη σημασία σε άλλες γλώσσες, θυμούμενοι δυσάρεστα τη μία φορά που χρειάστηκε να κωδικοποιήσουν γρήγορα κάτι από την πλευρά του frontend.
Ανεξάρτητα από την ομάδα στην οποία ανήκετε, υπάρχει λόγος για τον οποίο μένετε με Java. Και δεν σε κατηγορώ. Έχει αναμφισβήτητα το πιο ανεπτυγμένο, καθολικό και πλήρες οικοσύστημα σε ολόκληρο το επιχείρηση κόσμο. Η γλώσσα διαθέτει ένα καλά προσαρμοσμένο σύνολο δυνατοτήτων, κάπου στη σωστή ζώνη μεταξύ υπερβολικά πολλών και πολύ λίγων. Και νέα χαρακτηριστικά προστίθενται αργά αλλά σταθερά, διατηρώντας την ως επί το πλείστον ενήμερη με τις νεότερες τάσεις στον κόσμο του προγραμματισμού.
Ξέρετε Lombok όμως; Αν δεν το ξέρετε, σας συνιστώ ανεπιφύλακτα να το δοκιμάσετε. Αν σας αρέσει, τότε έχω κάτι μόνο για εσάς να δοκιμάσετε. Μια εντελώς νέα γλώσσα, που με τα χαρακτηριστικά της καθιστά τη Lombok παρωχημένη. Ονομάζεται Kotlin.
Kotlin; Εννοείτε τη γλώσσα Android;
Η Kotlin στο Android ευλογήθηκε από την ίδια τη Google σε σημείο που έγινε η de facto γλώσσα επιλογής για την πλατφόρμα. Δεν είναι αυτό στο οποίο θα επικεντρωθώ σε αυτό το άρθρο, αλλά το Android είναι πράγματι το μέρος όπου συνάντησα την Kotlin για πρώτη φορά.
Ο συνάδελφός μου στη δουλειά ανέπτυσσε μια εφαρμογή για μια τότε τρέχουσα έργο, μόνος του. Οι προθεσμίες όμως πλησίαζαν γρήγορα, οπότε μου ανατέθηκε να τον βοηθήσω να τις τηρήσει. Επιτρέψτε μου τώρα να μεταφερθώ πίσω στο χρόνο σε εκείνη τη στιγμή. Και... Αααα! Γιατί χρησιμοποιεί μια περίεργη γλώσσα που ακούγεται σαν... μάρκα κέτσαπ!? Φαίνεται απαίσιο!
Γιατί γράφεται "fun" πριν από κάθε συνάρτηση; Λες και δεν ξέρω ήδη τι είναι. Επίσης, έχω ήδη διασκέδαση με Java τέλος πάντων. Και πού είναι ο τύπος επιστροφής; Στο τέλος; Είσαι τρελός; Τι είναι αυτό, αναθέτεις κάτι σε μια συνάρτηση; Δεν βγάζει νόημα! Όλα μοιάζουν σαν Java με επιπλέον βήματα! Περιμένετε, πού είναι η κλάση στην οποία ανήκει αυτή η μέθοδος; Πού την έκρυψες εσύ που ακούγεσαι σαν κέτσαπ, Java μιμητική δικαιολογία μιας γλώσσας προγραμματισμού; Ωχ όχι. Όχι, δεν το έκανες. ΑΥΤΉ ΕΊΝΑΙ ΜΙΑ ΠΑΓΚΌΣΜΙΑ ΣΥΝΆΡΤΗΣΗ; Αυτό ήταν, τελείωσα, θα καλέσω την αστυνομία.
Συναγερμός: δεν κάλεσα τις αστυνομικές αρχές. Είτε μου άρεσε είτε όχι, έπρεπε να προσαρμόσω την Java-κεντρική μου νοοτροπία για να προσαρμοστώ σε μια άλλη γλώσσα. Δεν θα είναι τόσο άσχημα όμως, σωστά; Εξακολουθεί να είναι μια γλώσσα JVM, σίγουρα είναι απλά μια διαφορετική Java. Ίσως ακόμη και με κάποια ωραία επιπλέον χαρακτηριστικά; Διστάζοντας, άρχισα να εργάζομαι πάνω στο έργο.
Java με επιπλέον βήματα
Αν η Java είναι τόσο σπουδαία, γιατί δεν υπάρχει Java 2; Πέρα από τα αστεία, αυτό σκέφτηκα στον εαυτό μου. Θα προσποιηθώ ότι η Kotlin είναι η Java 2. Νέο συντακτικό και όλα αυτά, αλλά πρέπει να μάθω αρκετά από αυτά για να τελειώσω το έργο. Αγόρι μου, αγόρι μου, έκανα λάθος.
Αφού το δοκίμασα για μία ή δύο ημέρες, συνειδητοποίησα γρήγορα ότι τόσο η Kotlin όσο και η Java δεν είναι τόσο ελαστικά. Η προσπάθεια να τα λυγίσετε το ένα προς το άλλο καταλήγει αναπόφευκτα στο να σπάσει το ένα στη μέση. Έγινε φανερό ότι η Kotlin είναι ένα πράγμα από μόνη της, και το γεγονός ότι λειτουργεί σε μια JVM δεν σημαίνει σχεδόν ακριβώς τίποτα από τη σκοπιά ενός προγραμματιστή. (Παρεμπιπτόντως, μπορεί επίσης να μεταφράσει σε JavaScript, ή να μεταγλωττιστεί σε εγγενές δυαδικό αρχείο).
Σχέδιο Β τότε. Στην πραγματικότητα, γνωρίστε τη γλώσσα. Η ανάγνωση των εγγράφων για πρώτη φορά προκαλεί ρίγη στη σπονδυλική στήλη ενός έμπειρου προγραμματιστή Java. Για παράδειγμα: - το προαναφερθέν κορυφαίο επίπεδο ή αλλιώς παγκόσμιο πλαίσιο - τύποι παραμέτρων και τύποι επιστροφής συναρτήσεων που καθορίζονται στο τέλος
fun sum(a: Int, b: Int): Int {
return a + b
}
το σώμα της συνάρτησης μπορεί να είναι μια έκφραση (χρησιμοποιώντας το σύμβολο ισότητας)
fun sum(a: Int, b: Int) = a + b
η δήλωση if μπορεί να δώσει ένα αποτέλεσμα
val y = if (x == 1) {
"one"
} else if (x == 2) {
"two"
} else {
"other"
}
Εντάξει, θα πρέπει να το συνηθίσω. Απλά μια διαφορετική σύνταξη. Τι άλλο έχεις να προσφέρεις, κύριε Kotlin;
value?.method() // execute if not null
Ω, εντάξει, να απαλλαγούμε από if (value == null), ένας πόντος για εσάς. Τι άλλο έχεις;
fun check(list: List, alternative: Boolean) = when {
list is LinkedList -> print("linked")
alternative -> print("εναλλακτική")
list.size > 50 -> print("big")
else -> print("άλλη")
}
Χμμ ωραία, θα μπορούσε να είναι βολικό για να αποφύγετε αν κάποιος άλλος μπλοκάρει, εξακολουθεί όμως να μοιάζει με τέχνασμα.
object SingularObject: Μετρητής() {
var a = 14
fun test() = if (a > 10) "more" else "less"
}
Εντάξει, αυτό φαίνεται πραγματικά χρήσιμο, μου αρέσει! Από την άλλη πλευρά, μπορώ να δημιουργήσω ένα singleton και στη Java. Ίσως να μην είναι τόσο κομψό, αλλά δεν είναι κάτι πραγματικά καινούργιο. Έχεις τίποτα άσους στο μανίκι σου; Όπως, πραγματικά βαριά χτυπήματα;
Φανταστείτε μια βάση κώδικα, όπου δεν χρειάζεται να ανησυχείτε για την ασφάλεια του null. Φανταστείτε να θεωρείτε δεδομένο ότι κάθε αναφορά περιέχει πραγματικά κάτι σημαντικό. Φανταστείτε να είστε σίγουροι ότι κάθε πρόβλημα που σχετίζεται με το null έχει αντιμετωπιστεί εκ των προτέρων. Μην φανταστείτε τίποτα άλλο. Όλες οι αναφορές στην Kotlin δεν είναι μηδενικές από προεπιλογή. Αν θέλετε να τις κάνετε μηδενικές, θα πρέπει να συνειδητά να λάβει αυτή την απόφαση, και ρητά να το δηλώσετε στο κωδικός:
var s: = null
Καταλαβαίνω ότι μπορεί να είστε επιφυλακτικοί με την όλη ιδέα σε αυτό το σημείο. Έχετε συνηθίσει σε μηδενικές αναφορές. Το έχετε στο πίσω μέρος του μυαλού σας κατά την κωδικοποίηση. Έχετε μάθει πού πρέπει να είστε προσεκτικοί. Οι σκέψεις μου είναι ακριβώς οι δικές μου. Προερχόμενος από Java, στην αρχή αισθάνθηκε πράγματι περίεργα. Όπως, ποιο είναι το νόημα; Δεν θα εξαφανίσει με μαγικό τρόπο όλα τα σχετικά προβλήματα. Απλά θα πρέπει να προσθέσω "?" παντού, ακούγεται σαν αγγαρεία.
Αλλά αποφάσισα να βουτήξω βαθιά στη γλώσσα, έτσι δεν είναι; Ας το κάνουμε με τον τρόπο σου, κύριε. Kotlin. Άρχισα να κάνω μια προσπάθεια να εξαλείψω όσες περισσότερες μηδενικές μεταβλητές, πεδία και παραμέτρους μπορούσα. Βήμα προς βήμα, έμαθα να χρησιμοποιώ χαρακτηριστικά της γλώσσας που διευκόλυναν την εξάλειψη των μηδενικών αναφορών, π.χ. ο τελεστής safe call ";.", ο τελεστής elvis ";:", οι εξουσιοδοτημένες ιδιότητες, η μέθοδος "let" και άλλα.
Καθώς περνούσε ο καιρός, κατάφερα να κάνω κάποιες κλάσεις να περιέχουν μόνο μη μηδενικά πεδία και παραμέτρους μεθόδων. Βασικά, ήξερα ότι αν μια κλάση ενσαρκωνόταν επιτυχώς, μπορούσα σχεδόν να ξεχάσω τη μηδενικότητα στα σώματα των μεθόδων. Ήταν μια ευτυχία. Με τον καιρό, το εκτιμούσα αυτό όλο και περισσότερο. Τελικά, όμως, δεν το θεωρούσα ως δολοφονικό χαρακτηριστικό, Java εξακολουθούσε να μοιάζει με το σπίτι μου. Μέχρι που...
Η επιστροφή
Το έργο πλησίαζε στο τέλος του. Γνώρισα την Kotlin όλο και περισσότερο, και με αυτή τη γνώση, ο κώδικας γινόταν όλο και πιο τακτοποιημένος, ευανάγνωστος και συνοπτικός. Μπορούσατε να δείτε τις βελτιώσεις με γυμνό μάτι στο ιστορικό των δεσμεύσεων. Τελικά, όμως, έφτασε η ώρα. Με απροσδόκητα τρυφερές αναμνήσεις από τη νέα γλώσσα, ήρθε η ώρα να πούμε αντίο και να επιστρέψουμε στη γλυκιά ζώνη άνεσης του Java. Ή έτσι νόμιζα.
Γνωρίζετε αυτό το συναίσθημα όταν αρχίζετε να εκτιμάτε κάτι την ίδια στιγμή που χάνεται; Όταν δεν συνειδητοποιείς πόσο πολύ στηρίζεσαι σε κάτι μέχρι να μην μπορείς να το χρησιμοποιήσεις πια; Ήταν το καλύτερο παράδειγμα αυτού του συναισθήματος που πιθανώς έχω βιώσει ποτέ στη ζωή μου.
Καθώς επέστρεφα στη συγγραφή του κώδικα στο Java, ήμουν σχεδόν τρομοκρατημένος από την έλλειψη ορισμένων χαρακτηριστικών. Ήταν σαν ο εγκέφαλός μου υποσυνείδητα, λανθασμένα να μεταφέρει τα χαρακτηριστικά της Kotlin στη Java. Βίωσα καταστάσεις όπου πραγματικά άρχισα να υλοποιώ κάτι, μόνο και μόνο για να συνειδητοποιήσω ότι δεν θα λειτουργήσει σε αυτή τη γλώσσα. Στην καλύτερη περίπτωση θα μπορούσα να το γράψω Kotlin-like, αλλά θα ήταν ογκώδες, δυσανάγνωστο και/ή θα απαιτούσε πάρα πολλά boilerplate.
Η μηδενική ασφάλεια ήταν φυσικά το χαρακτηριστικό που μου έλειψε περισσότερο. Αλλά εξεπλάγην από το πόσα μικρότερα πράγματα έγιναν φυσικά για μένα: ονομαστικές παράμετροι, ιδιότητες αντί για getters και setters, "==" ως ίσα και "===" ως αναφορική ισότητα, προσδιορισμένο "this", συναρτήσεις επέκτασης, έμμεση μοναδική παράμετρος λάμδα, "_" για αχρησιμοποίητες παραμέτρους λάμδα, κλάσεις δεδομένων, συναρτήσεις εμβέλειας, άλλες συναρτήσεις Kotlin stdlib, τελεστές και πολλά άλλα. Και ο τρόπος με τον οποίο όλα αυτά ταιριάζουν όμορφα μεταξύ τους. Σε σύγκριση, η Java έμοιαζε... πρωτόγονη.
Στην πραγματικότητα ένιωσα τόσο άσχημα που άρχισα να σκέφτομαι να στραφώ συνολικά στην Kotlin. Θεωρητικά, είναι πλήρως διαλειτουργική με τη Java, μπορείτε απλά να προσθέσετε την υποστήριξη της Kotlin σε ένα υπάρχον έργο και να αρχίσετε να γράφετε νέες κλάσεις. Η πλευρά της Kotlin ξέρει πώς να "μιλήσει" με τη Java, και η πλευρά της Java δεν γνωρίζει καν ότι "μιλάει" με μια άλλη γλώσσα. Και μετά τη μεταγλώττιση σε bytecode, δεν έχει πραγματικά καμία διαφορά για το JVM.
Έλεγχος της πραγματικότητας
Τι περιμένετε λοιπόν; Αν η γλώσσα είναι τόσο καλή όσο λέτε, απλά χρησιμοποιήστε την! Ίσως όχι σε υπάρχοντα έργα όμως, ξέρω ότι πρέπει να είναι διαλειτουργική, αλλά το να αναμειγνύεις δύο διαφορετικές γλώσσες με αυτόν τον τρόπο ακούγεται άσχημο.
Εντάξει, λοιπόν, για νέες ενότητες - Kotlin είναι. Ή μήπως όχι; Εργάζεστε σε ένα ομάδα. Πρέπει να τους συμβουλευτείτε και να τους πείσετε για το μεγαλείο αυτής της νέας γλώσσας. Τι; Δεν τους αρέσει; Ακούγεται σαν να μην θέλουν να καταβάλουν προσπάθεια για να την μάθουν. Δεν μπορείτε να τους κατηγορήσετε όμως, ήσασταν κι εσείς επιφυλακτικοί στην αρχή.
Ο διαχειριστής του έργου! Ναι! Σίγουρα θα καταλάβει τη μεγάλη αξία που θα έδινε η Kotlin στην ομάδα μας. Ω, το μεγαλείο που θα έρθει! -No -Περίμενε, γιατί; -Η ομάδα δεν το γνωρίζει. -Θα μάθουν! -Δεν θέλουν να μάθουν. -Μπορείτε να τα φτιάξετε! -Δεν χρειάζεται να μάθουν. -Εννοώ, αυτό είναι αλήθεια, αλλά σκεφτείτε τις δυνατότητες! -Ναι, τι θα λέγατε να σκεφτείτε πρώτα τα προβλήματα.
Ο μύθος λέει ότι υπάρχει ένα σχέδιο. Ένα έργο που είναι μεγάλο και πολύπλοκο, αλλά όμορφα γραμμένο σε κάθε του μέρος. Ένα έργο, όπου όλοι οι προγραμματιστές είναι σε συμφωνία για τις χρησιμοποιούμενες λύσεις. Όπου οι νέες λειτουργικότητες απλά ρέουν ομαλά από τα πληκτρολόγια των προγραμματιστών. Όπου τα σφάλματα είναι σπάνια και διορθώνονται εύκολα.
Έχετε δει ένα τέτοιο έργο; Δεν έχω δει. Κάποια πλησίασαν, αλλά τα περισσότερα από αυτά είναι ένα μεγάλο χάος κώδικα κληρονομιάς. Και αν δεν είναι, πιθανότατα θα γίνουν κάποια στιγμή στο μέλλον. Φανταστείτε τώρα να βάζετε και μια άλλη γλώσσα στο μείγμα. Εισάγονται νέοι τρόποι για να κάνεις λάθη. Απαιτεί από τους προγραμματιστές να γνωρίζουν τι κάνουν. Είναι τουλάχιστον ένα ρίσκο.
Τώρα εξετάστε επίσης την περιστροφή των προγραμματιστών. Οι άνθρωποι έρχονται και φεύγουν. Θα αναγκάσετε κάθε νέο προγραμματιστή να μάθει μια εντελώς νέα γλώσσα; Όχι, αυτό είναι αντιπαραγωγικό. Θα προσλάβετε προγραμματιστές Kotlin στην πρώτη θέση; Καλή τύχη με αυτό, η πρόσληψη ενός καλού προγραμματιστή Java είναι αρκετά δύσκολη.
Οι άνθρωποι έχουν δοκιμάσει. Οφείλω να πω ότι δεν συμφωνώ με τους περισσότερους ισχυρισμούς του εν λόγω άρθρου. Υπάρχει κάποια έγκυρη κριτική εκεί, αλλά νομίζω ότι δεν χρησιμοποίησαν την Kotlin αρκετά για να κατανοήσουν πραγματικά "τον τρόπο Kotlin". Πολλοί σχολιαστές κάτω από αυτό το άρθρο φαίνεται να σκέφτονται παρόμοια.
Αυτό όμως δεν έχει σημασία. Στοιχηματίζω ότι αυτό θα συνέβαινε και στο δικό σας έργο. "Το δοκίμασα, δεν μου άρεσε". Δεν θα τους κάνετε να ξοδέψουν περισσότερο χρόνο για αυτό. Δεν θα τους κάνεις να ξαναδοκιμάσουν. Δεν θα τους κάνεις να δώσουν άλλη μια ευκαιρία. Και από πρακτική άποψη, μπορεί να έχουν δίκιο. Java είναι τόσο δημοφιλής, που η χρήση οποιουδήποτε άλλου στο JVM φαίνεται περιττή.
Γιατί τότε αυτό το άρθρο;
Μόλις ξοδέψατε αρκετό χρόνο για να γράψετε ένα άρθρο που φαίνεται να μην έχει νόημα. Γιατί να προσπαθήσω να μάθω μια γλώσσα, αν λέτε ότι είναι άσκοπο ούτως ή άλλως;
Λοιπόν, δεν νομίζω ότι είναι άσκοπο. Εξακολουθώ να πιστεύω ότι η Kotlin είναι σπουδαία. Εξακολουθώ να θέλω να τη χρησιμοποιήσω πραγματικά (και το κάνω για τα ιδιωτικά μου έργα). Αν μπορούσα, απλά θα μεταπηδούσα σε αυτήν και θα ξεχνούσα τους περιορισμούς της Java. Αλλά η τρέχουσα πραγματικότητα λέει ότι δεν μπορώ. Και θέλω να προσπαθήσω να το αλλάξω αυτό.
Η πρόθεσή μου για σένα, αγαπητέ αναγνώστη, είναι να σκεφτείς τουλάχιστον την πιθανότητα να βγεις από τη ζεστή ζώνη άνεσης της Java. Επειδή ίσως, μόνο ίσως, θα αγαπήσετε την Kotlin όσο και εγώ. Και αν το κάνεις, τότε θα έχεις έναν ακόμα προγραμματιστή που γνωρίζει την Kotlin στο αγορά.