When and why to clean up your code: now, later, never
codewithoutrules.com
codewithoutrules.com
For them, they pay me a fraction of a developer's price and get a constant improvement of the codebase.
For me, I work at my own pace, remote and part time. I live in a place where I don't need much money.
It's awesome.
Ping me at itamar@codewithoutrules.com
It’s kind of hard for me to imagine moving out of the Bay Area, but I’m sure there are major cities outside California that one could easily live on 1/2 a software developer’s income.
But the calculation should not be about the fraction, it should be about what you need. If you make $100/hr and work 5hr/day, that's $110k with 5wk vacation. I make more than this and I moved to France, so I make a very decent living compared to the local standards.
I think the right mind set if crappy code piles on is to think:
1. It's more work for me, so my employment is pretty safe
2. If I wasn't doing what I was doing, then the code would be even crappier. So all in all, this is my little contribution to a little cleaner world...
When you are repairing other people's code, don't change it to your style, fix it in theirs.
If you'll be the one owning the code, do what you want. If it's not yours, check first.
If you do have communal ownership, coordinate and establish style guides, ideally using tools to establish conformance (rather than eye-balling it, this also leads to greater consistency).
This randomly reminded me of the time I let my friend use my laptop, only to find out the next morning that he had changed all the colors and styles of my windows xp with a gimmicky "mac skin". So infuriating.
This way if someone decides to rearrange something, the stakeholders can hold up the review until they're happy.
I've certainly blocked code reviews because of planned changes.
That being said, you only "own" code if you own the business. If you think you "own" code, you might need to re-evaluate your ego.
As we've moved, here, from SVN style version control systems towards git we've encountered a few snags along the way. People used to SVN want to check out files, make a lot of changes, complete the whole change request in a single checkout (which could take a while), and then check it back in. The problem arises that they end up making tweaks (small refactors, style adjustments) that aren't really part of the change request. This creates confusion when trying to check the work back in and review it. It also means that positive changes (those tweaks usually are) get tossed out when the whole CR is rejected for some other reason.
Git makes it much easier to do small commits. Changed a file to use spaces instead of tabs (per style guide), check it in with just that change. Refactored a common set of lines into a new function? Check in the new function creation once. And then do one check in per true refactor (replacing the many lines with one function call).
This allows you to cherry pick much more easily, but also to isolate errors. Maybe that Extract Method refactor should only have been done to 10 of the 12 cases you did it in. Or what looked like a common magic number was only coincidentally the same. If you made all the changes in one commit, it's harder to revert just the broken part. And git bisect is useless if you have a handful of giant commits, rather than many smaller commits.
Suddenly an SVP pulls you aside and tells you you need to extend a service that team SadStyle owns and integrate it with your own team's widgets. Team SadStyle has regrettably not yet been shown the way by a C# bodhisattva and has the following inarguably egregious C# style errors in its codebase:
1. Braces open on a newline instead of on the same line
2. Profligate use of `var` for every kind of variable declaration
3. Inconsistent use of tabs and spaces
4. Anonymous functions sprinkled into the code ad hoc that are sometimes quite long
You're shocked at team SadStyle's code, but you need to get some work done, quick, since a deadline is coming. So what are you going to do?
If you answered "I'm going to go through and change every brace, variable declaration, and span of whitespace", I think you should maybe think more about whether this is a good use of your time.
Personally I try to follow the style of the existing code, but when something permamently becomes the responsibility of my team I won't hesitate to apply the style of my team to the whole thing. Most parts of the style can be applied automatically, and the parts that can't be will be applied when functional changes to that part of the code are required.
I will note that some projects such as FreeRDP, already have an autoformat script that does the "saving" part (unfortunately, not entirely automatically, since the precommit-hook is not set to run it).
I do agree with the basic idea of the article though. maintenance/sustaining = touch the code as little as you can (helps with diffs) greenfield = take the time to make it right for as long as you can
The business types don't care. What they care about is having something to sell.
The engineers who are even capable of understanding what I'm doing don't care because they've got their own deadlines on a totally unrelated part of the codebase. They probably won't even work here any more by the time someone has to touch this code again.
I've had so many projects bitten by an overzealous dev who decided to update the version of a library because newer = better and then we spent the next three weeks chasing bugs/differences between the versions.
Edit: Curious about the down votes. Would someone who disagrees care to illuminate me?
At least IMO, best practice is to continually evaluate and adopt updates to dependencies. I’d rather have a slow trickle of problems associated with continuous updates, than have a total firefight when you realize you have to upgrade, now, and you have neither solid plans and practice in place to do so, nor the time because you’re in the middle of yet another feature drop that is pushing tech debt to the breaking point.
Setting and forgetting dependencies is like saying you have a backup somewhere, but never actually testing if you can recover from it. That’s the kind of thing that could turn a routine outage into a crippling emergency.