TL;DR This is a job ad. Not a typical one, but still. I'm looking for 1-2 .NET software engineers with an insatiate apetite for serious challenges. Job itself is about methodical tending to brownfield codebase, but not by firefighting, but applying mature development practices: convention tests, continuous inspection & feedback, re-modeling according to DDD principles, applying SOLID principles at small & larger scale. This is NOT about typical maintenance, but long-term, iterative transformation (conducted by several teams in parallel) & elevating whole (existing) platform to the next level - also in terms of technical excellence. This IS about being a scout, crazy scientist, neural surgeon & lumberjack in one person. I'm leading the charge, but I need sidekick(s) to push even harder. Up for a challenge?
Few weeks ago I've mentioned on-line that I'd like to recruit someone for hand in hand collaboration (specifically with myself), but I didn't provide any details.
For smart people in general. All levels, incl. Team Lead (maybe even above). Aaand, as a Sith, I need a full-time Apprentice as well. #evil— Sebastian Gębski (@liveweird) September 26, 2017
Until now. Today is the day.
I'm am looking for a Code Forester.
Contrary to the common belief, forester is someone far more than just a lumberjack or a logger. Even if (s)he occasionally cuts the trees off like them, the purpose is different. The primary duty of a forester is to CARE for the forest - tend to damaged trees (& not only trees), mark the ones that should/could be removed (as their further existence won't benefit forest as a whole) but also plant seedlings (in correct places, suitable conditions, etc.) so the whole ecosystem can develop.
Large codebases need their foresters ("codesters"?) as well:
- codebase should have its development plan
- some constructs should be marked for removal or long-term refactoring (not everything can be done immediately)
- good practices should be looked for - so they cultivate properly & spread around
- bad practices have to be identified as early as possible, so the infected area is limited & can be quarantined.
Yes, you've guessed right - code forester is a hands-on architect.
Which is precisely doing ... what?
Here are the most important properties of this role:
- ... works with people and code equally
- ... knows the platform (/language /framework) very well, feels it intimately, can sense shit hitting the fan after the first breath of the stench ...
- ... should be able to fluently move across different levels of detail (from whole systems to single objects), architecture layers (from client-facing presentation to deepest pits of back-end), functional areas, ...
- ... has to be cunning enough to spread her/his control even over places he doesn't visit everyday - by smart automation, static analysis, convention checks and other continuous inspection mechanisms
But isn't technical excellence (& code quality) the joint responsibility of all the developers? Does it makes sense to transfer these duties to dedicated individuals? Well, the goal is NOT to remove code ownership from the teams, but to provide the necessary guidance & support ("shepherding") by people who not only have the skills, but can also solely focus on this topic.
Can't functional teams handle it themselves? In fact, it really depends on particular organization - experience, maturity, awareness of the people - in majority of organizations I've encountered having a dedicated code forester(s) on duty was a very reasonable solution.
Talk is cheap ...
What about more precise examples of code forester's work? Sure, I can provide some just from last month (all are real):
main solution gets to painful too work with, architecture could use some decomposition - .NET solution (sln) has been split, project dependencies have been orchestrated by Cake, proper tooling has been provided for the convenience of all developers
as the public API of service layer was supposed to be shared across all teams, proper (& up-to-date!) documentation was crucial - code forester has applied the principles of living documentation (with DocFx), by merging metadata (inputted manually in agreed format - markdown) with automatically generated API dump - all on that as a part of Continuous Integration
platform's architecture is a subject of multi-step transformation, not really a trivial one, limited by some constraints, stretched for a longer period of time - to make sure new rules & conventions are being applied & old ones are in a decline, code forester has implemented convention tests (with NDepend) (on the level of coarse-grained components) that are running in the CI loop and indicate whether the changes in code are aligned with transformation direction.
Code foresters are not stealthy ninjas, who make commits & dissolve in shadows without a word. Their role is also about education, organic growth of technical capabilities in the teams - code forester shared knowledge about the recent changes & educated teams by recording video tutorials (with Camtasia), creating representative code samples (for reference purpose), organising Q&A sessions with on-line diagramming (Sketchboard) or maintain dedicated support channels on Slack.
Last example is the one I find really important - code forester is NOT a purely technical role! (S)he has to be an excellent communicator, able to pragmatically delegate work to others' ("standard" functional teams) backlogs. Such a person has to pro-actively look for feedback, probe people understanding and be able to "put her/himself in others shoes" - to feel their pains, fears, limitations.
Code forester can't be afraid of the domain either! Bad model is also a disease that could infect he whole codebase - it should be identified, assessed, properly & timely addressed. Some problems recognized by their technical symptoms can be treated "mechanically" (like decoupling), but it's far more dangerous than a proper approach, aided with deep understanding of the business domain.
Rule of Two
"Always two there are; no more, no less. A master and an apprentice."
Yoda, "The Phantom Menace"
Now comes the best part. Part of my role (Chief Software Architect) in the company I currently work for (EcoVadis) is about implementing code foresting (for the platform built on .NET). I have plenty of ideas, there are certain interesting challenges waiting in the queue, but ... I can't up-scale myself, so I'd like to out-scale myself :)
In more simple words: I need more code foresters in my crew. One should be enough for now, I can make an exception and take two if someone truly decent pops up.
Warning. Minefields ahead.
I'm not going to bullshit you - code foresting is not gonna be nice'n'easy.
You have to "have balls" for courageous decisions (two comments: 1. obviously not literally, gender is not relevant, ladies are welcome just as much as men; 2. "have balls" doesn't mean "to be reckless", but "to take ownership over tough decisions & their consequences").
You can't be afraid of sticky touch of brownfield - this offer is NOT about another greenfield attempt to implement the clean code principles "the perfect way" from scratch. It's about continuous & REAL improvement of existing platform - no excuses, no whining, just proper engineering. This is the correct attitude for this job:
Obviously, intimate familiarity with .NET platform is a must. Not only in terms of syntax, but also tools, techniques & resources available to deal with certain problems. Don't get me wrong, I don't expect mastery (or certains yrs of experience ...) - but the (temporary) lack of knowledge has to be compensated with passion for learning, unconstrained pragmatism, ability to correctly identify problems and grit required to deal with them (aka "getting shit done").
Needless to say - this role comes with certain authority, but this one will not be given for free. You need to earn it by proving yourself and building actual trust & respect based on merit & real accomplishments.
What are the sample challenges to be dealt with?
Let me list some:
- fast & resource-efficient state management for the sake of integration testing
- full-scale convention testing suite, including DB-level metadata & whole codebase
- re-modeling key parts of core domain according to DDD principles
- separating some write & read-related system capabilities - the CQRS way (due to strong asymmetry between those)
- loosing unnecessary coupling between various functional components by properly identifying the contexts, scopes, boundaries and re-integrating them via asynchronous events
Some more, "mundane" details about the offer:
- back-end platform is in .NET 4.6+, code is written in C#
- state is persisted in MSSQL Server 2016
- We use latest TFS for CI with Git as a VCS
- infrastructure is in leased private cloud, we're gradually migrating to Azure
- working language is English
- teams are distributed (+/-2h around Warsaw), company is not remote first, remote time per month is limited
- our office is in the center of Warsaw, PL (Rondo ONZ)
- you get tools (hw) & licenses (sw) you need for your work (within reason ;>) - we shape our workplace according to needs
- domain is business-targeted (as end-users), very unique (sustainability), supposed to bring greater good to global population & truly complex
- code foresters don't Scrum ;> our efforts are continuous - we Kanbanize
- moneywise, I don't have a set budget for this position (budget is on the level of whole eng. unit), I can afford paying an honest market rate - come to me, state your expectations & convince me you're worthy
Just to make sure we're on the same page:
this offer is not necessarily targeted to people with decades of software engineering experience. You'll be fine with just few years (reasonably utilised ...), as long as you truly have a strong engineering background, know the key principles of building proper software products (SOLID, Clean Code, "-ities" of architecture, key integration patterns & architecture reference models) & are open for shitloads of learning.
This last thing may be a key benefit for you - I know the craft, just need someone to pair with.
You learn, we perform, everyone wins.
If this all somehow "resonates with you" ...
If you're looking for new, interesting challenge that involves decent engineering ...
If, for once, you'd like to change something instead of complaining on how broken things are ...
Then contact me (details in "Contact" tab on my blog), let's have a talk.