Junior Software Developer στην Κύπρο: Πρώτο Project με Κώδικα και Tests

For Candidates in Cyprus • By Alpha.jobs •

Για μια αίτηση ως Junior Software Developer στην Κύπρο, ένα μικρό προσωπικό project μπορεί να δείξει πώς μετατρέπετε μια απαίτηση σε λειτουργικό κώδικα. Η αξία του βρίσκεται στο αν μπορείτε να εξηγήσετε τι κάνει, πώς το ελέγξατε και ποια όρια έχει.

Εδώ κατασκευάζουμε ένα συγκεκριμένο εκπαιδευτικό παράδειγμα: μια λίστα εκκρεμοτήτων με τρεις λειτουργίες. Ο κώδικας και τα δεδομένα είναι δικά μας υποθετικά δείγματα. Δεν αποτελούν πραγματικό τεστ εργοδότη, παραγωγική εφαρμογή ή επαγγελματική προϋπηρεσία. Η Python επιλέγεται για την αναγνωσιμότητα του παραδείγματος· δεν παρουσιάζεται ως η περισσότερο ζητούμενη γλώσσα στην κυπριακή αγορά.

1. Ξεκινήστε από ένα μικρό brief

Το brief είναι απλό: «Θέλω να προσθέτω εργασίες, να ολοκληρώνω μία εργασία και να βλέπω τους τίτλους όσων παραμένουν εκκρεμείς». Οι εργασίες υπάρχουν μόνο στη μνήμη όσο εκτελείται το πρόγραμμα. Δεν προσθέτουμε λογαριασμούς, βάση δεδομένων, ιστοσελίδα ή εξωτερικές υπηρεσίες.

Πριν γράψετε κώδικα, ορίστε τι σημαίνει σωστή συμπεριφορά. Αυτό σας δίνει συγκεκριμένα κριτήρια για τα tests και για την παρουσίαση του έργου.

  • Κάθε έγκυρη προσθήκη παίρνει νέο αριθμητικό ID και αρχίζει ως εκκρεμής.
  • Τα περιττά κενά στην αρχή και στο τέλος του τίτλου αφαιρούνται. Κενός τίτλος απορρίπτεται χωρίς προσθήκη.
  • Η ολοκλήρωση γνωστού ID αφαιρεί τον τίτλο από την προβολή εκκρεμών. Επανάληψη της ίδιας ολοκλήρωσης δεν αλλάζει το αποτέλεσμα.
  • Άγνωστο ID προκαλεί σαφές σφάλμα και διατηρεί τις υπάρχουσες εργασίες.

Στο παράδειγμα οι τίτλοι δίνονται ως κείμενο και τα IDs ως ακέραιοι. Η λίστα τροποποιείται μόνο από τις δύο συναρτήσεις προσθήκης και ολοκλήρωσης. Δεν υποστηρίζεται διαγραφή. Αυτές είναι δηλωμένες προϋποθέσεις, όχι έλεγχοι που ο κώδικας κάνει αυτόματα σε κάθε πιθανό input.

2. Γράψτε την πρώτη μικρή υλοποίηση

Δημιουργήστε έναν φάκελο και αποθηκεύστε το παρακάτω σε αρχείο tasks.py. Όλα τα αρχεία που ακολουθούν πρέπει να βρίσκονται στον ίδιο φάκελο. Χρειάζεται εγκατεστημένη Python 3· δεν χρησιμοποιούνται πρόσθετα πακέτα.

def add_task(tasks, title):

title = title.strip()

if not title:

raise ValueError("Title required")

task_id = len(tasks) + 1

tasks.append({

"id": task_id,

"title": title,

"done": False,

})

return task_id

def complete_task(tasks, task_id):

for task in tasks:

if task["id"] == task_id:

task["done"] = True

return

raise KeyError(task_id)

def pending_titles(tasks):

return [

task["title"] for task in tasks

if not task["done"]

]

Η add_task επιστρέφει το ID ώστε ο επόμενος χειρισμός να αναφέρεται στη σωστή εργασία. Η complete_task αλλάζει την κατάσταση ενός γνωστού ID. Η pending_titles δημιουργεί μια λίστα τίτλων χωρίς να αλλάζει τα αρχικά δεδομένα. Δύο εργασίες μπορούν να έχουν ίδιο τίτλο: η ταυτότητά τους διακρίνεται από το ID.

