
Code vs. Stellenausschreibung
Wir sind auf eine aktuelle Stellenausschreibung auf LinkedIn gestoßen, die uns etwas zum Schmunzeln brachte. In diesem Artikel nehmen wir sie per Reverse Engineering auseinander.
Inhaltsverzeichnis
Als wir auf LinkedIn unterwegs waren, sind wir auf eine Stellenausschreibung gestoßen, die wir dir nicht vorenthalten wollen. Dort wird mit ABAP Coding nach einem ABAP Entwickler gesucht, hier würde man annehmen, bewerben sich auch nur Menschen die Ahnung von der Materie haben und das Beispiel auch verstehen.
Einleitung
Schauen wir uns zuerst einmal die Anzeige an. Auf den ersten Blick sieht es nach validem Coding aus, außer das es in Stichpunkt gepackt ist und damit für den Compiler nicht interpretierbar wäre.
Nehmen wir uns einmal der Herausforderung an und validieren, ob der Code durch einen Entwickler geschrieben wurde oder sich die Personalabteilung nur etwas ausgedacht hat. Per Reverse Engineering bauen wir uns die Originalobjekte zusammen.
Analyse
In der ersten Analyse wird ein Objekt einer Klasse erzeugt, wenn man sich die einzelnen Methoden der Klasse ansieht, stellt man schnell fest, dass diese Klasse kein Interface besitzt. Zumindest wird auch keines bei den Aufrufen verwenden, die Instanziierung läuft direkt über die Klasse per Inline-Deklaration. Damit können wir feststellen, welchen Datentyp die Referenz "lo_employee" haben wird.
Klasse
Legen wir im ersten Schritt einmal die Klasse an. Da es sich um eine Ausführung handelt, implementieren wir noch das Interface, um eine Konsolen Applikation daraus zu machen.
Damit haben wir eine leere Hülle, um das Coding einzufügen:
CLASS zcl_rewe_digital_employee DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_rewe_digital_employee IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
ENDMETHOD.
ENDCLASS.
Im nächsten Schritt können wir das Coding aus der Stelleausschreibung übernehmen, hier solltest du aber darauf achten die Punkte zu entfernen, damit wir keine Fehler im Compiler bekommen. Natürlich werden wir trotzdem mit jeder Menge Fehlermeldungen belohnt, da uns noch einige Dinge fehlen:
Refactoring
Als Nächstes sollten wir nun mit dem Refactoring des Codes starten, um eine aktivierbare Klasse zu erhalten. Im ersten Schritt legen wir alle Methoden an, dazu können wir die Refactoring Tools von den ABAP Development Tools (ADT) verwenden.
Nach der Abfrage der Methode und der Parameter, wird die Methode im privaten Bereich der Klasse angelegt. Weiterhin fällt auf, das die ADTs den Code leicht verändert haben:
lo_employee->connect_to( 'Experten' ) ( 'Workshops/Schulungen' ) ( 'Community' ) ) ).
lo_employee->add_content( 'SAP Learning Hub' ) ( 'Lernzeit' ) ( 'Dev-Buddy' ) ) ).
Die Klammer und das VALUE Statement sind verschwunden, das Refactoring scheint in diesem Fall nicht sauber zu arbeiten. Wir können aber erst einmal alle Methoden über diesen Weg anlegen und später einfach noch einmal den Original-Code einfügen. Da die Methoden aber von außen aufgerufen werden, müssen wir sie noch von PRIVATE auf PUBLIC setzen.
Nachdem alle Methoden angelegt sind, müssen wir noch bei allen verwendeten Methoden mit CHECK, einen Returning Parameter definieren. CHECK erwartet einen Vergleich, da keiner hinter dem Check aufgeführt ist, wird sehr wahrscheinlich ein boolscher Wert zurückgegeben. Demnach brauchen wir einen Returning Parameter vom Typ ABAP_BOOL oder ABAP_BOOLEAN.
Typen
Nachdem nun alle Methoden definiert sind und auf öffentlich stehen, können wir mit der Typisierung beginnen. Die Methoden haben Importing Parameter und es gibt einen offensichtlichen Typen, der im zweiten Abschnitt zur Generierung der Features verwendet wird. Hierbei scheint es sich um eine Struktur zu handeln, die in den folgenden Stichpunkten befüllt wird. Die meisten sind einfache Tabellen die Texte übernehmen, wobei man hier nicht den Typ STRING verwenden kann. Die verwendeten Literale können nur zusammen mit Feldern vom Typ CHAR verwendet werden, andere Typen führen zu Fehlermeldungen. Das Feld "Training" ist vom Typ ABAP_BOOL, da hier die Inline Funktion XSDBOOL verwendet wird, die einen boolschen Wert zurückliefert. Damit würde man aus dem Beispielcode die folgenden Typen generieren:
TYPES:
tt_char TYPE STANDARD TABLE OF char40 WITH EMPTY KEY,
tt_language TYPE STANDARD TABLE OF char2 WITH EMPTY KEY,
BEGIN OF tt_employee_features,
Personality TYPE tt_char,
Attributes TYPE tt_char,
Experience TYPE tt_char,
Optional_Experience TYPE tt_char,
Nice_to_Have TYPE tt_char,
Languages TYPE tt_language,
Training TYPE abap_bool,
END OF tt_employee_features.
Komplette Klasse
Wie immer hier noch einmal das vollständige Beispiel, welches auch ausgeführt und debuggt werden kann. Nur sollte man in diesem Zustand keine Ausgabe erwarten:
CLASS zcl_rewe_digital_employee DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
TYPES:
tt_char TYPE STANDARD TABLE OF char40 WITH EMPTY KEY,
tt_language TYPE STANDARD TABLE OF char2 WITH EMPTY KEY,
BEGIN OF tt_employee_features,
Personality TYPE tt_char,
Attributes TYPE tt_char,
Experience TYPE tt_char,
Optional_Experience TYPE tt_char,
Nice_to_Have TYPE tt_char,
Languages TYPE tt_language,
Training TYPE abap_bool,
END OF tt_employee_features.
METHODS:
has_sap_business_processes
RETURNING VALUE(rd_result) TYPE abap_bool,
want_to_use_technology
IMPORTING
it_data TYPE tt_char
RETURNING VALUE(rd_result) TYPE abap_bool,
validate_periodically
IMPORTING
it_data TYPE tt_char
RETURNING VALUE(rd_result) TYPE abap_bool,
connect_to
IMPORTING
it_data TYPE tt_char,
add_content
IMPORTING
it_data TYPE tt_char,
add_new_employee
IMPORTING
is_data TYPE tt_employee_features.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_rewe_digital_employee IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA:
ld_studies TYPE abap_bool,
ld_training TYPE abap_bool.
DATA(lo_employee) = NEW zcl_rewe_digital_employee( ).
CHECK lo_employee->has_sap_business_processes( ).
CHECK lo_employee->want_to_use_technology( VALUE #( ( 'BTP' ) ( 'RAP' ) ( 'ODATA' ) ( 'S/4 HAHA' ) ) ).
CHECK lo_employee->validate_periodically( VALUE #( ( 'Qualität' ) ( 'Beratung' ) ( 'Optimale Lösung' ) ) ).
lo_employee->connect_to( VALUE #( ( 'Experten' ) ( 'Workshops/Schulungen' ) ( 'Community' ) ) ).
lo_employee->add_content( VALUE #( ( 'SAP Learning Hub' ) ( 'Lernzeit' ) ( 'Dev-Buddy' ) ) ).
DATA(lt_your_features) = VALUE zcl_rewe_digital_employee=>tt_employee_features(
Personality = VALUE #( ( 'Sorgfalt' ) ( 'Zuverlässigkeit' ) ( 'Engagement' ) ( 'Mut' ) ( 'Verantwortung' ) ( 'Teamgeist' ) )
Attributes = VALUE #( ( 'mutig' ) ( 'wissbegierig' ) ( 'offen' ) ( 'etwas wagen' ) ( 'proaktiv' ) )
Experience = VALUE #( ( 'ABAP' ) ( 'ABAP OO' ) )
Optional_Experience = VALUE #( ( 'SAP Module FI, SD, CO' ) ( 'Schnittstellen IDOC, REST' ) ( 'RAP' ) ( 'Webdynpro' ) ( 'ABAP Unit' ) )
Nice_to_Have = VALUE #( ( 'S/4 HANA' ) ( 'Agile Skills' ) )
Languages = VALUE #( ( 'DE' ) ( 'EN' ) )
Training = xsdbool( ld_studies = abap_true OR ld_training = abap_true )
).
lo_employee->add_new_employee( lt_your_features ).
ENDMETHOD.
METHOD has_sap_business_processes.
ENDMETHOD.
METHOD want_to_use_technology.
ENDMETHOD.
METHOD validate_periodically.
ENDMETHOD.
METHOD connect_to.
ENDMETHOD.
METHOD add_content.
ENDMETHOD.
METHOD add_new_employee.
ENDMETHOD.
ENDCLASS.
Fehler
Im Großen und Ganzen kann man sagen, dass das Coding höchstwahrscheinlich von einem Entwickler kommt und nicht von der HR-Abteilung selbst. Die Benennung des Typen fühlt sich nicht korrekt an, da es hier eigentlich um eine Struktur und nicht um eine Tabelle handelt. Die beiden Variablen für die Ausbildung scheinen lokal definiert wurden zur sein, die korrekte Definition fehlt noch oder muss durch den Bewerber ergänzt werden.
Fazit
Vielleicht soll der Bewerber auch die Augen offenhalten und die gefundenen Fehler bringen Pluspunkte bei einem neuen Arbeitgeber. Grundsätzlich wurde der Code solide in Modern ABAP geschrieben und würde am Ende auch funktionieren, wenn man ihn ausführt. Am Ende bleibt nur zu sagen, die Variablennamen, Methodennamen ergeben scheinbar die Überschriften, die Festwerte sind die Anforderungen und Inhalte.
Quelle
LinkedIn



