The other side of Stack Overflow content moderation
I’ve been putting off writing this post because I intend to stop actively contributing to Stack Overflow once I publish it. I was hesitant because I had found a group of people that made content moderation tolerable (shout-out to the SO Close Vote Reviewers). But the reality is that I spend too much time on the site and I no longer consider it a rewarding experience.
On Meta Stack Overflow, Reddit, Twitter, your grandmother’s Facebook account, Hacker News, Medium, we often read criticisms of content moderation on Stack Overflow. Users report instances of unfair closures, unrelated duplicates, downvotes without an explanation; really, anything that can be perceived as unwelcoming behavior on the part of Stack Overflow content moderators.
I’ve been a decently active content moderator for years. I want to challenge the belief that we, the Stack Overflow content moderators, are out to get you. The reality is less sinister: we are here to scrutinize content and prune what’s inappropriate so you can contribute more productively and so others can find higher quality answers more quickly.
I thought it might be interesting to shine a light on what content moderators have to deal with on any given day. To that end, I’ve authored this post to expose an entire day of my content moderation activities, with commentary!
I keep repeating the terms content moderator/moderation to distinguish between site moderators (little ♦ next to their user name) and their responsibilities and regular users who have gained moderation privileges. Going forward, I’ll be referring to the latter.
You can find a summary of my activity on my Stack Overflow profile, here. As of this writing, I’ve gained all the privileges listed above. Unfortunately for our purposes here (but as a guard against revenge votes), some of the actions granted are not public. For example, you won’t be able to see when I vote up or down on a post. Similarly, you cannot audit all the posts I’ve voted to close (although my user name will show up on individual posts where my vote contributed to their closure). I’ll be sharing my actions, whether they’re publicly visible or not.
Vote counts are restricted per day. Here are the rules governing how they are calculated. The actions I’m presenting below all occurred between December 8th and December 9th, 2019. During that time, I exhausted all my close votes, all my delete votes, and, I think, all of my up/down votes.
Historically, I’ve mostly contributed to the popular java
, spring
, and related tags. But since I participate in moderation with the help of people in the SO Close Vote Reviewers chat group, I did also vote on posts in unrelated tags during that day.
As a reminder, here is Stack Overflow’s Help Center document describing on-topic and off-topic subjects. Here’s the article on voting up and here’s the article on voting down. These are provided as guidance. Unless you’re abusing the privilege by targeting a specific users, you’re free to vote as you see fit.
You can probably tell from the size of your scrollbar that there is a lot of content to follow. It’ll be split up by post on which I acted. After every post, you’ll find a link like this one to skip to the end of the article
Let’s begin, in a mostly chronological order. Spoiler alert: it’s not pretty.
One post is titled: How to get Current Date and Converting it to Epoch Time using Java? That’s a useful title but I can already guess they’ve made no effort to answer the question themselves. The post has since been edited, but its first revision originally looked like
The question doesn’t show any research effort. That alone calls for a downvote. Three other users voted to close the question with a reason of “Needs more focus”. Other users left these comments:
Say what you will about how welcoming they are, but they’re all to the point. The first and second explain that the author demonstrated no effort at finding an answer to their problem on their own (a reason for downvoting). The third actually provides a solution and the last two provide further helpful comments about Stack Overflow expectations and about the Java Date API.
Two other users actually provided answers but deleted them. Here’s a screenshot for those that don’t have the privilege to see deleted answers:
The posts eventually accumulated a score of -3 and I didn’t believe it would be improved by its author so I voted to delete it (and potentially recover a up/down vote). If two other users had also voted to delete it, Stack Overflow would have removed the post from its regular view.
Next we have a post, which has since been deleted, titled: Developing my first game in java but how do I improve it? I can already tell this is too broad.
This author is definitely new, their profile shows they joined 2 days ago. Unfortunately, they’ve completely misunderstood the purpose of Stack Overflow and some users have left comments explaining that. The question isn’t clear and won’t be useful to anyone else, so I voted it down. I also voted to close it, indicating that it needed to be more focused. From my experience, it’s nigh impossible for this question to be made on-topic through an edit, so I voted to delete it along with two other users.
Next we have a post titled: How do I fix the problem with Array outOfBounds problem. From the title, I can already guess they’re asking about an issue that’s asked about repeatedly, an ArrayIndexOutOfBoundsException
. When I open the link, the question has already been closed as a duplicate of the canonical post for that exception type: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?
In its original revision, the question looked like this:
They provide some code with an incomplete stack trace, with no indication of line numbers and no evidence of any effort on their part to try and solve it. There’s no way this post will ever be useful to anyone else. For that, I voted it down and also believe the canonical duplicate closure was appropriate.
In a later edit, they added more code, but that didn’t improve anything: the lines were still a mystery and the code wasn’t executable, it wasn’t a minimal complete verifiable example.
One user did provide an answer
I downvoted this answer because I don’t believe it’s useful. The author assumes the error occurs for check
when there’s no such indication in the question. It also doesn’t directly address how or why the access would throw a ArrayIndexOutOfBoundsException
. This user is new and doesn’t have enough reputation to comment, but they’re aware they should wait until the question is edited with more information. I’m not inspired to explain my downvote.
I’ve bookmarked this question so I can later vote to delete it (either when it’s received sufficient votes or when 2 days have elapsed).
The next question I came across was originally titled: “I need tips on my Java Store assignment (Just tip, you don’t need to write code)” and looked like this
This is nothing more than a requirement dump. The author is trying to evoke pity with a comment like “I am stuck here for 2 hours” but don’t provide any specific explanation of what they’re stuck on. Do they not understand what arrays are or how they work? Are they seeing some kind of behavior that they didn’t expect? What did they actually expect and why? These types of questions are not useful to anyone else.
I voted to close it as “Needs more focus”. (For some reason, I didn’t downvote it. Reviewing it now, I probably should have.)
To their credit, the author later edited the question to include more details. They also re-titled the question
Still no evidence of effort…Ideally, we would reopen the question and re-close it as a duplicate of the canonical I linked to previously, but that‘s complicated: 3 reopen votes and 3 more close votes. If the author had shown some effort, I might have linked to the canonical in the comments. I’m, once again, un-inspired.
Next we have: How to print the current time on the console every 2 seconds. After doing this activity for 20 seconds the program quits
The first part of the title is reasonably useful. The second should be in the post. The rest of the post is just a code dump. It’s also mistagged with multithreading
when the code provided is a simple main
method.
I didn’t downvote this post (although I’m again wondering why), but I did vote to close it as requiring more details or clarity. The author did try to clarify their question in the comments. They should’ve instead edited their post. It’s currently sitting at a score of -9.
I think the next one was reported in the SOCVR chat room, originally titled: How can I get this to not print “zero”? Please help me
Some users do this thing where they try to ask their question in code comments. Don’t do that. Ironically, if this post was properly formatted, it would’ve been harder to read…
One user who has a gold badge for java
unilaterally closed the question as a duplicate, but later realized it didn’t apply and reopened the question. I came around some 10 hours later and voted to close it as unclear or requiring more details (there are some 50 or some unexplained lines of code missing from the screenshot above). I also voted down.
Next we have an issue that’s not reproducible: After implementing interface and using the method, still getting “Method not used”
We routinely ask for a minimal, reproducible example. If we can’t reproduce your issue, it’s unlikely that we can help you. In this case, the author chose to post images of their code and IDE instead of providing the details needed to help us help them. I voted down and voted to close the question (with a reason indicating that the problem cannot be reproduced).
A user chose to answer this question before it was closed.
This isn’t helpful as it doesn’t explain why the problem occurs. It’s just a coin-flip solution, that didn’t actually end up working according to the author of the question. Don’t ask me who found this answer helpful.
This one didn’t last very long: Why does the n get included even though it’s after the < sign? Its original revision looked like this:
The author was likely trying to understand the execution of a for
statement and the pattern of declaring variables before the loop so you can use them after. Some of the commenters guessed as much
The author, as far as I can tell, never responded and never edited their post to clarify the input they expected and what they actually saw. That could’ve been a useful and clearly written question (although likely a duplicate). As it stands, I voted the post down and voted to close it. I also voted to delete it soon later.
This one is disappointing: Simple Java solution from a interview. The title doesn’t tell us anything. That’s already a red flag and I’m going in planning to downvote the post.
For anyone claiming we are only strict with newcomers, this post lasted a whole 2 minutes before it was closed (it was deleted by its author before the rest of us could do so). The author has been a member of Stack Overflow for 8 years. The quick response is evidence that we expect better from everyone, but particularly from our more experienced users.
(If it’s not clear from the quick response, such questions are completely off-topic for Stack Overflow.)
The next post had a misleading title: I do not know how to use this assertSame() and assertNotSame() method?
The problem isn’t with the functionality of the methods themselves, as the title seems to claim, but with an actual error. However, the author didn’t include that in their question either. Instead, a commenter had to ask them to clarify and they did so only in the comments.
The actual error literally has a question named after it. The author could’ve easily found it with a minimal amount of effort. I closed the post as a duplicate and also downvoted the question, because it was unclear and because it showed no research effort.
The user that provided the duplicate link in the comments had previously provided an answer
This is what’s known as a link-only answer. What’s worse, it’s a link-only answer that links back to a Stack Overflow question. There’s already a mechanism for that: duplicates!
I could’ve gone in multiple directions with this next post: Java. Why I can’t convert a interface object to a class object?
The author provides a complete and reproducible example, ie. I can copy it to my environment and run it. They also provide an error message, an explanation as to why they think they shouldn’t be seeing an error, and a clear question about how to get rid of it. I could be convinced that this question deserves an upvote.
However, I gave it a downvote. Here’s why. First, they didn’t demonstrate any research effort. I closed the question with 2 duplicates that I easily found using keywords in their post, namely interface, class, and casting (pro-tip: prefix your searches in Google with site:stackoverflow.com
to restrict your search to Stack Overflow questions). What’s worse, I went through their post history and the previous question they had asked that day already contained answers to their their questions in this post.
A user answered before I closed the question as a duplicate:
That first comment is referring to the first revision of the answer (see edit history). The answer isn’t very useful, however. It doesn’t attempt to explain the root cause of the error or how the changes address it. “Teach a man to fish.”
This one was a duplicate that could’ve again been easily found if they just plugged the error message into Google: Upgrading spring 3 to 4 (getting multiple error)
That title is not at all descriptive so I’ve just gone ahead and edited it to include the error message. This will likely remain a useful signpost duplicate.
Another reasonably easy duplicate to find: Java SQL PreparedStatement is not working. This title again annoys me because it doesn’t describe how the PreparedStatement isn’t working. I didn’t downvote it at the time. I only found a duplicate and closed it. (The way they describe their intentions, the author should’ve been able to find a duplicate themselves…)
Pretty generic title: How do I store these data in an arrayList using loop
This is, again, unclear. There’s a 60 line snippet of code that’s not executable, with no explanation of its intended behavior (other than “store these data”). This won’t ever be useful to anyone else. Downvote and vote to close, and eventually delete.
Our next question is titled: Can you look at this code and say why it’s not compiling? and I already want to downvote. The question starts:
I get an “cannot find symbol” while trying to compile it. I’m extremely new to Java.
The mention of “cannot find symbol” is an almost immediate downvote. Plug that into Google and you’ll immediately find the canonical duplicate: What does a “Cannot find symbol” or “Cannot resolve symbol” error mean? This question gets asked multiple times a day and there’s no reason they wouldn’t have found it if they tried (which I don’t believe they did).
I voted to close and the author deleted their post shortly thereafter.
Can you guess what’s wrong with these two questions?
- Refrescar un Activity desde un Servicio cada cierto tiempo
- Seleccionar unicamente un checkbox (Español)
That’s right. They were closed, downvoted, and deleted because they weren’t written in the English.
Stack Overflow has non-English sister sites. Users often confuse the two. These also get caught relatively fast so they’re closed before I can act, which is awesome (save a vote)!
Posts like these are all over the place: I need help understanding prepared statements for use with mySQL and JDBC and JAVA
There’s a goal with a claim of an attempt, but no code presented. Then a claim of reading documentation but no clarification about any misunderstandings. Stack Overflow is not a tutorial service. Don’t use it as such. Ask specific questions. Downvote, vote to close, move on.
This one has a very clear title: Modify the array so each element is twice the original value, but a terrible first revision:
The post lists some requirements and dumps some code and claims it doesn’t work. What effort have they done to debug why it doesn’t? What behavior do they see that contradicts their expectations? That’s what would’ve made this question, if not good, better.
In reality, someone experienced with java
or who simply has a good editor (code formatter) would have immediately noticed the dangling semicolon after the for loop and the use of 1
instead if i
in the array accesses. These are things we consider as being
caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
There are also duplicates for some of the more common cases (“dangling semicolon” gets asked a lot). I voted down and closed. The author later deleted it.
Another huge code dump with little in the way of explanation or debugging effort (since deleted): Messages are duplicated as more clients are connected? How can I eliminate duplication in the chatlog? Some users really expect us to debug 300 lines of code for them…After I downvoted the post (and voted to close), the author deleted it.
This is another question that would likely fly better on the Code Review site: Handle Chained Method Calls avoiding NullPointerException while filtering a list
The question asks how to refactor a number of null
checks with features introduced in Java 8. Unsurprisingly, this has been asked before. Conveniently, someone asked the same question the day before so I had a list of duplicates handy and didn’t have to go looking for them. The author quickly deleted their question.
Here we go again: Count the number of letter pairs in a string Java
Once again, the title does not describe the actual issue they’re seeing. Once people point it out though:
Didn’t we just see this a few minutes ago. Another downvote (it’s not useful to anyone else), and close vote.
Another code dump with “please help”: Compute the product of the elements in the array, Print only the multiples of 3, Compute the frequency of the number 5 in the array
This is once more a requirements and code dump with an unexplained request for help. Turns out they had misspelled some identifiers. This isn’t going to help anyone else. Downvoted and closed. I later voted to delete it as well.
Although this post was a duplicate, it wasn’t a particularly easy one to find: Deserialization array from json field, so I voted and moved on.
I ask myself this every day: Should I learn C++?
Still, this question (and others like it) is not appropriate for Stack Overflow. We don’t want to generate opinions and debates. Respect its goals. I voted to close and delete.
You know how I know you haven’t read what’s on-topic on Stack Overflow? Your title literally starts with something that is explicitly declared off-topic: Tools for creating an indoor floor plan with data to work with for routing etc on Android? (This question could also have been closed as too broad.)
By now, my hand automatically moves over the downvote and close buttons.
I didn’t downvote this one, but maybe I should have because it wasn’t particularly clear: Java — future — how to write junit tests to this class
Don’t add tags to your titles (I should’ve edited the post to remove them).
They ask how to test something they haven’t shown. There’s not enough to go on. However, even if they did show their implementation, there’s a million and one ways to test something. I’m not sure the question would’ve been answerable (in a useful manner) either way.
“Doesn’t work” isn’t descriptive, don’t use it in titles like: Get() Method of HashMap dosen’t work properly
Their question was poorly described, but they did mention a NullPointerException
. If users hadn’t voted to closed because of missing details, we could’ve also voted to close as a duplicate of the canonical post that addresses NullPointerExceptions
. While not directly explaining why a HashMap#get
call would return null
, it explains how to debug well enough to discover it on your own.
Again with the poor titles: Get the size of an Iterator with generics. Error
Here are two lines of code in their question:
ite = g.incidentEdges(v);//...
int d = size(Iterable<Edge> ite);
The compilation error is due to the use of `Iterable<Edge>
in the argument to the size()
call. This is again one of those “typo” style questions. They’re obviously not using the syntax in the top call so why don’t think they need to in the bottom one? This won’t be useful to anyone else. I downvoted but the author deleted before the question could be closed.
This is another borderline well-asked questions: How does ArrayList in java store items
But in my opinion, the author, again, fails to demonstrate research effort. ArrayList, store, object, reference. All these keywords lead to the duplicates I used to close the question.
“Please help” in the title this time: Please help me with java CodeHS
I’ll follow the link for you. It leads to a picture of a method in an IDE with a comment to fill in an implementation. At this point, is anyone expecting us to go out of our way to somehow be welcoming to this user?
This post code be made into an acceptable signpost: Is there anyway to convert hex string value into long?
As it stands, it’s a rather poor duplicate that doesn’t explain how/why things are “not working”. Googling the error message and the method used would’ve identified one or more duplicates on Stack Overflow itself. The fact that they tried a number of different things might convince me that they made some effort researching a solution, but they fail to explain why they tried those options (don’t freestyle code you see on the Internet).
More duplicates: Java- Can’t find symbol: getX() , getY()
Can you guess from the title which one it’s a duplicate of?
Stack Overflow should build a feature that lets us vote directly from the tag feed. Questions like these are so blatantly off-topic: What are some good project ideas for this exercise?
Semi-clear title: How would I take an object/value out of an array but you read the question:
I’ve spent hours scouring the internet for an answer but none of it was relevant to what I was doing so any help at all would be very much appreciated!
and it’s again a generic “please help” type of question. The author doesn’t explain the behavior of their program or how/why it differs from their expectations. Stack Overflow is not a personal help desk, do not expect us to figure this out for you.
I downvoted and voted to close. In this case, an actual ♦ moderator also voted to close the post. Their vote was binding (we didn’t need 3).
Promising title: How to write method that will check if digits of number are in ascending order?
This is a requirement dump with no demonstration of effort by the author. They later added “code”:
I hope you can tell this edit serves no other purpose than to sucker users into answering the question. They’re trying to satisfy the generic “please add your code” comment that’s often left below such questions. They don’t explain how their code behaves, why that’s wrong or what they expected instead. Don’t help these users.
One user did attempt to answer the question, dumping a solution with no explanation. They deleted their answer after 4 downvotes, hopefully having understood that such answers are not useful.
Another one reported in the SOCVR chat room: How to reinstall mac OS x after hard drive crash
These types of questions are off-topic.
The title alone has everything you need to find an answer: Java opposite of php’s json_encode — how to decode?
There have been thousands of questions asked about how to parse JSON in Java and the keywords in that title would have surfaced a large number of them, surely enough to address their issue.
I think I voted as “needing details” because of the poor description of their issue. Before the question could be closed, they answered
Never mind — I was too quick to post
with an unexplained snippet of code. That’s not helpful to anyone else.
At this point, I think I’m out of close votes. With a title like Last Object in Array Replacing All Other Objects, I already know what the problem is. Copy pasting the title itself into Google would have shown them the canonical duplicate: Why does my ArrayList contain N copies of the last item added to the list?
This is another question that’s asked almost daily.
Some users try to fit their entire question body into the title: I try to print the name from an array of objects but all I see on the screen is “Frame0”, “Frame1” and so on. Does anyone know what to do to fix it?
Those commenters have more patience than I do.
Here’s another common question: Java — Passing Strings/Arrays by value
The keywords in the title and more in the body would all have lead the author to the canonical Is Java “pass-by-reference” or “pass-by-value”? if they had just made a minimal effort to research their question. I gave the post a downvote, but since I didn’t have any close votes available, I commented with a link to the duplicate and someone else voted to close.
This title is extremely poor: Why is java changing my int to something else?
Changing how? Changing to what? To the author’s credit, the post body does contain those details. Still, the root cause of their issue is quite common. We have lots of duplicates that address it. I don’t believe they can’t find it by simply rewording the description of their problem on Google. Another community member and I listed 5 of these duplicates (in reality there are way more than 5 posts addressing this issue) as part of the closure.
For me, the disappointing part of this post isn’t the question. It’s the two users that chose to provide answers. Both of those users are very active members of Stack Overflow and I know for a fact that they’ve seen and actually answered this same question in the past. They should know better. The appropriate action here is to find an applicable duplicate (maybe one of their own) and link it to the post. I’m fairly confident they weren’t going after reputation, they already have all the privileges. They were just trying to help, but there are ways to do that without clogging the site with the same question and answers.
Questions like this one are curious at first: Unexpected Sum in Java
Is this a trick question? Is it a misinformed question? One way or another, it’s not useful and it’s not clear.
The author later added a snippet of code with no explanation and that did not reproduce the behavior they were asking about. Then why add it at all?!
Here are a few more posts that I voted to delete:
The title seems pretty clear and a quite common exercise. The question, however, is extremely poorly stated.
They copy-pasted their problem statement and posted a “solution” with no explanation of why they did what they did. This is, once again, one of those code snippets posted to pretend like they made an effort. Regardless, this question has been asked before and closed appropriately by another community member. The post itself doesn’t add any value to the website and can therefore be deleted.
Are they asking about SDKs in general or about some OCR SDK? If they do mean the OCR SDK, do they expect us to give them a tutorial on how to use it? None of this is clear. The closure could’ve been for lack of details. The duplicate might also apply. One way or another this question is poor and unlikely to be salvaged, so closure and deletion are preferred.
This is a work order, not a question asked in good faith. Downvote, close, delete.
They typed ArrayList
in one place and Arraylist
in the other. This is a classic typo, not likely to be useful to anyone else. Note that the error message actually states Arraylist
, not the correct name used in their title. Looking up that error message on Google also would have revealed the issue.
Note that I voted on this post the previous day, but came back later to delete it. A user had provided an answer which would have prevented the Roomba from deleting the post. Don’t answer these types of questions!
Although this question is off-topic, the SOCVR actually brought it up because of this answer:
This is not an answer and shouldn’t be posted as one. After it collected a few downvotes, we voted to delete it. A user also decided to edit out the language. I think I’ll return to vote to delete the parent post as well.
Summary
I probably acted on more posts than these, but some actions are hidden to me as well. For example, if I downvote a post and it’s later deleted by others, I can’t find it through my activity log.
Still, these examples should give you an idea of the quality of the content we have to deal with on a daily basis. Obviously, users posted (hundreds of questions and answers on java
and thousands across all tags daily) and I looked at way more posts than just these over the day. Most of them were on-topic and therefore didn’t require intervention. Note, however, that I didn’t upvote a single question or answer. In my opinion, none of what I came across that day justified it.
I don’t deny that we make mistakes while moderating. Users can always contact us in the SOCVR chat room (or 1-on-1 chat rooms) or leave a comment mentioning us (for example,@sotirios
) under a post where we voted. Most of us return to posts to see if they were improved (or made on-topic) and deserve to be reopened (or up/down-voted differently). Other contributors with the appropriate privileges can also reverse those mistakes.
As for being welcoming, I match my attitude to that of the author. If they’ve shown no effort, I’ll make no effort. Otherwise, I will typically engage them in the comments to explain how they can improve their posts or why their post wasn’t appropriate, or re-articulate the details provided in the answers of a duplicate, etc.
I can honestly say the examples I’ve given are very representative of my experience on Stack Overflow over the last couple of years. I’ve only contributed 32 answers in the last two years, against a total of 4,542 over the previous seven years (and no questions). I’m just as active as I was back then, but I’ve already answered most questions (about the language or common errors/paradigms) or seen them answered elsewhere. I don’t see the point in repeating those.
For off-topic questions, there are more of these now than ever before. The site seems to be doing something about it, namely reducing close votes necessary from 5 to 3. I believe that’s a step in the right direction, but other community members have better ideas that have yet to be implemented (discussed on Meta).
If you’re new to Stack Overflow, please go over the Help Center to familiarize yourself with its policies. And don’t be so easily discouraged by votes — they’re a content moderation tool, not some kind of portrayal of your competence. Remember that Stack Overflow isn’t a personal help desk and it isn’t the be-all and end-all resource for programming discourse.
If you’re an active contributor, please consider becoming more involved in moderation activities, whether it’s through the review queues; flagging spam, vulgarity, and plagiarism; or plain old up/down and close voting. The quality of the site depends on it.
Thanks for reading!