«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής

Το άρθρο μου σήμερα είναι σκέψεις δυνατές από ένα άτομο που πήρε το δρόμο του προγραμματισμού σχεδόν τυχαία (αν και φυσικά).

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

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής
Πηγή: https://xkcd.com/664/

Γενικά, αφιερωμένο σε όλους τους σημερινούς φοιτητές από πρώην μαθητή!

Προσδοκίες

Όταν ολοκλήρωσα το πτυχίο μου στις Τεχνολογίες Πληροφορικής και Συστήματα Επικοινωνίας το 2014, δεν ήξερα σχεδόν τίποτα για τον κόσμο του προγραμματισμού. Ναι, όπως πολλοί άλλοι, πήρα το μάθημα «Επιστήμη Υπολογιστών» στο πρώτο μου έτος - αλλά, Κύριε, ήταν στο πρώτο μου έτος! Ήταν μια αιωνιότητα!

Γενικά, δεν περίμενα κάτι ιδιαίτερα διαφορετικό από το πτυχίο και όταν μπήκα στο μεταπτυχιακό «Επικοινωνία και Επεξεργασία Σήματος» Γερμανο-Ρωσικό Ινστιτούτο Νέων Τεχνολογιών.

Αλλά μάταια...

Ήμασταν μόνο η δεύτερη πρόσληψη, και τα παιδιά από την πρώτη έφτιαχναν ακόμα τις βαλίτσες τους για τη μακρινή Γερμανία (η πρακτική άσκηση διαρκεί έξι μήνες στο δεύτερο έτος του μεταπτυχιακού). Με άλλα λόγια, κανείς από τον άμεσο κύκλο δεν είχε ακόμη αντιμετωπίσει σοβαρά τις μεθόδους της ευρωπαϊκής εκπαίδευσης και δεν υπήρχε κανείς να ρωτήσει για τις λεπτομέρειες.

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

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής

Περιττό να πούμε ότι εμείς, οι μελλοντικοί Master of Science, από τη νεανική μας βλακεία, αποφύγαμε να γράψουμε κώδικα σαν φωτιά. Εδώ, για παράδειγμα, είναι το Simulink από το MathWorks: εδώ είναι τα μπλοκ, εδώ είναι οι συνδέσεις, εδώ είναι κάθε είδους ρυθμίσεις και διακόπτες.

Μια άποψη που είναι εγγενής και κατανοητή σε ένα άτομο που έχει εργαστεί στο παρελθόν στον σχεδιασμό κυκλωμάτων και στη μηχανική συστημάτων!

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής
Πηγή: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Έτσι μας φάνηκε...

Πραγματικότητα

Μία από τις πρακτικές εργασίες του πρώτου εξαμήνου ήταν η ανάπτυξη ενός πομποδέκτη σήματος OFDM ως μέρος του μαθήματος «Μέθοδοι Μοντελοποίησης και Βελτιστοποίησης». Η ιδέα είναι πολύ επιτυχημένη: η τεχνολογία εξακολουθεί να είναι σχετική και αρκετά δημοφιλής λόγω της χρήσης της, για παράδειγμα, σε δίκτυα Wi-Fi και LTE/LTE-A (με τη μορφή OFDMA). Αυτό είναι το καλύτερο πράγμα για τους πλοιάρχους να εξασκήσουν τις δεξιότητές τους στη μοντελοποίηση συστημάτων τηλεπικοινωνιών.

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής

Και τώρα μας δίνονται αρκετές επιλογές τεχνικών προδιαγραφών με προφανώς μη πρακτικές παραμέτρους πλαισίου (για να μην ψάξουμε λύση στο ίντερνετ), και χαζεύουμε το ήδη αναφερόμενο Simulink... Και μας χτυπάει το κεφάλι με τσαγιέρα της πραγματικότητας:

  • Κάθε μπλοκ είναι γεμάτο με πολλές άγνωστες παραμέτρους, οι οποίες είναι τρομακτικές να αλλάξουν με την πτώση ενός καπέλου.
  • Οι χειρισμοί με τους αριθμούς πρέπει να γίνουν, φαίνεται, απλοί, αλλά πρέπει ακόμα να φασαριάζεις, Θεός φυλάξοι.
  • Οι μηχανές του καθεδρικού ναού επιβραδύνουν αισθητά από την ξέφρενη χρήση του GUI, ακόμη και στο στάδιο της περιήγησης σε βιβλιοθήκες διαθέσιμων μπλοκ.
  • Για να τελειώσετε κάτι στο σπίτι, πρέπει να έχετε το ίδιο Simulink. Και, στην πραγματικότητα, δεν υπάρχουν εναλλακτικές.

