Τεχνολογικό stack της cutty.dev — συνειδητοποιημένες επιλογές
Τι υπάρχει κάτω από το cutty.dev και γιατί. Χωρίς προσηλυασμό — φιλοσοφία: βαρετό, σταθερό stack, hosting στην ΕΕ και ιδιωτικότητα ενσωματωμένη στην αρχιτεκτονική, την οποία ένα άτομο είναι σε θέση να συντηρήσει.
Οι περισσότερες αναρτήσεις "mój tech stack" είναι μια περήφανη λίστα καινοτομιών. Κοίτα, έχω αυτό, έχω εκείνο, και εδώ ακόμα μια φρέσκια βιβλιοθήκη από την περασμένη εβδομάδα. Αυτό θα είναι διαφορετικό.
Γιατί η αλήθεια είναι ότι όταν διαχειρίζεσαι ένα project μόνος σου, δεν ψάχνεις το πιο μοντέρνο. Ψάχνεις κάτι που δεν θα σε ξυπνάει στις τρεις το πρωί. Και ακριβώς γι' αυτό είναι όλο αυτό το technological stack της cutty.dev: βαρετό αντί για μοντέρνο, ευρωπαϊκό αντί για αμερικανικό, ιδιωτικό από τα θεμέλια, και αρκετά απλό ώστε να μπορεί να το διαχειριστεί ένα μόνο ζευγάρι χεριών.
Πηγαίνω με τη σειρά, σαν να σου το εξηγούσα σε μια καφετέρια.
Astro με αναπαραγωγή στον διακομιστή (και γιατί όχι κάτι "πιο ωραίο")
cutty.dev είναι ένα Astro με server-side rendering. Κάθε αίτημα περνά από τον διακομιστή, δημιουργεί τη σελίδα και επιστρέφει έτοιμο HTML. Σκουπότητα; Ακριβώς αυτό είναι το νόημα.
Ήθελα τρία πράγματα: rendering στον διακομιστή χωρίς βαριά μηχανουργικά συστήματα, καλή υποστήριξη πολλών γλωσσών έτοιμη προς χρήση, και ταχύτητα χωρίς επιβάρυνση. Το Astro προσφέρει όλα αυτά, και ο κώδικας παραμένει ευανάγνωστος. Όταν επιστρέφω σε αυτό μετά από δύο μήνες διακοπής, ξέρω τι συμβαίνει εκεί. Σε ένα solo project, αυτό αξίζει περισσότερα από οποιαδήποτε μονάδα τάσης που μετά από έναν χρόνο δεν την υποστηρίζει πλέον κανείς.
Ένα αρχείο αντί για μια βάση με πυροτεχνήματα
SQLite. Μία βάση, ένα αρχείο στον δίσκο. Επιπλέον, ένα επίπεδο ερωτημάτων που επικοινωνεί με το TypeScript, έτσι ώστε αν αλλάξω τη δομή των δεδομένων, το σφάλμα να εμφανίζεται στον editor μου και όχι στην παραγωγή τα μεσάνυχτα.
Γιατί ακριβώς αυτό; το cutty είναι "read-heavy". Κάποιος κάνει κλικ σε έναν συντομευμένο σύνδεσμο, εμείς κάνουμε ανάγνωση και αυξάνουμε τον μετρητή. Αυτό είναι. Η SQLite διαχειρίζεται τέτοια κίνηση άνετα, μέχρι πραγματικά μεγάλα καθημερινά νούμερα. Και το backup; Αντιγράφεις το αρχείο. Τέλος. Χωρίς τελετουργίες αναπαραγωγής (replication), χωρίς scripts που κανείς δεν θυμάται πώς λειτουργούν.
Προσοχή σε ένα πράγμα εδώ, γιατί είναι μια συνηθισμένη παγίδα: οι άνθρωποι ακούν "SQLite" και σκέφτονται "παιχνίδι για ένα project στο πανεπιστήμιο". Δεν είναι έτσι. Όσο λιγότερα κινούμενα μέρη, τόσο λιγότερα πράγματα που μπορούν να καταρρεύσουν. Αυτό δεν είναι εξοικονόμηση κόστους στην ποιότητα, είναι μια συνειδητή απόφαση.
Ο διακομιστής βρίσκεται στην Ευρώπη και αυτό δεν είναι τυχαίο
Αφιερωμένος διακομιστής στην ΕΕ. Ιδικό TLS, reverse proxy με αυτόματο HTTPS, εφαρμογή σε κοντέινερ.
Αυτό είναι το θεμέλιο για το πώς η cutty διαχειρίζεται τα δεδομένα. Ξέρω ακριβώς πού βρίσκονται φυσικά (για τους πελάτες από την ΕΕ και τον GDPR αυτό δεν είναι μια λεπτομέρεια, αλλά μια προϋπόθεση), δεν είμαι δεμένος σε έναν μόνο πάροχο, τίποτα δεν διαρρέει αυτόματα πέρα από τον ωκεανό, και το κόστος είναι προβλέψιμο αντί να παρουσιάζει απότομες αυξήσεις μαζί με την κίνηση.
Ναι, οι βολικές πλατφόρμες από τη Δύση θα επέτρεπαν μια ταχύτερη αρχή. Κάνεις κλικ, deploy, λειτουργεί. Μόνο ότι πληρώνεις για αυτό με το σημείο όπου καταλήγουν τα δεδομένα των χρηστών σου. Για μένα, αυτό ήταν μια κακή συμφωνία.
Μεταφράσεις κάνει το δικό του μοντέλο, στον ίδιο
cutty μιλάει 25 γλώσσες. Μεταφράζει αυτό ένα τοπικό, ανοικτό μοντέλο AI, που τρέχει στην υποδομή μου. Δεν στέλνω το κείμενο από το περιβάλλον χρήστη σε κανέναν εξωτερικό πάροχο.
Τα οφέλη είναι πρακτικά. Μια μεμονωμένη μετάφραση κοστίζει μηδέν. Έχω πλήρη έλεγχο στην ποιότητα και μπορώ να την ανανεώσω όποτε θέλω. Και το μηχάνημα χρειάζεται πάντα ένα ανθρώπινο μάτι, επομένως κάθε μία από αυτές τις 25 γλώσσες έχει ελεγχθεί. Αλλά το γεγονός ότι το κάνω στον δικό μου χώρο, σημαίνει ότι η ιδιωτικότητα δεν είναι μια θέση στον τιμοκατάλογο. Είναι ιδιότητα του τρόπου με τον οποίο είναι δομημένο ολόκληρο το σύστημα.
Tailwind, κοντέινερ και μερικές μικρότερες αποφάσεις
Style? Utility-first, δηλαδή Tailwind. Χωρίς CSS-in-JS, χωρίς ξεχωριστά αρχεία στυλ, όλα απευθείας μέσα στα templates. Δεν χάνω χρόνο επινοώντας ονόματα classes, τα αχρησιμοποίητα styles έτσι κι αλλιώς δεν καταλήγουν στη τελική σελίδα, και το design είναι συνεπές επειδή το ίδιο το σύστημα το επιβάλλει. Για έναν άνθρωπο, κάθε λεπτό που δεν σπαταλάται σε ασήμαντα πράγματα μετράει.
Αυτή η υλοποίηση είναι Docker. Το ίδιο περιβάλλον τοπικά και στην παραγωγή, τέλος στο "στον υπολογιστή μου λειτουργούσε". Και αν κάποια στιγμή χρειαστεί, μεταφέρω τα πάντα σε έναν άλλο διακομιστή σε περίπου μισή ώρα. Η φορητότητα είναι μια σιωπηλή μορφή ανεξαρτησίας.
Τι έβγαλα από αυτό
Το βαρετό stack κερδίζει. Astro, SQLite, Tailwind, containers. Όλα ώριμα, δοκιμασμένα, περιγεγραμμένα. Τίποτα δεν καταρρέει τη στιγμή που το χρειάζεσαι λιγότερο από όλα.
Η φιλοξενία στην ΕΕ είναι έτοιμη για παραγωγή, πραγματικά. Το ότι "πρέπει να πας σε μια μεγάλη αμερικανική cloud για να είσαι σοβαρός", είναι παραμύθι. Το τοπικό AI είναι επίσης εφικτό, δεν χρειάζεται να δίνεις δεδομένα σε ένα εξωτερικό API για να έχεις αξιοπρεπείς μεταφράσεις. Και το τελευταίο πράγμα: ένα άτομο μπορεί να κυκλοφορήσει κάτι που μοιάζει με τη δουλειά ολόκληρης μιας ομάδας. Πρέπει μόνο να θυμάστε ότι ο χρόνος είναι πιο ακριβός από τα χρήματα, και από αυτή την άποψη να επιλέγετε κάθε κομμάτι προσεκτικά.
Όταν χτίζετε κάτι δικό σας, κάντε στον εαυτό σας μια ερώτηση για κάθε τεχνολογία: θα μπορώ σε ένα χρόνο να το συντηρήσω μόνος μου; Αν όχι, τότε μάλλον έχετε την απάντηση.
Όλα αυτά λειτουργούν εδώ: cutty.dev. Και αν θέλετε να συζητήσετε για κάποια από αυτές τις αποφάσεις, γράψτε στο [email protected], απαντώ την ίδια ημέρα.