Skip to content

Commit b4b1297

Browse files
committed
Late Answer recap
1 parent fad29ab commit b4b1297

File tree

8 files changed

+4158
-31
lines changed

8 files changed

+4158
-31
lines changed

Gemfile.lock

+26-30
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ GEM
22
remote: https://rubygems.org/
33
specs:
44
RedCloth (4.2.9)
5-
activesupport (4.2.3)
5+
activesupport (4.2.4)
66
i18n (~> 0.7)
77
json (~> 1.7, >= 1.7.7)
88
minitest (~> 5.1)
99
thread_safe (~> 0.3, >= 0.3.4)
1010
tzinfo (~> 1.1)
1111
addressable (2.3.7)
1212
blankslate (2.1.2.4)
13-
celluloid (0.16.0)
14-
timers (~> 4.0.0)
1513
classifier-reborn (2.0.3)
1614
fast-stemmer (~> 1.0)
1715
coffee-script (2.4.1)
@@ -22,33 +20,34 @@ GEM
2220
colored (1.2)
2321
ethon (0.7.3)
2422
ffi (>= 1.3.0)
25-
execjs (2.5.2)
23+
execjs (2.6.0)
2624
fast-stemmer (1.0.2)
2725
ffi (1.9.7)
2826
gemoji (2.1.0)
29-
github-pages (37)
27+
github-pages (39)
3028
RedCloth (= 4.2.9)
3129
github-pages-health-check (~> 0.2)
3230
jekyll (= 2.4.0)
3331
jekyll-coffeescript (= 1.0.1)
34-
jekyll-feed (= 0.3.0)
32+
jekyll-feed (= 0.3.1)
3533
jekyll-mentions (= 0.2.1)
3634
jekyll-redirect-from (= 0.8.0)
37-
jekyll-sass-converter (= 1.2.0)
35+
jekyll-sass-converter (= 1.3.0)
3836
jekyll-sitemap (= 0.8.1)
39-
jemoji (= 0.4.0)
37+
jemoji (= 0.5.0)
4038
kramdown (= 1.5.0)
4139
liquid (= 2.6.2)
4240
maruku (= 0.7.0)
4341
mercenary (~> 0.3)
44-
pygments.rb (= 0.6.1)
42+
pygments.rb (= 0.6.3)
4543
rdiscount (= 2.1.7)
46-
redcarpet (= 3.1.2)
44+
redcarpet (= 3.3.2)
4745
terminal-table (~> 1.4)
48-
github-pages-health-check (0.3.1)
49-
net-dns (~> 0.6)
46+
github-pages-health-check (0.5.3)
47+
addressable (~> 2.3)
48+
net-dns (~> 0.8)
5049
public_suffix (~> 1.4)
51-
hitimes (1.2.2)
50+
typhoeus (~> 0.7)
5251
hpricot (0.8.6)
5352
html-pipeline (1.9.0)
5453
activesupport (>= 2)
@@ -80,36 +79,35 @@ GEM
8079
toml (~> 0.1.0)
8180
jekyll-coffeescript (1.0.1)
8281
coffee-script (~> 2.2)
83-
jekyll-feed (0.3.0)
84-
jekyll-gist (1.2.1)
82+
jekyll-feed (0.3.1)
83+
jekyll-gist (1.3.4)
8584
jekyll-mentions (0.2.1)
8685
html-pipeline (~> 1.9.0)
8786
jekyll (~> 2.0)
8887
jekyll-paginate (1.1.0)
8988
jekyll-redirect-from (0.8.0)
9089
jekyll (>= 2.0)
91-
jekyll-sass-converter (1.2.0)
90+
jekyll-sass-converter (1.3.0)
9291
sass (~> 3.2)
9392
jekyll-sitemap (0.8.1)
9493
jekyll-tagging (0.6.0)
9594
ruby-nuggets
96-
jekyll-watch (1.2.1)
97-
listen (~> 2.7)
98-
jemoji (0.4.0)
95+
jekyll-watch (1.3.0)
96+
listen (~> 3.0)
97+
jemoji (0.5.0)
9998
gemoji (~> 2.0)
10099
html-pipeline (~> 1.9)
101-
jekyll (~> 2.0)
100+
jekyll (>= 2.0)
102101
json (1.8.2)
103102
kramdown (1.5.0)
104103
liquid (2.6.2)
105-
listen (2.10.1)
106-
celluloid (~> 0.16.0)
104+
listen (3.0.3)
107105
rb-fsevent (>= 0.9.3)
108106
rb-inotify (>= 0.9)
109107
maruku (0.7.0)
110108
mercenary (0.3.5)
111109
mini_portile (0.6.2)
112-
minitest (5.7.0)
110+
minitest (5.8.1)
113111
net-dns (0.8.0)
114112
nokogiri (1.6.6.2)
115113
mini_portile (~> 0.6.0)
@@ -119,22 +117,20 @@ GEM
119117
blankslate (~> 2.0)
120118
posix-spawn (0.3.11)
121119
public_suffix (1.5.1)
122-
pygments.rb (0.6.1)
120+
pygments.rb (0.6.3)
123121
posix-spawn (~> 0.3.6)
124122
yajl-ruby (~> 1.2.0)
125-
rb-fsevent (0.9.5)
123+
rb-fsevent (0.9.6)
126124
rb-inotify (0.9.5)
127125
ffi (>= 0.5.0)
128126
rdiscount (2.1.7)
129-
redcarpet (3.1.2)
127+
redcarpet (3.3.2)
130128
ruby-nuggets (1.0.0)
131129
nuggets (= 1.0.0)
132130
safe_yaml (1.0.4)
133-
sass (3.4.16)
131+
sass (3.4.18)
134132
terminal-table (1.5.2)
135133
thread_safe (0.3.5)
136-
timers (4.0.1)
137-
hitimes
138134
toml (0.1.2)
139135
parslet (~> 1.5.0)
140136
typhoeus (0.7.1)
@@ -148,7 +144,7 @@ PLATFORMS
148144
ruby
149145