Ναι, στο τέλος, φυσικά, ολοκληρώσαμε το έργο, αλλά το ολοκληρώσαμε με μια δυνατή εκπνοή ανακούφισης.

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

Το σημείο στις αμφιβολίες μας ήταν η φράση ενός από τους δευτεροετείς φοιτητές (μόλις είχαν επιστρέψει στη Ρωσία εκείνη την εποχή):

  • Ξεχάστε, τουλάχιστον για τη διάρκεια της πρακτικής άσκησης, τα Similink, MathCad και άλλα LabView - πάνω από το λόφο όλα είναι γραμμένα στο MATLAB, χρησιμοποιώντας το ίδιο το MatLab ή τη δωρεάν «έκδοση» του Octave.

Η δήλωση αποδείχθηκε εν μέρει αληθινή: στο Ilmenau, η διαμάχη σχετικά με την επιλογή των εργαλείων δεν επιλύθηκε επίσης πλήρως. Είναι αλήθεια ότι η επιλογή ήταν κυρίως μεταξύ MATLAB, Python και C.

Την ίδια μέρα, με έπιασε ένας φυσικός ενθουσιασμός: δεν πρέπει να μεταφέρω το μέρος του μοντέλου πομπού OFDM σε μια σεναριακή μορφή; Για πλάκα.

Και έπιασα δουλειά.

Βήμα βήμα

Αντί για θεωρητικούς υπολογισμούς, θα δώσω απλώς έναν σύνδεσμο σε αυτό εξαιρετικό άρθρο 2011 από tgx και στις διαφάνειες Φυσικό επίπεδο LTE καθηγητές Μισέλ-Τίλα (TU Ilmenau). Νομίζω ότι αυτό θα είναι αρκετό.

«Λοιπόν», σκέφτηκα, «ας επαναλάβουμε, τι θα κάνουμε μοντέλο;»
Θα μοντελοποιήσουμε Γεννήτρια πλαισίου OFDM (Γεννήτρια πλαισίου OFDM).

Τι θα περιλαμβάνει:

  • σύμβολα πληροφοριών
  • πιλοτικά σήματα
  • μηδενικά (DC)

Τι (για λόγους απλότητας) αφαιρούμε από:

  • από τη μοντελοποίηση ενός κυκλικού προθέματος (αν γνωρίζετε τα βασικά, δεν θα είναι δύσκολο να το προσθέσετε)

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής

Μπλοκ διάγραμμα του υπό εξέταση μοντέλου. Θα σταματήσουμε στο αντίστροφο μπλοκ FFT (IFFT). Για να ολοκληρωθεί η εικόνα, ο καθένας μπορεί να συνεχίσει τα υπόλοιπα μόνος του - υποσχέθηκα στους καθηγητές από το τμήμα να αφήσουν κάτι για τους μαθητές.

Ας τα ορίσουμε μόνοι μας. άσκηση:

  • σταθερός αριθμός υπο-μεταφορέων·
  • σταθερό μήκος πλαισίου.
  • Πρέπει να προσθέσουμε ένα μηδέν στη μέση και ένα ζευγάρι μηδενικά στην αρχή και στο τέλος του πλαισίου (σύνολο, 5 τεμάχια).
  • Τα σύμβολα πληροφοριών διαμορφώνονται χρησιμοποιώντας M-PSK ή M-QAM, όπου M είναι η σειρά διαμόρφωσης.

Ας ξεκινήσουμε με τον κώδικα.

Μπορείτε να κατεβάσετε ολόκληρο το σενάριο από σύνδεσμος.

Ας ορίσουμε τις παραμέτρους εισόδου:

clear all; close all; clc

