Contact information
- Mike Dotty
- E-mail me@mikedotty.com
Summary
I design, develop, maintain and run software systems with focus on long-term maintainability.
What do I do?
Software architecture and design
Software is useless if it is solving a wrong problem. I know how to find groups of stakeholders, elicitate their needs and convert them into concrete requirements.
Requirements change all the time. I know how to do an MVP to avoid spending months implementing features nobody wants.
Software systems need both functionality and properties such as flexibility, adaptability and ease of operations. I know how to isolate layers, invert dependencies, partition systems, evict state, add immutability, split interfaces, make tons of other small and large decisions to make it happen and communicate it clearly.
Complexity creeps in. I know how to prune unwanted statefulness, remove layering violations, keep the interfaces minimal.
All software is distributed now: Web SPA and mobile apps are distributed systems too. I know how to manage upgrades, do a staged rollout client- and server-side, collect metrics and log messages, how to deal with old versions of client software suddenly reappearing out of the blue and how to version REST protocols to avoid breakages while staying flexible.
The best requirements and architecture are useless if not communicated to the team. I know how to write and maintan clean documentation, how to create coherent vision in the team, and how to maintain this vision via design sessions and code reviews.
Software development
Give me a task, I'll do it. Or better: give me a problem and I'll solve it.
Can this problem be solved without writing new code? By deleting existing code? By a change in an internal process? Or by using an external service (price, SLA)? Does this problem need to be solved at all?
Reengineering and refactoring
Is your legacy system a mess? Does implementing a new feature take ages, do bugfixes cause more problems than they solve, do system administrators have to apply enormous amount of effort to keep it running?
This is something I am able to do and like to tackle. I have experience decluttering various software systems, getting rid of creeping statefulness and streamlining operations.
Tools
I know my tools. I have introduced CI into several projects, bootstrapped an embedded Linux distribution and all of its infrastructure, and wrote a countless number of tests, makefiles and scripts.
SRE
I'll get the project to "press here to deploy, here are your logs and metrics" state.
What I can not (will not) do
- NEW FEATURES NO MATTER WHAT-NEW FEATURES NO MATTER WHAT-NEW FEATURES NO MATTER WHAT. There are many people who are way too happy to create new features and never look back at the mess created. I'd rather take additional time making sure the new functionality integrates with the rest of the system and does not contribute to a Big Ball of Mud.
- Client-side all day long. I'm reasonably proficient in working with client-side functional UI libraries (React, Reagent), but it is not my forte.
- PHP.
- Perl.
- Windows as a mandated development environment.
What do I want?
- Remote work (unless the company offices are located on Cyprus).
- Flexible work schedule, to a reasonable extent.
Projects/Companies
Open Source
I have contributed many patches to various open source projects, mostly fixing problems I have encountered.
Packet (2018+)
I'm responsible for elicitation and management of requirements, architecture of the solution and architectural/design code reviews.
In addition to that I spend a lot of time writing product code, passing knowledge to co-workers, and improving internal tools.
Hola! / Luminati (2013-2018)
Wearing my SRE hat, I have improved insight into performance of Hola services, by adding
- centralised application-level logging, and
- application-level metrics
that made it much easier to pinpoint and resolve performance problems and bugs.
I have created several internal-facing statistic dashboards for Hola VPN and also user-facing statistics for Hola Spark CDN.
While working on Luminati I have implemented a custom in-memory DB to track the status of 1M+ peers of Luminati network that decreased the price of hardware running this database by 8x compared to the off-the-shelf DB.
Debian (2006+)
I maintain several packages in Debian, mostly "scratching my own itch".
My Debian experience usually makes me a "resident Debian/Ubuntu expert" in companies I work for.
Puppet (2011-2013)
Introduced a bunch of software engineering practices to Puppet development (CI, unit and acceptance testing, release management).
OpenInkpot (2007-2012)
A Linux distribution for eBook readers. It was fun while it lasted until Kindle killed it.
I have started it, have built the infrastructure (from bugtracking to cross-compiling Debian packages in CI environment to repository manager) and was BDFLing it until it withered out.
Also I've got the experience managing distributed team in addition to the previous experince working in one.
cPanel (2004-2007)
For cPanel I have created a tool for transferring contents of competing hosting panels to Plesk and a backup system.
I have designed a pre-SAML single-sign on protocol for cPanel integrations, and a packaging format for one-click Web applications installations.
Other
From | To | Name | What it was/is about? |
---|---|---|---|
2009 | 2010 | IPlinux | Unwillingly started a Debian-based embedded distro to build OpenInkpot on top of something after previous base distribution got abandoned by the primary developer. Worked OK, but OpenInkpot was always the main focus. |
2007 | 2009 | Mandriva Linux | I was maintaining distro bugtracker, bringing development documentation into order and creating internal web apps for analysis of development process. |
2003 | 2004 | Azmor | As a member of IBM Solutions Group team I was doing R&D work for IBM, evaluating new cool technologies of the time for potential usefulness for IBM projects. Also doubled as system administrator. |
2003 | 2003 | Mitie | An intern! My first "real" place of work. Wrote a small billing system based on Cisco NetFlow. |
Keywords/Experience
10Y+ experience with
C, Linux, Make, Debian, Korn-like shells, POSIX/SUSv3, various Unices
5Y+ experience with
Go, Clojure, C++, Javascript, Node.js, TCP/IP, Python, git
Swedish language (upper intermediate).
3Y+ experience with
GCP, Terraform, Kubernetes, ElasticSearch, Kafka
1Y+ experience with
Clojure, Perl, XSLT, Java, Django, Eclipse RCP, SQLite, PostgreSQL.
Toyed with
Various Lisps, Haskell, React, Ruby, OCaml, Rust, Erlang, C#, J2EE (old one), AWS, Ansible, Salt, Puppet, and everything else on the front page of Hacker News.