D:\sideenCV

Pavel Peganov
Software engineer

✉️ me+cv@dside.ru, t.me/dside_ru, @dside:dside.ru (Matrix)
👤 LinkedIn, GitHub, StackOverflow, Fediverse (Mastodon)
📚 English (proficient, around C1), Russian (native)
🌐 Presently in: Russia (GMT+3)

I build software, dabbling in code since about 2009 when I wanted to make videogames and working professionally since 2014 in roles ranging from tech support and backend developer to technical consultant and development team lead, even tried my hand at architecting.

I love small-scale digital solutions and open-source software, concerned with data privacy and self-reliance, but also worked on bigger distributed systems. I strive to build solutions that help people (including myself) save time while remaining themselves.

I primarily use Ruby, especially at work, but built working software in numerous other languages, including low-level C and functional Clojure, and altered existing software in a whole bunch of others too (Python, Lua, Golang, TypeScript…). My interests in software aren't limited to my duties.

  • Blocks with a slightly highlighted background can be expanded and collapsed with a click or a tap
  • 🧾 The default state of the page is designed to provide a concise summary and to save paper
  • 🖱️ Click here to expand/collapse everything (I really needed that function when writing this)
  • 🚧 What's outlined with a dashed border (like this list) is automatically skipped in print
  • 🔗 This document contains hyperlinks; they aren't essential, but may be inaccessible after printing

🛠️ Work experience

DataArt
Senior Ruby Developer, Team Lead, Technical Consultant
⚙️ Ruby, Ruby on Rails, Clojure, JavaScript, AWS, SQL, Redis, Ansible, Kubernetes…

…the list goes on! But some details are under NDA.

Over (1 year) I helped carry a few data extraction projects (web scraping, mostly) from inception to release and into maintenance. These were Ruby-based and mostly required backend work. I finalized two of them and built one small business intelligence solution single-handedly, employing: PostgreSQL (for storage), a daemon out of Ruby, Sequel and Que (that collects data through web scraping and populates the database) and Metabase (for displaying charts based on the data gathered).

Over (>5 years) I worked as part of a multinational team for a client running a ride booking & fulfillment service focused on business travel.

I started as a backend developer on a team in charge of B2B integrations, we were mostly building and maintaining API transforming gateways and a few surrounding projects. Then we got involved with extracting notifications (email, SMS) out of the core monolithic app. Most of it Ruby work with relational databases, Ansible and a whole lot of Amazon Web Services (S3, EC2, SNS, SQS, SES, later EKS and some Cognito).

I learned a lot about the parts of the system that I worked on, going on to also consult other teams on our services as well as tools and concepts for development, deployment and migration. By then I was the lead of the B2B integrations team and some time later joined the team of tech leads to help improve the overall platform and explore a new technical design for it.

Then the pandemic hit, starting a crisis that took some time to recover from, and some would argue that the recovery never actually happened. We nearly finished a transition to container-based infrastructure (with Kubernetes) and spent a lot of time implementing Single Sign-On (SSO) for a B2B customer, which involved a tough security audit that we managed to make through in collaboration with the client’s security team. Though that feature was ultimately cancelled, as an unforeseen technical limitation made the SSO solution inapplicable for the problem being solved and we learned enough about the technology to make the solution much better.

In 2022 the company underwent a significant reorganization and I ended up becoming a lead of a newly formed Core Platform team and tasked with handling what remained of the monolithic core. But shortly after that half of my team, including myself, were (abruptly and without an explanation) let go before the transition even finished. DataArt’s management was left very confused by that development, but what happened since I do not know, nor care much about, nor could probably disclose due to an NDA.

Over (a bit over a month) I was conducting job interviews and consulting projects in presale stages on technical topics involving my expertise on Ruby and software solutions in general. However, at the time the company was ceasing its operations in Russia, so I was faced with a choice to either relocate or leave. I left, as I still had some unfinished business in the area.

Over (some occasional extra hours) my Clojure experience came in handy: DataArt got involved with a client that uses it, so I worked with another Clojure enthusiast to properly adopt the language at the company: we developed an interview process around it, interviewed over 20 people and successfully assembled our first Clojure development team.

Over (3 months) I took some time off. I was thoroughly exhausted and frustrated, not even sure whether I wanted to stay in software development at all. So I took a massive unpaid vacation with an unspecified return date. It was a tough decision that I announced months in advance. I’m very happy with the results, I resolved a number of personal matters, reconsidered my approach to work and found joy in working on software outside of what I was doing at work.