Το len(tasks) + 1 λειτουργεί εδώ επειδή οι εγγραφές προστίθενται διαδοχικά και δεν διαγράφονται ή αλλάζουν απευθείας. Αν προσθέσετε διαγραφή, εισαγωγή παλιών δεδομένων ή περισσότερους χρήστες, χρειάζεται νέος σχεδιασμός ταυτοτήτων. Μην επεκτείνετε σιωπηρά τις δυνατότητες που αποδίδετε στο δείγμα.

3. Δοκιμάστε ένα αναμενόμενο αποτέλεσμα

Αποθηκεύστε το επόμενο αρχείο ως demo.py. Προσθέτει δύο εργασίες και ολοκληρώνει την πρώτη.

from tasks import add_task, complete_task, pending_titles

tasks = []

first = add_task(tasks, "README")

add_task(tasks, "Tests")

complete_task(tasks, first)

print(pending_titles(tasks))

Από τον φάκελο των αρχείων εκτελέστε python3 demo.py. Σε περιβάλλον όπου η εγκατάσταση καλείται python ή py, χρησιμοποιήστε την αντίστοιχη εντολή που εκτελεί Python 3. Το αναμενόμενο αποτέλεσμα είναι ['Tests']. Το README ολοκληρώθηκε και δεν εμφανίζεται πλέον στις εκκρεμότητες.

Αν το αποτέλεσμα διαφέρει, ελέγξτε πρώτα ποιο αρχείο εκτελείτε, από ποιον φάκελο και με ποια έκδοση Python. Η ένδειξη ότι το πρόγραμμα «έτρεξε» δεν αρκεί: συγκρίνετε την έξοδο με την αναμενόμενη συμπεριφορά.

4. Προσθέστε tests που ελέγχουν το brief

Ένα σωστό demo δείχνει μία διαδρομή. Τα tests πρέπει να εξετάζουν και περιπτώσεις που μπορούν να αποκαλύψουν λάθος. Η επίσημη τεκμηρίωση του unittest εξηγεί τη χρήση TestCase και ελέγχων αναμενόμενων αποτελεσμάτων ή εξαιρέσεων. Εδώ το χρησιμοποιούμε για τέσσερις συγκεκριμένες συμπεριφορές.

Αποθηκεύστε το παρακάτω ως test_tasks.py:

import unittest

from tasks import add_task, complete_task, pending_titles

class TaskTests(unittest.TestCase):

def test_add_trims_title_and_assigns_ids(self):

tasks = []

self.assertEqual(add_task(tasks, " README "), 1)

self.assertEqual(add_task(tasks, "Tests"), 2)

self.assertEqual(pending_titles(tasks), ["README", "Tests"])

def test_blank_title_does_not_add_task(self):

tasks = []

with self.assertRaises(ValueError):

add_task(tasks, " ")

self.assertEqual(tasks, [])

def test_completed_task_leaves_pending_list(self):

tasks = []

task_id = add_task(tasks, "README")

add_task(tasks, "Tests")

complete_task(tasks, task_id)

self.assertEqual(pending_titles(tasks), ["Tests"])

complete_task(tasks, task_id)

self.assertEqual(pending_titles(tasks), ["Tests"])

def test_unknown_id_keeps_existing_task(self):

tasks = []

add_task(tasks, "README")

with self.assertRaises(KeyError):

complete_task(tasks, 99)

self.assertEqual(pending_titles(tasks), ["README"])

if __name__ == "__main__":

unittest.main()

Εκτελέστε python3 -m unittest -v test_tasks από τον ίδιο φάκελο. Με τα τρία αρχεία αυτού του παραδείγματος αναμένονται τέσσερα tests και τελικό OK. Ο χρόνος εκτέλεσης και η ακριβής μορφοποίηση της εξόδου διαφέρουν ανά περιβάλλον.