150146
DEPENDENCIES
151-
github-pages (= 37)
147+
github-pages (= 39)
152148
hpricot
153149
html-proofer
154150
htmlentities

_posts/2015-10-11-late_answers.md

+162
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
---
2+
layout: post
3+
title: My Adventure with Late Answers
4+
comments: yes
5+
tags: community
6+
---
7+
8+
![Stack Overflow is . . . rude](/images/SO_bad.png "Stack Overflow is . . . rude")
9+
10+
Last week, I finally got around to analyzing
11+
[a change](http://meta.stackexchange.com/q/266696/1438) to the Late
12+
Answers review queue. For those who aren't familiar with Stack Exchange,
13+
[review queues](http://stackoverflow.com/help/privileges/access-review-queues)
14+
give experienced users a chance to look over posts from new users for
15+
problems that can be corrected or hidden gems. The later is
16+
particularly important for answers that come over a month after a
17+
question was asked, since those answers often get ignored. Increasing
18+
the pool of new users eligible for consideration seemed like a good
19+
way to combat the commonly-held perception that Stack Overflow is
20+
rude.
21+
22+
23+
[![My motto is "Move fast and break things."](http://imgs.xkcd.com/comics/move_fast_and_break_things.png "I was almost fired from a job driving the hearse in funeral processions, but then the funeral home realized how much business I was creating for them."){: .wrap}](https://xkcd.com/1428/)
24+
25+
My main concern was that by adding more reviews, we might get into a
26+
situation where more answers were being added to the queue than the
27+
reviewers could handle. That can be a problem since ever-growing
28+
queues
29+
[demoralize reviewers](http://meta.stackoverflow.com/q/255270/1438). So
30+
most of my analysis was geared toward predicting how many extra tasks
31+
my change would create. By my estimate, it would add roughly 300 tasks
32+
a day on Stack Overflow and maybe a dozen on other large sites. Given
33+
Stack Overflow users review tens of thousands of posts a day, these
34+
numbers seemed manageable.
35+
36+
37+
Site Name | New Tasks
38+
:------------- | --------:
39+
Stack Overflow | 314
40+
Super User | 13
41+
Server Fault | 9
42+
Apple | 7
43+
Gaming | 5
44+
Ubuntu | 4
45+
All others | 3 or fewer
46+
47+
After this analysis, I consulted a colleague and decided to just
48+
change the site setting and see what happens:
49+
50+
[![4.4k Late Answers](/images/big_queue.png)](http://meta.askubuntu.com/q/14469/173605 "4.4k Late Answer reviews")
51+
52+
So my estimate was about 4 _orders of magnitude_ wrong. With a single
53+
change of a variable, I'd increased this site's outstanding reviews 10
54+
fold. And I'd made the change on every site on the network. Not only
55+
that, but there is no easy way to remove review tasks except by, well,
56+
reviewing them. I'd managed to inadvertently create a bunch of work
57+
for thousands of people. My immediate reaction was panic.
58+
59+
Then I got down to business figuring out what had happened. It quickly
60+
was clear that the change picked up late answers that were older than
61+
a day. Initially, I thought the code was only picking up a month's
62+
worth of posts (more on this later), but comments on
63+
[my answer](http://meta.stackexchange.com/a/267080/1438) fixed my
64+
misunderstanding. In fact, the change put _all answers ever_ that fit
65+
the new criteria up for review.
66+
67+
Meanwhile, I'd notified the network's moderators of the change and,
68+
thanks to their encouragement, featured the meta post describing the
69+
change on the sidebar across the network. Many sites had already
70+
started
71+
[noticing the change](http://stackexchange.com/filters/205229/late-answers)
72+
and answering the meta questions became an addition task for
73+
moderators and involved users. I couldn't keep up with those posts,
74+
but
75+
[looking back a week later](https://www.google.com/search?q=site:meta.*.stackexchange.com+"late+answers")
76+
it's gratifying to see so many informed (and considered) answers from
77+
other users.
78+
79+
Also meanwhile, people were working hard to remove tasks from the queue:
80+
81+
![Ubuntu Late Answer reviews completed.](/images/ubuntu_reviews.png "Spike in completed reviews.")
82+
83+
This activity is on [Ask Ubuntu](http://askubuntu.com/), but I could
84+
show similar charts from all sorts of sites. Traditionally, Late
85+
Answers tend to be a backwater of the review queues, so the sudden
86+
spike was a rare opportunity to earn badges for that queue. The week
87+
before my change, there were 5 Custodian badges—the bronze level
88+
for doing just one review. In the following week:
89+
90+
Badge |Queue |Awarded
91+
:--------|:----------|------:
92+
Custodian|Late Answer| 6
93+
Reviewer |Late Answer| 7
94+
Steward |Late Answer| 1
95+
96+
The [Steward badge](http://askubuntu.com/help/badges/126/steward)
97+
requires 1,000 Reviews, which is pretty hard to accomplish when there
98+
are only 300 or so a week divided among hundreds of interested users.
99+
100+
As the initial crisis began to die down, I started to wonder why Stack
101+
Overflow hadn't exploded. The answer, which I'd noticed in the code
102+
before starting research:
103+
104+
(Current.Site.IsStackOverflow ? "and p.CreationDate > GETUTCDATE() - 7" : "")
105+
106+
So I was saved by a special case that was, no doubt, built in for just
107+
this purpose. On Stack Overflow, the code does not consider answers
108+
older than a week, so it only spiked to 1500 or so. Why did I think
109+
the code looked back 30 days? I don't really know, but I think I got
110+
that from the definition of a "late answer": 30 days after the
111+
question was asked.
112+
113+
## Lessons learned
114+
115+
1. **Reading the code is no substitute for testing.** Well, I've known
116+
this for _at least_ 20 years. But thanks to my high self-esteem, I
117+
need to relearn this yearly, it seems. We have a development
118+
environment which would have been a perfect place to discover that
119+
the queue was going to spike, if only I'd thought to try there
120+
first. Alas, I did not so think.
121+
122+
2. **If you are about to make a change that might effect thousands of
123+
other people, you might want to test it first.** The bit I didn't
124+
consider was that people don't just see the number of outstanding
125+
reviews when they go to the review page. The number _also_ gets
126+
displayed for people with 500+ reputation on the top bar visible on
127+
every page on the site. So plenty of people noticed even if they
128+
don't make a habit of reviewing.
129+
130+
3. **Don't make a dramatic change if you can make several small
131+
changes instead.** Many of the comments/forceful suggestions I
132+
received in the aftermath of my fateful change hinted that a more
133+
controlled increases in reviews would have eased the concern people
134+
had. There were any number of ways I could have
135+
[boiled the frog](http://conservationmagazine.org/2011/03/frog-fable-brought-to-boil/),
136+
but the easiest would have been to increase the reputation limit in
137+
increments of 5 or 10 followed by quiescence until we reach the
138+
desired limit. The thought never crossed my mind.
139+
140+
4. **Even if you plan to make a change no matter what, it helps to
141+
notify people in advance.** Obviously, _knowing_ the actual impact
142+
of the change is a prerequisite to announcing a coming change. But
143+
if I'd known, I still would have wanted to increase the Late Answer
144+
pool. Obviously, I couldn't ask _everyone_ who has a
145+
stake. However, it would be good to let the moderators know what to
146+
expect at least a few hours in advance.
147+
148+
## Future work
149+
150+
I'd really like to see about increasing the reputation level
151+
to 100. But before I do that, I really should take advantage of the
152+
natural experiment created by the change to 50. How did people handle
153+
the flood of late answers? Overall, did we find hidden gems or just
154+
superfluous answers? In the weeks to come, will people who benefited
155+
from upvoted answers in this queue tend to contribute more and better
156+
answers? Or has the feedback come too late?
157+
158+
<!-- LocalWords: LocalWords http png https xkcd chatroom ubuntu
159+
-->
160+
161+
<!-- LocalWords: GETUTCDATE CreationDate IsStackOverflow
162+
-->

_sass/_layout.scss

+4-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@
189189
}
190190

191191

192-
193192
/**
194193
* Posts
195194
*/
@@ -242,4 +241,8 @@
242241
textarea {
243242
min-height: 56px;
244243
width: 100%;
244+
}
245+
246+
.wrap {
247+
float: right;
245248
}

0 commit comments

Comments
 (0)