M = 4; % e.g. QPSK 
N_inf = 16; % number of subcarriers (information symbols, actually) in the frame
fr_len = 32; % the length of our OFDM frame
N_pil = fr_len - N_inf - 5; % number of pilots in the frame
pilots = [1; j; -1; -j]; % pilots (QPSK, in fact)

nulls_idx = [1, 2, fr_len/2, fr_len-1, fr_len]; % indexes of nulls

Τώρα καθορίζουμε τους δείκτες των συμβόλων πληροφοριών, αποδεχόμενοι την προϋπόθεση ότι τα πιλοτικά σήματα πρέπει απαραίτητα να πηγαίνουν πριν και/ή μετά τα μηδενικά:

idx_1_start = 4;
idx_1_end = fr_len/2 - 2;

idx_2_start = fr_len/2 + 2;
idx_2_end =  fr_len - 3;

Στη συνέχεια, οι θέσεις μπορούν να προσδιοριστούν χρησιμοποιώντας τη συνάρτηση linspace, μειώνοντας τις τιμές στον μικρότερο από τους πλησιέστερους ακέραιους αριθμούς:

inf_idx_1 = (floor(linspace(idx_1_start, idx_1_end, N_inf/2))).'; 
inf_idx_2 = (floor(linspace(idx_2_start, idx_2_end, N_inf/2))).';

inf_ind = [inf_idx_1; inf_idx_2]; % simple concatenation

Ας προσθέσουμε δείκτες μηδενικών σε αυτό και ας ταξινομήσουμε:

%concatenation and ascending sorting
inf_and_nulls_idx = union(inf_ind, nulls_idx); 

Αντίστοιχα, οι δείκτες πιλοτικού σήματος είναι οτιδήποτε άλλο:

%numbers in range from 1 to frame length 
% that don't overlape with inf_and_nulls_idx vector
pilot_idx = setdiff(1:fr_len, inf_and_nulls_idx); 

Τώρα ας καταλάβουμε τα πιλοτικά σήματα.

Έχουμε ένα πρότυπο (μεταβλητή πιλότοι), και ας υποθέσουμε ότι θέλουμε οι πιλότοι από αυτό το πρότυπο να εισάγονται στο πλαίσιό μας διαδοχικά. Φυσικά, αυτό μπορεί να γίνει σε βρόχο. Ή μπορείτε να παίξετε λίγο δύσκολο με πίνακες - ευτυχώς το MATLAB σας επιτρέπει να το κάνετε αυτό με επαρκή άνεση.

Αρχικά, ας προσδιορίσουμε πόσα από αυτά τα πρότυπα ταιριάζουν πλήρως στο πλαίσιο:

pilots_len_psudo = floor(N_pil/length(pilots));

Στη συνέχεια, σχηματίζουμε ένα διάνυσμα που αποτελείται από τα πρότυπά μας:

% linear algebra tricks:
mat_1 = pilots*ones(1, pilots_len_psudo); % rank-one matrix
resh = reshape(mat_1, pilots_len_psudo*length(pilots),1); % vectorization

Και ορίζουμε ένα μικρό διάνυσμα που περιέχει μόνο ένα κομμάτι του προτύπου - την "ουρά", η οποία δεν ταιριάζει πλήρως στο πλαίσιο:

tail_len = fr_len  - N_inf - length(nulls_idx) ...
                - length(pilots)*pilots_len_psudo; 
tail = pilots(1:tail_len); % "tail" of pilots vector

Παίρνουμε πιλότους χαρακτήρες:

vec_pilots = [resh; tail]; % completed pilots vector that frame consists

Ας προχωρήσουμε στα σύμβολα πληροφοριών, δηλαδή, θα σχηματίσουμε ένα μήνυμα και θα το διαμορφώσουμε:

message = randi([0 M-1], N_inf, 1); % decimal information symbols

if M >= 16
    info_symbols = qammod(message, M, pi/4);
else
    info_symbols = pskmod(message, M, pi/4);
end 

Όλα είναι έτοιμα! Συναρμολόγηση του πλαισίου:

%% Frame construction
frame = zeros(fr_len,1);
frame(pilot_idx) = vec_pilots;
frame(inf_ind) = info_symbols

Θα πρέπει να πάρετε κάτι σαν αυτό:

