I work as a freelance/consulting software engineer, augmenting product development teams. This file provides an outline of how I work with clients.
If instead you're looking for an overview of my work history, please see my main GitHub profile page here:
If you have any further questions please email me at ali.najaf@gmail.com
I write, a lot. On a development team this extends to status updates, wiki pages, trello cards, and GitHub PR descriptions.
My goal in doing so is to:
- Keep everyone up to date on what I'm doing, how I'm doing it, and why
- Leave a record of my thinking so future developers (especially myself) can understand my current decision-making process
- Ensure that if I get hit by a bus, other developers can take over in-flight work
When implementing changes to any given system, my process is roughly as follows:
- Gather as much information as possible about the existing system and the intentions behind the proposed changes
- Collaborate with product, other developers, and anyone else involved to make decisions about requirements, then document those requirements
- For larger features, make an implementation plan and have another developer review it
- Implement the feature, preferably with tests and minimal incidental complexity, then have other developers on the team review the changes in a PR
- Deploy the changes
- Ensure that the feature meets the requirements in production
Working this way, no one should be surprised by anthing I do. I try to get buy-in from relevant people on the team on what I'm going to build and how I'm going to build it.
My bugfixing process is similar to my development process:
- Get clear about the difference between expected behaviour and observed behaviour
- Gather information about the environment the bug was observed in
- If the cause isn't readily apparent, gather further information, conduct experiments, have discussions etc until the the cause of the bug becomes clear
- If there are multiple options for a fix, weigh them up and decide on a fix for now, potentially after speaking to other developers or product managers
- Implement and deploy the fix
- Confirm that the fix works on production
Staying productive (especially when working remotely) is a challenge for all developers. Here's what I do so that I can put in focused work every day:
- Planning and communication. In order to keep forward momentum I try to break larger projects down into smaller pieces and communicate before, during, and after implementation.
- Time management and logging. I try to keep detailed logs of exactly what time I spend and how I spend it while doing development work. This helps to keep me focused and also makes providing status reports a great deal easier.
- Staying generally healthy. This includes maintaining a sensible sleep cycle, staying hydrated, lifting weights 4-5 times a week, and trying to stick to an overall healthy diet. While these things aren't directly related to programming, I find that the amount of time I can spend doing deep work drops if I don't keep these fundamentals in check.