Resume
This page is very actively under development. You’ll find typos and missing content. Feel free to refresh now and then :)
Officially I started working in 2008 as a junior developer in Voxcommerce sp. z o.o., but I took odd jobs as a technology consultant years before.
My first paid sysadmin job was in 1999 when I was rewiring network for a family friend’s company. I never wanted to become programmer, as I perceived is as boring kind of work, but as of today I joke that the only difference between work and leisure is whether I’m paid or not.
Roles I have are often connected to task-force problems. I’m fitting where - for some reason - there’s no one else to fill. While I’m often not as great as someone who dedicated their life to single tech I make up for that through knowledge of wide range technologies so my insights sometimes are broader than immediate horizon.
Below is list of my prior work experience, beside that, I:
- … have Bachelor’s Degree on IT Project Management
- … am Agile (non-proprietary form) enthusiast and practitioner
- … have Master’s Degree on Software Engineering with focus on distributed systems and language development
- … am Distributed Systems junkie (and asynchronous processing, too)
- … have finished yearly training on Group Training at TenStep Poland
- … am Mentor at Toptal
- … and newly-in Free Software Foundation Contributor (Emacs)
Note that due to ~18 years of experience this list is not complete but I intend to make it so. Missing information:
- Gaps between work period (TL;DR; I unsuccesfully try to create own products)
- Personal projects (work for fun, etc.)
- Contacts to coworkers etc.
Important informations
- I’m very anxious traveler - all retreats, meetups etc. are associated with a high cost, thus I try to avoid it unless necessary
- Because of high maintenance requirement I prefer flexibility in my work hours. When I know when meetings are happening I can work around them, but I need to have enough leeway to take care of myself.
Generated content
Following content was generated using Haskell. Code can be found at https://codeberg.org/exlee/haskell-toys
Experience disclaimer
- Most of my includes multiple technologies, but since I didn’t count what and where, experience sum is bigger than general experience.
- Because filling in forms is tedious not everything might be there
- PostgreSQL — 10+ years [1] [2] [3] [4] [5] [6] [7] [8]
- JavaScript — 10+ years [1] [2] [3] [4] [5] [6]
- Ruby — 10+ years [1] [2] [3] [4] [5] [6] [7]
- Ruby on Rails — 7 years, 4 months [1] [2] [3] [4] [5]
- React — 6 years, 5 months [1] [2] [3] [4] [5]
- Python — 5 years, 7 months [1] [2] [3] [4]
- Systems Administration — 5 years, 5 months [1] [2] [3]
- Unity — 5 years [1] [2] [3]
- C# — 4 years, 9 months [1] [2]
- Heroku — 4 years, 9 months [1]
- MongoDB — 4 years, 9 months [1]
- Django — 4 years, 2 months [1] [2]
- MySQL — 4 years, 2 months [1]
- PHP 4/5 — 4 years, 2 months [1] [2] [3]
- Elixir — 3 years, 11 months [1] [2] [3] [4] [5]
- NewRelic — 3 years [1]
- Rust — 2 years, 7 months [1] [2] [3]
- Event Systems — 2 years, 3 months [1] [2]
- Datadog — 2 years [1]
- OTEL — 2 years [1]
- NodeJS — 1 year, 7 months [1] [2] [3]
- Queues — 1 year, 6 months [1] [2] [3]
- Golang — 1 year, 4 months [1] [2] [3]
- Dafny — 1 year, 3 months [1] [2]
- F* — 1 year, 3 months [1] [2]
- OCaml — 1 year, 3 months [1] [2]
- Prolog — 1 year, 3 months [1] [2]
- TLA+ — 1 year, 3 months [1] [2]
- Haskell — 1 year, 1 month [1] [2]
- Clojure — 1 year [1]
- Common Lisp — 1 year [1]
- GraphQL — 1 year [1]
- K8S — 1 year [1]
- Phoenix — 1 year [1]
- RabbitMQ — 1 year [1]
- TypeScript — 1 year [1]
- Argo — 8 months [1]
- ThreeJS — 6 months [1]
- Docker — 4 months [1] [2]
- C — 3 months [1]
- Zig — 2 months [1]
- Buck2 — 1 month [1]
- CLIPS — 1 month [1]
- MITMProxy — 1 month [1]
- ObjectiveC — 1 month [1]
- Starlark — 1 month [1]
I spent 2 intensive but great years at Bluecode, developing, optimizing and modeling various problems or researching state-of-art technologies to use internally. My initial hire was as a Rust specialist, but I was dealing mostly with Elixir systems and working on a tooling.
Leave was a conditional trigger communicated during initial hiring talk.
The goal was to optimize build + testing phase, which took long time and caused a lot of distruptions. What started as long research phase of existing systems turned into custom Build System based on Docker and Go.
While early versions allowed to find inconsistencies, project was still WIP in my final days.
Overarching, multi goal project on the topic of tangling heterogenous codebases, code generation and logic discovery.
This project involved researching, for feasability various existing solutions and writing various utility as a proof of concept in a few lesser known languages.
Similar to Graph Knowledge Extraction this project was mostly research based about modelling and proving outcomes in context of temporal events.
One of the best technical stacks I've ever seen. Without going into too much details, product was thoroughly tested in distributed way. I still advocate exactly the same approach I've seen at Subscribe. Beside that I was able to work at one of the most difficult problems in my career, i.e. untangling old JavaScript stack.
Contract ended as planned.
Day to day work revolved around document inclusion logic. This tool was a simple PDF generator that, through use of color and distinguishable identifiers made it easy to empirically confirm validity.
This project started as an answer to "how update stack not updated over the long period". I was working as a lone developer and acted as a time progressed in intervals, slowly updating whole stack.
Project took couple of months but no downtime happened and whole update was relatively safe.
We observed occassional bug during transaction with e-signature partner. It couldn't be reproduced and access to production environment was limited. I was able to imitate production stack with development keys and observe transaction through MITM proxy which pinpointed critical issue in logic that could bring system down.
Work at SameSystem was very challenging - I couldn't keep up with the team. I was tasked with a specific feature while the whole stack was moving forward. After few short months I figured that I'm unable to deliver promised features and asked for termination. Since I wasn't alone in a similar position I decided that at least I should share my observations in the document form, which was accepted and my contract continued until end planned beforehand.
I spent approx. 1 year being screener at Toptal. While I can't divulge any information I can disclose that I screened hundreds of candidates and was given opportunity to create new task.
Decided to move on because I cared too much for candidates which made me spent too much of emotional energy for the interviews.
Work at OwensCorning was one of the best experiences I ever had. I didn't trust in "The Best Employee" awards, but I never found people so respectful of my time and expertise. During my time at OwensCorning I helped developing various marketing systems with some more complicated than the others.
I moved forward because most of the difficult problems were solved and I felt work was getting stale. We still ocassionally exchange e-mails :)
Page renders were known to be slower than expected, but multiple sweeps of optimizations weren't able to produce satisfying results.
Upon hooking extra telemetry I found out that the cause was a single table, surpisingly much bigger than the development model which was missing index.
Time-to-render decreased by ~1.5 DOMs.
Task was to have a virtual roof builder, that would both connect compatibility rules but also look nice. Due to miscommunication with vendor, I volunteered and was tasked to integrate provided model with the data before the marketing event set for the promotion of the feature.
Builder was delivered on time.
I'm a Toptal contractor since 2018 and I maintain this relation even though my recent contracts weren't Toptal related. It's still great network where I made plenty of friends with whom I keep in contact.
Fitpeak was a startup with a goal of being "Booksy for personal trainers". I was hired as an Interim CTO with a very specific shape of the company, which impacted architecture decision. Initially planned two separate (backend and frontend) teams were impossible to assembly and heavily isolated architecture made it hard to progress in limited resources landscape. Finally due to lack of funding contract has ended.
My first project with working for Toptal, relatively short one but revolving around linguistic analysis and AST transformations.
Entropy-1 was a self-founded IT/game company with goal of expanding operations and produce own games. Unfortunatelly we had a falloff in a period where I was awaiting medical procedure and my business partner weren't able to reassure our sole partner that things are going well.
With funding cut off company had to shutdown, but it existed for couple of years due to complicated legal landscape. Main experience out of it was dealing with documents and navigating LLC like-landscape.
Goal of the system was to provide smart notepad for medical staff so that they can focus on work instead of clicking on fields.
Project failed after initial phase due to lack of funding.
Concept for the runner-kind of game with economic layer targeted at young girls to help them make economic decision in the face of omnipresent microtransactions.
Core game was gaining and spending currency while teaching that impulse spending hampers progress.
Project didn't reach development phase due to lack of financing.
Simple game about opening safes within time limit. Full featured, with custom graphics and sound. Developed in-house. 5 copies sold ;-)
WeWantToKnow was my first big contract work. Multiple projects
Savegame Pipeline was a first Elixir project that I advocated after we've noticed unreliability when Ruby-based system connected to Heroku's database. Feature, while sounding low-priority was crucial for operations, as savegames were used in math students performance evaluation.
Pipeline was running on it's own, without updates, for years before it was shutdown.
Tooling project was a mean to solve lack of proper manager for Unity ecosystem. Unfortunatelly during polishing phase Unity released their own solution making code irrelevant.
Voxcommerce sp.z. o.o. was my first official workplace. I joined as a zero-formal-experience intern but was promoted to a paid position two weeks later. What started as a small company became a mid-sized company next few years - I was promoted to a senior and then later on to a technical manager.
Voxcommerce's contracts included the biggest realestates agencies in Poland - in fact almost all digital offer flows were somehow related to us. During the job I also interacted with agency owners which helped me develop people skills.
Corporate partner wanted to have, what is today known as, content farm. These weren't popular back then and the heart of solution was to ensure that there sites are visually different and content had differences enough significant so that they wouldn't decrease search ranking.
I architected solution based on special syntax that would allow variants of parts of text and included custom editor that allowed to check specific version of it.
Implementation was done in Python/Django but my role was limited to guidance during unclear situations.
Project itself wasn't complicated, however 2 weeks before the launch during manual tests what was found is that search engine is inconsistent and has tendency to bleed sesssions.
I was appointed emergency-leader to solve the issue. After analyzing I made decision to completely rewrite search engine, which resulted in getting on time and only 2 days of overtime.
One of our partners produced gigabytes of real estate offers daily. Most of those were very similar, but differed in branding. Because not all export consumers took incremental packs, big ones were produced, causing almost 24h processing loop.
This project was bootstrapped by myself, both in terms of architecture and documentation for approval by the partner. In gist it was about moving each offer in a multiple "processing belts" and caching results, so one image wouldn't be processed unless changed, most of the data pack could be cached.
Implementation ran the whole process in less than 15 minutes and allowed our partner to produce even more variation of the offers, with minimal impact on the processing time.
Another small hack, this time on Linux kernel, requiring changing few bytes to get Fujitsu-Siemense Amilo V3550 ACPI work correctly.
An unorthodox contextual but stackless file parser using forward chaining system CLIPS. Still something I'd like to develop, however extensions require C knowledge, which I try to use with Zig (for ergonomics).
As an optimization freak I figured that Emacs build are going too slow, thus I'm looking into optimization while trying to wrap current GNU Makefile based system in buck2 with (as of moment of writing this word) limited success :)
I've been using Emacs for neigh 20 years, and so I've implemented multiple Lisp snippets. Last couple of months I had time to spare so I decided to work on Emacs performance on macOS, which I'm doing at the moment of writing this words.
Event Calculus is conceptual project about processing event streams. In short it's all about how event streams can be treated by their abstract prorities while sustaining qualities like idempotenty, e.g.
A -> B -> ROLLBACK(B) -> C == A -> C A -> B -> ROLLBACK(B) -> C -> ROLLBACK(ROLLBACK(B)) = A -> B
This one was little but fun. Logitech's K810 keyboard was starting in "FN as Special Keys" mode, which supposedly was implemented only in slightly different model.
Annoyed I decided to hack the driver to sent switch upon connection. It worked. Code is somewhere on GitHub.
Microdiagram concept is something I'm working for a long time. In nutshell it's a visual communication improvement project that uses many microDSLs in order to provide small, domain-specific diagrams.
Prototype can be found at microdiagram.com.
Overengineering everything is a thing!
I figured that something as dull as writing resume (yet another time) can be fun by doing this in Flavour Of The Month language and hyperlink everything everywhere. So here it is. Source code available on Codeberg.
Riphold is an interrupted (so probably won't be ever finished) exploratory project written in Zig with the concept of priority sorting incoming data streams by using user-specified heuristic to hold data streams.
In human language: use rules to sort grep/fd results :)