Bewerbungen mit LaTeX und Python

Letzte Nacht habe ich mir reichlich Zeit um die Ohren geschlagen, um meinen Bewerb-O-Mat um ein neues Feature zu ergänzen, und gerade feilte ich an meinen Anschreiben-Templates. Das brachte mich auf die Idee, überhaupt erst einmal zu beschreiben, wie meine Bewerbungen technisch ablaufen.

LaTeX statt Word oder OpenOffice: Warum eigentlich?

Letzte Woche durfte ich bei einem Bewerbungstraining eine der üblichen Fragen beantworten: Warum eigentlich dieser unkonventionelle Weg? Warum verwende ich nicht Word oder OpenOffice wie alle anderen?

Die Antwort ist einfach: Weniger Ablenkung, schönes Layout – und das mit vergleichsweise wenig Arbeit.
Formatierungen in gängigen Office-Programmen zusammenzuklicken, war früher eine meiner liebsten Prokrastinationsfallen. LaTeX kümmert sich ganz automatisch um die Formatierung und im Gegensatz zu vielen OpenOffice-Standardformaten sieht LaTeX-Output von sich aus schon gut aus (und zwar besser – und besser lesbar- , als ich es in Word oder OpenOffice zusammenklicken könnte). Habe ich mich in LaTeX einmal hineingearbeitet und mir brauchbare Vorlagen erarbeitet, muß ich nur noch im Ausnahmefall etwas an diesen ändern. Beim Brief muß ich mir keine Gedanken machen, ob der Adressblock an der richtigen Stelle steht: er tut es einfach, ganz automatisch; um das kaputtzumachen, müßte ich so richtig Arbeit investieren.

Das Arbeiten mit Quelltext, auf dem Terminal, nicht in einem X11-Fenster, hat zudem den Vorteil, daß es so ablenkungsfrei ist, wie es nur geht. Email, Browser, Instant Messenger sind aus den Augen und aus dem Sinn (außer, ich muß mich durch gefühlt 130 Einträge auf stackoverflow wühlen, um eine Antwort auf eine howto-Frage zu bekommen).

Mein Bewerbungs-Workflow – und was meine Skripte machen

Am Anfang steht das Stellenangebot. Das picke ich mir immer noch manuell heraus, ich will schließlich nicht riskieren, auf einer Stelle zu landen, wo dem ich fehl am Platz bin.

Für jede Bewerbung lege ich einen eigenen Ordner an; dazu habe ich ein bash-script, das eben jenen Ordner erstellt und bestimmte benötigte Dateien – den Lebenslauf, das dazugehörige Foto etc. – dorthin kopiert. Die Ausschreibung kopiere ich mir in eine Textdatei (damit ich sie vor Augen haben kann, wenn ich am Terminal daran arbeite), bestimmte Daten – Kennziffern, Firma, Anschrift, Stellenbezeichnung etc. – werden in ein Textfile geschrieben, das folgendes Format hat:

Jobtitle: Expert/in für Dingsbums
Quelle: Superzeitschrift vom 13.09.2012
Referenznummer: 14-ZZ-2305
Firma: Muster GmbH & Co. KG
Ansprechperson: Erik Beispiel
Strasse: Beispielstraße 12
PLZ: 12456
Ort: Beispielstadt
Telefon: 0122/4506732
Email: foo@example.com
Art der Bewerbung: Email 

In einem Ordner für Templates habe ich drei Teile einer LaTeX-Datei liegen, die zusammen mein Template für das Anschreiben ergeben: in einem liegt eine Präambel plus Dokumentanfang (einige KOMA-Variablen wie ) eines scrlttr2-Dokuments, im zweiten liegen Platzhalter für Betreffzeile, Adressangaben und Anrede und im dritten Teil der Rest des Anschreibens. Dann kommt ein Python-Skript zum Einsatz, das automatisch die Platzhalter in der zweiten Datei mit den richtigen Angaben (denen aus dem oben genannten Textfile) ersetzt, anschließend die drei Dateien zusammenfügt und im Ordner für die jeweilige Bewerbung ablegt sowie eine Betreffzeile für eine eventuelle Email in einer Textdatei ablegt.

Dieses Anschreiben wird natürlich nicht so versendet – noch enthält der Brief eher generisches Blabla. Am Brieftext arbeite ich dann händisch und mache daraus ein Motivationsschreiben, so schön formuliert, wie ich es nur kann.Bin ich damit fertig, wird es mindestens durch einen Rechtschreibkorrektur-Durchgang mit aspell gejagt, optional auch noch mit diction und style auf Lesbarkeit geprüft und ggf. weiter bearbeitet. Auch der Lebenslauf wird mindestens geprüft, ggf. auch angepaßt (manche Arbeitgeber wird es interessieren, daß ich mit redmine, WordPress und diversen CRM-Systemen Erfahrung habe, bei anderen will ich meine Erfahrung in Arbeit mit Text mehr hervorheben…). Dafür reicht oft, ein Kommentarzeichen vor die Zeile zu setzen oder zu entfernen.

