Million requests per second with Python - <AUTHOR> https://medium.com/@squeaky_pl/million-requests-per-second-with-python-95c137af319#.3eiek12me <comment><USER2> >HTTP pipelining is crucial here since it's one of the optimizations that Japronto takes into account when executing requests.

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

> Of all the major browsers, only Opera based on Presto layout engine had a > fully working implementation that was enabled by default. In all other > browsers HTTP pipelining is disabled or not implemented.[3]

>Internet Explorer 8 does not pipeline requests, due to concerns regarding buggy proxies and head-of-line blocking.[7]

>Internet Explorer 11 does not support pipelining. [8]

>Mozilla browsers (such as Mozilla Firefox, SeaMonkey and Camino) support pipelining; however, it is disabled by default.[9][10] Pipelining is disabled by default to avoid issues with misbehaving servers.[11] When pipelining is enabled, Mozilla browsers use some heuristics, especially to turn pipelining off for older IIS servers.[12]

>Konqueror 2.0 supports pipelining, but it's disabled by default.[citation needed]

>Google Chrome previously supported pipelining, but it has been disabled due to bugs and problems with poorly behaving servers.[13]

That seems like optimizing for a benchmark.

<comment><USER3> Would it make make sense to optimize for HTTP/2 then?

<comment><USER4> HTTP/2 is a big step forward, but I wish web servers and HTTP clients supported HTTP/2 over TCP (h2c), TLS encryption is useless for internal microservices.

<comment><USER5> Isn't that thinking what got google tapped by the NSA in those infamous prism slides? (Honest question, I don't know if there are other solutions)

<comment><USER6> Yes, and it wasn't just Google.

Client or even frontend https wouldn't have solved the problem in most cases (it is necessary but not sufficient).

The database (or key value store, etc) replication stream is a prime target, as are any backend protocols that let edge data center storage proxy internal requests for core data centers.

</comment></comment></comment></comment></comment><comment><USER7> The project is very interesting but the benchmark results must be completely wrong.

On my machine, using [https://github.com/rakyll/hey](https://github.com/rakyll/hey) to test:

1 concurrent request: node.js does ~8000 req/second, go does ~9000, japronto does ~10000

10 concurrent requests: node.js does ~24000 req/second, go does ~45000, japronto does ~55000

Nowhere near a million. That's without pipelining though. Can pipelining really add SO MUCH performance?

 _UPDATE_ : tried wrk with pipelining. japronto does 700000, golang 150000, node 35000. Holy shit, pipelining is epic.

But the benchmark is not fair when only one server supports pipelining.

<comment><USER8> Yes, because the real bottleneck is TCP. Pipelining reduces number of packets sent. However, very few clients actually support pipelining, so it's almost useless

<comment><USER9> Also, it's measuring the number of static responses to _a single client_. I guess there probably is an use case for this, but a more typical situation is many clients making one or a few requests, and also doing the TLS handshake.

</comment></comment></comment><comment><USER10> ITT people complaining that the underlying library is written in C.

Who cares? The author wrote the C code and Python bindings for his library so we can _all_ benefit from handling more requests per second just by writing Python code and using his framework.

I appreciate the work and will be exploring its potential use. Thank you squeaky_pl for writing it.

<comment><USER11> It matters because all the heavy lifting is done by C and has little if anything to do with Python itself.

You could give the same treatment to virtually any other host scripting language (Ruby, Lua, PHP) and then make outlandish claims that that host language is now capable of ridiculous things when it had nothing to do with the alleged success other than that it exposes a FFI that lets you create something like this.

<comment><USER12> Your same argument can be applied to virtually any other language:

This ruby benchmark doesn't matter because ruby is written in C!

This nodejs benchmark doesn't matter because v8 is written in C/C++!

etc.

<comment><USER5> I think his argument is that ymmv as you add more python code to this native- heavy benchmark.

<comment><USER13> ITT: Web developers being surprised by the meaninglessness of microbenchmarks.

<comment><USER11> No, we're not surprised by microbenchmarks. We're surprised by the amount of investment in trying to improve the foundations of toppling-over buildings when that investment could be better spent elsewhere.

</comment></comment></comment></comment></comment></comment><comment><USER14> A million requests per second in Python, if you write all the code that does work in C.

<comment><USER15> You use it in Python. OP writes the C code for you.

<comment><USER16> As soon as you do anything else than return 'hello, world' in Python, your performance will drop dramatically. Just parsing a tiny JSON string a million times in python takes 7s (i5-2467M).

      $ time python -c "import json;
      for i in range(0, 1000000):
          json.loads('{\"data\": \"hello, world\"}')"

      real	0m7.055s
      user	0m6.951s
      sys	0m0.063s

It is no use optimising one part of a system if other parts take 99% of the time.

As it stands, the title of the post would be more accurately stated as 'million requests per second with C'.

<comment><USER17> json:

        $ time python -c "import json;
        for i in range(0, 1000000):
              json.loads('{\"data\": \"hello, world\"}')"

        real	0m3.142s
        user	0m3.098s
        sys	0m0.034s

ujson

        $ time python -c "import ujson as json;
        for i in range(0, 1000000):
              json.loads('{\"data\": \"hello, world\"}')"

        real	0m0.444s
        user	0m0.399s
        sys	0m0.028s

Like with many things, it's a question of being smart about your choice of libraries.

Also, just because I was curious:

        $ time pypy -c "import json;
        for i in range(0, 1000000):
              json.loads('{\"data\": \"hello, world\"}')"

        real	0m0.422s
        user	0m0.386s
        sys	0m0.032s

<comment><USER16> If you use a C library and have hardly any Python code running it obviously goes faster. That misses the point I was making. At some point you'll have to write some Python code, and that will lower the number of requests dramatically. If you're talking millions of requests per second, you will have maybe 10s of thousands of CPU cycles per request. That doesn't buy you much in Python. Case in point: parsing a trivial json string in Python eats up your budget.

Of course, most websites aren't dealing with anywhere near that volume of requests, and then Python is fine.

Pypy is interesting, but last time I looked it didn't support C extensions and hence can't be used with the poster's library.

</comment></comment></comment></comment></comment><comment><USER18> >wrk with 1 thread, 100 connections and 24 simultaneous

Say what? When I do this kind of testing using wrk:

      1. I use multiple clients
      2. Each client uses a thread for every logical CPU
      3. I usually use at least 256 connections

What is actually being tested here? This smells like a test to get a desired result.

No to mention in regards to Go/Others:

      1. He is using an RC
      2. By default it uses all all cores, why handicap it?
      3. He didn't share his code for his contestants, how can I trust this?

<comment><USER7> The contestants are in the repo. One core is used "to be fair" (the Python stuff only uses one core). But the test, yeah. What's being tested is the presence of pipelining :D

<comment><USER18> >What's being tested is the presence of pipelining :D

Which is silly considering a majority of wild browsers now support HTTP/2.

Thanks for pointing our the repo, I missed it before: [https://github.com/squeaky-pl/japronto](https://github.com/squeaky- pl/japronto)

His Go isn't horrible, but it could be written like this:

      func hello(respWtr http.ResponseWriter, req *http.Request) {
        text, status := []byte("Hello world!"), http.StatusOK
        if request.URL.Path != "/" {
          text, status = []byte("Not Found"), http.StatusNotFound
        }
        respWtr.WriteHeader(status)
        response.Write(text)
      }

Rather than: [https://github.com/squeaky- pl/japronto/blob/master/benchmark...](https://github.com/squeaky- pl/japronto/blob/master/benchmarks/golang/micro.go)

Also, limiting Go to use a single core is unfair because the Go GC is optimized for multi-core operation.

</comment></comment></comment><comment><USER19> Yeah the hard part is having customers. If you have that, PHP, 5 layers of proxies, worst case latency, who cares? The pig can be made to fly at that point.

"optimised for loopback!" \- which is nobody's actual problem.

It's a cool thing though, just cynical I guess because it doesn't solve my actual problems which are all self inflicted and organisational. Thinking about deleting this comment because it would logically apply to every incremental technical advance :(

<comment><USER20> I don't think it's cynical at all. These edge-case optimizations really are just entertainment.

The author's claim that the other http servers are deficient is misleading.

</comment></comment><comment><USER21> This looks like a contrived benchmark to me. If that's really your use case, use nginx instead. The http parser might be useful, but it's not very well documented and not super readable at first glance. I do prefer not to parse http at every layer if I can but other people seems to like it.

Along those lines, what happened to uwsgi async mode? uwsgi has been rock solid for me, with a straightforward binary framing and hot loading, and it would be great to use it for the (admittedly, few) cases where async might be useful. It seems like one of those obvious good ideas that no one uses?

</comment><comment><USER22> How does this get to the front page? Has nobody seen this? [https://www.techempower.com/benchmarks/#section=data-r13](https://www.techempower.com/benchmarks/#section=data-r13)

Much more thorough than this toy benchmark article, which reads like marketing release...

<comment><USER23> If you work out a way to model the performance of your own systems based on these benchmarks, then on the way you will discover what is wrong with them. Or switch to Urweb for all your future sites, I guess?

<comment><USER22> the source to all the benchmark is available [https://github.com/TechEmpower/FrameworkBenchmarks](https://github.com/TechEmpower/FrameworkBenchmarks)

If you want to make your chosen platform fast you can see what they're doing in the src to get those results. The ones not marked "stripped" and with "full" for ORM are very realistic examples. Not sure where you're going with this? Nobody's real workload looks exactly like benchmarks.

</comment></comment></comment><comment><USER24> I checked the benchmark code out. I have asked the author for more information. I am not sure if all the tests were limited to using only 1 core during the run. GOMAXPROCS=1 severely limits the Go version.

1 Go worker process can utilise all the cores in the server. I just want to get that clarified.

<comment><USER25> From the article:

> To be fair all the contestants (including Go) were running single worker > process

That seems to imply that they were all limited to a single core.

<comment><USER11> A single worker process sounds like what it says it is. A single process containing possibly many OS threads. Just because it's a single process doesn't mean it won't use all cores. Where's the implication that process = core? GOMAXPROCS defaults to the number of cores in the system.

<comment><USER7> GOMAXPROCS _is_ the number of cores used.

</comment></comment></comment></comment><comment><USER26> > To be fair all the contestants (including Go) were running single worker > process.

This makes the benchmark results much less impressive. Sure its cool that this micro framework allows you to serve a million requests per second with a single process but no one is going to be running a single process per server in production if they value their uptime.

</comment><comment><USER27> This is a great project. However, it not a very useful result (1M RPS in Python). Once you start layering more work into your handlers (JSON deserialization, admittedly C-optimized, business logic, IO, etc.), you can be assured that your HTTP serving layer is not the bottleneck.

</comment><comment><USER28> I wonder how it would compare to the fasthttp libary [https://github.com/valyala/fasthttp](https://github.com/valyala/fasthttp)

I don't suppose the hand tuned microhttp parser supports h2?

Pipelining is a dead technology that was never really alive. For those who aren't familiar with it, it's based on a http "hack" where after http/1.1 was released and response end could be signaled via something other than EOF on the tcp connection they figure you can send n requests in a row and receive n responses in a row. This was in the days where good manners required you make no more than 2 simultaneous requests to a server.

Nobody ever really supported it, and the lack of support for out of order responses meant that any one slow request could slow down everything else. The h2 model allows at least hundreds of simultaneous requests and responses multiplexed over one TCP stream.

</comment><comment><USER29> There is no pure python out there. It's python with bindings to the highly optimized C code. It would be fair to say it's C gives you almost million of RPS in some tweaked tests.

</comment><comment><USER30> Can this be retrofitted into flask (just the performance improvements) ?

I would pay for that.. a lot (as much as I can afford). And I'm pretty sure so would a lot of others.

<comment><USER31> I'd also pay for this to happen.

</comment></comment><comment><USER32> I think, one of the main points of writing a framework in Python or another high-level language is the ease of extension in the future by the community.

<comment><USER23> Where are the "ease of extension" benchmarks?

What kind of data do people look at when they want to prove their language is better, or choose the best language?

<comment><USER13> Evidently there's at least one group of developers who mainly derive their decisions from irrelevant and often incorrectly conducted micro-benchmarks.

</comment></comment></comment><comment><USER33> HTTP Pipelining should not be the base for a performance benchmark. It's an unrealistic scenario.

To make the benchmark a bit fair, add a graphic of memory usage, pipelining might have a huge impact on resources usage in the server side.

</comment><comment><USER34> When something is too good to be true it probably is not. Even if it was written in assembly these are dubious results. The graph alone tells me the quality of the claims.

</comment><comment><USER35> Sorta unrelated, but the author made an interesting claim that PyPy will reach 3.5 "conformance" in 2017 in the context of talking about NumPy. Does that mean PyPy is expected to work seamlessly with C extensions like those used in SciPy or generated by Cython?

</comment><comment><USER36> Django needs this kind of performance boost, without depending on gunicorn/uwsgi servers

<comment><USER19> Nothing will save django for free because if you used that your most likely real problem is scaling postgres or mysql.

Use as many appservers as your customer base will pay you for.

Basically, cry in your beer because you're so rich and successful now that the framework won't handle your stuff.

<comment><USER37> Agreed. Scaling Django isn't difficult really. Just spin up another instance if you need to. The major problem is scaling the DB. Making sure you're not bogging Postgres down by making it have to deal with possible race conditions is difficult.

</comment></comment></comment><comment><USER38> A million requests per second with Python.

Spoiler: technically, it's not "with Python".

</comment><comment><USER39> When did anyone start to believe that languages scale ?

<comment><USER40> what do you mean?

<comment><USER41> It might be a variant of the old argument that "languages aren't slow, implementations are", meaning that scalability is a property of the language, not the implementation.

In any case, this is written in C so I'm not sure it proves anything about the Python language.

<comment><USER23> It says something about the performance that is available from the Python language. This is how Python has always been, starting from the interpret and builtin data structures in CPython which are written in C. That isn't cheating, that's normal, realistic usage of the tool. Why should benchmarks go out of their way to use only unrealistic Python programs just to prove that it cannot "x += 1" as fast as C? Who is surprised by that, and why would it matter? Node uses libuv and nobody blinks an eye.

</comment></comment></comment></comment><comment><USER42> I love Python and use it as the main tool at my day job but I have to call it out.

> It lets you do synchronous and asynchronous programming with asyncio and > it's shamelessly fast. Even faster than NodeJS and Go.

and then,

> To be fair all the contestants (including Go) were running single worker > process.

What is the point of such a benchmark? It is completely useless. You are deliberately crippling other tech before comparing your tech with them.

What am I missing here HN?

<comment><USER13> While I certainly don't want to give this sort of "benchmarking" any credibility _at all_ :

allocating significantly different compute resources for different samples would be at least as laughable (eg. giving Go a dozen cores [per it's defaults] but constraining Python to one worker [per it's defaults]).

</comment></comment><comment><USER43> Just want to say that this post was inspiring to me. Thanks for writing it in such detail!

Sounds like you have a long and fun road ahead of you with this project.

</comment><comment><USER44> Trying to grasp the concepts here. But if I understand pipelining correctly, it's a great boost for a single browser making a million requests but won't really help you in dealing with a million browsers firing one request each.

If that is correctly understood then the benchmark is highly artificial.

But yeah, feel free to correct me if I got it wrong.

</comment><comment><USER45> I was impressed til he revealed most of Japronto is C... so much for learning of some new nifty Python technique :/

</comment><comment><USER46> Have you tried load testing it with Gatling ([http://gatling.io/](http://gatling.io/)) which seems to provide more accurate results including potential hicups you can't see with other load testing framework?

</comment><comment><USER47> Who cares about Hello world benchmark?

</comment><comment><USER48> Great work. The name looks to be Brazilian PT for "already ready," aka now!

</comment><comment><USER49> this is a ruse. all the code which does the work in this is in C.

<comment><USER50> So? The API is still Python. How do think numpy got so popular?

<comment><USER51> I think the difference here is that numpy is not flaunting its speed as a benefit of using python. They are very open that they were bringing the performance of BLAS and LAPACK to python.

</comment></comment></comment><comment><USER52> Couldn't get this to work on osx, initially got an error from strip in src/picohttpparser/build - which was fixed by running `strip -x libpicohttpparser.so` which got `python setup.py develop` to work.

But then running the demo app resulted in:

      ImportError: dlopen(/tmp/japronto/src/japronto/protocol/cprotocol.cpython-35m-darwin.so, 2): Library not loaded: libpicohttpparser.so
        Referenced from: /tmp/japronto/src/japronto/protocol/cprotocol.cpython-35m-darwin.so
        Reason: image not found

Didn't bother after that

<comment><USER53> Exactly, so you need to manually copy src/picohttpparser/libpicohttpparser.so to /usr/local/lib

<comment><USER21> Doesn't LD_LIBRARY_PATH work on a Mac?

<comment><USER7> It's DYLD_LIBRARY_PATH or something on macOS.

</comment></comment></comment></comment><comment><USER54> It's worth considering Python asyncio as well for this type of work [https://magic.io/blog/asyncpg-1m-rows-from-postgres-to- pytho...](https://magic.io/blog/asyncpg-1m-rows-from-postgres-to-python/)

</comment><comment><USER55> The current situation of Python's performance is really pathetic. Thanks for the project, we need to make Python great again otherwise the future is for Go, Elixir and Rust.

<comment><USER56> People are obsessed with performances, while my experience is that for the enormous vast majority of projects you could run on something 10 times slower than Python.

Actually, I have a friend of mine running a streaming website. He banks 15k€ a month for 400k daily users.

Python perf has zero inpact on his project. Python ease of use and maintainability means he, as a terrible (really terrible) programmer have been able to keep the site up and running for 5 years.

I worked in africa for a while. Needs for Python perf ? Zero. Needs for code that is understandable and easy to write. A LOT.

Moved to geographes working on SIG. Needs for Python perf ? Hell the GIS engine does the heavy work, they don't care. But they don't undestand jack about programming and need things done. Python let them to do it cleanly.

Or I moved to embeded programmers. Hardcore C coders that are using Python to test their boards. Need for Python perf ? They don't even know what you are talking about. For them perf is assembly. They want something that is fast to write, with 10000 libs available.

As a trainer and dev I teach Python on a monthly basis. JS training. Jeez, where do I begin ? If you let them do something more than a one-file stuff, they are lost. Python ? They are project ready in no time.

Data mongers ? They have numpy and databases.

Now myself ? I code in Python all the time. I've seen many slow sites. It's always either because of the DB queries or the static assets. Never about the server side language, be it Python, JS, Ruby or PHP.

Coding in Go, Elixir or Rust for task where my productivity is more important than the machine output makes no sense. Especially in a world where an unmetered VPS cost 3€/month ([https://www.ovh.com/us/vps/](https://www.ovh.com/us/vps/)) with 2 GB RAM and 10 GB SSD. I can just take 100 of those and build a freaking skynet without making my company accountant blink.

We are not google or facebook (and they do use Python BTW. Fb just announced they are migrating to 3 massively).

So yes, more perf is nice. I would literally pay to help having better perf because it's always a good thing. But stop pretending you need it so bad, because you would be magically the 0.1% that actually do on all the forum post where people are saying they are.

It's a nice to have.

If you want to switch to something else, just admit you are following a trend. Dev always are. They love what's new and shiny. Nothing wrong about it. But those "Python is slow I'm out" posts are ridiculous. Dropbox can say that. Bank of America can say that.

<comment><USER57> Yeah. I mostly agree with this. Developer productivity is the best thing to optimize for. These are the most important metrics for that, in my opinion: Code readability, good editor w/ intellisense, fast test suite, solid library ecosystem.

It would be interesting to see an analysis done of developer productivity across languages to find out which language provides the best over all value for new and existing codebases.

<comment><USER58> Perl would be my bet.

<comment><USER56> Perl fail on big code base, particularly because the cognitive load of reading it is high.

<comment><USER58> I'm not really buying into that argument. I have seen Python code that is unreadable, actually a lot worse than 90s PHP/Perl. Take a look at modern Perl please.

<comment><USER56> Perl 6 is better, but it still offloads a lot of the logic parsing to the human brain.

Create an array or string, take the last element and display it:

<A B C>[* - 1].say;

The same in Python:

print(['A', 'B', 'C'][-1])

The same in Ruby:

print ['A', 'B', 'C'][-1]

The first version is a good example of what perl is good at : it's short to write. The Python version is more verbose.

But, your brain has to do the following:

\- Scan the element to realise A, B and B are strings. Perl can have strings with "A", but in this here you can write it without it. So when you read, you need context to know what's going on. The Python version make it clear it's a string.

\- Then figure out the that the separation is on the spaces. Python put comas, so you don't have to parse negative space in your head.

\- the you have the "*" you need to integrate to get context of what element you use. Then you get the ";" which is just noise.

Small elements like those add up very, very quickly in a code base. Every time your brain has to gather context before understanding what it reads, you add cognitive load. You can't scan the code.

PHP, Perl and JS by nature have a higher cost that Ruby or Python. The laters have been design with readability in mind. You have less tricks, they are more boring. And easier to read.

Of course you have many other small issues with perl, like figuring out why you use .say but .WHAT in uppercase. Why the shell by default on some linux setup have a broken history. Why you can leave out the .say most of the case in the shell, but sometime if you don't use it nothing is displayed. That you have to install the rakuto package on Ubuntu but run the perl6 command to start the shell, etc.

All in all, Perl is a neat technical achievement, but has not been very ergonomy oriented.

<comment><USER58> Is Russian the hardest language to read for someone that doesn't know Russian?

C type brackets and semicolons are second nature to a lot of people.

Perl has a lot of built-in stuff that makes a lot of sense when you have learned it.

Your example in Perl 5:

      print qw/A B C/[-1];

I instantly know that qw has to do with a list of words, and the qw// can be replaced with qw(), qw[], qw##, etc to make the code the most readable to you.

Can be written like this if you like the commas and quotation marks:

      print qw/'A', 'B', 'C'/[-1]; #Will warn
      print(('A', 'B', 'C')[-1]);

'say' instead of 'print' adds a newline:

      say qw/A B C/[-1];

Print the three first elements:

      print qw/A B C D/[0..2];

Assign elements to variables:

      my ($a, $b, $c) = qw/A B C/;

Print the number of elements and assign it to a variable at the same time:

      print my $num =()= qw/A B C/;

You CAN very easily write "boring" readable Perl if you want to. But the power is there when needed. One letter variables, insane uncommented regexes, removing all whitespace etc is generally not how modern Perl programmers code.

Take a look at some code in Python that is done by someone less disciplined (or intentionally obfuscated). It is as unreadable (or worse) as the obfuscated C and Perl from the late 90s.

<comment><USER56> Of course you can get used to anything. But even if you get use to run, walking is always easier.

Using so much context to convey meaning implying a lot of processing even if you are train for it, so you have an additional load. Using so many symbols to convey meaning as well.

By design, Perl is harder to read if you write it the way it's intended to be used.

Just like Russian is harder to read than english because the language has some concept like letter effecting other letters than implies you brain need to backtrack.

Eventually, if you become a master at it, you won't feel it. But you can only master so many things in life. Most of the stuff, at best, we become very good at it. But very good means you still use your brain CPU. There is no way around it.

That's why language design is important, and to me, Perl failed this big time.

It's not just about habit either. Take Erlang for example. It is a very different language. It's hard to reason about. But it's not very hard to parse in your head because it's quite consistent and regular in the way it unfolds.

Erlang has other issues of course and I wouldn't recommand it over Perl for non highly // related tasks.

But yes, Perl has been written to be clever. This is not a quality in language design. Handy yes. Intelligent yes. Clever, not so much.

<comment><USER58> "Using so many symbols to convey meaning as well." Actually as a visually oriented person I find it very helpful. And logical:

      $ - a single thing
      @ - a list of things
      % - a hash (associative array, key-value pair list)
      \ - a reference to any of the above

      my @fruits = qw/Apple Pear/;
      my $company = $fruits[0];

      # A reference can be declared directly, this is a \%
      # with a nested \@. Encodes nicely to JSON as an example.
      my $hash_ref = {
          fruits => [
              'Apple',
              'Pear'
              ]
          };

      my $apple = $hash_ref->{fruits}[0];

"By design, Perl is harder to read if you write it the way it's intended to be used."

What way is it intended to be used? Perl 4 style mixing Perl and shell script?

Perl 5 has had (roughly) yearly releases since 1994 and is now at 5.24. Quite a bit has changed in that time and the language has evolved and improved.

There are modern non blocking web frameworks, great database support, several modern OO systems etc.

And Perl still works great shell script style (you can choose to code in a clean style) and for the most parts there is great backwards compatibility.

Perl is definitively about getting the job done. Hence the slogans "make easy things easy and hard things possible" and "there is more than one way to do it".

For someone well versed in Perl something like idiomatic Python becomes a prison where it is hard to get the job done because you can't freely express yourself.

I think it's not just philosophy or language design but people are wired differently. And Perl is a lot of fun for creative individuals.

Lastly, I am looking forward to the next years when the Python community has to clean up because of its current popularity with novice programmers. That's what Perl has been through and that old novice code is also where most of the undeserved reputation come from.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER58> Not so sure that I would want to use Python. For anything.

<comment><USER58> Some very petulant pythonista downvoters here. Thinking that no one should have a different opinion than themselves. Actually that profile fits the language... only one way... sad people.</comment></comment>


Ask HN: Do Windows and OS X each have their own React like rendering engines? - <AUTHOR> 	Do Windows, MacOS and Linux each have their own React like rendering engines to render the GUI apps?<p>It seems each OS would need to have a rendering engine to render the GUI apps? Are these engines dataflow rendering engines like React? <comment><USER2> Kind of. And there's many over the history of thos operating system as they evolved. Have a look at [https://en.wikipedia.org/wiki/List_of_widget_toolkits#OS_dep...](https://en.wikipedia.org/wiki/List_of_widget_toolkits#OS_dependent)

<comment><AUTHOR> Does it make sense to have a common rendering engine library that is common to both browsers and GUI desktops?

So something like a react rendering engine but the type of nodes change when you use it in different environments:

1\. Using it on desktop for GUI: The nodes are like the native GUI elements for that OS

2\. Using it on the web: the nodes are whatever HTML DOM nodes that have to be rendered

<comment><USER2> React for desktop already exists, so yes, I guess it makes sense [https://github.com/ptmt/react-native-macos](https://github.com/ptmt/react- native-macos) [https://github.com/Microsoft/react-native- windows](https://github.com/Microsoft/react-native-windows)</comment></comment></comment>


Run Aurora on Mesos - <AUTHOR> http://mesosphere.io/learn/run-aurora-on-mesos/

<comment><USER2> I have no idea what Aurora or Mesos are -- a better introduction would be a blog post rather than an in-depth sysadmin tutorial</comment>


Bring Back Handwriting: It's Good for Your Brain - <AUTHOR> https://elemental.medium.com/bring-back-handwriting-its-good-for-your-brain-fe22fe6c81d2 <comment><USER2> Learning anything is good for your brain. Lots of other things involve sequence and symbolism. Lots of other things involve fine motor skills. Why not learn introduce something else, like knitting?

</comment><comment><USER3> I keep Leuchtturm notebooks for capturing ideas in depth, and a stack of index cards for notes. Over time, as the notebooks fill up, they become really nice objects to keep coming back to. (And they look nice on my shelf.) The index cards are not precious, and I can scribble something down, tear it up, pin it to a board, keep them in a box for later.

I definitely agree that there's something calm about writing with a real pen or pencil on a piece of actual paper. It's tactile and satisfying. And the 'slowing down' has a very clear mental effect.

Side note: classic Montessori education starts kids with cursive, because the flowing letters are easier to start with. I got back into cursive with keeping a journal; with practice it starts to become a really nice mental/physical fit.

</comment><comment><USER4> Considering one of the reasons I got into computers was that it was easier to write closer to the speed my brain thinks at.... nope.

In fact, I'm still waiting for that sweet neural interface that cyberpunk authors promised us 30 years ago.

Handwriting is alright for studying (as you're forcing the brain to re- evaluate what you read, helping memorization), but for everything else it's a complete drag.

<comment><USER5> I've found that if you're drafting something important (i.e., not transactional communication), the extra delay of handwriting enables you to edit your thoughts more effectively, more than writing something fast and then editing it on the computer. Whether this advantage justifies the extra time taken to compose the text depends on the writer. Many proflific writers still use pencil and paper to compose their manuscripts.</comment></comment>


The extraordinary life and death of the world's oldest known spider - <AUTHOR> https://www.washingtonpost.com/news/speaking-of-science/wp/2018/05/01/the-extraordinary-life-and-death-of-the-worlds-oldest-known-spider/ <comment><USER2> Surprisingly well written.

Was wondering why a 43 year old spider was in the news, it's not about the spider itself but about the dedication of the people that study and track these species, the connections they make with the world around them, and their passion for ecological systems and the changes induced on them over time.

<comment><USER3> Arguably without a 43 year-old spider there wouldn't be a story... so it's probably more so about the spider, no?

<comment><USER4> "I took a speed reading course... I was able to read 'War and Peace' in twenty minutes. It's about Russia." \- Woody Allen.

</comment></comment></comment><comment><USER5> Some prior discussion of spider 16 RIP [https://news.ycombinator.com/item?id=16947089](https://news.ycombinator.com/item?id=16947089)

</comment><comment><USER6> This was a fun read!

Then I got to the bottom and saw a link about people stoning a 'roo because it wouldn't hop. wtf?

<comment><USER7> Humans are a species of extremes. The comparison between this article and the one about the murdered kangaroo is a great example of that.

</comment></comment><comment><USER8> Makes me wonder how similar a spiders experience of the world is to our own.

<comment><USER9> ["What is it like to be a spider?"]( [https://en.wikipedia.org/wiki/Thomas_Nagel#What_is_it_like_t...](https://en.wikipedia.org/wiki/Thomas_Nagel#What_is_it_like_to_be_a_something)) is surely a book waiting to be written.

<comment><USER5> I sometimes wonder if, assuming we are able to simulate brains and nervous systems in software at some point in the future, if we'll be able to experiment with mapping spider or bat nervous system states to human ones to be able to investigate that experimentally. Which would be somewhat counter to Nagel's arguments.

<comment><USER10> Some off topic: I'd use that experiential mapping tech to "show" the mentally ill what a "normal" state of mind which they struggle to conceive of would be like. I suspect that may be curative. I also suspect most criminality may be cured in a similar way.

<comment><USER11> Isn't that an extremely dangerous thing to do to a person's mind?

Nobody is perfect, right? I believe that. That's an ancient biblical principle. If we were to take someone we perceive as unhealthy and conform their mind to someone we perceive as healthy, that person is being robbed of their individual experience and opportunity at life.

It's one thing to denounce criminalized thoughts, it's another to disallow them entirely. Regulating our thoughts and our actions is by definition living our lives. Excluding that experience, what is left?

I'm sorry if what I'm saying is not well organized, but for whatever reason this idea evokes something passionate in me. I don't think people should ever be put through that.

<comment><USER12> Agreed; it sounds like an aseptic version of Room 101.

"But it was all right, everything was all right, the struggle was finished. He had won the victory over himself."

<comment><USER11> He truly loved big brother.

Yeah, I hadn't the bravery to include that, as I didn't want my response to seem so reactionary, but that really is what it is. Really the only difference is that in the book, he is coerced to perform the mental gymnastics through suffering, but if we could just restrain someone and zap them.... That's awful.

I'm glad others agree that this is at least controversial. The political landscape (at least here in America, my own perspective) the idea of offensive is seemingly headed down a path where people will want to bar themselves from experiencing anything offensive.

When you get on the subway and the guy next to you has odor, doesn't it make you appreciate your apartment even more?

Healthy dealings with unhealthy thoughts generally leads to healthy thoughts. Carl Rogers pioneered Humanist Psychology like fifty years ago, and he talked about that. Idk if he used the term self-talk, but that's what we call it now.

I think most neurodivergent people, particularly the criminally oriented ones, they have a dialogue imbalance, not a chemical imbalance. They are having the wrong conversations with themselves.

Anyways, the world is crazy.</comment></comment></comment></comment></comment></comment></comment>


Goodbye, MMX Usage inside Qt possibly removed soon - <AUTHOR> http://lists.qt-project.org/pipermail/development/2011-December/001084.html

<comment><USER2> Uh, none of that makes any sense.

You don't have to stop using MMX to use AVX, although you might benefit from using equivalent SSE2 instructions when available (might as well, who doesn't have an SSE2 processor now, you have to go pre-P4 for that), and that gets a tiny little mention near the end.

<comment><USER3> I think he's saying that the MMX versions of these functions actually perform worse than what the compiler could produce from the plain C code, because the compiler would be able to use SSE2 for all floating-point math. Hence, these elaborately hand-optimized code paths are actually "pessimizations".

<comment><USER4> ... for new hardware.

If you still target Pentium 2 boxes, this is bad news for you :)

</comment></comment></comment><comment><USER5> For some strange reason, when I see MMX, I am reminded of Sega's old "with blast processing" commercials.</comment>


Ask HN: I don't need a big salary, how to avoid being deemed as lower quality? - <AUTHOR> I'm a Java dev / Linux sysadmin (actually a generalist, but that's where most of my experience is) working remotely from Romania.
If I go over $55k a year I get switched to another income tax bracket, which I wouldn't mind if it didn't come with a lot more paperwork and headaches (bureaucracy is better now around here, but it still has some catching up to do on the freelancer/self employed side) -- and I don't want that.
The problem is when I mention this salary upfront, I'm (mentally) assigned a lower value/quality when the client/employer is from an area when ever juniors make almost double that.
Now I'm no rockstar dev or 10x'er, but I do deliver.
How can I avoid this pitfall? <comment><USER2> Ask for other compensation rather than money.

For example, ask for a 4 day work week, or 2 months paid leave, or possibly other perks that are important to you?

You could also ask that the company make a donation on your behalf to another cause.

The nice part is that you can look passionate, important, and pragmatic all at the same time.

For example, say "I deeply care about free and open source software. As part of my compensation package, I expect your XYZ company to donate $$$ to MyCause."

<comment><USER3> I've been asking for 80% time for 10 years, and my current company is the only one who has ever approved it. Companies say that only the work matters, and they want to be flexible, and yadda yadda, but corporate culture expects you to be available on Fridays, at least nominally. And this is more true the bigger the company.

<comment><AUTHOR> I've also noticed a disturbing trend with pseudo on-call availability, even on the weekends, labelled as "flexible working hours".

Then there's always the "unlimited time off, we trust you".

<comment><USER3> Yes, the company I'm at now has the 'unlimited time off' policy. Which has been shown to reduce the amount of time off people actually take, and means they don't have to pay out vacation when you leave. And that's on top of the perception that they're being kind to their employees. A triple win for the company.

But that's exactly why I want my 80% time to be officially recognized. I don't want to feel guilty or worry that I haven't justified my existence when I'm not there on Fridays. The contractual 3-day weekend means a lot more to me than an extra 20% salary with strings attached.

<comment><USER4> What happens if you test that unlimited policy and take say every Friday off?

<comment><USER5> Your coworkers will resent you, and maybe try to get you on the crap projects.

</comment></comment></comment></comment></comment></comment><comment><USER6> I'm also in Romania, making about $95k/year. I'm running it through my company, an LLC (SRL in Romanian). Starting in 2016, you can classify yourself as a micro-enterprise if you make less than EUR 100k ($112k) and you pay 3% in tax if you have no employees or 1% if you employ at least 2 people (could be you and your spouse for instance - that's what I do), then an additional 5% in dividend tax if you want to get cash in your pocket and don't expense anything. An accountant will cost you about 100 EUR (probably less in your case if you have just one monthly invoice to your client).

I'm not sure why you'd want to stay below $55k, depending on where you live you may just get additional projects and outsource them yourself to a junior dev you can monitor. That would give you your two employees to qualify for the 1% tax and you could move more of your workload to the additional dev as he/she learns stuff.

</comment><comment><USER7> So they simply do not understand that you are working remotely from Romania? Are you sure this is a problem? Because part of the whole job search thing is identifying people who you don't want to work with.

I live in the central US - which has, believe it or not, a similar problem. I do this partly because I'm a craftsman and I don't want to be part of the syndrome where making $110k yields the quality of life (by my lights) that $40k does here. I want people who pay more because I can infer that they'll be depending on me. I have done projects which addressed and "fixed" up to 100x the cost of development. I want _those_ projects. Ive tried places where they want seat warmers. I can't compete on that basis.

I have access to a small choir to sing my praises. Perhaps you can do the same?

</comment><comment><USER8> You could use the extra money to pay someone to do the paperwork for you.

<comment><AUTHOR> Sure, but if something happens and I can't actually keep making that much money, there's no going back to the initial state.

<comment><USER9> Where do you live? That really does sound like a beurocratic nightmare.

<comment><USER10> mentioned in OP: Romania

</comment></comment></comment></comment><comment><USER11> As someone who lives in a much less expensive part of the United States, I've run into this too (though likely not to the same degree as you). My advice: if you're skilled enough to command a higher salary, IMO, you should _always_ push for it. Use some of the extra money to pay an accountant to do the paperwork for you. With the rest, invest it or if nothing else, put the extra money into a retirement account. You'll just be able to retire that much more quickly.

</comment><comment><USER12> I have found there to be some common misconceptions about how tax brackets work, at least in the US. I'm not sure if this is how it works in your country and you might already be aware of this, but just in case it is helpful to anyone...

Only the income that is above the boundary of that higher bracket is taxed at the higher rate. All of the income below the boundary is taxed at the lower rate. E.g. if you make $105k and a higher tax bracket starts at $100k, only $5k is taxed at the higher rate.

<comment><USER13> Romanian tax law is really weird; I'm guessing this is probably related to the IT worker tax exemption.

Good advice for most of the rest of the world though :)

</comment></comment><comment><USER14> You can't! It is essentially only in the free software world where your value as a human being is __not __valued by how much money you make.

Trust me, I've worked in the big Swedish company that took advantage of cheap Romanian and Bulgarian programmers and they were deemed as inferior. I didn't review any of their code so it is possible they were.

In all the jobs I've had, I've been treated with more respect and my opinions have carried more weight the more money I made. It's just how things are. I live a very frugal life and I don't need that much money, but I always aim for a salary much above market average because I know it will mean I will enjoy my work more.

</comment><comment><USER15> Why do you not simply use some of the extra income to hire someone to do the paperwork for you? Or hire someone to find someone to do the paperwork for you?

Edit: For example if you paid me $1,000 USD I would find someone in Romania to take care of the paperwork side of affairs for you, within the extra income you make, and with very little input from you aside from finished product.

<comment><AUTHOR> But would I trust you with my financial paperwork if you missed that I already answered this question?

<comment><USER4> You haven't answered that in your question. You didn't say why the bureaucracy is a problem and why paying someone to deal with it isn't a solution.

Edit: oh I see the answer nested in a reply near the bottom. Probably worth including it in your original question.

</comment></comment></comment><comment><USER16> Idea: if you really don't want more than $55K, maybe you can make a 100% tax deductible donation to get down to 55K?

Hopefully the extra paperwork from that is minimal: just declare the donation somewhere, subtract from taxable income and attach receipt.

<comment><USER17> Is that how it works in Romania?

</comment></comment><comment><USER18> Hire an accountant. The extra money will more than pay for one.

</comment><comment><USER4> I think working part time is the way to go. Do some open source work or learning on your days off.

Also talk to tax advisor. Maybe there is a workaround

</comment><comment><USER19> Are you doing this as an individual, or as a single person company? If the later, look into paying yourself less as regular income and another sum as dividents. Might save you on corporate tax. Also, pay a bookkeeper to do this for you. Your time and security is worth that small amount.

</comment><comment><USER20> Just take the bigger salary. You'll be able to pay someone to do the paperwork for you

</comment><comment><USER21> i'm curious how that works in Romania? and why is $55K the cap?

</comment><comment><USER22> Easy. Refuse to mention your current or desired salary. It's not required that you do. Insist that they give a number first. Not only will you get more money, but you will not be seen as cheap. Win Win.

<comment><USER2> I think the OP specifically doesn't want more money? (I read the intent as staying below the $55K line)

<comment><USER22> If he wants to sacrifice thousands of dollars due to the burden of paperwork, i'm sure he could then tell them after the offer that he wants 55k instead of 80k and they would be just fine with it.

</comment></comment></comment><comment><USER23> Negotiate as high a price as you can, not necessarily aggressively, but enough so that they know you take yourself seriously. Then take anything over 10% less than that.

</comment><comment><USER24> form a company (not necessarily in Romania), pay yourself the $55k from there and allow the remaining value to accrue in the company. Of course there's a paperwork hit with that as well, but mostly outside Romania.

<comment><USER25> Won't he have to file annual tax for that company too?

</comment></comment><comment><USER26> You can just explain this, we are all humans and only your work (results) is the right meter

</comment><comment><USER27> Ask to be paid in bitcoin.</comment>


Ask HN: Review my developer job board startup - <AUTHOR>

One of the constant complaints I heard at pretty much every startup and tech meetup I went to was the difficulty in hiring good developers.
So I've tried to tackle this problem by building a hand-curated developer job board concentrating purely on companies that want to hire top-tier developers.
I'd appreciate any feedback !
http://www.coderstack.co.uk/ <comment><USER2> Good idea. Is it focused on the UK? (Looks like it from the URL).

I don't understand your implementation though. You are trying to solve the problem of "difficulty in hiring good developers" by providing a list of jobs? Shouldn't you provide a list of developers?

From the site, it looks like you're trying to solve the problem of "it's hard to find good jobs in 1 place". Better be clear about what problem you are trying to solve :)

<comment><AUTHOR> Yes, focused on the UK (at least at first).

One of the major reasons hiring good developers is hard is that traditional job boards are dominated by recruiters and it's hard for an individual company to stand out. So companies are pretty much forced to use recruiters who aren't great.

I'm solving the find good developers problem by building a job board that allows individual companies to standout, but also by strategic advertising. Using my background as a developer I can target ads much more specifically to top-tier developers by focusing for example on the things they'd be more likely to search for.

Solving the "it's hard to find good jobs" problem for developers is a side- effect of the main problem I'm tackling :)

<comment><USER2> ok, got it.

</comment></comment></comment><comment><AUTHOR> Link: <http://www.coderstack.co.uk/></comment>


How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub - <AUTHOR> http://tom.preston-werner.com/2008/10/18/how-i-turned-down-300k.html <comment><USER2> To put things in perspective, Microsoft also paid Jerry Seinfeld something like a million dollars a minute for his on-screen time, or $183,000 a second. $300,000 over three years (almost 95 million seconds) works out to be 1.73162648 nano-jerries. Nice to know what you're worth.

<comment><USER3> Good point, but isn't a million dollars a minute more like $16,000 a second, not $183,000 a second? So he's really worth more like 19 nanojerries. Not nearly as bad as you make it sound. :-)

<comment><USER4> Also, he's counting the on-screen time, not the real time Seinfeld had to give for travel/acting/whatever.

<comment><USER2> Picasso would say that I'm not counting the decades Jerry spent building himself up to the point where he could earn this payday, nor am I counting the years Tom spent doing the same.

</comment></comment></comment></comment><comment><USER5> "We publicly launched the site on April 10th. TechCrunch was not invited."

<comment><USER6> That one made me laugh, but I liked this one better:

> _When I'm old and dying, I plan to look back on my life and say "wow, that > was an adventure," not "wow, I sure felt safe."_

<comment><USER7> Interesting how apparently adventurous parts of life and safe parts of life are mutually exclusive.

<comment><USER8> Adventure requires exploring the unknown. Thus, you never know whether you will be taking the "safer" path, but that's the fun.

<comment><USER9> Meh, you're stretching the metaphor. Adventuring "into the unknown" doesn't have to be financially risky - you could explore it at a university or big R&D lab, without much risk of market failure.

<comment><USER10> Not if you're an entrepreneur.

</comment></comment></comment></comment></comment></comment><comment><USER11> Considering that you sold Gravatar previously, this was probably less of a difficult decision for you than it would have been for many. For others who are 29, married and thinking of starting a family(not saying that you are), a guaranteed > $600,000 (salary + $300k) over 3 years might not be such a bad thing

<comment><USER12> Hey, us family men like adventure too! We just can't live in a cardboard box in San Francisco, or pretty much anywhere in California for that matter (my wife was a clarinet major, not a lawyer).

It doesn't take six figures to raise a family, California aside.

</comment></comment><comment><USER13> I liked this story very much. I think the key decision point in the post is exemplary. I took a similar decision 4-5 months ago. I can recognize my thoughts and feelings perfectly.

The moment I took the decision to leave the company, my well paying job as Team Lead for total insecurity, adventure but freedom and fun was a jolt of energy.

An energy that permeates my life to this day. There is no comparison between doing something because you're told to and doing what you love. The act of creation and the sense of freedom are in themselves an incredible reward.

</comment><comment><USER14> Way to go Tom. You and Chris are two of hackers I respect the most on this planet, so I'm sure you guys are going to be ludicrously successful, if you aren't already.

Don't forget your ex-coworker when you guys make it big.

</comment><comment><USER15> You're the best! Around! Nothing's ever gonna keep you down!

Great story. I appreciated the Karate Kid and Indiana Jones references.

</comment><comment><USER16> Inspiring stuff, thanks a lot.

</comment><comment><USER17> Totally inspiring stuff. "When in doubt, don't follow the crowd". Works for me.

<comment><USER12> Except when the crowd is running and screaming.

<comment><USER18> Especially when the crowd is running and screaming.

The T-Rex will probably follow the biggest chunk of meat.

</comment></comment></comment><comment><USER19> I see a lot of this on here and it is understandable given the "startup attitude" that is necessary. But It does kinda bother me that people brag about turning down money.

I get the whole idea behind it. By turning down money you are reaffirming that life isn't about money and sometimes we have to take a little risk to do something that will make us happier yadda yadda yadda.

Just please keep in mind the amount of resources that an amount of money like 300k represents. Many people don't have the opportunity to make an equivalent amount in an entire lifetime of work. If the urge ever arises to be smug about how you turned down $x amount, please keep this in mind. We are a group whose skill set happens to be very valuable because we were born into circumstances that have allowed us to maximize our advantages (time, place, parents). It's humbling when you realize how much luck was involved.

</comment><comment><USER20> The next question: Will they turn down $3 million from an acquirer?

<comment><USER21> I think thats extremely easy to answer.

If you are willing to turn down a 6 figure salary + 300k, you will not settle for halfish of 3 million with way higher risk. Especially if that buyout forced you to work at a large company too, which he doesn't seem interested in.

<comment><USER22> I'm not sure that's so clear. Suppose we say $200K is the "6 figure salary." That's getting paid for 6 years of work right now, and even if you have to put in 12 months at the acquirer to fully vest the $1.5mm, that's getting paid $1.7mm for a year of work (reckoning from this point forward).

I'm not saying that's a slam-dunk deal, but it's a far cry better than 1/5th that amount...

</comment></comment></comment><comment><USER23> Am I the only person who finds this insane...? Walking away from over a half mil over 3 years! GitHub is cool, but is working at Microsoft for a few years _that_ bad?

<comment><USER24> Microsoft helped price his skills, and their value will surely not diminish in three years. So, it is more like putting off the opportunity of making $300,000 now by three years. Having accepted the offer now could have made him more risk averse three years down the line (in the face of a more tangible opportunity cost in terms of lost paychecks). In fact, it is a very rational choice if your window for evaluating expected outcomes is five years or more.

</comment></comment><comment><USER25> Tom,

I only know you through your service that has made my transition into the Rails world infinitely easier. I commend you for your efforts and producing a web application that actually has a business model and yet helps the community at the same time. I'm probably going to sign up with your service as soon as my projects jumps into Heroku (they don't use SVN, they use Git).

Tom, you might be one of my new role models, but dude, get a real blog going, I want to subscribe to you!

</comment><comment><USER26> Great post. Congrats on a great idea, great execution, a great team. And Good Luck.

</comment><comment><USER27> The lack of a page footer was very confusing, but great read nonetheless.

</comment><comment><USER28> Tom, if you read this, think about turning on comments. Would have liked to have given you a nice "Great post, congrats!" on the post directly. :)

<comment><AUTHOR> Isn't that what comments here at HN are for? =) In all seriousness, from past adventures in blogging, I'm sick of managing a commenting system of my own. I love HN and the people here, so this is the only place I plan to notify when I post. I'm working on a different blogging methodology this time around that I'll talk about it in my next post.

<comment><USER16> Have you thought about using <http://disqus.com> ?

<comment><AUTHOR> I considered Disqus, and will continue to evaluate it, but for now I'm going old-skool and leaving comments off my blog. I'd like to experiment with using HN for comments. Hmm, I wonder if I could hook up a piece of JS that automatically pulls the HN url when I post it here...

<comment><USER29> On that thread, it'd be a pretty nifty thing to have HN comments & posting directly integrated at the bottom of the blog post.

<comment><USER30> Something I wished for when disqus first came out...

</comment></comment></comment></comment></comment></comment><comment><USER31> definitely a nice post to start a new blog.

</comment><comment><USER32> A true entrepreneur.

</comment><comment><USER33> Well written article to be sure. However let me say what a lot of folks here I bet are thinking but don't want to actually post: they would give their left- you-know-what for a 300K over three years offer from Microsoft!! I darn sure would, and I am not afraid to admit that! :-)

<comment><USER34> "they would give their left-you-know-what for a 300K over three years offer from Microsoft"

I am missing something here. 300K over 3 years is 100k /year. Assuming you are drawing a decent salary in the United States this effectively doubles your salary. Would you sell your left-you-know-what for a job that doubles your salary?

Some context: I make over 100K US $ (and that is in India. Expenses are much lower here, than say in Silicon Valley. I have many friends who make similar amounts of money).

I wouldn't automatically accept a job at Microsoft just because they double that amount, _especially_ if the alternative is working on an idea/code base I love full time. I could live on about a 1000 $ after taxes (I am single and have no debt) if I were working on something world changing with brilliant people I respect and can learn from.

I am sure I am missing something. maybe the payout is 300 K US $ / year? (though it doesn't read that way) That is more tempting to be sure. Even for that amount I still wouldn't give my left-you-know-what :-)

</comment></comment><comment><USER35> Great read, but I have to say that I'm disappointed that Tom felt the need to publish actual numbers. There are other folks still working at Powerset/MS who would rather that the details of our offers stay confidential. Very classy, choosing self promotion over the financial privacy of former coworkers.

<comment><USER36> Why on earth would you think that someone discussing their Retention Bonus would have any relevance on what yours was? Just like there are employees of a company who receive $200K/year and those who receive $50K/year, there are those who receive $300K Retention bonuses and others who receive $20K retention bonuses. Or receive no retention bonus and are put on "Transition Plan" - or hell, are just laid off outright with 2 weeks severance + vacation. (I've always thought that that 160 Hours of vacation everyone in the valley stocks up on is a way of adding 4 weeks of severance as they eventually get laid off)

<comment><USER35> Well, if you made 50k a year and there was someone in a comparable position bragging about their 200k/yr how would it make you feel? How would your boss take it? How would you deal with the situation if you were the boss?

Companies make offers in confidence for a reason. I'm sure that Tom's business partners wouldn't appreciate him posting about their revenue anywhere public. The same principle applies here.

<comment><USER37> Truth will set you free, dude. _Lack_ of information is how companies can pay one $50k and another $200k for the same work.

<comment><USER38> Really? You're going to try, "The truth will set you free?" That's your response?

moon's complaint is that now, there are some awkward positions to deal with at Powerset/MS. Because we were all a very tight knit startup before being acquired, many of us are friends with our supervisors and bosses. Now, we're suddenly faced with the question, "Why did my friend and boss value me at value X and Tom at value Y?" These are guys and gals we've basically lived with for 2-3 years, working feverishly for the shared goal of a game-changing increment to what constitutes search. Everyone played a part, but sometimes it can be painful learning that people may not have regarded your part as much as you did.

What's more, every Powersetter knows some people in the company got The Shaft in terms of retention, for a variety of political and legal reasons. Some of these people chose to stay, some chose to leave. For those who chose to stay, this rubs salt in a wound that's still sore: their baby grew up and didn't treat them as well as the other parents.

Being acquired is both a blessing and a curse. On the one hand, it's great because you get a payout. On the other hand, the company becomes something else entirely and it's almost never what you had before the acquisition.

I understand why Tom talked about it (and it is an interesting story), but I understand why moon is upset about it as well. Tom was very fortunate that he had something else to walk away to (and this definitely drove up his retention price). For many Powersetters, it was "Microsoft" or "...?" (this is doubly true for the scientists who were literally redefining the field as they went along). I only wish everyone had as difficult-yet-easy choice as Tom did.

<comment><USER34> 'We're suddenly faced with the question, "Why did my friend and boss value me at value X and Tom at value Y?" '

So why _did_ they value you at X and Tom at Y ? If the reasons aren't obvious perhaps your friends were not evaluating people on a rational basis? And if they are (obvious reasons) no real harm done right?

What is the advantage of _not_ facing this question? I would rather know (and learn from it) than not know at all.

"Tom was very fortunate that he had something else to walk away to (and this definitely drove up his retention price)"

I think this is a very interesting take away point - always have something to walk away to.

<comment><USER38> > What is the advantage of not facing this question? I would rather know (and > learn from it) than not know at all.

So we know the disadvantages: social strife, perhaps feelings of personal inadequacy, friction with your supervisors.

So why then, do I also have to justify the opposing side? Things are difficult enough right now with the integration pains of moving into Microsoft. Let me be the first to tell you it is _not easy_ to go from the frenetic and dedicated full, sustained sprint of a startup like Powerset to the slower, bureaucratic pace of Microsoft.

We all know some people were more valuable than others. But to get the full and absolute dollar-amount measure of it hurts some people's feelings. You can say _you'd_ rather know, but that's you making a decision for yourself. The unfortunate part of Tom's story is that he decided for everyone at the company, and that has some people miffed. You can say it's emotional and irrational, and that's probably true. That doesn't make it less real.

> I think this is a very interesting take away point - always have something > to walk away to.

This is absolutely true, and I also drove up my retention price by making it clear I had opportunities to walk away to. The instant I heard about the MS offer process I immediately applied for several jobs. When it came time to listen to Microsoft's offer, I already had two other offers on the table (one from a stealth startup and one from EngineYard), and I made sure my supervisors knew (in general terms) what I was looking at.

</comment></comment></comment></comment></comment></comment></comment><comment><USER39> Get over yourself.

<comment><USER40> I don't git your antagonism toward him.

<comment><USER41> Seen on /.:

"This is a thread for talking about git, not for being one!"</comment></comment></comment>


A Farewell to Go - <AUTHOR> https://www.churchwood.at/posts/a-farewell-to-go/ <comment><USER2> This was a terribly worded blog post. The problems the author faced with go were so paper thin -- I don't think they warranted claiming "every line of go i've written is now deprecated".

It's pretty clear going into go from the initial HelloWorld -- that you are expected to:

1 - use gofmt 2 - won't have inheritance 3 - Drudge your way through a solution for dependency versioning

To complain about it so late into a project really speaks poorly to the author.

<comment><USER3> > To complain about it so late into a project really speaks poorly to the > author.

There's really no need for such a personal attack here - why do you feel a need to lash out at this author?

It is entirely reasonable to start a project knowing of limitations, and finish that project with a better understanding of how those limitations affect your productivity in the real world. That's what we call _experience_ , and learning from it is a critical element of personal growth.

<comment><USER4> > There's really no need for such a personal attack here - why do you feel a > need to lash out at this author?

the whole blog post is lashing out at something. You reap what you sow. There's no "these are the tradeoffs, and this is why I disagree with those tradeoffs"; every argument goes like this:

\- I have an expectation

\- that expectation is informed by my priors, not by Go

\- Go didn't meet my expectations

\- even though Go never made or promised to meet those expectation, I'm going to be mad that it didn't do something that I wanted that was never promised

the whole article is structured like "Go wants me to think in a different way than I already think and I refuse to think in a new way".

<comment><USER5> That's not it at all. He attacked your chosen tribe, now you're responding with personal attacks. The correct response would be, "I didn't mean to personally attack him, what I meant was X"

Go is a language, attacking Go is not justification for you to attack the author. Replace Go with a rant about Ford trucks and you'll see how silly you are being.

</comment></comment></comment></comment><comment><USER6> I disagree with the authors feelings on code formatting. Gofmt is one of the best features of Go, especially when reading others code.

<comment><USER7> I can agree with gofmt being great, but I can't agree that a simple newline before a brace should be treated as a syntax error. You're forced to use Google's coding style, whether you like it or not. Preferred coding style is subjective, and Go ignores the fact that not everyone works for Google.

<comment><USER8> I don't know why they are modding you down, but is true, code formatting is subjetive and Google enginers do not hold universal truth.

</comment></comment></comment><comment><USER9>
      According to my opinion, a programming language should let a developer use his or her style.

gofmt is the best part of Go. Everybody's code looks the same.

      Broken Package Management

This is a solved problem with dep. Switch your Go projects to dep today.

      In the documentation there is no mentioning of those missing things, you expect from a modern HTTP library.

Go's philosophy is "less is more." This is the journey of every Go programmer:

      What?! Go doesn't have X??? This is an outrage!
      * figures out how to do it without X *
      I guess I didn't need X after all. I just had to write a bit of code.

<comment><USER10> _This is a solved problem with dep. Switch your Go projects to dep today.

This never works correctly for me and I have no idea why. I haven't written enough Go lately to get this sorted – but it's definitely not quite so obvious.

_This is the journey of every Go programmer:*

There are steps after that though:

      Oh, I guess I have to copy that code from before. No big deal.
      Oh, right. I have to copy it again, with some changes? I guess that's okay.
      Wait, did I fix this bug in the other copies too?
      fire and burning pain.

<comment><USER11> No offense intended, but in those steps, I'd have probably lifted some of that work into a closure or other higher-level function. Go behaves a lot like a hybrid of functional and objective programming.

</comment></comment></comment><comment><USER12> [http://www.golang.sucks/](http://www.golang.sucks/) is both a better and a more comprehensive critique of Go.

Rob Pike's quote about "They're not capable of understanding a brilliant language" is extremely unfortunate, and a missed opportunity to elevate the art/science of programming and the much larger understanding of information theory in general for all programmers, instead of trying to appeal to the lowest common denominator. My first question would be "why would anyone pick a language that is _designed out of the box to ultimately limit the depth of their understanding_?

<comment><USER13> "Because many developers have a limited depth of understanding and no desire to increase it" is the pithy but correct answer.

<comment><USER12> Sham developers accelerating technical-debt spaghetticode, then. ;)

</comment></comment></comment><comment><USER14> Go is a lowest common denominator language designed by a large company to make programmers expendable. It's ironic though because we all know how that worked out after Sun tried it with Java and what we now have some 20+ years later.

<comment><USER4> > It's ironic though because we all know how that worked out after Sun tried > it with Java and what we now have some 20+ years later.

a tremendous number of production systems written in Java, being used by a tremendous number of people, and making a lot of money for corporations?

That's the goal of Go. It's not for research, it's not for discovery: it's for dominating the marketplace. If Go replicates Java's fate, it will have succeeded at its goals, because it's goals are to be used in production systems run by corporations.

</comment></comment><comment><USER10> I also disagree on the code formatting front – once you get used to it, gofmt really is the best thing ever.

However, all the rest of the points are pretty valid. Go has the potential to be an awesome language and environment, and minimalism as a language attribute is attractive. But it's so frigging annoying to use in practice.

</comment><comment><USER15>
        Interfaces help to solve the   problem with methods of objects, but not with data members.

I wonder if the author knows about structure embedding in Go at all.

<comment><USER16> I guess the author meant that interfaces are defined by methods, not data members. Thus, you can't have an interface that describes you should have a member field "Foo", but instead will need to create a "getter" Foo(), for it, if you want it to be part of an interface definition.

<comment><USER15>
         Go willingly chose to not support this behaviour causing me to write a lot of duplicated code. For example, my SAP analysis web interface uses three different product group structures, as the required amount of details varies between user stories. Go forces me to maintain the same code in three different places.

I think his reference to "duplicated code" means that he has the same data members in different structures, and that he duplicated those members, instead of using structure embedding. He then looked for a solution in interfaces, and _naturally_ did not find it there. If so, he is at a very basic level of Go knowledge. Having dealt with complex Go codebases, I have never seen "code duplication"

<comment><USER16> Aha, yes, I see now.

</comment></comment></comment></comment><comment><USER17> He doesn't mention what he's using instead, which doubtless has problems of its own. I'm not much of a Go user, but its community seem fairly forthright about what it does, how, and its tradeoffs. I didn't learn anything by reading this.

<comment><USER18> I wonder if the author has gotten a chance to use Java or C++ for any extended period of time. While I don't think Golang is the greatest language ever invented, the trade-offs it offers for the productivity it provides is paramount to me.

I think an appreciation for Go and the choices it makes can only be fully felt once you've spent a significant amount of time in another less expressive/convenient/simple language.

</comment></comment><comment><USER19> From everything I'd read about it, I idealized Go and it sounded, on paper, like an awesome language.

Actually _writing_ it felt like a true dose of reality after such built-up expectations. It's... ok, I'd say I like it better or at least as much as any other static language, but damn it feels clunky at times. Specially the error handling; the `if err != nil {...}` _everywhere_ is basically built-in verbosity and isn't very expressive.

</comment><comment><USER20> What I really miss with Go is a proper error handling. First of all: in my opinion exceptions are vastly superior to return values. But even if I can live without exceptions by adding `return err` everywhere, Go lacks proper framework for error construction, all it provides is strings as errors and stacktraces are not even provided. Third-party libraries can solve this problem, but only partially.

</comment><comment><USER21> The verbosity of error handling is what frustrates me most. If errors are supported as a first-class citizen, handling them should be too.

I'm still happy to employ it for what it does well, but using it feels a lot like using Java circa 1997.

</comment><comment><USER22> Go's most impressive feature to me is it's build ecosystem. Took one of Tyler Treat's experiments and had it running within 30 minutes, no real previous Go build experience.

The language itself? Meh. Python/Haskell/C/LLVM IR cover my use cases. I see Go as another wrapper on top of LLVM IR when it is convenient and that is it.

<comment><USER23> I thought go compiled to native directly? Does it use LLVM under the hood?

<comment><USER24> The official compiler doesn't. Then there's llgo [0] and gollvm [1].

[0] [https://github.com/go-llvm/llgo](https://github.com/go-llvm/llgo) [1] [https://go.googlesource.com/gollvm/](https://go.googlesource.com/gollvm/)

</comment></comment></comment><comment><USER25> Did the author even learn Go?

Gofmt is for consistency for all devs to be on the same page, the format and structure is part of the language.

Are they complaining about the inheritance and generics, again did they learn Go? Stop thinking in about other languages when you are writing Go code, think the Go way.

<comment><USER26> What is the Go way to implement a generic data structure that can't be trivially realised by wrapping a couple maps and arrays into a struct (without using interface{} and throwing away the safety Go's type system, such as it is, provides)?

<comment><USER27> You first reconsider your need to make a generic data structure and evaluate on a case by case basis.

<comment><USER10> That's a glib answer. You end up with a bunch of duplicated code when you do this.

<comment><USER27> How often do you implement generic data structures in your code? The last time you wrote one was probably in your data structures class.

<comment><USER26> There are many, many, _many_ "legitimate" "real-world" situations where you need data structures ouside of the two or three Go gives you by default. Queues? Dequeues? _Trees_ , for the love of $DEITY? Tries? Sets?

Effective use of Golang is really teaching yourself to think that anything beyond the language is a useless distraction or some kind of academic pretension. I won't go so far as to call it S________ S_______, but this is textbook Blub.

</comment></comment></comment></comment></comment></comment><comment><USER28> I'm learning Go for working with distributed systems and blockchains, but I'm basically another C#/.NET dude. Apart from the requirements to follow and maintain certain Google Guidelines, I don't mind the language to be honest. Looks neat to me.

<comment><USER28> Interestingly, I've been learning Go by reading the goethereum codebase. Any more awesome codebase pointers would be appreciated too. Thanks all.

</comment></comment><comment><USER29> I would agree that go has many flaws, but the formatting and gofmt is not one. I welcome a language that enable me to not care at all about the formatting, and just focus on programming.

\- Write a messy formatted code \- Run gofmt \- Commit

</comment><comment><USER30> I might as well use this thread as an announcement that I'm extremely excited to be working in Go in the near future.

Go appears to have all but monopolized most of the really exciting / modern Cloud Infrastructure open source projects, and from what I can tell it's going to be a joy to work with given the number of solid web frameworks that exist.

</comment><comment><USER31> Inheritance and Generics: How's the discussion for Golang 2 going? Do we get _some_ code reuse mechanism? Macros? Anything?

<comment><USER24> At the very least, you get as code reuse mechanisms: functions, ad hoc polymorphism via interfaces, struct and interface embedding, and reflection.

</comment></comment><comment><USER32> No new arguments here, and the author doesn't share what they'd rather use instead.

</comment><comment><USER33> 1\. Strict Enforcement of the Google Code Guidelines

People who are undisciplined typically don't like discipline when they first encounter it. This doesn't restrict "Coding style" like the author suggests. Coding style and code format shouldn't be conflated.

2\. Broken Package Management

It's not broken; it's intentionally limited. A "vendor" directory is natively supported by Go to account for this; use Glide or similar for more complex use-cases.

3\. No Inheritance

It's a pattern of programming just like any other. In return you get first principles code and tiny lightning fast binaries.

4\. Missing Generics

While I agree this isn't awesome, you can resolve this using Reflection.

5\. Feature-Lacking HTTP Library

??? The author is missing the point of Go here entirely.

<comment><USER34> Go binaries are small and don't do much initialization work but they don't run especially quickly, mostly due to GC and value->interface conversion and dynamic dispatch.

<comment><USER33> > and value->interface conversion and dynamic dispatch

Thank you for the reply. Where can I learn more about that?

</comment></comment></comment><comment><USER35> Nitpick/Off-topic: typo in the following line for the word 'lightweight' > Go's capabilities of utilizing leightweight thread

</comment><comment><USER36> So everyone is entitled to their own opinion. And one person's opinion is no different than any others.

That said, I absolutely love go and wouldn't consider any other language for my development. I like the strict coding guidelines. Some of the things listed are bugs/issues that can be fixed in later releases (Feature-Lacking HTTP Library & Broken Package Management to be specific).

</comment><comment><USER37> Haven't used Go in about a year and change, is Google going to pull an Angular and pull the rug out from under developers for Go 2.0?

<comment><USER38> Go 2 considered harmful?

<comment><USER21> I now really, really hope that when they originally named the language it was exclusively to set up this pun. Well played, friend, well played.

</comment></comment></comment><comment><USER39> "Strict Enforcement of the Google Code Guidelines ... According to my opinion, a programming language should let a developer use his or her style."

This is one of the better language features, IMO. No more maintaining massively complex inherited eslint rulesets. One style and you're done.

</comment><comment><USER8> I almost picked Go for a project, I've read so many complains about it that I feel like I skiped a bulled.

<comment><USER40> You can find complaints that range all the way from "spot on" to "wildly inaccurate" for any tool.

What project did you have in mind? What specific complaints did you see that made you think "this isn't a good fit"? And what did you pick instead?

</comment></comment><comment><USER41> I am not surprised you mention "missing generic". It can be done by using interface. As "no inheritance", you can use encapsulation. As "broken package management", you can use "vendor". Above are all about how to engineer application. There is no only one way to solve it. (if you are from java/C++, I don't think those OOP concepts are the king rules) As of "Google Guidelines", I would judge you just entered the beginning level of software engineering. (You dont know how much pain without those)

In conclusion, I think you blog title is just making horrible attention.</comment>


"It's surprising how hard we'll work when the work is done just for ourselves." - Bill Watterson - <AUTHOR> http://home3.inet.tele.dk/stadil/spe_kc.htm <comment><USER2> Open up a newspaper, and look at some of the strips. Rubbish. Absolute utter rubbish. And yet they all got published! Somebody looked at them and said, "Yep, that's a winner."

And here, unsurprisingly, is Watterson talking about how hard it was to get into print. Maybe--since this website is intended for businesspeople as much as creators--maybe it would be fitting if everyone remembered just how completely powerful people can fail--and not even realize it, nor be punished for it.

<comment><USER3> Well, though I share the same sentiments in general (there are a few good strips), someone out there is reading all that rubbish. Either we're not like most people, and most people like rubbish, or good content is not how strips are being evaluated to make it to print. Perhaps they're catering to something else other than good content.

<comment><USER4> I think it's the former: we're not like other people.

</comment></comment></comment><comment><USER3> I suppose there are correlations between his life and founders. He failed as a political cartoonist right out of college, and failed for a couple of years drawing C&H...not; a lot of newspapers wanted to take his work.

The most amazing thing to me, though is that he chose a stopping point. He stopped C&H; at what one might call the pinnacle of his popularity because he felt he had completely explored what he wanted to explore with the medium, unlike those long running one-liner and uninspired strips like Garfield.

Software might be amendable to the same time of attitude--they only should go up to a certain point, instead of add feature after feature, ad nauseum, creating an uninspired pile of features.

It might be like how the Ilwrath just got a little bit too good and wrapped around to evil.

<comment><USER5> Even if there isn't a cut-off for adding features to software, there's probably a cut-off for where adding features is the best occupation for the founder. Either the software fails, and its moot, or it takes off, and if it takes off, there is probably a point at which it makes more sense for the founder to leave and work on a new project--one where the hard problems still have to be solved.

</comment></comment><comment><USER6> It's only surprising if you've missed out on the last thirty years of research into motivation.

Rule of thumb: As books read decreases, the insightfulness of other people's blog posts increases.

Kvetching aside, the speech as a whole is a great read.

</comment><comment><AUTHOR> The first link I submitted to reddit. It garnered 27 points, at that time a huge number. Watterson is a fascinating character. He's last storied to be painting landscapes near his hometown of Chagrin Falls, Ohio, burning them once they're completed.</comment>


A Pledge for Namespace Directives in C# - <AUTHOR> https://medium.com/@ssg/a-pledge-for-namespace-directives-in-c-15a322504a15 <comment><USER2> <3 C#. Anders Hejlsberg and the rest of the C# team have openly interacted with developers from the first release. In recent years, they've opened the design process to feedback from anyone:

[https://github.com/dotnet/csharplang](https://github.com/dotnet/csharplang)</comment>


Before MIT Cops Arrested Aaron Swartz, Secret Service Took Over Investigation - <AUTHOR> http://www.emptywheel.net/2013/01/13/two-days-before-cambridge-cops-arrested-aaron-swartz-secret-service-took-over-the-investigation/?utm_source=rss&utm_medium=rss&utm_campaign=two-days-before-cambridge-cops-arrested-aaron-swartz-secret-service-took-over-the-investigation

<comment><USER2> This is crazy! WHY? JSTOR dropped everything, why is the Secret Service even involved?</comment>


Be first to get a Nexus 5 - <AUTHOR>

for (( ; ; )); do if curl "https://play.google.com/store/devices" -L -s --compressed | grep -q "exus 5" ; then echo "Nexus 5 is Launched" ; fi ; sleep 10 ; done ;<p>Enough said :D <comment><USER2> If you're on a Mac I recommend using 'say' instead of 'echo'. Then you'll hear when it's finished instead of having to check the terminal (which kind of defeats the purpose)

<comment><USER3> On linux, you can use espeak as it is installed by default as text-to-speach engine:

echo "Nexus 5 launched" | espeak

</comment></comment><comment><USER4> You can use [http://uptimerobot.com/](http://uptimerobot.com/) I monitor wikipedia censorship using it ;)

<comment><USER5> thanks, trying this out.</comment></comment>


Hey, Microsoft, stop installing third-party apps on clean Windows 10 installs - <AUTHOR> https://www.windowscentral.com/microsoft-please-stop-trying-install-third-party-apps-my-clean-windows-10-install <comment><USER2> It used to be that Mac tried to create a specific experience for the user, while Windows allowed me to have the experience I wanted. This article touches on the problem, I was fond of saying "Windows is becoming more Mac like," but actually Mac isn't even having these problems. I don't want your apps, Windows, and I don't want your advertisements in my start menu.</comment>