Skills
My Skill Set
Programming
I want to preface this section a bit because I think it is important to do so.
My education in computer science was excellent. I think I am a pretty skilled programmer. And I think the programming language does not matter as much as many people think. That said, I am aware of how many things I do not know in a given language.
For example, there might be widespread libraries I am not knowledgable in. That is - in my opinion - okay, as they are usually quick to pick up. But there might also be plenty of details in obscure language semantics which might be not well understood. I am always amazed how knowledgeable you can get in niches I did not ever consider.
Anyway, I know the concepts of object-oriented, functional and logical programming, I have dealt with a fair share of C and Assembly code. This knowledge transfers to other languages. I have in particular worked with:
Java
Pretty advanced. Meaning: I know more than I ever wanted of JVM implementation details. Not as familiar with the latest features, but watched them in passing.
This was my first language in university and was the lingua franca expected for all courses. I contributed to the ProB Java API, implemented a compiler and mandatory projects, and many more things I do not remember exactly.
C
Pretty advanced. Meaning: I have maintained significant code bases in C. Spent plenty of time with gdb and valgrind. I still prefer to check the man pages once more to ensure that what I do is actually defined behaviour.
In the network security course, I abused buffer overflows, format string attacks, etc. in order to inject and execute assembly code.
Python
Pretty advanced. Meaning: I had a master's level course on Python, implemented an interpreter, worked with meta-classes. I worked at HHU with maintainers of the PyPy project and learned a fair share from them.
Prolog
Expert level. This is a statement I can confidently make. I have written interpreters, meta-interpreters, term expanders, compilers, static code analysis tools, and much more in this language. I feel like I have seen any dirty performance trick. I have submitted bug reports with minimal examples for very weird issues.
Clojure
Expert level. I have taught it at HHU for almost a decade, seen and gave feedback/fixed plenty of weird student code and issues. I dove into the implementation for very detailed questions students had. And I love the language and its REPL-driven way.
I feel okay with Clojurescript, but do not like inheriting the fluctuations of the JavaScript ecosystem (sometimes, it is hard to get older code to run properly, in some cases even very basic templates).
I maintain two Clojure libraries:
- lisb, a library that embeds the B language and the ProB tool in Clojure.
- testor, which allows me to add tests quickly to my Leiningen projects while I'm developing on the REPL.
Assembly
Okay, I guess. I do not really have a metric at what level you are advanced in assembly, or an expert. I can write and understand basic stuff. I prefer not to implement larger stuff or hand-optimise compiler output on a regular basis. On the other hand, I like Zachtronics games.
Other languages
In university, I have taken courses on R, Matlab and Maple.
I took a look at Rust, Erlang, Lean (as an FP language), Go, and many more languages. I am confident I can work in basically any programming language, but sometimes I am not sure whether it is worth the pain (looking at you, JavaScript and PHP).
Tools
git, GitHub, Gitlab, etc.
Yeah. First thing I learned at the STUPS group in 2011 was to use git. I went from just memorizing shell commands to understanding it somewhat properly. But often enough, I encounter new features and feel like they are rabbit holes I do not need to dive into.
CI/CD in git hosting services are a great thing. I administered the Github classroom stuff for our university's course on theoretical computer science. I even had automated builds for my papers.
bash and Unix stuff
I prefer working on Linux, for quite some time now. I picked up quite a bit on the way. I'm fine with some shell scripts, but prefer nicer languages for that.
LaTeX
Love/hate-relationship. Seasoned user with enough knowledge to point students to a package or search phrases to solve their problems. Probably most lines I have produced in any language. Do not really like it, but I'm lacking something better.
Long story short: Have a look at my publications. I also made slides for lectures, exercise groups and other presentations in it. If I needed to write a letter, I would use it for that too.
ZeroMQ
One of the coolest libraries I have learned. I am using it every time I need to connect two processes. Learned distributed programming with it the hard way, even after reading Java Concurrency in Practice by Brian Goetz.
University Stuff
Safety-Critical Systems
Or call it functional safety, or verification, or theorem proving, or proof engineering, or formal methods, or model checking, or or or.
I did my doctoral degree here. Of course, there's plenty I do not know. I can pick up what I'm missing along the way.
Compiler Construction
I implemented a compiler based on the Dragon book. Also took a seminar on compiler optimisations.
I used quite some techniques from that in my day-to-day life to generate code, design DSLs, etc.
I am also pretty knowledgeable on interpreter design, partial evaluation, etc.
Computer Networks
Four courses: Fundamentals, advanced, network security and peer-to-peer networks.
Build and configured a network that routed packages in a ring. Debugged for hours to find out some ethernet cables were defunct.
Network security was the most fun course. Writing a DOS virus, injecting assembly code, exploiting vulnerabilities (XSS, CSRF, SQL injections, path traversal, ...), cracking passwords. Naturally, all in a controlled setting and for education :-)
Cryptocomplexity
I'm interested in cryptography. I took a (more) theoretical course on this. I have learned enough to understand what I'm doing and what I shouldn't do.