From time to time, I'm available for consulting work through Edument Central Europe, based in Prague, Czech Republic. At present, for personal reasons, I'm only able to take on work that I can do remotely.
While I can turn my hand to a wide range of problems, I've most recently had practical experience with:
- Fields: virtual machines, compilers, programming language design and explanation, concurrency and parallelism, web and distributed applications, Domain Driven Design
- Roles: software architect, lead developer, senior developer, architecture/code reviewer, course material author
Think I might be able to help you? Drop me an email at email@example.com.
I find designing and building software fascinating. Our industry is still relatively young, and there's so much left to figure out. At the same time, we're already called on to build systems in complex problem domains. Even when the domain is less challenging, software typically finds itself in a rapidly changing world, and needs to be able to evolve - or make itself easy to replace with something better.
I view software design largely as an act of modeling. To me, that means taking the use cases, drawing on my understanding of how computers, networks and people work, considering lessons learned the hard way over the years, and between them arriving at suitable data representations and algorithm choices.
While this activity may involve sitting on the sofa and thinking hard, or furiously scribbling in a notebook, I'm wary of going too far without getting concrete. So, I'll often turn to rapid prototyping to explore unknowns, or start expressing the use cases as automated tests and use those to help me drive out the model.
So far as implementation goes, I look for solutions that allow clear, succinct, expression of the problem at hand. I try to pick names carefully, following the language of the problem domain. While most of my work to date has been in imperative languages, I think fairly functionally. Pure functions, single static assignment of variables, and preferring higher-order operations insted of loops for list processing are a few examples. At the same time, I want to write code that is easy for others to dig in to and manipulate. Sometimes the stateful, mutating solution is the one that the code's audience will figure out fastest. Pragmatism wins the day.
What can I help you with?
Put simply, designing and building software. I'm a fast learner, strong at spike solutions and rapid prototyping, well above average when it comes to diving into existing codebases, and a patient and methodical debugger. As a software architect I know how to balance out using new technologies where they may offer a strategic advantage, while sticking to tried and tested technologies and tools for the most part. I value loose coupling over re-use, don't hurry to introduce abstractions without evidence they are going to hold up, and think hard about how to guide developers into the pit of success by choosing the right defaults.
While I can and have built software in many fields, naturally there are some that I find especially interesting and have more practical experience in. These include compilers, virtual machines, programming language design, concurrency, and event or messaging-based systems.
Notable past and present work
- Architect of MoarVM, a virtual machine built primarily for the Perl 6 language. I lead the design and implementation work for MoarVM's interpreter, meta-object system, generational/parallel garbage collector, dynamic optimizer (featuring type specialization, inlining, OSR and deoptimization), and a bunch of other smaller pieces. (2013 - Present)
- Lead developer for Rakudo Perl 6, the leading Perl 6 implementation. I've had my hand in, and in many cases led, the implementation of numerous langauge features, perhaps most notably OO, the type system, concurrency, and multiple dispatch. I was the first to implement (though did not invent) Normal Form Grapheme, Perl 6's innovative approach to string handling. (2008 - Present)
- Teacher and course material author at Edument AB in Sweden. I authored some of Edument's most popular courses, including Parallel and Asynchronous C# 5, the C# Masterclass, Applied DDD in .Net, and Introduction to Git. I was a co-author on numerous others, including the highly successful Software Architecture and Modern TDD in .Net. I delivered approximately 100 courses, both open classes and for individual companies, and my deliveries and material were both highly rated. (2010 - 2015)
- Consultant at TN DataKonsult. I worked on designing and implementing systems for a number of clients, mostly using C#, .Net and SQL Server. I also maintained and ported legacy code in ASP and VBScript. (2008 - 2010)
- Developer and content author at Programmer's Heaven. At the time, Programmer's Heaven was one of the largest developer resource websites. I wrote a number of articles, and was involved in developing various features on the site. (2001 - 2010)
- Small-business owner and web developer at JWCS.Net Ltd, short for Jonathan Worthington Computer Services. The company provided web development services to mostly local clients, and delivered ecommerce, hotel booking, and other systems with the backend written in Perl. I created and ran the company while completing my college and university studies. At its peak, I managed 4 remote, part-time consultants. (2001 - 2006)