E-Citrus
Ruby Developer
⚙️ Ruby, Ruby on Rails, PostgreSQL, Redis

One of the two Ruby developers behind a project involving e-commerce, elements of social networking and project tracking in the construction industry. My work was largely database design (PostgreSQL), server-side-rendering Rails development with initial bits of frontend until we were joined by a dedicated frontend engineer.

This was my first experience with AWS, of all their services we only used EC2 and S3 and the deployment setup was arranged by the other guy, I only learned how it works in the later stages.

Business requirements were vague even by Agile standards, so we (mostly our product manager, with our help) spent quite a bit of time clarifying them, actual development was often blocked pending response about a key feature decision from the customer — something that was unfortunately necessary because we had no domain expert of our own to make an educated guess and keep going.

About 30% through the project, with regular demonstrations that seemed to satisfy all parties involved, the customer suddenly stopped responding and paying the development bills. The company could not afford to pay the team out of pocket and gave us an advance warning that they’ll have to let us go and that we should probably start looking for new jobs.

Several months later the customer showed up again and offered more favorable terms, prompting the management to attempt reassembling the former team — it didn’t work out, as the customer intended to impose strict deadlines without addressing the issues that kept dragging the project down before.

IAIT "Vector"
Software Developer & Support Engineer
⚙️ GameMaker Studio, Ruby on Rails, Linux

My first “real paying job” at a private school with ambitions for software development. Was originally employed for a GameMaker programming support role, recommended by a peer from the local community around the engine.

Not a very busy role in itself, I supplemented it by maintaining the office’s IT infrastructure (desktop machines and network routers) and eventually going on to set up an internal server packed with useful web portals for other employees to use — with applications developed in-house as well as open-source solutions.

When there was nothing better to do, I learned to use Ruby on Rails and went on to build a couple small support apps as well as started a larger project to help with building a library of educational materials. In the later years I would learn it would essentially be like Confluence in terms of purpose, with the killer feature being block reuse — wherein a single block of content would be displayed on multiple pages in the knowledge base, with edits to the blocks reflecting in all the pages that use it.

We had a decent proof-of-concept after a few months of work, which looking back I find surprising, considering that I myself was the entire development team, and that management did not really have any kind of vision for the project — meaning I effectively had to define the whole product, from stories and features to implementation. This was back before I even knew these terms.

The company was seriously struggling financially by the end of the year, and after payroll delays reached several full months in length, I decided to leave. This got mildly ugly, with management employing straight up FUD to convince me to stay, saying I would not find a better paying role without an academic degree (which is commonly believed in the area), but I was dead-certain that I would be better valued elsewhere — and later went on to prove it.

🔧 Side projects

Self-hosting & home automation
Deployment and maintenance of FOSS-based suite of apps

As a hobby, I host numerous network services for use by myself and a small circle of friends and family. I had to learn numerous topics regarding computer networks, protocols and server administration. My setup is based on hand-rolled container definitions and does not involve any application management solutions such as YunoHost (for historical reasons really, it started off simple enough, but by the time I learned of other feasible solutions, migration would be a serious hassle).

Some of the applications that have functioned there at least for some time: Nextcloud, Gitea, NodeRED, Home Assistant, Rhasspy, Calibre, NocoDB, Synapse (Matrix server), Penpot, Kiwix, Oauth2-proxy, Jellyfin, F-Droid repo builder, OnlyOffice — there are more, but some are unimportant and some I would prefer to not disclose.

This has proved to be especially helpful during wide-band blockages by Russian authorities since 2018 (during their attempts at blocking Telegram) and later during numerous service suspensions due to sanctions imposed on Russia in 2022. Plenty of chances to learn the importance of digital self-reliance the hard way.

Some of the applications are the backbone of my smart home setup, which is designed around the idea of being fully functional offline, for reliability and security reasons. Despite this serious (at the time of writing) limitation it’s packed with features and even supports voice control. This required some some deep dives into underlying technologies and even come code fixes that are, technically, contributions to open-source.

Answering questions on Stack Overflow ⏸️
Research, documentation, participation in community self-governance

Contributed hundreds of answers to the main Stack Overflow and Stack Overflow in Russian. And in the Russian community posted a number of insightful answers on community self-governance and moderation (defining and interpreting rules in large communities), participants’ mindsets (why people behave the way they do), making sensible decisions in difficult/controversial situations (solving conflicts inside and at the edges of the community) and Russian localization of the platform (which was… an afterthought).