Ελέγχουμε ότι η κενή προσθήκη δεν αφήνει ανεπιθύμητη εγγραφή, ότι η ολοκλήρωση επηρεάζει τη σωστή προβολή και ότι άγνωστο ID δεν πειράζει την υπάρχουσα εργασία. Τα tests δημιουργούν κάθε φορά δικά τους δεδομένα, ώστε το αποτέλεσμα να μην εξαρτάται από τη σειρά εκτέλεσης.

Για να καταλάβετε τι προστατεύουν, σε ξεχωριστό προσωρινό αντίγραφο αφαιρέστε μόνο το φίλτρο if not task["done"] και ξανατρέξτε τα tests. Ο έλεγχος ολοκλήρωσης πρέπει να αποτύχει. Επαναφέρετε τη σωστή έκδοση και επιβεβαιώστε το OK. Μη μοιραστείτε κατά λάθος το εσκεμμένα χαλασμένο αντίγραφο ως τελική λύση.

5. Παραδώστε ένα README που βοηθά στην αναπαραγωγή

Ο επισκέπτης του repository χρειάζεται να καταλάβει τι εξετάζει και πώς το εκτελεί. Η καθοδήγηση του GitHub για README περιγράφει τον ρόλο του στην παρουσίαση και στην εκκίνηση ενός έργου. Για το δικό μας δείγμα καταγράψτε:

  • Σκοπό: εκπαιδευτική λίστα εκκρεμοτήτων με υποθετικές εργασίες.
  • Περιβάλλον: την έκδοση που ελέγξατε με python3 --version και ότι δεν υπάρχουν πρόσθετες εξαρτήσεις.
  • Αρχεία: tasks.py για τη λογική, demo.py για το παράδειγμα, test_tasks.py για τους ελέγχους.
  • Εκτέλεση: τις δύο ακριβείς εντολές demo και tests και τα αναμενόμενα αποτελέσματα.
  • Όρια: προσωρινά δεδομένα μνήμης, χωρίς διαγραφή, UI, αποθήκευση, έλεγχο χρηστών ή αξιολόγηση ασφάλειας παραγωγής.
  • Συμβολή: ποιο μέρος ακολουθεί τον παρόντα οδηγό και ποιο εξελίξατε προσωπικά.

Δοκιμάστε τις οδηγίες από ένα καθαρό αντίγραφο του φακέλου. Ένα screenshot με πράσινα tests μπορεί να συμπληρώνει το repository, αλλά δεν αντικαθιστά τα αρχεία και τις εντολές. Για την ευρύτερη οργάνωση των δειγμάτων σας δείτε τον οδηγό επαγγελματικού portfolio.

6. Εξελίξτε το δείγμα και εξηγήστε τις επιλογές σας

Επιλέξτε μία επόμενη αλλαγή και ορίστε πρώτα την αναμενόμενη συμπεριφορά της. Για παράδειγμα, περιορισμός μήκους τίτλου απαιτεί σαφές όριο, χειρισμό υπέρβασης και tests και στις δύο πλευρές του ορίου. Η αποθήκευση σε αρχείο χρειάζεται επίσης απόφαση για αποτυχία ανάγνωσης και έλεγχο της δομής των δεδομένων.

Κρατήστε στο Git πραγματικές, κατανοητές αλλαγές: μικρή αρχική λειτουργία, έλεγχο μιας περίπτωσης, διόρθωση και ενημέρωση οδηγιών. Μην δημιουργείτε τεχνητά πολλά commits για εντύπωση. Εξηγήστε μία επιλογή που θα αλλάζατε σε μεγαλύτερη εφαρμογή και ποιο πρόβλημα θα έλυνε.

Αν χρησιμοποιήσατε tutorial ή AI, αναφέρετε τη βοήθεια και τι ελέγξατε εσείς. Μπορείτε να εξηγήσετε γιατί υπάρχει το ValueError, τι κάνει το φίλτρο και γιατί δεν υποστηρίζεται διαγραφή; Αν όχι, μελετήστε και δοκιμάστε αυτά τα σημεία πριν δηλώσετε ότι κατέχετε τον κώδικα. Μην κοινοποιείτε εταιρικό κώδικα, credentials ή προσωπικά δεδομένα.