Ist das erledigt, lasse ich ein Skript laufen, das aus den .tex-Dateien pdf-Dateien erstellt und diese beiden Dateien mit einem dritten .pdf zusammenführt, in dem meine Zeugnisse liegen. Das Resultat: eine digitale Bewerbungsmappe in einer pdf-Datei.

Wenn die Bewerbung nicht gedruckt oder in einem Online-Bewerbungs-System hochgeladen, sondern per Email verschickt werden soll (bei mir der Regelfall), folgen zwei weitere Schritte:

  1. Ein Skript entfernt den LaTeX-Code aus dem Anschreiben sowie alles bis zur Anrede und schreibt das in eine Textdatei. Diese Textdatei bearbeite ich ein wenig weiter, so daß sie als Text einer Email dienen kann.
  2. Ein weiteres Skript öffnet eine neue Email in Thunderbird mit der soeben generierten Textdatei als message body, dem Betreff aus dem File, das mein Anschreiben-Skript erzeugt hat, der Emailadresse aus dem Jobdaten-File im to:-Feld und der soeben erzeugten digitalen Bewerbungsmappe als Anhang.

Das Skript, mit dem das (Roh)Anschreiben generiert wird, schreibt zugleich eine Zeile mit den Angaben aus dem Textfile und dem Datum der Bewerbung in eine .csv-Datei, aus der später – mit dem Skript, das ich gestern nacht schrieb – ein hübscher LaTeX-Bericht erstellt werden kann.

Am Ende löscht ein letztes bash-Skript die Dateien, die als temporäre Ablageorte erzeugt wurden, sowie manche LaTeX-Output-Dateien (etwa *.log oder *.aux).

Das Ganze begleite ich mit dem Versionskontrollsystem git, damit ich, wenn ich etwas „kaputtmache“, schnell zu einem vorherigen Stand zurückkehren kann; außerdem habe ich ein privates Repository bei einem Code-Hoster, über das ich meine Dateien synchronisiere. (Ja, ich weiß, dafür ginge auch Dropbox. Andererseits muß ja nicht alles in meiner Dropbox liegen und mit git habe ich mehr Möglichkeiten, eine bestimmte Datei wieder in einen bestimmten Zustand zu versetzen.)

Was jetzt noch zu tun ist, aka: known limitations

Mein Skriptset hat einige Einschränkungen, vor allem, da es auf der Basis meines Workflows entstanden ist. Hier sind die, die mir auf den ersten Anhieb einfallen:

  • Nur eine Bewerbung auf einmal. Das könnte auch als Anti-Multitask-Feature durchgehen, aber es wäre schön, User nicht dazu zu zwingen – manchmal wollte ich auch so eine Art Bewerbungs-Queue aufbauen, die dann eine nach der anderen abgearbeitet werden kann.
  • Bisher ist das Skriptset darauf angewiesen, eine bestimmte Ordner- und Dateistruktur zu verwenden (die ich bei Bedarf gerne mal beschreibe). Es wäre anzudenken, ob es nicht gut wäre, das Ganze flexibler zu gestalten, und wenn ja, wie.
  • Es ist teils in bash, teils in Python 2 geschrieben. Auf Systemen, die bereits Python 3 als Standard verwenden, müssen die Python-Skripte explizit mit python2 aufgerufen werden. Langfristig wäre es evtl. sinnvoll, die Python-Teile auf Python3 zu portieren.
  • Es ist uneinheitlich, von wo die Skripte aufgerufen werden müssen: manche vom Ordner für die jeweilige Bewerbung aus, manche von dessen Großelternverzeichnis aus.
  • Die Skripte sind linux only; einige wurden von meiner Freundin auf einem Mac getestet und funktionieren dort auch, aber auf Windows müßten sie erst portiert werden.
  • Es gibt keine GUI. Das Ganze ist eine Kommandozeilen-Toolsammlung – und wird das wohl auch noch eine lange Weile bleiben; zumindest, wenn ich alleine daran arbeite.
  • Ich habe noch null Dokumentation geschrieben.

Warum der Aufstand?

Und warum mache ich das Ganze? Weil es mir psychische Hürden wegnimmt (erwähnte ich schon einmal, daß ich stumpfsinnige Arbeiten und Copy-Paste-Orgien hasse?); weil ich insgesamt vielleicht genauso viel Zeit investiert habe, wie wenn ich das Ganze händisch und/oder mit OpenOffice/Word machen würde, aber in dieser Zeit unvergleichlich viel mehr Spaß gehabt habe; weil es meinen Bewerbungsprozess weniger fehleranfällig macht; weil es Zeit, die ich sonst mit zermürbendem Kopieren von Daten und händischem Formatieren verbringen würde, für das Wesentliche, nämlich das Formulieren und die inhaltliche Arbeit, frei macht – und natürlich: weil ich dabei viel gelernt habe.

Ironischerweise frage ich mich jetzt, wieviel mir all diese Fähigkeiten in nächster Zeit nutzen werden, denn ich bereite mich gerade auf den Schritt in die Selbständigkeit vor. Aber wer weiß, wozu ich meine LaTeX- und Python-Skills da noch brauchen werde? Und ich hoffe sehr, daß mein Bewerb-O-Mat auch noch anderen hilft, schicke und schnelle Bewerbungen zu verfassen.