I largely stopped in 2017 because Stack Overflow the company and their community management team specifically made a series of highly controversial moderation decisions, sowing significant doubts among major contributors about whether it’s worth contributing efforts to their websites as a form of public service. The biggest misstep was the “Monica” story about which many community members can still be found protesting through their display names on the website. I, however, chose to stop contributing altogether.

Russian Fan Localization for FTL: Faster Than Light ⏸️
Translation, reverse-engineering and modification of game assets

There was this game I used to enjoy, “FTL: Faster Than Light” by Subset Games, about managing a spaceship and its crew on the run from a fleet of pursuing ships. It’s a game about making tough choices in face of uncertainty and damage control in dire situations. I was totally fine with playing it in English, but frequented its Russian community on VK where many didn’t know English very well.

Over (1 year) I worked with a team of volunteers to update Russian localization mod after the release of “Advanced Edition” expansion, extracting text from game assets and injecting it back. Translation process itself ran on Notabenoid with proper facilities like the glossary and review, and text export/import was implemented using Ruby initially.

Over (on-and-off over a couple months) I built a font dissector/patcher after another update introduced proper support for multiple languages but reworked some of the stuff under the hood, breaking compatibility with prior modifications. The game introduced official Russian localization shortly after, but the team still relied on font modification to add icons that made the UI more succinct in their “Arsenal+” overhaul mod they built in my absence.

Miscellaneous
Some other projects that didn't deserve full entries on the list (yet?)
  • This very website and its Sass‘y design showcases my HTML-fu
  • I run a public digital garden, though I don’t tend to it very regularly
  • Working on a concept of a package manager for knowledge, only a concept so far
  • Read data off of electricity meters using NodeRED and the vendor’s USB-serial adapter
  • Used to be an elected administrator on a public Terraria server, managing and moderating a community of players
  • Coded most of the point’n’click adventure “G1Deon: Towards God” which somehow even got published

💪 Key strengths

  • I'm (allegedly) good at explaining complicated stuff in simple terms and willing to improve that skill further. Practiced it on Stack Overflow for a good while (see above), and before that was a decently well-known contributor in the Russian GameMaker community, explaining the concepts of that game engine — where became notorious for deep knowledge of the subject and keeping a cool head when a discussion gets heated.
  • I heavily rely on documentation, tools and references, all things that are easy to improve and share with others. In this way I help newcomers dive into what's documented as well as avoid creating an unhealthy dependency between the company and myself.
  • I tend to dive beyond trivia when exploring subjects, learning more than I might necessarily need for the task at hand, but also on occasion uncovering pitfalls.
  • I value constructive discourse. I clearly denote guesses, educated guesses and educated statements when asked and during brainstorms in general. When faced with a disagreement, I present the information that shaped my viewpoint without pressuring into accepting mine.

⚠️ Potential pain points

Quirks you should probably know if you get to work with me:

  • I may be bluntly honest with my talking points at times. The fact that I have this section on my CV at all should tell that I'm not afraid to undermine my own position for the sake of transparency.
  • I value and respect the rules. I'm capable of following the rules I don't agree with, but I might get upset when rules are needlessly broken or left unmaintained. I reckon this comes with the job, software engineers design rules and solidify them in code, and the better the rules are designed, the less work will have to be put into them later. And over time the same attitude towards the rules extended beyond software.
  • I don't have an academic degree. Not for a lack of trying, I spent a couple years making my way towards a bachelor's degree in Computer Science, but left, both due to lack of motivation and out of disappointment with systemic problems in our education system. There's some of my own blame in that, but with how much actually useful stuff I've since learned on my own I believe I made the right call. So now I strive to be a living breathing example of why requiring a degree is a bad idea. How am I doing?
  • Remembering large amounts of trivia is not my thing. Computers are much more reliable at remembering large amounts of information, I don't see much of a point in doing that job for them. So in an interview that expects me to know the names of numerous niche concepts I will likely fail and will not regret it.
  • Modern day advertising has fostered in me an utter distaste for manipulation, thus limiting what I consider acceptable in negotiations, arguments and products. This also limits the domains I would be happy working in: I've previously declined positions around advertising and mobile videogames because they practically rely on manipulating their intended audience.
  • Preference for discussions that have a purpose, not small talk. This can manifest in a quirk that some have even found cute: I might take a small talk question like "How are you?" seriously and tell some interesting story from the events of the past few days. Which people seem to generally enjoy, but it doesn't always fit the format of the discussion and goes against people's expectation of a meaningless response like "I'm fine".