Σε μια αίτηση γράψτε με ακρίβεια «εκπαιδευτικό project με τρεις λειτουργίες, τέσσερα tests και οδηγίες αναπαραγωγής», μόνο αν το υλοποιήσατε και το ελέγξατε. Το μικρό δείγμα δεν αποδεικνύει εμπειρία σε παραγωγή, συνεργασία μεγάλης ομάδας ή συγκεκριμένο framework. Ο γενικός οδηγός καριέρας IT στην Κύπρο βοηθά να τοποθετήσετε το project στη σωστή επαγγελματική κατεύθυνση.

7. Συνδέστε το project με τη συγκεκριμένη junior θέση

Διαβάστε τις απαιτήσεις στις αγγελίες IT και Developers στην Κύπρο. Η κατηγορία περιέχει διαφορετικά επίπεδα και ειδικότητες· δεν είναι όλες οι θέσεις junior software development. Επιβεβαιώστε την ισχύ, το stack, το επίπεδο εμπειρίας, την τοποθεσία και τον τρόπο αίτησης κάθε αγγελίας.

Συνδέστε κάθε σχετική απαίτηση με συγκεκριμένο τεκμήριο: καθαρή λογική, χειρισμό λάθους, version control, testing ή τεκμηρίωση. Αν η θέση ζητά διαφορετική γλώσσα, το παράδειγμα δεν αποδεικνύει γνώση της. Μπορείτε να το επανυλοποιήσετε και να επαληθεύσετε την ίδια συμπεριφορά στο ζητούμενο εργαλείο, εφόσον το κατανοείτε.

Στη συνέντευξη περιγράψτε σύντομα το brief, μία απόφαση, ένα test που αποκαλύπτει λάθος και το βασικό όριο της υλοποίησης. Οι οδηγίες μιας αξιολόγησης εργοδότη υπερισχύουν της προσωπικής σας ρουτίνας ως προς επιτρεπόμενα εργαλεία και μορφή παράδοσης. Ένα portfolio υποστηρίζει τη συζήτηση, χωρίς να εγγυάται πρόσληψη.

Συχνές ερωτήσεις για το πρώτο project Software Developer

Πρέπει να χρησιμοποιήσω Python για μια junior θέση στην Κύπρο;

Όχι ως γενικό κανόνα. Η επιλογή εδώ υπηρετεί το παράδειγμα. Για μια αίτηση ακολουθήστε τη γλώσσα και τις απαιτήσεις της συγκεκριμένης θέσης και δηλώστε το πραγματικό επίπεδό σας.

Αρκεί ένα τόσο μικρό project για πρόσληψη;

Δεν υπάρχει τέτοια εγγύηση. Το δείγμα δείχνει περιορισμένες συμπεριφορές και τρόπο επαλήθευσης. Οι απαιτήσεις εμπειρίας, γνώσεων και διαδικασίας επιλογής καθορίζονται από τον εργοδότη.

Τι σημαίνει ότι πέρασαν τα tests;

Ότι οι συγκεκριμένοι έλεγχοι έδωσαν το αναμενόμενο αποτέλεσμα στο περιβάλλον εκτέλεσης. Δεν αποδεικνύει απουσία κάθε bug, πλήρη κάλυψη, ασφάλεια ή παραγωγική ετοιμότητα.

Μπορώ να παρουσιάσω τον κώδικα αυτού του οδηγού;

Παρουσιάστε τον με σαφή αναφορά ότι ακολουθήσατε εκπαιδευτικό παράδειγμα του Alpha.jobs. Ξεχωρίστε τις δικές σας αλλαγές και τους ελέγχους που εκτελέσατε. Μην τον εμφανίσετε ως πρωτότυπο έργο πελάτη ή ως επαγγελματική προϋπηρεσία.

Χρειάζομαι website ή πληρωμένο hosting;

Το συγκεκριμένο δείγμα εκτελείται τοπικά και δεν χρειάζεται hosting ή εξωτερική υπηρεσία. Ένα οργανωμένο repository με αρχεία και ακριβείς οδηγίες μπορεί να χρησιμοποιηθεί για την παρουσίασή του, ακολουθώντας πάντα τις απαιτήσεις της αίτησης.