Bigger things
Something unexpected happened this week: I was offered my first senior engineer position. I'll be focussed mainly on the project management and planning side of things, and I'm being encouraged to delegate the software development work. I'm still prepared to get my hands dirty with the coding and systems administration, if anyone gets stuck on a tricky problem, and I'll likely be working on a couple of .NET applications as personal projects. It will also be hard to resist the temptation to refactor code here and there.
The interview questions were mostly broad and generic, which meant my answers needed to cover a lot of ground. And the interviewers weren't looking for textbook answers as much as they were looking for someone with enough experience and insight to be opinionated about different approaches to planning, development, delivery and support. There were a few questions about things I'd never even thought of before.
Part of the conversation went something like:
'Why are best practices important, and how would you encourage others to follow them?', One of the interviewers asked.
'Best practice in the context of...?'
'Developing, deploying and maintaining a service.'
I actually found it difficult to answer this one in a single sentence.
'The overall reason best practice is important because we want to deploy software that works, is maintanable, secure and can be supported by the support team.'
But I needed to go into software engineering principles, unit testing, code reviews, DevOps, documentation, deployment process, choosing third-party dependencies. Oh, and how I'd go about making the idea of Agile development work in the real world.
And there was a rather tough security management question around incident response, and that required quickly and methodically thinking up a process for mitigating the situation, with multiple tasks that could (and probably should) be delegated. I think my answer to this was useful enough to commit to writing at some point.
What should I do now?
The thing I'm probably most concerned about is the possibility of software engineering being a perishable skill. Frameworks and coding patterns Microsoft encourage do change. Coding patterns even get deprecated on the rare occasion. Whenever a new version of .NET is released, I create a .NET MVC project template that provides a basis for an engineered application, with patterns for generic repositories, Unit of Work, unit tests, etc., just to make sure I can still do that from scratch.
I don't actually care that much about 'clean code' and SOLID as principles. Having readable code is far more important, in my opinion, and well-engineered software generally follows from applying SRP.
Best practice is something I've been working on for a while, mainly for the sake of consistency. Our services need to be robust, and our knowledge management methods need to work for people supporting them. There will be valid differences of opinion on how we go about this.
All developers should be good enough at using SQL, as a core skill I need to keep working on. Software could be considered an abstraction of a data source, and most the software problems I encounter are attributable to data issues.
Working with people outside of a development team - from clients to project managers - is also under-rated as a skill. Developers spend their time implementing use cases as code, thinking about very specific criteria and solving problems we're told exist. People without a technical background will have a different way of trying to communicate what they actually need a system to do, and how it needs to work for them.
Humility does go a long way, as does being aware of what we don't know. I think everyone in my department is a domain expert in something I don't have much experience with, and even a difference of perspective can lead to a solution to a tricky problem.
Try to encourage Agile development (I'm definitely not referring to Scrum, which I detest for many reasons). If my planning is good enough, a service is getting released once the core features are tested and ready for deployment, and we have a working iteration. There will be change requests and defects to address, but those will be filed under ongoing support, unless it's something major.