Performance bugs – the dark matter of programming bugs - Ono-Sendai https://www.forwardscattering.org/post/49 <comment><AUTHOR> > Performance bugs are out there, lurking and unseen

Is it a bug if it's unseen? Code that runs slower than it could in theory is literally _everywhere_. But is it worth paying the cost of the time to fix it, if you aren't experiencing any delays?

I love the way Michael Abrash talks about optimizing. He emphasizes and re- emphasizes that optimization is for people not computers, and that if you aren't experiencing a delay, you're done.

"In other words, high-performance code should ideally run so fast that any further improvement in the code would be pointless.

"Notice that the above definition most emphatically does not say anything about making the software as fast as possible. It also does not say anything about using assembly language, or an optimizing compiler, or, for that matter, a compiler at all. It also doesn't say anything about how the code was designed and written. What it does say is that high-performance code shouldn't get in the user's way—and that's all."

[http://www.jagregory.com/abrash-black-book/#the-human- elemen...](http://www.jagregory.com/abrash-black-book/#the-human-element-of- code-optimization)

<comment><USER2> User focused metrics:

1\. It's a user facing bug if I have to purchase a bigger laptop because someone decided to get the smallest element of a list by typing list.sort()[0].

2\. It's a user facing bug if the use of my app heats up their phone, drains the battery, and leaves someone stranded w/o a way to get safely get home on a friday night.

3\. It's a business facing bug if my AWS bill is in the hundreds of thousands per month when I could be paying a mere 10s of thousands. (This is more common than you'd think)

4\. It's a user facing bug if a sudden increase in traffic (due to my product being featured somewhere) takes down my services and results in lost sales and brand damage.

I understand your point, it's not necessarily a problem if a backend feed is taking 45s instead of 30s, or if the the text input subroutine for an interactive app allocates.

As far as I can tell as a software developer and daily computer user, people aren't erring on the side of making their software too fast.

<comment><AUTHOR> 100% agree with all of these, and you did what the author didn't and added criteria that affect people. If these happen, then make the code faster!

Abrash is a well known games/graphics programmer, and part of his point is that if your game is already running at 60fps, there's no point in replacing list.sort()[0] with something else. No milliseconds saved will help anyone in that case. (Though yes, as many pointed out, power consumption may be an important metric).

Personally, I'd say if your backend feed is taking 45s and could easily take 30s, then you should fix it. :)

> people aren't erring on the side of making their software too fast

:) 100% agree... too fast isn't a problem we have. But, over-engineering is an exceedingly widespread problem, and that's where I'm coming from. If there's a user-focused metric that shows a problem, yes fix it. If there isn't a user- focused metric, then think twice. The article didn't advocate a user-focused metric as far as I could tell.

<comment><USER3> > if your game is already running at 60fps, there's no point in replacing > list.sort()[0]

If the game runs on a device with a battery then reducing that load is a reason. You already implied that though.

I suspect hard to quantify improvements in quality is not what you are trying to rail against. If the software is going to be used widely or for long duration hard to quantify improvements can easily save millions in the long run.

There are over-engineering efforts where people try to shoehorn in bad design strategies, over-abstract an already well abstracted or refactor well working code to be more "testable" when it is already tested. All of those should be opposed, but how do you draw the line be over-engineering and hard to quantify quality increases?

<comment><AUTHOR> > how do you draw the line be over-engineering and hard to quantify quality > increases?

That is a really good question. That is _the_ question, IMO. I don't know the answer, and if I did I'm pretty sure I could make a lot of money doing it. It's a balance, maybe the right thing to do is just make sure you have forces in both directions, and don't let one force dominate for too long. Make sure in your working groups there are always people asking if there's a user facing metric, a real tangible reason or justification for the code you're planning to write or optimize. And also make sure there are people who are good at planning for the future and are good at coming up with user-facing justifications for upcoming plans.

</comment></comment></comment></comment></comment><comment><USER4> I have seen too many of these to keep track of.

But I will never forget once having to work with some Windows software written by someone else. He decided to parse a CSV file by reading the whole thing in memory, and then literally chopping off one character at a time..copying the rest of the string. It made what should be an instantaneous import of a fairly small file into a 20 minute ordeal. Simply reading in one line at a time would have been a massive speedup.

I did not have access to change it. I asked him to fix it. I begged him to fix it. His response was to shrug and say, "Who cares? This runs as part of a batch process with nobody in front of it. It works fine." That may be, but _I_ cared because _I_ had to sit through it repeatedly while debugging certain misbehavior that arose in said batch process.

Years later I was talking to an ex-coworker who stayed at said company after I left. He reported that that original developer after I left had to make a fix to said batch process. While doing so he had fixed the performance bug and was an instant hero among a number of other people who had to sit through the same import repeatedly over time.

Yeah..it turns out that he had made the fix I'd originally asked. And nobody realized that he had caused the problem originally AND refused to fix it.

That's one developer that I'm glad I will never have to work with again...

<comment><AUTHOR> That would be pretty frustrating and annoying!

This reminds me of a story I heard about a lead game programmer who made a habit of pre-allocating an unused megabyte at the beginning of a project. The last week before ship, when the game would crash out of memory often and everyone was freaking out and trying to squeeze every last byte out of their code, he'd comment the allocation nobody had noticed, free up a megabyte, and be the hero that made the game fit.

<comment><USER4> That one is famous.

But in the version that I heard, the lead programmer didn't do it to be a hero. He did that because he knew that it is easier to not waste memory up front than it is to figure out where you can save it at the end. Therefore he made sure that memory became an obvious problem early on so that people were careful about it the rest of the way through development.

In other words _because_ he did that, the game hit memory targets that it never could have had people waited until they tried to squeeze everything in at the last moment and only then found that they were out of memory.

</comment></comment></comment><comment><USER5> Quote from the linked article by John Carmack[1]:

> The fly-by-wire flight software for the Saab Gripen (a lightweight fighter) > went a step further... Control flow went forward only. Sometimes one piece > of code had to leave a note for a later piece telling it what to do, but > this worked out well for testing: all data was allocated statically, and > monitoring those variables gave a clear picture of most everything the > software was doing.... No bug has ever been found in the "released for > flight" versions of that code.

When I started writing Arduino code, I independently re-invented this technique. I write my code with only fixed-size loops and no delay() calls (basically cooperative multitasking), making heavy use of finite-state machines to keep track of what should happen when.

This style of code takes some getting used to, but its advantages are enormous: I see other people using delays and busy-loops and then struggling to get interrupts working to keep their device responsive, whereas I have a clean linear set of logic that can be easily understood and is free of strange race conditions and the like, and is _guaranteed_ to keep responding to events.

This style also makes it easy to literally eyeball performance: attach a bicolor LED (one that has e.g. red and green LEDs in the same package) and tell it to toggle colors once per loop. If the main loop is taking more than 8 milliseconds or so the LED will start to flicker visibly; if something pauses the LED will go solid and it's obvious the main loop is frozen.