frame =

   0.00000 + 0.00000i
   0.00000 + 0.00000i
   1.00000 + 0.00000i
  -0.70711 - 0.70711i
  -0.70711 - 0.70711i
   0.70711 + 0.70711i
   0.00000 + 1.00000i
  -0.70711 + 0.70711i
  -0.70711 + 0.70711i
  -1.00000 + 0.00000i
  -0.70711 + 0.70711i
  -0.70711 - 0.70711i
   0.00000 - 1.00000i
   0.70711 + 0.70711i
   1.00000 + 0.00000i
   0.00000 + 0.00000i
   0.00000 + 1.00000i
   0.70711 - 0.70711i
  -0.70711 + 0.70711i
  -1.00000 + 0.00000i
  -0.70711 + 0.70711i
   0.70711 + 0.70711i
   0.00000 - 1.00000i
  -0.70711 - 0.70711i
   0.70711 + 0.70711i
   1.00000 + 0.00000i
   0.70711 - 0.70711i
   0.00000 + 1.00000i
   0.70711 - 0.70711i
  -1.00000 + 0.00000i
   0.00000 + 0.00000i
   0.00000 + 0.00000i

"Ευδαιμονία!" — σκέφτηκα ικανοποιημένη και έκλεισα το λάπτοπ. Μου πήρε μερικές ώρες για να κάνω τα πάντα: συμπεριλαμβανομένης της συγγραφής κώδικα, της εκμάθησης ορισμένων συναρτήσεων του Matlab και της σκέψης μέσω μαθηματικών κόλπων.

Τι συμπεράσματα έβγαλα τότε;

Υποκειμενικός:

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

Σκοπός:

  • Δεν χρειάζεται να πυροβολούμε σπουργίτια από κανόνι (εκτός και αν αξίζει, φυσικά, ένας τέτοιος εκπαιδευτικός στόχος): χρησιμοποιώντας το Simulink, αναλάβαμε να λύσουμε ένα απλό πρόβλημα με ένα εξελιγμένο εργαλείο.
  • Το GUI είναι καλό, αλλά είναι καλύτερο να κατανοήσετε τι περιέχεται "κάτω από την κουκούλα".

Και τώρα, απέχοντας πολύ από το να είμαι φοιτητής, θέλω να πω το εξής στη φοιτητική αδελφότητα:

  • Να της καλής ευθυμίας!

Δοκιμάστε να γράψετε κώδικα, ακόμα κι αν είναι κακός στην αρχή. Με τον προγραμματισμό, όπως και με κάθε άλλη δραστηριότητα, το πιο δύσκολο κομμάτι είναι η αρχή. Και είναι καλύτερα να ξεκινήσετε νωρίτερα: εάν είστε επιστήμονας ή ακόμα και απλώς τεχνικός, αργά ή γρήγορα θα χρειαστείτε αυτή τη δεξιότητα.

  • Ζήτηση!

Απαιτήστε προοδευτικές προσεγγίσεις και εργαλεία από δασκάλους και επόπτες. Αν αυτό είναι δυνατό, φυσικά...

  • Δημιουργώ!

Πού αλλού είναι καλύτερο να ξεπεράσεις όλες τις πληγές ενός αρχάριου, αν όχι στο πλαίσιο ενός εκπαιδευτικού προγράμματος; Δημιουργήστε και ακονίστε τις δεξιότητές σας - και πάλι, όσο πιο γρήγορα ξεκινήσετε, τόσο το καλύτερο.

Επίδοξοι προγραμματιστές από όλες τις χώρες, ενωθείτε!

PS

Για να καταγράψω την άμεση σχέση μου με τους φοιτητές, επισυνάπτω μια αξιομνημόνευτη φωτογραφία του 2017 με δύο πρυτάνεις: τον Peter Scharff (δεξιά) και τον Albert Kharisovich Gilmutdinov (αριστερά).

«Μανιφέστο για αρχάριους προγραμματιστές από σχετικές ειδικότητες» ή πώς έφτασα σε αυτό το σημείο της ζωής

Άξιζε να τελειώσει το πρόγραμμα τουλάχιστον για αυτά τα κοστούμια! (αστεϊσμός)

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο