A boat anchor is a metaphor that describes something that is obsolete or useless. In programming, boat anchors are everywhere. If you aren’t careful, boat anchors can ruin your productivity and cause confusion. Luckily, boat anchors are easy to prevent and correct if you look out for them. With just a little bit of foresight, you too can preserve your sanity.
Everyone’s used it. A seemingly innocent TODO comment. No harm done, since it’s just a little reminder for yourself right?
TODO comments are not only useless, but a productivity sink as well. Firstly, the “TODO” that you gave for yourself usually never gets done, as it’s buried in some function or class that you probably won’t even revisit for another week or two. Even if you do see the TODO, you’ll most likely ignore it as you’ll be too focused on your current task.
Secondly, TODO comments are bad because they waste the reader’s time. TODO comments belong in a Trello board or some other organizational system, not in your code base. No one wants to waste time reading about something that you should have/want to have done, but never got around to.
In this day and age, if your organization uses GitHub or some other form of version control, commented code is absolutely useless. This isn’t referring to commenting your code with useful English messages, but rather commenting out chunks of runnable code.
Commented code is essentially noise for the reader. If you push commented code to your repository because you think you might “need it later”, then you are ignoring the key purpose of version control.
Version control saves code. If you ever need that snippet of code that you deleted two months ago, it’s easily accessible. Don’t comment out code, or you’ll end up with hundreds and hundreds of obsolete lines of code.
Uncommented Code That Is Unused
Imagine you’ve written a utility class that calculates mortgages for you.
Suddenly, you’re told that the feature is scrapped, but that it might make a reappearance in the future.
Upon hearing that it might be used again in the future, you decide to leave the utility class in the code, since you might “need it later”. Once again, this goes back to the idea of version control. If it’s not relevant, and if it’s never used or referenced, then it doesn’t belong in your repository. Delete it.
Let’s say you have a nifty little method that method that divides every number in a list by 4.
def list_divide(list, dividend): """ Divides every number in a list by a dividend and returns a new list with the resulting numbers. """ ret_list =  for num in list: ret_list.append(num/dividend) return ret_list
Suddenly, you remember about division by zero and quickly add a check to your function.
def list_divide(list, dividend): """ Divides every number in a list by a dividend and returns a new list with the resulting numbers. """ if dividend == 0: print("Dividend must not be zero.") return ret_list =  for num in list: ret_list.append(num/dividend) return ret_list
Unfortunately, since you didn’t update the documentation, the docstring is now a lie. It doesn’t tell the user what the function actually does. There is no reference to division by zero in the docstring, causing the documentation to become a boat anchor.
Outdated documentation causes all sorts of issues for users. Luckily, this issue is easy to resolve. As a rule of thumb, if you add additional functionality to a function, document it. Even if you don’t like documentation, or if you think it’s tedious and pointless, do it anyway. You’ll save other programmers from headaches and wasted time.
Adding Ticket Numbers as Comments
Although not extremely common, some people feel the need to compulsively comment every change they make with a ticket number.
For example, you might see something like this :
#Added foobar function to resolve ticket 53 def foobar(num): #Fixes ticket 281 if num == 0: print("Hello World!") elif num == 3: #Added because of ticket 571 print(num/9) #Added else because of ticket 1528 else: #Due to ticket 4713, changed to 'Goodbye World!' print("Goodbye World!")
Before long, everything in your code will have a comment regarding a ticket.
If you are guilty of doing this, stop it. No one cares what ticket number the fix was in. Make the fix, commit, and push. All of the comments about tickets and issue numbers are utterly pointless and end up as unnecessary noise to the reader.
If you feel that the change is so strange or quirky that you absolutely must give some sort of background information, then write a comment. Making the reader search up a specific ticket to understand the code is a gigantic time sink, especially since most tickets have multiple comments. No one wants to read through all that text. Summarize it in a single comment and move on.
Storing Variables For No Reason
It’s a common practice for developers to do something along the lines of this :
def foobar(num): return num * 13 #Doing this num = foobar(32) print(num) #As opposed to print(foobar(32))
In this case, as long as “num” is not set to some wildly long function call, there is no reason to store it as a variable. In this case, foobar(32) is short, so it should be directly inputted into another function, rather than being set to a variable, and then inputted into the function.
Assigning it to a variable when the functional call is short tells the reader, “The variable num is important. It will be reused later in some way somewhere down the line.”
Not only that, but unnecessarily creating variables adds extraneous code for no good reason.
Boat anchors are everywhere in code. If you can avoid them, you will make not only your life easier, but everyone else’s as well. No one wants to waste time reading excessive code. Reading code is already difficult. Making your peers read more code than necessary hurts their productivity and makes coding an unpleasant experience.
So be a good person. Prune off the excess and correct the outdated. If you find any excessive code, then remove it. If the documentation is inaccurate or outdated, fix it. It might be a thankless job, but know that you’ll have made the world just a little brighter in the process.