[1] [http://number- none.com/blow/blog/programming/2014/09/26/carm...](http://number- none.com/blow/blog/programming/2014/09/26/carmack-on-inlined-code.html)

(Edits for clarity and writing style.)

<comment><USER6> I would like to see more of this style of code (specifically in the Arduino setting) as I'm having trouble seeing what you're up to from here. Is some place I can read more - ideally, actual code?

<comment><USER5> Most of the code I've written either can't be released for privacy reasons (I don't feel like scrubbing out the info of the person I wrote it for) or is weird one-off experimental code that's a pain to explain.

However, I did find one standalone project that illustrates the point quite elegantly; I've just written up some documentation and posted it on [https://github.com/wolfgang42/iDropper- arduino](https://github.com/wolfgang42/iDropper-arduino)

This code cheats a _little_ bit in that it has some delay loops in it; this is because the timings are finicky and it was a lot easier to write this way. Notice, however, that the `idrop_loop()` function that drives everything still specifies a four-millisecond maximum runtime, far under anything that I've ever needed to worry about.

Let me know if you have any questions about this; I feel that some of the explanation I wrote isn't quite as clear as it should be, and because the code is so minimal (it's really more of a library than a full project) it doesn't illustrate the point quite as well as I'd like.

<comment><AUTHOR> I don't have any examples to share, but I'll add that the thinking behind this style is sometimes codified by style guides for projects that requires high levels of code safety. The best example I can think of is the famous "Power of Ten" rules for code safety published by NASA. Follow these rules, and the byproduct will be the kind of code we're talking about.

[http://pixelscommander.com/wp- content/uploads/2014/12/P10.pd...](http://pixelscommander.com/wp- content/uploads/2014/12/P10.pdf)

</comment></comment></comment></comment><comment><USER7> One of my favourite examples:

A friend once sped up some code 90% by changing a

list.size() == 0

to

list.empty()

yes, std::list::size() can be _linear_ in C++98.

[http://www.cplusplus.com/reference/list/list/size/](http://www.cplusplus.com/reference/list/list/size/)

<comment><USER8> std::list is a linked list, so it makes sense that size() is linear. Only if you store the size separately, you get constant behavior (which the c++11 enforces), it's constant.

Your friend probably could've sped his code up even more by using a std::vector. Linked lists have very bad processor cache behavior (not allocated in continuous memory), there are not a lot of things a list does better than a vector.

Only if you prepend a lot, or insert in the middle of a list, it might have some advantages over a vector, even then, there're are better alternatives.

<comment><USER3> I have timed it on several implementations and posted (mostly on on reddit.com/r/cpp), but until you get several thousand items std::vector is just faster than std::list. Of course it varies from machine to machine, for example my 4th gen i7 could insert about 8,000 items before list finally got the same speed as inserting at the front of an std::vector and my AMD 8150 (The bulldozer thing way before ryzen) was about 3,500.

I did similar tests comparing linear scans through an std::vector and lookups in a std::map or std::unsorted_map, with similar results, many thousands of items are required before dumb vectors got slow.

My default rule is to use a std::array if the size is fixed or an std::vector if the size changes until I hit 1,000 items. Then look at the complexity notation of the operations I am doing and choose what containers to then to benchmark. Then I throw a couple microbenchmarks in the test suite and use whatever that tells me will be faster in my case. Sometimes I even go so far as to use ifdefs and typedefs to change the container for different builds.

In practice I use a lot of std::vectors and I sort them a lot. Sorted vectors are very fast in the general case. In the few workloads I have with large numbers of items, even with millions of items, I use std::sort and std::binary_search with std::vector because they can be much faster than other associative containers. You do need to use operator< intelligently and that means either already passing in an overload for the comparator function or making a simple container class that wraps these concepts the way that makes sense for your workload.

<comment><USER9> Amazing how often just replacing a std::vector with a gap buffer vector implementation will get both the benefits of vector storage combined with good insert/delete behavior (presuming locality of such operations which is often the case, especially when doing something that scans through the array).

</comment></comment></comment></comment><comment><USER10> One recent example of this is Synapse, the Matrix messaging server.

Synapse was generally considered to be inefficient and a huge memory hog, so they have been experimenting with various ways to rewrite it in Go, saying[1] at the end of last year:

"Synapse is in a relatively stable state currently ... we're starting to hit some fundamental limitations of the architecture: ... python's single- threadedness and memory inefficiency; ...; the fact the app papers over SQL problems by caching everything in RAM (resulting in synapse's high RAM requirements); ..."

But in January[2] it was discovered, during the investigation of another problem, that the vast majority of the memory usage was due to a bug:

"It's also revealed the root cause of why Synapse's RAM usage is quite so bad – it turns out that it actually idles at around 200MB with default caching, but there's a particular codepath which causes it to spike temporarily by 1GB or so – and that RAM is then not released back to the OS."

I wonder if they would still have started the Go rewrite if it hadn't been for that bug. (It seems the new implementation has a better architechture and is substantially faster, so I guess it's still a good idea though, but maybe not as urgent as before?)

[1] [https://matrix.org/blog/2016/12/26/the-matrix-holiday- specia...](https://matrix.org/blog/2016/12/26/the-matrix-holiday- special-2016-edition/)

[2] [https://matrix.org/blog/2017/01/06/synapse-0-18-6-is-out- ple...](https://matrix.org/blog/2017/01/06/synapse-0-18-6-is-out-please- upgrade-especially-if-on-0-18-5/)

<comment><USER11> This is a great example of why you can't take perf related issues intuitively or at face value. Profiling and in depth analysis is always needed. I wonder if this could have been more easily spotted earlier on if a better analysis was done.

</comment></comment><comment><USER12> Back in 2001, Joel Spolsky coined "Schlemiel the Painter's algorithm" to illustrate the same class of inefficient programming techniques: [https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Pai...](https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm)

His particular example was with the standard C library function strcat where each new invocation traverses the enlarged string over and over from the beginning, in order to find the terminating NUL character and append the new part.

</comment><comment><USER13> I define a special category of distributed system performance bugs. The fact that proper distributed tracing is not standard yet (especially outside of cloud environments) is a real pain here. The google white paper on Dapper [0] and all its implementations [1][2][3] in one form or another are appearing but usually target the Web environments. That means that for my legacy stack with multiple nodes connected via networks of different kinds I have to profile on multiple systems, aggregate different log types manually, think of time syncs (not everything logs utc..) and so on. To be honest we just reached the point where we try to get a European subsidiary project rolling where we address this problem. The time lost to trace down unexplainable time gaps between first displayed result in app and request are weeks, and in multiple occasions months. Just because we have no easy way to profile our distributed ecosystem.

After identifying who is to blame: network, db nodes, processing nodes, application logic, cache (invalidation); we can talk about fixing.

For fixing of course it would be great if you could extract a meta model of the application and another of the hardware. Changes to those models and some nice prediction of impact would be the ideal end goal. Or, if we are wishing anyway, some nice DSE on those models to optimize would be even better.

[0] [https://research.google.com/pubs/pub36356.html](https://research.google.com/pubs/pub36356.html) [1] [http://opentracing.io/](http://opentracing.io/) [2] [http://lightstep.com/](http://lightstep.com/) [3] [https://aws.amazon.com/xray/](https://aws.amazon.com/xray/)

<comment><USER14> OpenTracing has libraries for C++ (though it needs work tbh) and Java which can be used for mobile. The idea is to cover your entire stack ...

<comment><USER13> I know. But our stack is C#, Wcf, websockets with c++ where performance is required and some RestAPI/wpf/html5/typescript/javascript ui/clients.

The stack is something grown the past 15 or so years (medical business). The existing options are not mature enough yet for us to be used, or not available yet on our platforms.

</comment></comment></comment><comment><USER15> Occasionally I like the idea of producing some sort of dynamic instrumentation code (I privately think of it as "shitgrind") that detects dynamic code that is doing redundant work and flags it. Of course, this doesn't tell you that the code is useless (i.e. I might have to initialize something that subsequently isn't used down some deep and not-anticipatable-at-compile-time set of branches), but it might provide hints that I'm doing a lot of writes that never match up with reads, or that the writes/calculations that I'm doing are going into places that already have that value. It would be incredibly slow but there are plenty of uses I can imagine where you could detect performance problems in a toy version of the problem (maybe running 100-1000x slower) that are the same problems that you would have in the real version of the problem at full scale. Would be a fun project, IMO.

<comment><USER16> Assembly instruction level profiler? Sounds like an extension to callgrind.

<comment><USER15> Well, not just instruction profiling, but profiling of effects and tracing of all reads/writes. Very, very expensive.

</comment></comment></comment><comment><USER17> Even though I agree that >>insert method of std::map is roughly 7 times slower than it should be<< is bad, these kind of problems are not too hard to find and solve if they are actually problematic for your software.

The most problematic performance issues I've come across were usually bad/premature optimizations that were not (correctly) validated against a simpler implementation as a performance baseline. Things like parallelism (multi-threading, web workers) or caching can absolutely tank performance if not done correctly. Plus they usually tend to make stuff more complex and bug- prone.

</comment><comment><USER18> This is one of the few areas where adding more levels of abstraction cannot help you fix the problem. It's remarkably easy for some library function or low level of the program to have O(n) performance that ends up getting called in a loop with the same input or output.

<comment><USER19> > This is one of the few areas where adding more levels of abstraction cannot > help you fix the problem.

I'm not sure that's true. It is of course true that adding levels of abstraction often degrades performance, but I don't think it's necessary.

In fact, programming languages themselves are abstractions. It's pretty well agreed at this point that a good C compiler will generate faster code than someone writing assembly. It's of course _possible_ to write code that's at least as fast in assembly, but in practice, nobody would do it, because the program would be unmaintainable.

You can make abstractions fast, and one of the benefits of doing so is that you can make your abstraction be the _easy_ way of doing things. That means, by picking the easiest solutions, the people on your team are _also_ using an efficient solution.

<comment><AUTHOR> > It's pretty well agreed at this point that a good C compiler will generate > faster code than someone writing assembly.

I've honestly never heard that before. If you'd said "a good C compiler will generate code faster than someone writing assembly," then I'd agree... ;)

<comment><USER12> How many die-hard assembly programmers today would do a better job in register allocation, instruction scheduling based on the latency of each individual instruction, instruction selection to pick the instructions with the minimum encoded length, avoiding pipeline hazards or doing inlining decisions? These are hard optimization problems that require some real CPU juice to get right. An additional bonus is that the compiler does these really quickly for you and you don't have to worry about the instruction scheduling each time you refactor the code, for example.

<comment><USER20> Funny thing is that one of the bigger problems with optimizing compilers _is_ register allocation. Not only is it difficult to write a good algorithm for it, but compilers don't always know what variable is most important to keep in a register. Gcc even implemented a weaker allocator [0] as the older one was too complex to decipher problems with it.

Instruction scheduling is not a problem on modern cpu's. Not that it's hard either way, just reorder things around memory access and heavy instructions like division. Agner Fog made a nice table of instruction latencies and throughputs [1].

Instruction encoding length... do you use 16bit integers or do you just int everything ? The compiler has to do what you tell it to do. Sure there are plenty of tricks around that but those are not the ones that give the compiler a remarkable advantage over humans. Tricks like using bitwise operations instead of multiplication and such and shortening equations is the advantage that the compiler has. But even that is not that big of a deal. (again, do you use the restrict keyword ? or static/define for constants ? do you know that C treats every "compile unit"(.c file) as a separate program ?)

[0] [https://gcc.gnu.org/wiki/cauldron2012?action=AttachFile&do=g...](https://gcc.gnu.org/wiki/cauldron2012?action=AttachFile&do=get&target=Local_Register_Allocator_Project_Detail.pdf)

[1] [http://www.agner.org/optimize/](http://www.agner.org/optimize/)

<comment><USER16> I wonder if there is a resource for ARM CPUs like Agner's...

</comment></comment></comment></comment></comment></comment><comment><USER21> I'm open sourcing a Java Selenium library with page performance assertions built in as part of my startup. It will let you do things like:

       test.config.setSLAMaxTime(2000); // set time in MS

       assertSLAMet(); // add this to any page

It will also allow you to assert specific URL's, and window timings. You can then use these assertions to pass/fail builds. I also have some other nifty ideas on preventing performance regressions I'm building into this (smart benchmarking vs. previous).

If anyone is interested, I'll be announcing it here when we open source it:

[http://signup.browserup.com/](http://signup.browserup.com/)

<comment><USER22> > What if your Selenium tests had performance asserts for CI/CD

Isn't this just... a single function? Like, how the heck do you build a startup around that. We do this as part of our Python selenium tests, I didn't realize it wasn't built in to be honest.

<comment><USER21> There's a lot more to it--this is just a tiny part we're giving away, not something we'll make money on.

We do real-browser load testing in the cloud using the same scripts folks use for integration testing. Because they can also run locally, you can run them alongside your integration tests with each commit, and you always know you have working scripts. Scripts are easy to code and maintain because they can use page objects like functional tests.

This means you can have versioned load test/monitoring scripts in your project that always work with a particular sha. When you deploy, you can start transactional monitoring immediately. It also means load testing is not a separate stage in your development lifecycle.

</comment></comment></comment><comment><USER23> It's only a bug if the stakeholders that surround the program agree that there should be (or already is) in place a performance _requirement_ which is not being met.

Opportunities to uncover performance that could be improved and impose requirements against it are out there, lurking unseen. Only problem is you have to convince people to care on a case-by-case basis.

</comment><comment><USER24> At one point I was working on a utility to detect suboptimal sequence of method calls; canonical example is using "[1,2,3].select {|x| x > 1 }.first" rather than "[1,2,3].detect {|x| x > 1}". These can be performance issues, although the bigger win is in readability and communicating the developer intent. More details and examples here if you're interested:

[https://thomasleecopeland.com/2014/10/22/finding- suboptimal-...](https://thomasleecopeland.com/2014/10/22/finding-suboptimal- api-usage.html)

I haven't worked on it much recently though because the problems it found weren't that significant. But I like the idea of runtime analysis for finding issues, especially in a dynamically-typed language.

</comment><comment><USER25> An internet points out the obvious -- that performance matters in computing. Hackernews nods in agreement, then goes back to coding Ruby on Rails applications in an editor implemented in HTML5 and JavaScript that consumes 13% CPU just to make the cursor blink.

</comment><comment><USER26> "It takes an experienced programmer, with a reasonably accurate mental model of the problem and the correct solution, to know how fast the operation should have been performed, and hence if the program is running slower than it should be."

I love this sort of approach to performance. If you know the hardware, the software, and the application, you can predict how fast it should go. That's surprisingly rare, in my experience, sadly. About the time I wrote lmbench I was sitting in a lot of meetings at Sun where people were saying "we should do this" and I could do a mental estimate of how fast it would go (I memorized most of the stuff that lmbench measured so I know how many packets/sec we could do, how many iops, how much memory bandwidth we had, etc). You'd be amazed at the number of times "architects" were proposing to build something that couldn't possibly work.

It's pretty systems-y and not that common in programmers, what with today's frameworks and all. But there is still some value in being able to predict how fast something should run. I love it when I see people doing that with the needed knowledge to be accurate, very fun to watch.

</comment><comment><USER27> I did several research projects on performance bugs during my phd. [https://songlh.github.io/](https://songlh.github.io/)

</comment><comment><USER28> Reminds me of [https://accidentallyquadratic.tumblr.com/](https://accidentallyquadratic.tumblr.com/)

</comment><comment><USER29> Performance sort of has a paradoxical "coffee test": something that takes a few seconds is aggravating and you will _wait_ for it but something that routinely takes 5 minutes will make you go get coffee or switch tasks completely.

With enough alternate tasks, waits are absorbed. Oddly, overall _throughput_ can be worse with sporadic tiny delays that are technically indicative of a fast task.

You don't just want fast operations, you want programs that can be smart about gathering unavoidable delays into chunks. This can even pay dividends when consuming resources, as the gathered steps may use less (e.g. laptop wakes dormant hardware just once to perform several grouped tasks, instead of repeatedly over a short time frame).

</comment><comment><USER30> In practice the majority of web app performance have more to do with latency of IO. People seem to forget that 4ms may seem fast to humans, but it's glacial to computers. Add 100 4ms calls to the DB and all the sudden your code is waiting for half a second if it does nothing else.

<comment><USER16> Bonus points that in a real real-time system (anything with a GUI) you might have only a 1 ms or less to handle an event in a bigger stream, e.g. dragging. This is why so much UI is or should be really asynchronous.

</comment></comment><comment><USER15> We run into this a fair bit of the time with Hyperscan. One particularly noxious anti-pattern that can arise is the "prefilter that isn't" anti- pattern: specifically, a multiple stage pipeline where the initial stage is meant to filter out some portion of false positives when feeding to a more expensive check, but isn't doing its job.

The painful thing is that the expensive check downstream winds up doing everything, but the code still "works" because the expensive check is the only necessary part (well, as long as the pre-filter isn't totally hosed and isn't producing false negatives).

</comment><comment><USER31> Performance issues come in all flavors...

\- CPU usage (complexity, cache misses...)

\- Memory usage (leaked resources like memory, connections and handles)

\- Excessive I/O (networking, files...)

\- Concurrency (contention, starvation, deadlocks, livelocks...)

There's no one size fits all profiler. I find load testing in combination with profiling very useful to get an idea of how a system performs.

Usually I keep injecting load until the system fails then find what failed.

There are other approaches, like automated performance testing (writing tests with assertions on performance). e.g: [https://scalameter.github.io](https://scalameter.github.io)

</comment><comment><USER32> Oh boy, it becomes far worse when you are dealing with javascript and web apps. Pretty much all modern day "best practices" are not, but bullet hole leaks of performance.

I spent about a year researching this and put together my findings into this (too short) 20 minute tech talk: [https://youtu.be/BEqH- oZ4UXI](https://youtu.be/BEqH-oZ4UXI) hopefully others will find it useful too.

Or just never use JS ;) but it is possible to make it fast.

</comment><comment><USER33> The fun begins when you need to find performance issues in production, where you cannot really use profiler. Then you need to jump into APM tools. Unfortunately it seems there nothing really for that level for free, but take this for example: [https://www.dynatrace.com/blog/code-level-visibility-for- nod...](https://www.dynatrace.com/blog/code-level-visibility-for-node-js/)

<comment><USER34> Can't you just use something like performance counters, like perf for Linux?

<comment><USER35> In my experience, it's very difficult to tie profiling data from generic profilers to specific requests, then to the specific lines-of-code triggering the problems.

This is important because many performance conditions don't reveal themselves all of the time: for example, it's very common that an issue might only be a problem for your largest customers. The context is really important.

Scout has a production-safe profiler for Ruby apps that builds on the wonderful StackProf gem that does this: [http://help.apm.scoutapp.com/#scoutprof](http://help.apm.scoutapp.com/#scoutprof)

</comment></comment></comment><comment><USER36> Already down. edit: up again now

[https://webcache.googleusercontent.com/search?q=cache:o4ftZJ...](https://webcache.googleusercontent.com/search?q=cache:o4ftZJqeuhsJ:https://www.forwardscattering.org/post/49+&cd=1&hl=en&ct=clnk&gl=ro)

<comment> Ono-Sendai Oh the irony :) Will try to fix.

Edit: Back up, let's see how long it lasts now :)

<comment><USER37> Less than 15min ;)

Edit: back up after further 10min. Seems like it moves in waves.

</comment></comment></comment><comment><USER38> > when I was working on the Doom 3 BFG edition release, the exactly predicted > off-by-one-frame-of-latency input sampling happened, and very nearly shipped

What is this predicted off-by-one-frame-of-latency input sampling ?

</comment><comment><USER39> If performance matters, benchmarking the heck out of everything helps quite a bit! I like the style of benchmarks that focus on comparing iterations per second.

</comment><comment><USER40> Personal blog authors - if you insist on not using Medium/similar big box blogging service, just host your blog as flat files on S3. It will never, ever go down when you hit number 1 on HN (as this poor author's site has).

<comment><USER41> It wouldn't go down with flat files even if you hosted it on an arduino connector to your phone's tethered wifi.

<comment><USER42> How many tls handshakes per second can an arduino manage? Https everywhere isn't cheap.

</comment></comment></comment><comment><USER43> Ironic that the site is down...

</comment><comment><USER44> "Should" is a tricky word.</comment>


Reasons Tumblr went down - <AUTHOR> http://wellbebackshortly.com/ <comment><USER2> You (and certainly I) wish to have the amount of traffic [1] Tumblr has, to put it simple, this is an awesome problem to have :-)

With that being said, they didn't take it lightly:

"know that this is absolutely unacceptable to our team, and unacceptable for a platform determined to be the best place in the world for your creative expression" [2]

I mean, what else can they say? Refund the customer's money? They've already done that.

[1] [http://www.quantcast.com/profile/trafficGraph?wunit=wtpub%3A...](http://www.quantcast.com/profile/trafficGraph?wunit=wtpub%3Apixel%2Fp-19UtqE8ngoZbM&drg=&dty=ar&gl=all&reachType=period&dtr=dm&width=522&country=UK&ggt=large&showDeleteButtons=true&v=1642576819)

[2] <http://staff.tumblr.com/post/2127872280/downtime>

<comment><USER3> As the creator of this site, I agree. It's all intended in good fun.

</comment></comment><comment><USER4> Cute doesn't cut it when people are relying on your business. I sure hope no SaaS vendors take this approach.

<comment><USER5> The major downtime sucked, and the minor hiccups still continue to suck. But I think we also need to realise it's free. It doesn't excuse the lack of communication, but lofty expectations of uptime for a service that's offered freely seem asinine.

<comment><USER6> On a site like Hacker News, we judge Tumblr both from a consumer point of view, but also from a start-up point of view. And from the latter, this instability is a really big problem.

<comment><USER7> and beyond that, if you set the expectation that you're giving a pro service, regardless of the price, then you should probably do what you taught people to expect...especially with millions on funding.

</comment></comment></comment></comment><comment><USER8> This one could, sadly, be true: _WikiLeaks was hosted here_

</comment><comment><USER3> I created this, and it might be a good time to mention that I'm always looking for new opportunities. I'm a well-rounded front-end developer with a sense of humor. ;)

</comment><comment><USER9> "Doing bong rips of salvia with Miley Cyrus"

There's no excuse for downtime, but if there were, this would certainly be one.

</comment><comment><USER10> funny this guy has more sites like this <http://reasonstumblrwentdown.com/>

<comment><USER3> Same app, different path. (I couldn't decide on the morning that I whipped this up.)

</comment></comment><comment><USER11> "Gone for lunch, be back in 10"

Oh OK, I'll wait...gone.</comment>


Don't tell me what my browser can't do - <AUTHOR> https://www.christianheilmann.com/2016/01/16/dont-tell-me-what-my-browser-cant-do/ <comment><USER2> (if you don't know the author, he's a web evangelist, working previously for Mozilla, now for Microsoft; now you can understand his frustration, in the times of recent Chrome monoculture in the web)

I wholeheartedly agree with the author and wanted to post another long rant here, but I resisted the temptation :)

In this particular example of a WebGL demo, I think it was not exactly malicious, the issue was IMO most probably due to writing non-future-proof code, and then abandoning it (there was a related post last week about writing non-future-proof Python code that will break in python4, same applies here). Lots of early "HTML5" demos do not work anymore because they used some not- yet-standardized and/or prefixed syntaxes that have changed since etc.

Anyway, the link to [1] is very interesting. Many people underestimate the risk of third-party JS server going down (or being slow), adblockers preventing some JS from executing etc.

Edit: to clarify, I don't mean you should not use JS (heck I'm a JS developer, and IMHO the times of "progressive enhancement" are long gone, unless you serve almost only text content). I don't mean you should have 3 redundant servers to serve your JS from; just detecting that the thing didn't load, and not making assumption that it will be reliably delivered to the user in 0.1 s, would be good enough. There are pages out there that will totally break or fail to load if some non-important JS file is not loaded due to a network issue or whatever else.

It doesn't require infinite amount of work to handle some cases like that (though, sadly getting management buy-in for even small things like this is not easy, and we might sometimes have to go against the flow for the good of our users).

[1] [http://kryogenix.org/code/browser/everyonehasjs.html](http://kryogenix.org/code/browser/everyonehasjs.html)

<comment><USER3> <sarcasm> hahaha I love it. Better yet:

Do your roads support horses?

Many people own horses in America still[0]

Have they got to the destination yet?

FACT: All people who are not traveling, are not traveling by horseback. --socrates

If you're on a highway and suddenly the edgecase of therebeing a fuckton of cars going fast on it occurs, suddenly they have to swerve to avoid a random cowboy and get in an accident, then they don't make it to their destination.

Do your interstate or inter-province highways prevent horses? Loads of them do[1]

You wouldn't download a car[2]? </sarcasm> </comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>====

Look, I get it, provide a good user experience. That's fine, I appreciate that. However, javascript is pretty ubiquitous, so what the fuck are people supposed to do? Check headers and sniff browser on every request (something the parent article implied was negative), then send 2 sets of javascript to the user, one to call a cdn, and one to call a local script if download fails or cdn not cached? Check if cdn is cached every time?

I mean, sure there is some pretty good practices out there and you should be cognizant of that, but if you are just sending out a cat picture because you're a bored 16 year old kid learning how to use a new web technology like webgl, are we supposed to hold you to 5 9's worth of uptime and backwords compatability all the way to mosaic.

Here is the answer (my answer really) you can do whatever the fuck you want, to the extent that wtfyw overlaps with what your users want, you can keep them.

[0][https://en.wikipedia.org/wiki/Horses_in_the_United_States](https://en.wikipedia.org/wiki/Horses_in_the_United_States)

A USDA census in 1959 showed the horse population had dropped to 4.5 million. Numbers began to rebound somewhat, and by 1968 there were about 7 million horses, mostly used for riding. In 2005, there were about 9 million horses.

[1][http://www.rita.dot.gov/bts/sites/rita.dot.gov.bts/files/pub...](http://www.rita.dot.gov/bts/sites/rita.dot.gov.bts/files/publications/journal_of_transportation_and_statistics/volume_07_number_23/html/paper_06/index.html)

[2][http://www.slideshare.net/arnoudengelfriet/you-wouldnt- downl...](http://www.slideshare.net/arnoudengelfriet/you-wouldnt-download-a- car)

</comment><comment><USER4> Whether or not you like the delivery, it is a reasonably good point. Personally, I'd have loved to read a little more how to do it right and a little less why.

The how to do it right is important because WebGL adoption is growing, and plenty of sites actually require it, as opposed to only having a tangential demo or fancy logo on it that isn't strictly necessary. If your site absolutely requires WebGL, and you block browsers incorrectly, you're hurting your site drastically.

I don't know what the best way to do it is, and I'd love to hear what other people do. My current thinking is: don't screw around with user agents, of course. This might be where the OP's complaint came from, because if you try to whitelist compatible browsers, new ones will always break immediately.

A better approach is put a canvas on your page, try to grab the webgl context, and check whether it failed. That way, if webgl can work, it will, and you only block people who have it turned off or actually have on old browser.

The message that announces the reason for failure is important, IMO. You can put up some explanation for how to fix the problem, because sometimes its fixable, or you can do something off-putting that only says 'fail' and chase people away.

<comment><USER5> My objection is this paragraph:

 _You don't have to support old browsers and terrible setups. But you are not allowed to block them out. It is a simple matter of giving a usable interface to end users. A button that does nothing when you click it is not a good experience. Test if the functionality is available, then create or show the button. This is as simple as it is._

lolwut

Giving a usable interface for old browsers is definitely a form of support. You're telling me that my app has to support the Gopher protocol too?

At the end of the day, it depends on your Product and its Users. Some have to support many browsers. Some don't. No one expects an American vending machine to accept Euros as payment.

<comment><USER6> > Gopher

Nobody said anything about non-HTML markup. This is a straw-man argument.

> form of support

The entire point of implementing a proper progressively enhanced design is that you _don 't_ need to add extra support for older browsers. Handling missing features is important because "older browsers" isn't the only time errors happen.

Progressive enhancement is mostly good error checking. You should handle missing JS features (or missing JS entirely) for the same reason you should be checking calls to fopen(3) for NULL; skipping that check means you simply fail badly on errors. A webpage that sends an empty body tag is similar to a traditional program that crashes without any error message because it tried to use a NULL file handle when opening it's config file.

If your tools aren't handling a lot of this for you (Rails has since very early versions), maybe get better tools or maybe bug vendor?

> usable interface

Nobody expects _identical_ functionality when the JS doesn't load. Obviously, some features won't work, and it may not look as nice. Choosing exactly how to handle an error condition is one of the many design decisions programmers have to make. Skipping optional features like dynamic page rewriting (pjax or even simple remote ajax forms) may be slower, but skipping those features and leaving links/forms as traditional page-reloads is a better way to handle a failed JS download than blocking the entire page with an error message (or worse: leaving the person who visited your site with a blank page).

// I _suspect_ that a lot of the "interface" that is apparently so important to get right is _advertising_.

</comment></comment></comment><comment><USER7> For some reason this article received a fair amount of negative feedback here. I quite enjoyed it.

It's good to remind developers that they should ensure that their products degrade gracefully, and to give a few examples of what could go wrong. Mentioning the (somewhat basic, but still generally effective) fault-tolerance of HTML/CSS vs JS along with the user's basic viewpoint also helps to get his point across further.

Maybe I'm just used to reading longer form content, but I didn't feel that this brief blog post was a waste of time.

<comment><USER8> > It's good to remind developers that they should ensure that their products > degrade gracefully

I agree! I don't think it's a bad reminder, I think it just rubbed me the wrong way that he seems to present this whole concept like something new and novel, when frankly, it's just...not. The entire blog post doesn't have a single mention of either "graceful degradation" or "progressive enhancement," both of which would be useful to hear if a reader wasn't familiar and wanted to learn more about this topic.

</comment></comment><comment><USER9> I use Linux+Firefox+Pipelight. Amazon Video used to work well with this, until some bright mind decided to force Silverlight and to check browser agent strings beforehand to make sure you are using a "supported browser version".

Of course, this bright mind never thought of people using pipelight. Well, now I have to set my browser agent to pretend I'm on Windows or Mac to get things working. Thanks Amazon for sucking so much.

</comment><comment><USER10> Protip for Web programmers: "No, you can't count on Javascript."

Yes, I block your shitty Javascript. If I enable Javascript, I enable for your domain only. The 18 other domains are not going to load.

Get over it.

<comment><USER11> You and 0.0001% of the other users.

That will probably not exceed a total revenue of more than a couple dollars, so I guess I can get over that much quicker than you can find another site that does the same but works without Javascript.

But then I am a game dev, it is basically impossible to make an HTML game work without javascript and it is certainly not worth the investment.

Javascript is here to stay. You don't have to run it, but if you expect that people care you will be disappointed.

</comment></comment><comment><USER12> The problem is that it takes effort to support both with and without JS, and effort costs money. Just like many developers I like to do things properly and support both, however in a business context it doesn't always make sense to do so. 80/20 rule.

</comment><comment><USER13> how do you write like 1500 words saying the same thing over and over and over? Read this article for 1500 simple little examples!

In before "say something positive": If whoever wrote this gets to write a long rambling complaint about some random website nobody has ever heard of having a bad error message, I can equally complain about my pet peeve: "people writing long blog posts whining about things that set them off but aren't the real reason they are so angry to begin with".

<comment><USER14> Yeah, my immediate response was "Don't tell me who my customers are!" This is all a bit like storming into a Chinese restaurant then berating them for not having menus written in Slovenian.

His point about faulty sniffers throwing useless warnings and blocking content that could load is rock-solid, but it's obscured but everything else he's saying.

</comment></comment><comment><USER15> Seems a lot of people are doing the shit "we" (as in the older, sometimes even somewhat grumpier developers) have seen in the 90s, as in the "best viewed with Internet Explorer" shit -- making websites completely inacccesible to Netscape, all over again.

But this time with Chrome versus every other capable browser on the market.

Sigh.

</comment><comment><USER16> OK, so the author purports to be on the side of "end users". And he purports to share empathy with users who get annoying messages that their browser is lacking, outdated, etc.

As an "end user" who has gotten hundreds of such messages over the years, I ask: How about Silverlight? Have you ever gotten an annoying message along the lines of "Sorry, you need Silverlight"?

I have. And I assure you I do not need Silverlight to watch video.

Speaking of empathy, just this week I believe someone posted to HN about a still undisclosed 0-day for Silverlight that someone wrote years ago, that still works flawlessly and recently sold for tens of thousands of US dollars on the black market.

</comment><comment><USER17> I think he's really made because when developers write error messages the company doesn't like to suck it up and take the blame i.e. " we don't support your current browser" vs "YOU don't have webgl"

</comment><comment><USER18> I'm sorry that you wasted your time going to a web toy you were not able to see! :'(

The developer made a mistake in his error handling routing so that it is triggered by a false positive. This is likely because he made the demo on a time budget, because being a demo, it is not important to be perfect.

</comment><comment><USER19> Okay, I won't tell you that your browser can't calculate, for every possible Javascript function, and every possible input to that function, the Boolean value indicating whether or not that function will halt. Don't mind me at all!

> _HTML and CSS both are fault tolerant. If something goes wrong in HTML, > browsers either display the content of the element or try to fix minor > issues like unclosed elements for you. CSS skips lines of code it can't > understand and merrily goes on its way to show the rest of it. JavaScript > breaks on errors and tells you that something went wrong. It will not > execute the rest of the script, but throws in the towel and tells you to get > your house in order first._

HTML (or rather, processing thereof) being fault tolerant is a complete misfeature. It's the result of browser in the 1990's trying to out-do each other in handling broken web pages in order to look more functional. Broken HTML should be loudly rejected (at least in pages which declare strict conformance to a modern dialect).

CSS skipping stuff it doesn't understand is harmless because a declarative language for assigning style properties. It doesn't have permanent effects, like making a call to a server to update a database record.

A program in a general purpose language cannot reliably continue after an error (without logic to handle that situation). Later steps depend on the earlier ones having executed correctly in every detail.

<comment><USER20> >A program in a general purpose language cannot reliably continue after an error (without logic to handle that situation). Later steps depend on the earlier ones having executed correctly in every detail.

I don't understand this statement. Obviously, the program cannot preform correctly, but that may not matter. For example, if a web page caches content on disk for the future, but there is an error. It may not matter that the particular disk write failed without any additional logic. The error would just cause a slightly longer load time next time.

<comment><USER19> > _It may not matter that the particular disk write failed without any > additional logic._

Only if the disk write completely failed, leaving no traces of a half-broken cache entry.

If you have a half-written cache entry and don't deal with that situation somehow, you end up serving the user broken content from the cache.

It usually behooves us to have our code react to write errors.</comment></comment></comment>


Show HN: Keygen – a simple app and product licensing API now in closed beta - <AUTHOR> https://keygen.sh?ref=hn <comment><AUTHOR> Hey everyone,

I posted a landing page/mailing list signup for Keygen[0] few months back[1] and just recently pushed it into closed beta status! This has been a long journey, but I'm excited that I've hit this rather huge milestone.

If you're interested in trying it out, I'd love to get it into the hands of additional developers. I've spent a considerable amount of time on the documentation[2], so be sure to check it out. :)

And if you have any questions or concerns about the product, I'm down to discuss it here.

[0]: [https://keygen.sh](https://keygen.sh) [1]: [https://news.ycombinator.com/item?id=12870031](https://news.ycombinator.com/item?id=12870031) [2]: [https://keygen.sh/docs/api](https://keygen.sh/docs/api)

</comment><comment><USER2> Cool looking product and great job on the site! I see the docs are akin to Stripe which is awesome. What technology did you build the backend in?</comment>


The funny/sad thing about releasing software is...   - <AUTHOR> http://www.1014.org/?article=415 <comment><USER2> I'm a big advocate of trying to find especially inept people to test software - unfortunately the people who signup for betas are usually tech geeks so they don't even try crazy inputs or things that "obviously shouldn't work".

I think this might be something to do with bugs showing up on release...

<comment><USER3> Are you being ironic?

Trying to break things is the best part of beta testing something.

<comment><USER4> Most beta testers seem to barely use the software. Definitely few "Breakers" in my experience.</comment></comment></comment>


Facebook employees busted leaving 5-star reviews for Portal on Amazon - <AUTHOR> https://www.theverge.com/2019/1/17/18186990/facebook-portal-amazon-reviews-fake-employee-5-star-astroturfing <comment><USER2> Honestly seems like these guys weren't aware of Amazon's rule about not reviewing your employer's products. Three reviews out of a 100 (granted, could be more) doesn't seem like a concerted shady marketing push.

</comment><comment><USER3> I'm sure they aren't directly related to the production of the product, as it looks like the reviewer is an event coordinator, but there is something to be said about the sheer volume of FB now. An employer may be so big that an employee doens't even realize hes leaving his review for a product that FB owns, or does he?

</comment><comment><USER4> Every other seller is doing it for their own products on Amazon though, it seems to be the only way to move your junk efficiently on Amazon these days. Amazon is happy either way because more raw sales look better in their reports, and the cost of returns are on the seller anyway.</comment>


40 Days of Dating - <AUTHOR> http://fortydaysofdating.com/

<comment><USER2> Did they stop updating this almost 4 months ago after day 4?

<comment><USER3> This is hilarious. I get the feeling that the guy wasn't feeling it so much, judging by the commentary on the final day.

Anyway, it totally strikes me as a geeky designer thing. Two designers got together, and I think they just wanted to make a pretty website. (BTW, it's Wordpress. Does that make it better or worse?) The experiment was secondary and kind of fell flat, like when I spend six hours designing and building a custom blog platform/template and then only post one or two things on it.

</comment></comment><comment><AUTHOR> If somebody took me to 'couples therapy' on date two there'd be no date three.

</comment><comment><USER4> What a fascinating idea, a shame they didn't stick with it!

<comment><AUTHOR> They did - they just waited till the end of their experiment to begin publishing the outcome.

</comment></comment><comment><USER5> This reminds me that I don't miss dating.

</comment><comment><USER6> So they're both designers, but they use periods instead of spaces?</comment>


A platform for borrowing and lending books – thoughts? - <AUTHOR> We are building an app where readers can share books with one another. Before launching the platform, we would love to know your thoughts on it. Please help fill out the survey (link given below) to help us understand your needs better. Also leave any thoughts / suggestions in the comments below.
Survey: https://goo.gl/forms/2FakQf6TjWkzqVbG3
Thank you. <comment><AUTHOR> Link to the Survey: [https://goo.gl/forms/2FakQf6TjWkzqVbG3](https://goo.gl/forms/2FakQf6TjWkzqVbG3)</comment>


Show HN: Generate phishing alternative domains for Handshake - <AUTHOR> hello everyone,
https://github.com/stagas/hns-phish-gen
this is a small node.js project i've made in an effort to demonstrate the absurdity of using a government controlled, suppression-enabling centralized domain system (ICANN) when an alternative and superior technology (Handshake) is solving the same problem in a decentralized and secure manner, where the key holder has actual ownership of the domain, rather than it being provided by a private company as a service, which can, and therefore will be, revoked, when it is seen as economically hostile to some random dude's interests
it will only display domains that have been rolled out by the algorithm and can be registered right now at namebase.io (not affiliated)
examples:
$ hns-phish-gen facebook --more
febook fcebook fcebook afceboo fcebook fwcbook fcebook dcebook fdebook acobeok facobok faceooj tacebook afcebook fwcebook fafebook facobeok facebkok facebooj facebooi dfaceook tacebook tecabook taceb9ok tacebokk tacebo0k afcebook adcebook afcebpok afceboik fwcebook dwcebook fwcebolk fwcebopk fcebookj faacebok fafebook fsfebook faebfook fafboeok fafebopk fafebo0k facobeok facogeok facooebk facobkoe facobeoi facebkok dacebkok gacebkok facdbkok facebkko faceboo0 facebooj vacebooj faecbooj ...
$ hns-phish-gen google --more
googe gigle oigle gigle ggole googe booge g0oge go9ge goove googd ooleg zoogle giogle goigle golgle gogole googl3 gooleg zoogle zoovle zooble zoogel ggoogl giogle goigle giohle giozle giolge gogile giogpe giogl3 giogle goigle goigle giogle gogile goivle golgle holgle gogole gogile gogol4 gotgle gootge gtooge gopoge goooge googye googze googte gootge googwe googse googl3 boogl3 ooggl3 giogl3 glogl3 ggool3 golgo3 goo3lg gool3g gooleg g0oleg glooeg gool3g goleog gvoogle ggoogle goiogle ... <comment><USER2> It's unfortunate that this actually useful blockchain project will tainted by the malevolent... sadface

<comment><AUTHOR> <3</comment></comment>


Philippine Pres: I'm Like Hitler, but I Want to Kill Millions of Drug Users - <AUTHOR> https://foreignpolicy.com/2016/09/30/philippine-president-im-like-hitler-but-i-want-to-kill-millions-of-drug-users-duterte/ <comment><AUTHOR> It's an especially awkward concept, gunning down Dr John C Lilly[1], Dr Feynman[2], Carl Sagan[3], and all the other great figures who responsibly dabbled in drugs. Of course, killing _anyone_ for their personal decisions is probably not a great idea.

1\. [https://en.wikipedia.org/wiki/John_C._Lilly](https://en.wikipedia.org/wiki/John_C._Lilly) 2\. [https://en.wikipedia.org/wiki/Richard_Feynman#Personal_and_p...](https://en.wikipedia.org/wiki/Richard_Feynman#Personal_and_political_life) 3\. [http://www.huffingtonpost.com/2013/05/31/carl-sagan- marijuan...](http://www.huffingtonpost.com/2013/05/31/carl-sagan- marijuana_n_3367112.html)

<comment><USER2> The drugs and users don't matter to him. They're just a convenient group to demonize. Bonus that they essentially have no voice. It could as easily have been gamblers or some other more or less shady group. Or, say, Jews.

</comment></comment><comment><USER3> .. And after the drug users the homeless, then the homosexuals, then...

.. Why do we never learn?

<comment><USER2> On the contrary, leaders _always_ learn this lesson. It's Demagogue 101.</comment></comment>


Pronounceable Anagrams - <AUTHOR> http://smithamilli.com/blog/anagrams/

<comment><USER2> The author does some neat things. When they're comparing Really Small Numbers multiplied together, to avoid underflow, they instead calculate the logs of the pieces and add them. Very nice. :)

<comment><USER3> It's a fairly common (but cool nonetheless) trick that often turns up in stats :)

</comment></comment><comment><USER4> Cool! One little thing is that you would expect that the is_anagram relation is a symmetrical one. I.e. that "neo" is an anagram of "one" then "one" is also an anagram of "neo", which doesn't seem to be the case with you system. Why is that?

<comment><USER5> Probably because neo is not in the source corpus.

</comment></comment><comment><USER6> Couldn't find I am Lord Voldemort / Tom Marvolo Riddle. Tried upping the allowed string length, but it became struck.

<comment><AUTHOR> Yup as I mentioned in the blog post, the running time is factorial with the number of characters, so unfortunately Lord Voldemort won't work :(

</comment></comment><comment><USER7> Nice. A result of "good morning" is "goon mording." This could get entertaining..</comment>


News sites lurch towards encryption - <AUTHOR> http://www.washingtonpost.com/business/technology/in-a-prying-world-news-organizations-are-struggling-to-encrypt-their-online-products/2014/04/04/537d1fec-aed5-11e3-9627-c65021d6d572_story.html

<comment><USER2> While I understand this article is targeted towards non-technical people, its whole feeling felt a little strange:

> In an era when news zings across the globe at the speed of light, making > encryption work properly across an entire site is a challenge worth > undertaking, advocates say. "No one has done it for real," Eckersley said.</comment>


Why women quit technology careers - <AUTHOR> http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=319212&source=rss_news10

<comment><USER2> From an Indian perspective (the article mentions India is a bit better than the US) I know quite a few women IT workers most of whom enjoy their jobs and are good at them. But I also know many more who quit - usually to stay at home and raise a family.

Looking around my current office I see a lot of men and much fewer women. Of the men, I _know_ quite a few who don't enjoy their work but stick it out cause they are the breadwinners and need to provide for their families. Maybe if they were given the option (socially and biologically?) of staying home with the kids they would do just that.

</comment><comment><USER3> I didn't like the article. It was rather...well, it blamed it all on men, really. Didn't take SEXUAL DIMORPHISM INTO ACCOUNT. Sheesh.

<comment><USER4> While the dimorphism argument is interesting, this article was focused on the later drop-off in women in the field. In other words, women had already self- selected _into_ the field, and were leaving at greater rates.

At some places, there is most certainly a boys club atmosphere, including where my wife works (in IT). The stories she comes home with are crazy.

</comment></comment><comment><USER5> While I appreciate the support that these "women in technology" articles invariably generate, I can't help but feel victimised by them. It's almost as if - as a woman - I must fail, otherwise I'm not doing things right.

</comment><comment><USER6> I would to add that it was also noticed that in more reserved nations / communities and social class ... more women are into IT

This observation was first brought to my attention after a Linux User Group event in Egypt .... many many many women came most of them veiled.

I also noticed the IT field in Egypt have more women from lower and more reserved social classes

I am not sure how this observation can be helpful but its sure an area to investigate more.

My personal observation is that IT have a geeky laborish image (laborish as in you sit infront of the screen for hours without human contact) that repulse more femimin women, and by which poorer and more reserved women are not bothered, in other words, its a tuff field with tuff work envrionment, which is only suitable for tuff women (poor and reserved)

</comment><comment><USER7> Can we stop posting all these articles that claim to know the secret of why men like some things and women like others? These ridiculous articles aren't accomplishing anything!

<comment><USER8> Are you suggesting that:

(a) There is no reason why men like some things and women like others

(b) There is a reason but it is unknowable, or

(c) There is a reason and it is knowable, but it will never appear in any past or future article of this sort?

<comment><USER9> (d) All the articles I've seen so far post the same "reasons" which fail to explain:

(1) why women are underrepresented in math heavy fields,

(2) but are not underrepresented in other high status, high skill fields such as law, business and medicine.

When an article has an explanation that is specific to technology/science, go ahead and post it. But there isn't much point in rehashing the same flawed ideas.

</comment></comment></comment><comment><USER10> At another Hacker News commenter's suggestion, I'm reading "Growing a Business" --- I'm just a couple pages in, but hooked. One of the first points it makes is the competitive advantage the US gets from utilizing the female work force.

Articles like this make me wonder how much of the long-term market we're surrendering to India and China. I've met a lot of Indian female devs.

<comment><USER11> I've met a lot of Indian female devs. -- I actually don't know a single white dev. software engineer.

Asian born, Indian, one Turkish girl (she does hardware engineering), yet I have yet to meet or work with a white american woman engineer.

I still keep in touch with some of my classmates, and the only white girl we had in class, (and she was my really good friend), is doing project management now.

I know for fact, that many indian women, if they are still with and H1-B, or going thru the green card process, can't switch jobs.

But it seems, that the women that can switch, at some point will. It is just an unattractive profession to them.

<comment><USER10> I don't want to make too big a thing out of it. My superficial observation is, there are more Asian female devs than North American female devs --- which, if true, is a problem for North American competitiveness long term.

It's probably not true.

I don't agree that engineering is an unattractive profession for women. At all.

</comment></comment></comment><comment><USER12> from the Aspen study link that this is commenting on: "Women experience a perfect storm in their mid- to late thirties: They hit serious career hurdles precisely when family pressures intensify." so i'm confused as to why the article dismisses this with a simple "No.".</comment>


Making Postmates Even More Efficient - <AUTHOR> http://blog.postmates.com/post/112808593052/making-postmates-even-more-efficient

<comment><USER2> 9 points in 5 minutes is highly unlikely. Don't ask people to upvote your submission: it doesn't work.</comment>


How Hacker News Points Work - Mine Have Gone Empty - <AUTHOR>

Why do I suddenly have 0 points on Hacker news?<p>I had 9 about a day ago.. thanks :) <comment><USER2> when you submit a comment to a thread, other people can vote your comment up or down. when you're voted up, your score goes up, and it goes down with a vote down. your score can also go up based on your submissions, which can't be voted down.

based on your comment history (<http://news.ycombinator.com/threads?id=sscheper>), you made some remarks that people didn't like, so they voted you down.

<comment><AUTHOR> got it -- lol... I guess my humor sucks online... perhaps offline, too.</comment></comment>


Getting your SaaS pricing right-Pricing for cloud call centers - <AUTHOR> http://getkookoo.com/getting-saas-pricing-right-pricing-cloud-call-centers/ <comment><AUTHOR> Inspired by this blog by DHH, [https://m.signalvnoise.com/why-we-never-sold- basecamp-by-the...](https://m.signalvnoise.com/why-we-never-sold-basecamp-by- the-seat-4482f3e6a195#.gqpwagxqz)</comment>


Ask HN: Deprecating/Sunsetting Features? - <AUTHOR> I'm working on the deprecation and removal of website features used by a sizable number of users (lets say 10% of user base). It'd be to move users to a newer version of the product.<p>Does anybody have good examples of communication, UI patterns, and approaches to removing features? <comment><USER2> I helped with completely overhauling a UI once. We let people know via email, about the exact date. Then just did it. I voted to keep both the old version and new version out for a while, but was over ruled. Rip the bandaid off policy! It actually worked out well.10% will react, but at least you let them know.</comment>


Understanding and Writing Compilers [pdf] - <AUTHOR> http://www.eis.mdx.ac.uk/staffpages/r_bornat/books/compiling.pdf By Richard Bornat who recovered copyright. http://www.eis.mdx.ac.uk/staffpages/r_bornat/#vanitypublishing <comment><AUTHOR> By Richard Bornat who recovered copyright. [http://www.eis.mdx.ac.uk/staffpages/r_bornat/#vanitypublishi...](http://www.eis.mdx.ac.uk/staffpages/r_bornat/#vanitypublishing)

I've always been curious about this book after seeing it well spoken of in a bibliography/reading list somewhere.</comment>


For Bumble, the Future Isn't Female, It's Female Marketing - <AUTHOR> https://www.bloomberg.com/news/features/2020-01-17/for-bumble-the-future-isn-t-female-it-s-female-marketing <comment><USER2> > Andrea Silenzi, who used to host a dating podcast in Los Angeles, said she > likes the women-message-first feature, but not because it's empowering. > "It's more like a screening feature," she said.

Why not "screen" them before swiping right on them?</comment>


Go Proposal: Blank types as an alternative to generics for Go 2 - <AUTHOR> https://github.com/golang/go/issues/21132 <comment><USER2> > At runtime however they are simply passed as interface{} values wrapping the > real values since the type soundness already has been proven.

So, this is some sort of limited Java-like generics with type erasure?

As someone who has only dabbled shortly with Go just to find out that he prefers a slightly more complex language, I find this sort of proposals tyring. I'd reconsider using Go if they finally got this thing right, but until then ...

I personnally would find the lack of generics acceptable, if go had (some sort of) algebraic types. But since the go team thinks these are useless either ... In some room in some building this probably makes some sense.

</comment><comment><USER3>
        The compilation of a function that deals with a generic
        type would need to be redone for each concrete type the
        function is used with (including non builtin types) to
        allow proper allocation etc.

Isn't this essentially what's required to get type-safe "generic" code currently in Go, only with manual copy-pasting/codegen by the programmer instead of the compiler?

</comment><comment><USER4> Uh oh, someone invented Java-style "generics" again...

Seriously, static typing without proper parameterized types isn't going anywhere; just do it and get it over with. Watching the Go-community is like a flashback to Steve Jobs arguing for the one-button mouse.</comment>


HQ CEO: If You Run This Profile, We'll Fire Our Host - <AUTHOR> https://www.thedailybeast.com/ceo-of-hq-the-hottest-app-going-if-you-run-this-profile-well-fire-our-host <comment><USER2> If anyone here is looking for a startup idea: hire Scott at twice what he's making, clone HQ Trivia, and make him a cofounder instead of a contractor. The market has been validated, it's clear that the market cares about Scott as a person (they're dressing up as him for Halloween!), and it seems doubtful that he _enjoys_ being a contractor given all of this.

<comment><USER3> > Over 170,000 people waited in the game's lobby to play the HQ on Sunday > night.

It seems like no easy feat to build out an app that streams live video as well as trivia questions/answers to 170k concurrent users. Does anyone have a guess at how they went about architecting a product like this?

<comment><USER2> I feel like I'd buy that in the short term - that's what VC money is for. (And perhaps in the long term too.) The hard part is the live streaming; sending <1 kilobyte of _data_ to 170k concurrent users every few seconds isn't a fundamentally challenging problem (it's on the order of 1Gbps outbound traffic). YouTube has a live-streaming API I'd be inclined to build a proof of concept with and see how far that gets me; if not, a couple minutes of Googling finds me Ustream, owned by IBM, charging $99-$999/month for their "professional" tier, and Livestream (.com) charging $799 for their "enterprise" tier, with both having a call-us-if-you-need-more tier. That's cheap enough that you can fund the tech side on this on even just the old- school YC $20K until you have enough traction to do a better job of it.

</comment></comment></comment><comment><USER4> Wow, that is a completely absurd reaction from the co-founder. He could've gotten some great, free PR for the company out of the story.

Instead, he's about to be on the front page of HN and probably several other media outlets, in a story centered around him and portraying him as a shitty boss that nobody would want to work for or with.

Hopefully everything works out well for Mr. Rogowski.

<comment><USER5> Especially as the guy's a contractor, he can do whatever the hell he wants.

It's like it is becoming the new normal in startups, treat contractors like they're your personal slaves, while you can drop them whenever you want.

It's a reminder of why employment laws are so necessary.

<comment><USER6> I guess the problem could be that he find himself in a situation where his app is being associated with a contractor they hired, and he doesn't want to further solidify him as "the brand".

Imagine if MySpace Tom was just a contractor that could leave to join the competition any day.

Panic mode, which result in observed nutty behaviour.

<comment><USER7> So why use him on all your marketing material if you are afraid of him just up and leaving?

<comment><USER8> Greed. They want the short term profit from it.

</comment></comment></comment></comment></comment><comment><USER9> The founder profiled in the article just tweeted:

> Looking for a good PR agent. DM me if interested!

[https://twitter.com/rus/status/933075047039856642](https://twitter.com/rus/status/933075047039856642)

<comment><USER10> Needs help and media training badly. Past that, good sense to know to not apply additional pressure to your popular contract employee, while on another phone call with a reporter, and ask

> "Now they want to reframe the story as me threatening to fire you. Do you > think that's a good idea?"

<comment><USER11> The problem isn't his media training, the problem is his moral compass. Treat your employees with respect just as you'd treat any human being with dignity.

</comment></comment></comment><comment><USER9> The article title is _not_ clickbait.

This is an extremely _bizarre_ reaction for a founder who has already had successful startup experience.

<comment><USER12> Seems like a control freak who assumes the worst initially, then continually refuses to back down when corrected. It's bizarre, but it's a great example of how certain allegedly desirable traits in a founder can turn pathological.

<comment><USER13> I think even "assuming the worst" gives him too much credit, it's just irrational control freakery.

</comment></comment></comment><comment><USER14> I had literally never heard of HQ before reading this article, and I work in the tech / software space. This has to be the weirdest attempt at guerrilla marketing ever.

<comment><USER15> It occurs 2x a day and there are around 80k people who log on at those moments -- I don't feel this is an attempt at marketing.

<comment><USER16> Over 100k now

</comment></comment></comment><comment><USER17> It's not unusual for employees/contractors to be forbidden from speaking about their employer with reporters, at least not without clearance from PR and/or some vetting of questions and responses.

That said, this CEO's response is completely off the rails. Presumably he _didn't_ have a pre-arranged agreement or contract with Rogowsky regarding talking to reporters, and was trying to shut them up after the fact. Lame.

<comment><USER18> Just to play devil's advocate, it could have seemed to the CEO as if Rogowsky approached the media instead of the other way around, and that he was trying to gain leverage ahead of the contract renegotiation. It wouldn't surprise me if their contractor agreement / NDA covered not talking to the press.

Seems to take a real stretch of the imagination not to see the CEO as in the wrong here, though.

<comment><USER19> Assuming that was true, I'm not sure why that'd be the Daily Beast's problem. His accusation seems to be that they're doing something wrong by publishing an article or talking to an employee. The responsibility for maintaining any agreement/NDA isn't on the news outlet.

<comment><USER18> Yes, frankly I'm surprised they even cooperated enough to read him the quotes. They didn't have to.

</comment></comment></comment></comment><comment><USER20> If the reporting is faithful (big if) then Yusupov is demonstrating neurotic, paranoid and controlling tendencies. Maybe that's just his personality; if focused correctly I imagine those traits could benefit a startup's growth. Another plausible explanation: his regret over what happened to Vine after selling it to Twitter has led to obsessively avoiding any chance of making similar "mistakes".

<comment><USER13> "Generals are always fighting the last war."

</comment></comment><comment><USER21> I wonder if Yusupov realized that this would be the way that I and many other readers would learn about his app for the first time.

<comment><USER22> Interesting point. I'd never heard of Rus or HQ, and was only loosely familiar with Vine, but as someone who watches Jeopardy daily I'm interested enough that I'll at least test HQ out because of this.

</comment></comment><comment><USER23> This CEO needs to Google "Streisand effect"

Unless that is actual what he wants. Sounds like this contractor (no employee?) is critical to the company's success and firing him would be suicidal without first diversifying.

</comment><comment> moz-hx The founder/CEO comes off as absolutely unreasonable and reactionary in this article, and the title is surprisingly not clickbait (assuming everything happened as reported). It seems that startups oftentimes attract those kinds of big egos, although the brutal startup marketplace oftentimes punishes those people for their hubris.

</comment><comment><USER24> I think the host should very carefully consider what his employment will be like with HQ if he signs a longer-term contract, the founder seems prone to huge mood swings. They need to get a publicist pronto.

</comment><comment><USER25> I was going to do a search for this HQ app but lost interest after reading about the founder....

</comment><comment><USER26> Oddly, this is likely to get _way_ more press than the original interview, which seems to consist of deep revelations like "[I] enjoy making people happy and giving them the trivia they want" and "he's had a woman ask him for a selfie while he was retrieving money from an ATM".

<comment><USER27> This article introduced me to HQ trivia which I just installed.

</comment></comment><comment><USER28> Looks like a marketing ploy by a company which is comfortable being meta. The headlines giveaway what it is.

</comment><comment><USER29> Is this a bizarre PR stunt?

Maybe the CEO is just overly paranoid and controlling after seeing what happened to Vine.

<comment><USER30> If it is, it's still stupid. As other commenters in this thread have mentioned, he has exposed the fact that his star is a contractor, and opened up the possibility of a competitor essentially hiring away his product.

Yes, this story has introduced a whole bunch of new people to HQ. But it's also reinforced how important Scott is to their product. Not a good position to put yourself in.

</comment></comment><comment><USER31> Another inductee to the Silicon Valley asshole CEO hall of fame. It's getting a bit full now don't you think? They say there is no such thing as bad press, but I still don't want this app. Hope the presenter scores a Netflix deal as others have said.

</comment><comment><USER32> So he threatens to fire his top talent, freeing him to go to work for the first guy with some cash and the willingness to knock off this trivial app? (No pun intended) I'm not buying that. Nor his solicitation for a PR agent.

</comment><comment><USER27> This CEO just might be taking the Donald Trump approach to publicity. I had never heard of HQ trivia but from this article it sounds fun and I just installed the app and signed up. Mission accomplished?

</comment><comment> intro-b what a bizarre, disproportionate response over an article that's basically a lighthearted character-sketch

i can't imagine what the relationship between Scott and the startup founders is like right now

</comment><comment><USER33> Someone please teach Rus Yusupov how to think about the media and relate to the press. This is embarrassing. He did himself so much more harm than any profile could have done...

<comment><USER34> Why is he owed that? Let him fail. I loved Vine and was excited about HQ. I knew nothing about Rus until today. People like this are toxic to our culture and industry.

<comment><USER33> He's not "owed" that. It's kind of a manner of speaking. But teaching someone how to behave better removes a little of the annoyance from the world, so...

</comment></comment></comment><comment><USER35> Maybe the whole thing was a publicity stunt. I had never heard of HQ before.

[https://twitter.com/rus/status/933144474263339009](https://twitter.com/rus/status/933144474263339009)

</comment><comment><USER36> He since said sorry on Twitter: [https://twitter.com/rus/status/933144474263339009](https://twitter.com/rus/status/933144474263339009)

</comment><comment><USER37> Sounds like Mr Yusupov is having some sort of nervous break down

<comment><USER38> Or, more likely, he's just an asshole.

</comment></comment><comment><USER39> I just downloaded this app to see what the hell the fuss is about. I guess it's true that no press is bad press...

</comment><comment><USER40> My hypothesis is that they had an agreement where Scott couldn't talk to the press, but he did anyways. Since it happened the CEO just didn't know how to handle it well and was probably somewhat serious that the repercussions would be firing Scott (as the only option), something he probably didn't want to do.

</comment><comment><USER41> Maybe I'm just being cynical, but I can't imagine a previously successful founder doing something so stupid. Is this a _" any PR is good PR"_ stunt? I've certainly never heard of HQ before this, and this story is crazy enough to go viral and reach millions of people.</comment>


ActivityPub: from decentralized to distributed social networks - <AUTHOR> https://gitlab.com/dustyweb/talks/blob/master/activitypub/rwot/even_more_distributed_activitypub.org <comment><AUTHOR> Alternately if you prefer a dead tree version, here's a PDF: [https://gitlab.com/dustyweb/talks/raw/master/activitypub/rwo...](https://gitlab.com/dustyweb/talks/raw/master/activitypub/rwot/even_more_distributed_activitypub.pdf)

As an aside, this is a big week for ActivityPub, since Mastodon is going to begin rolling out ActivityPub to their ~850k registered users.

</comment><comment><AUTHOR> And apparently GitLab went down shortly after posting this, so here's an alternate copy: [https://github.com/WebOfTrustInfo/rebooting-the-web-of- trust...](https://github.com/WebOfTrustInfo/rebooting-the-web-of-trust- fall2017/blob/master/topics-and-advance-readings/activitypub-decentralized- distributed.md)</comment>


Adobe CIO resigns - <AUTHOR> Insider reports that Adobe CIO has resigned <comment><AUTHOR> i think its interesting because most of the svp's are leaving adobe , David Wadhwani left recently , Naresh Gupta couple of months back and coming to the CIO when the industry is trying to get some level of gender equality, Adobe's leadership is just male dominated with no representation of female</comment>


Non-obvious remote work techniques - <AUTHOR> https://queue.acm.org/detail.cfm?id=3417752 <comment><USER2> > makes the mute button easier to find

It's odd this is still an issue. I'm not sure why the mute button is not featured more prominently on videochat apps. It's almost the primary feature during a call that makes things go smoothly.

Also, there's always one guy who has to say every bloody time, "are you there, have you forgot to unmute?" if you fail to unmute and start talking <100ms after your name has been mentioned.

<comment><USER3> Just use a headset with a physical mute button. I've been using this pair[0] for years. It works great.

[0] [https://www.logitech.com/en-us/product/wireless- headset-h800](https://www.logitech.com/en-us/product/wireless-headset-h800)

<comment><USER4> I do this and it has downsides:

* muting yourself is not clearly visible to the conference app (Your face doesn't get a mic with a strikethrough on the screen). Apps that warn you that your audio device is receiving audio but you are muted on the application level no longer work correctly.

* some apps (Looking at you, Teams) will actually complain that you seem to have deactivated your audio device (of course you did - that's the whole point).

<comment><USER5> This is only a problem with headsets that have poor drivers.

Better devices like Jabra headsets integrate directly with Teams and will actually synchronize mute status between the headset and Teams!

<comment><USER4> Cool!

YMMV but 0 of my WFH colleagues own business-grade headsets though. Some have Airpods, and most use Gaming headsets (like I do) or Bose QuietComfort (which IIRC don't have dedicated mute buttons).

Until we find a unified API around all those devices, a prescribed unified usage pattern IMO doesn't make sense yet.

<comment><USER6> Eventually companies will realize they should spend or reimburse to upgrade "home office" equipment to "business-grade".

</comment></comment></comment></comment></comment></comment><comment><USER7> I feel like "Accurate Chat Status" only works if it's automatic (as in, a calendar integration that switches your status to "in a meeting" or "it's after 6pm, probably afk.)

Otherwise you get:

4pm: "Ah, bob's status says he's in a meeting. I could message him, but I'd like this to be a quick, synchronous, chat discussion."

5pm: "Guess bob's still in a meeting..."

7pm: "Let me check - yep, still 'in a meeting'"

10pm: "Yeah, he forgot to update his status"

And then you never trust those statuses again.

<comment><USER8> For me automatic idle+meeting detection is not good enough. There are lots of times when I can't chat immediately, but I'm using my computer and not in a scheduled meeting. Pair programming, someone else at my desk (pre covid), programming in the zone, watching a presentation, currently chatting with someone else, etc. etc.

I want the _expectation_ that my Slack icon is green to mean that I'm at work and I'll reply sometime today, not that I'm ready for you to interrupt what I'm doing right now.

<comment><USER9> Simply don't replay immediately. You'll build the expectations as people learn to work with you. Some people on my team respond immediately 95% of the time. Some people on my team turn off all slack notifications and check it throughout the day. We all work together pretty well.

<comment><USER10> I completely agree that there shouldn't be an expectation of an immediate reply and rather expect the exchage to be asynchronous. However, that renders to whole "presence indicator" moot, which is the subject of this particular thread.

If I try to talk to Bob and the expectation is that he might take a while to get back to me, it doesn't make any difference to know that he's "available" or "in a meeting". If he's available and coding he might not anwer for an hour. If he's in a meeting and bored he might answer right away.

</comment></comment></comment></comment><comment><USER8> > Accurate Chat Status > In meatspace you don't walk up to someone's desk and > just start talking.

This list seems to assume or suggest that chat should only be used for synchronous conversation... Are there reasons to avoid using chat asyncronously?

My assumption is that chat can be asynchronous, but I recognize many people don't want to ask their question until I'm actively responding. I can imagine security concerns, like someone doesn't want their question to be read by people near me or someone wandering by my desk while I'm away...

But, my status as to whether I can chat synchronously changes dozens of times per day, and I don't particularly want to have to manually toggle my status when I'm on the phone or when I'm chatting with someone else, or when I'm in the middle of coding and prefer to answer your "quick question" later, since it will inevitably require a 10 minute conversation. Quick to ask is often not quick to answer.

<comment><USER11> If you're doing incident response or on-call work, I think it needs to be more synchronous and more accurate. However, chat messages are more natural to me to indicate availability than setting the availability itself. Too many people don't set accurate statuses and it can get changed by the programs own rules, so it's a noisy signal IMO.

<comment><USER12> If you're doing incident response or on-call people don't contact you based on your availability, you guarantee your availability so people can contact you.

</comment></comment></comment><comment><USER13> #5 - IMHO you just can't emulate a physical social event, the biggest problem being that you cannot establish smaller groups which are natural in physical events.

<comment><USER14> I recently participated in C++ on Sea ([https://cpponsea.uk/](https://cpponsea.uk/)) - online, of course. The conference setup used [https://remo.co/conference/](https://remo.co/conference/) which automatically groups people into tables, where each table is essentially a video conference call. You can move around freely between tables but each table can only hold 8 people.

I felt it was possibly _better_ than a physical conference because it's so simple to join new conversations - no walking around looking for interesting groups (you can see who is currently sitting at each table) and none of the nonverbal social awkwardness in joining a conversation. Plus you always have the names and profiles right there. Never been easier to meet people imo.

I'd contradict your claim based on this experience. You clearly can establish small groups, and it seems to work really well when you do.

</comment></comment><comment><USER15> I love the quick chat protocol. It's a concrete example of what to do, instead of just saying "please don't just say hi".

I think there is one good strong counterpoint to it -- it is if there is a chance that the words "tomato incident" will be screencast to a meeting containing execs and/or external clients. Some people operate in "hello protocol" all day, and for them, I find it easier to just let the extra round trips happen.

Similarly, if I have access to a colleague's calendar, I usually check it before I initiate a quick chat protocol message, to avoid the same failure mode.

</comment><comment><USER16> #3 - Holy hell I hate it when someone sends me a message with just "Hi". Just tell me what you want!

<comment><USER17> What I do is just not respond until they say what they want from me.

And I also do this when someone just pastes an error message without a question.

<comment><USER18> Well, that sounds logical. I do the same, too.

1\. Current work

2\. Today work

3\. Review for when work

4\. Far future work

Everything in 1 and 2 are lined up for work. Anything without clear action items requires follow-up and clearly signals non-urgency so it's in 3 which is the end of the day. And a 4 is just intentionally forgotten.

If you stick that in your github.com/username/me/README.md then it's documented behaviour.

</comment></comment></comment><comment><USER19> Does anyone have any suggestions on a platform to facilitate Tip #4: Idling in a Videoconference Room? Zoom is the obvious choice, but wonder if anyone has built something better for this use case?

<comment><USER18> I have friends who ran a startup full remote. They sat on Discord together all day. Video off most of the time.

<comment><USER20> I don't know that non-gamers would understand idling in a discord/mumble/ventrilo/teamspeak server, but it's for sure the next big trend in remote work. I've been hanging out this way with friends for a long time.

I won't be surprised to see Discord pivot to b2b in a few years and completely destroy Slack.

<comment><USER21> Kevin Kwok agrees: [https://kwokchain.com/2019/08/16/the-arc-of- collaboration/](https://kwokchain.com/2019/08/16/the-arc-of-collaboration/)

</comment></comment></comment></comment><comment><USER22> Is there a good reason why ACM can't make their site readable for the largest group of computers in the world - mobile devices?

<comment><USER23> Works fine for me on Firefox, and I can even use Reader mode.

<comment><USER22> For me, with Firefox on Android, it delivered what appeared to be a desktop site (tiny text, clearly non-mobile layout). I almost never encounter that on websites, so the problem is not with me nor my phone. My phone is a Note 8 (still reasonably high performance and with a very large screen).

It's nice that it works for you, and sure I could try reader mode, but I should not have to switch to reader mode to view a website.

</comment></comment></comment><comment><USER24> stopped reading after tip #1. so lame. not practical at all.

</comment><comment><USER25> _Me: Hi!

You: Hi._

Absolutely not. Just say what you want.

<comment><USER26> The article lists that as an example of what _not_ to do</comment></comment>