Span<T> in C# - <AUTHOR> https://github.com/dotnet/corefxlab/blob/master/docs/specs/span.md <comment><USER3> I've done some ultra-fast optimizations of algorithms in C# before. Stack allocation and unmanaged pointers was essential for this. It seems that Span<T> is making this approach, in a sense, more accessible to more developers.

This makes my optimization skills less valuable as more developers will know how to do this ;)

However, this will greatly enhance awareness of C# as a language that can be used for reasonably high-performance code. Most people don't seem to understand how fast C# can be with good optimization techniques. This will help increase adoption of C# in the developer community.

<comment><USER4> OTOH, I'd say this gives you another tool to your optimization toolbox, and one that you can market as "this thing I was doing before with unmanaged pointers, can now be done in a safer way" (and call your previous clients to sell them the new-and-shiny-good-way-to-do-it).

<comment><USER5> Yeah, if Linq optimization work has taught me anything, `Span` will get lumped into "weird advanced things" by most developers and there will still be a role for developers that understand how to use it.

(Aside: I still can't believe the number of developers I meet that seem to think of basic Linq concepts like `ToLookup` as "weird advanced things", which leads directly to long rants about `ToList` and why I consider it harmful.)

<comment><USER3> Yes and no. You're right on the money about Span being an advanced construct. However, before Span, stack allocated memory was essentially C programming in the CLR, and most of the benefits of the CLR (cross architecture compatibility, for one) therefore goes out the window, as you have dependencies on raw memory layout and stack space (determined by the CPU architecture and OS) and things like memcpy, which depend on binaries from the C runtime. If Span does not compromise these benefits, then the developer no longer has to think about those things.

There will be an gain in ease of use. Granted, average developers aren't going to care about this (nor will they need to). But you should expect to see an increase in performance of many libraries, as most open source projects generally won't use unsafe code in order to increase performance.

</comment></comment></comment></comment><comment><AUTHOR> Span<T> was recently added to C# 7.2 [https://blogs.msdn.microsoft.com/dotnet/2017/11/15/welcome-t...](https://blogs.msdn.microsoft.com/dotnet/2017/11/15/welcome- to-c-7-2-and-span/), and the early proposal was discussed a bit on HN last year: [https://news.ycombinator.com/item?id=12713186](https://news.ycombinator.com/item?id=12713186)

Also this blog post has more examples and benchmarks for people interested: [http://adamsitnik.com/Span/](http://adamsitnik.com/Span/)

</comment><comment><USER6> C# was mostly irrelevant to me a long time when Microsoft's implementation was closed, but there are some neat things about it. They've done a lot of interesting stuff in the language since it first came out, including pragmatic sugar-y stuff like type inference (`var`), async/await, and recently some moves towards more functional-style pattern matching though they're not totally there yet ([https://www.kenneth-truyers.net/2016/01/20/new-features- in-c...](https://www.kenneth-truyers.net/2016/01/20/new-features-in-c- sharp-7/) discusses proposals, some of which didn't make C# 7). Interfaces and value types also seemed like important things to have early, and there's some other handy looking stuff like the SustainedLowLatency GC mode (defer full- heap compactions as long as it can).

Can be tempting to think of it as a Java clone because of its early history and the shared general category (OO-focused GC'd imperative statically typed language whose first major impl was bytecode/VM-based), but there's signs of more to it than that.

<comment><USER7> C# is a more polished and "prettier" Java. It has done well with it's incorporation of functional programming, generics, dynamic programming and syntactic sugar in the last few releases. Too bad it's pretty much confined to the windows ecosystem.

<comment><USER8> Our server library and framework software suite and Apps have been running cross-platform for several years and with the support of .NET Core 2.0 they now run fast and flawlessly on Linux which is a very popular deployment target for our Customers, in fact all our .NET Core Live Demos were developed on Windows and deployed to and running on Linux:

      - https://github.com/NetCoreApps/LiveDemos
      - https://github.com/NetCoreWebApps/LiveDemos

Each project can also be opened and developed on Linux or Mac with VS Code or Rider. Xamarin's solutions has been making C# a popular language for developing native high-performance iOS/Android Apps for several years and the stigma of C# server apps being confined to Windows should be eradicated with the advent of .NET Core.

</comment></comment></comment><comment><USER9> I'm not a C# programmer but can someone explain how it deals with memory validity? For example what if after the Span is created the underlying memory is freed or reallocated (e.g. moved to a different region in memory because it needs to grow)? What if I create some data on the stack and then return a Span<T> that points to it? The data on the stack would be implicitly deallocated as the function returns. Basically how does C# solve the iterator invalidation problem in C++?

<comment><USER10> The linked document kinda sorta explains it, by saying that Span is a by-ref type. Let me explain what this actually means.

In .NET (below C# level, in the VM itself), there are two fundamental types of pointers - managed (e.g. int&), and unmanaged (e.g. int* ).

An unmanaged pointer is basically the same as a C pointer. It points to whatever you tell it to point, and it's your responsibility to ensure that it's still valid when you dereference it. So you can get dangling pointers to locals that went out of scope, for example. If you point it at some memory that is managed by GC, you also need to make sure that GC doesn't automatically move that memory, because the pointer will _not_ be updated - the VM provides an opcode for "pinning" managed objects so that they don't move to facilitate this. Also, because these pointers are "dumb", you can do pointer arithmetic on them, cast them to/from integer types, etc. And they can be used in any position a valid type can.

A managed pointer, in contrast, is a pointer that is guaranteed to be memory- safe. For managed pointers that reference managed objects and their fields, this means that GC is aware of those pointers, and adjusts them as it moves the objects around in memory, just like it adjusts regular object references (so you don't need to pin anything; things "just work"). When you have a managed pointer to stack-allocated data, the VM basically makes it illegal to return such a pointer, or stash it away into a variable that can outlive the scope - this is enforced by the bytecode verifier, simply by prohibiting fields of managed pointer types in heap-allocated objects (including, recursively, in any structs). So the only legal operation that you can do with a managed-pointer-to-local is to pass it into a function call - since the stack frame of the calling function is guaranteed to be there for the duration of the call, that is memory-safe.

On C# level, unmanaged pointers are just pointers (int* ), and managed pointers are used to implement ref types, as in "void Foo(ref int x)". Until recently, function arguments were really the only place they were permitted, so they were only used to pass arguments by reference. Recently, they've also added the ability to declare ref locals and return by reference, subject to all the verification rules - e.g. if you return a ref, you cannot return a ref to a local, it must be a ref to a field, or a ref argument that you got from the caller.

The runtime additionally has some types, that effectively wrap a managed pointer and add some functionality to it. One existing example is TypedReference ([https://docs.microsoft.com/en- us/dotnet/api/system.typedrefe...](https://docs.microsoft.com/en- us/dotnet/api/system.typedreference)) - this is basically a type-erased managed pointer, plus runtime type of whatever it points to. You can then "downcast" it to a proper typed managed pointer, and because it knows the target type, it can verify that the cast is valid. There's also a type called ArgIterator, which is basically the .NET type-safe equivalent of C's va_list. These are used for various low-level stuff like C++/CLI vararg functions.

Now, these wrapper types, because they encapsulate a managed pointer, have all the same verification restrictions that managed pointers themselves have. And all these types, including managed pointers themselves, are collectively called by-ref types.

Now, Span<T> is basically just a new by-ref type, that combines a managed pointer with span length under the hood. As such, it's subject to all the same restrictions, which together are sufficient to make sure that it's not possible to use it in such a way that it points to invalid memory.

<comment><USER11> Thanks for taking the time to type this up. Having just written a class similar to Span in C++ I was curious as to how this would be accomplished in C#.

</comment></comment></comment><comment><USER12> This looks great! In other languages, I frequently miss having a simple, widely adopted abstraction like Rust's &[T]; C++ iterators are kind of a pain by comparison, and often feel like an abstraction maybe one level too low/broad (as always, concepts could help that).

It's nice that they the documented the interaction with the GC too.

</comment><comment><USER13> The greatest benefit of `Span<T>` in C# is that it allows you to do things that once required an unsafe context in an efficient, (memory) safe, and type- safe manner.

<comment><USER14> Can you give an example?

<comment><USER15> The Github link has an example:

      Span<byte> stackSpan;
      unsafe {
          byte* stackMemory = stackalloc byte[100];
          stackSpan = new Span<byte>(stackMemory, 100);
      }
      SafeSum(stackSpan);

You still need unsafe to allocate, but once allocated, you can access the memory in a type safe way. M

<comment><USER16> Unsafe is no longer necessary for such cases. This can now be written as:

        Span<byte> stackSpan = stackalloc byte[100];

See [https://github.com/dotnet/coreclr/pull/14503/files](https://github.com/dotnet/coreclr/pull/14503/files) as an example.

<comment><USER13> Yup. Perhaps the github links can be updated to reflect this awesomeness?

</comment></comment></comment></comment></comment><comment><USER17> I'm most excited for the "value types as references" such as ref returns an "in"-parameters. I often use arrays of structs for memory locality, and they often grow larger than the size where they can be passed in registers. In a 64bit app with all double precision floats there isn't much you can do with 16 bytes or less.

Being able to send 3 structs of e.g 32 bytes each (such as Vector4<double>) to a function without hidden copying will be great.

</comment><comment><USER18> Great to see span taking final shape!

As for the future, I wish c# had const refs working like in c++ instead of readonly and a plethora of ireadonly collections! It could optimize away many things on the CLR level too. I guess it's not doable without breaking some things, but I think it is worth it.

<comment><USER19> readonly ref/in params in C#7.2?

[https://github.com/dotnet/csharplang/blob/master/proposals/c...](https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.2/readonly- ref.md)

<comment><USER18> It seems like that's a step in the right direction, although as I can see implementation and specification are not finalized so it is hard to say whether any compromises will have to be made when it is released.

What I really want is to have some basic code contracts (like pure methods) embedded in the language in as frictionless way as possible. It eliminates need for many simple unit tests, null checks, etc.

I'm not sure if this feature will be only for structs or also for classes - <USER2> hope both will work.

Although I switched to C# 7 years ago from C++, and I like it, I have to say that C++ syntax seems more readable to me - const T& seems more readable to me than ref readonly T.

Another thing that might be missing here is propagating immutability information down to JIT. AFAIK, codegen could optimize code better if immutability is guaranteed (at least that's part of the rationale of using const & in C++). There is PureAttribute in System.Diagnostics.Contracts, however CodeContracts seem to be mostly dead in terms of compiler and VS using information from them for static analysis.

I wish this ref readonly feature could basically render all IReadOnly* interfaces useless, so that collections would have proper "ref readonly" interfaces. I don't see that in proposal - I wonder if there is a way I could contribute with that remark? I think it makes a good reason that's missing from the rationale on that github page.

Lastly, I wish there was more discussion about how C++ or other languages with stronger checks do it. Pretty sure there's huge opportunity to learn on other's mistakes :).

As a side note - this is what makes HN great - I can post a comment and get response from Ben Adams himself! One of the greatest .NET Core contributors who made it really fast! Thank you for that link :)

<comment><USER19> Is finalized, better doc might be "What's new in C# 7.2" and section "Reference semantics with value types" [https://docs.microsoft.com/en- us/dotnet/csharp/whats-new/csh...](https://docs.microsoft.com/en- us/dotnet/csharp/whats-new/csharp-7-2)

The `in` modifier on parameters, to specify that an argument is passed by reference but not modified by the called method.

The `ref readonly` modifier on method returns, to indicate that a method returns its value by reference but doesn't allow writes to that object.

The `readonly struct` declaration, to indicate that a struct is immutable and should be passed as an `in` parameter to its member methods.

The `ref struct` declaration, to indicate that a struct type accesses managed memory directly and must always be stack allocated.

ReadOnlySpan also gives immutability; though will only work over contiguous memory rather than a more general collection type; for which you'd still need to use a IReadOnly* interface either as param or generic constraint.

<comment><USER18> Thank you for additional clarification, I can see that some of related issues like [https://github.com/dotnet/csharplang/issues/38](https://github.com/dotnet/csharplang/issues/38) are not yet closed too, so it may cause additional confusion about its status.

I think that a C++'s const& equivalent would be very useful in C#, especially to simplify making objects and value types immutable by default and also more performant. I created [https://github.com/dotnet/csharplang/issues/1118](https://github.com/dotnet/csharplang/issues/1118) as a starter point for discussion, although I'm not sure if linking it to "ref readonly" that's available for value types is the right association to make in terms of more general C# roadmap and design.

</comment></comment></comment></comment></comment><comment><USER20> D has had slicing since 2001 or so. I proposed them for C a while back:

[https://digitalmars.com/articles/b44.html](https://digitalmars.com/articles/b44.html)

Slicing is an incredibly useful feature.

<comment><USER21> I see the usefulness of spans, but I'm not sure if they fit well with the C model. Consider these cases:

        void foo1(char *p, size_t sz);
        void foo2(char p[2]);

If I understand correctly, your proposal applies to the first case. The two arguments could be reduced to one, which is currently not possible for the general case without generic or template structs, but that alone would in my view not be worth introducing fat data types to the standard. An implementation doesn't need the new type either, it can already bounds check deferences of the pointer against the lvalue it was created from[1].

For the second case, I agree that would be nice but it can be worked around by using a struct.

[1] "recalling that pointers are anchored to the lvalue from which they were created" Kell, Some Were Meant for C, 2017 ([https://sjmulder.nl/dl/pdf/2017%20-%20Kell%20-%20Some%20Were...](https://sjmulder.nl/dl/pdf/2017%20-%20Kell%20-%20Some%20Were%20Meant%20for%20C.pdf))

<comment><USER20> > which is currently not possible for the general case

Not sure what you're thinking, since it does not require templates or generics, and works for the general case. I know it does, because I implemented it for D without generics or templates.

> it can be worked around by using a struct

Yes, but nobody does since it is clumsy, hence all the array bounds overflows in C. Even tiny bits of syntactic sugar, which is what this is, can have dramatic and transformative effects.

> [1]

That inescapably makes all pointers fat pointers, which is far more overhead than what I proposed. My proposal does not have any unavoidable overhead.

\--

As for implementation experience, the D community finds they work extremely well. It's much more than an "it would be nice" feature.

<comment><USER21> > Not sure what you're thinking, since it does not require templates or > generics, and works for the general case. I know it does, because I > implemented it for D without generics or templates.

This was in favour of your proposal, about how it isn't currently possible to implement this construct generically as a user of the language, hence, it would need to be implemented in the language itself.

I think I do see the point you're trying to make. However:

> Even tiny bits of syntactic sugar, which is what this is, can have dramatic > and transformative effects.

This is true, but its use would come mainly from bounds checking at compile time and runtime (otherwise it's just the struct) which is hardly even done for regular arrays.

<comment><USER20> > its use would come mainly from bounds checking

That is where the memory safety comes from. But the use comes from things like:

1\. strlen, strcat, etc., become obsolete, replaced by far more efficient code

2\. looping over an array contents becomes straightforward

3\. documenting the extra variable holding the dimension of the array becomes unnecessary

I.e. a host of benefits.

</comment></comment></comment></comment></comment><comment> c-smile Yet another incarnation of slices in D : [https://dlang.org/spec/arrays.html#slicing](https://dlang.org/spec/arrays.html#slicing) in a store near you this time.

Yet string_view, vector_view and other range<T>'s in C++. Yet Pythonic slices. Yet Rust.

<comment><USER22> I don't understand your comment, could you clarify a bit? Are you saying that Python's slice operator is a copy of D's? Or that there's some sort of contiguous memory guarantee with some sort of Sliceable in D? In Python?

</comment></comment><comment><USER23> Starting a new job and C# will be a part of it eventually. Reading through this is really confusing -- can anyone recommend me a good book that is relatively up to date? I am good with C and several other languages, so don't need anything that is too newbie-friendly.

<comment><USER24> Jon Skeet's C# in Depth is pretty solid. The fourth edition isn't done yet - and at the rate of change lately may be out of date by the time it is released, but it goes into some great detail on the guts of the language, and how it has changed over time.

[https://www.manning.com/books/c-sharp-in-depth-fourth- editio...](https://www.manning.com/books/c-sharp-in-depth-fourth-edition)

<comment><USER25> I think that book is more useful once you have been using C# for a while, I would recommend it as a starting point.

</comment></comment></comment><comment><USER26> This will make writing IOT apps easier as one often have to scan/process contiguous buffers. Using string was slow and onerous - this could be cool, and when combined with .NetCore starting to make C# a contender in device space and other low level uses.

</comment><comment><USER27> This is pretty cool. Ive seen a surprising number of things hidden in c# that can affect performance. For example stack allocation. Anyway im looking forward to the tools, frameworks, and abstractions that come from these features.

</comment><comment><USER28> Glad to see something out of Midori becoming widespread

<comment><USER29> Yes. .NET Native and async/await were also influenced by it.

</comment></comment><comment><USER30> They might call the example something other than "SafeSum" as it produces wrong answers on overflow :)

<comment><USER10> Not if you compile with -checked+ - then it throws. Although the right way to do this is to use a checked-block:

       checked { sum += bytes[i]; }

It's one obscure C# feature that I rarely see used, but which I find indispensable, and really wish more languages adopted it. Integer overflow vulnerabilities have become more prominent in the past few years, so perhaps there will be some uptake. Interestingly, C# had this feature since the very first release back in 2001.

<comment><USER31> It would be even better if checked was the default, and you had to use an unchecked block to get unchecked arithmetic.

<comment><USER19> Can set it at the project level; then you need to use unchecked instead:

[https://docs.microsoft.com/en-us/dotnet/csharp/language- refe...](https://docs.microsoft.com/en-us/dotnet/csharp/language- reference/keywords/checked-and-unchecked)

</comment></comment></comment></comment><comment><USER32> Can someone update the link to [https://github.com/dotnet/corefxlab/blob/49982d193b4853002a9...](https://github.com/dotnet/corefxlab/blob/49982d193b4853002a960770166713da858ef8da/docs/specs/span.md)

</comment><comment><USER33> Glad to see that they'll help devs with the pinned memory issue (for buffers used with IO Completion Ports). But had to look up what "RIO Sockets" were - turns out the API helps you pre-register your buffers. Something you had to "just know" to do before.

</comment><comment><USER34> Nice. Seems very similar to [https://github.com/abseil/abseil- cpp/blob/master/absl/types/...](https://github.com/abseil/abseil- cpp/blob/master/absl/types/span.h)

</comment><comment><USER35> Reminds me of slices in Rust.

</comment><comment><USER17> C# 7.0 works for the most part in .NET 4.5 or even 4.0

Here it seems there is a dependency on the 4.7 runtime, is this the case? Where can I see a matrix of what C# versions work on which (full/desktop) runtimes?

<comment><USER36> Span definitely requires VM updates (Mono has been picking up commits to support it) so that feature at least is not going to work on 4.5/4.0 without a polyfill.

<comment><USER19> You can use the NuGet package for downlevel support [https://www.nuget.org/packages/System.Memory/](https://www.nuget.org/packages/System.Memory/)

The runtime changes make it faster, smaller and include Jit optimizations for it (bounds check elimination etc)

</comment></comment></comment><comment><USER37> I read the blogposts, I have 10 years of C# under my belt (with very scare unsafe usage). Why is this important for me? What problems does this feature solve?

<comment><USER38> The fact that it can point to unmanaged memory is a benefit for me. Just last week I've been porting some performance critical code to C++\CLI and this will allow me to use a span of of object instead of having to pin arrays. One other application is that it is now possible to implement a memory pool using a contiguous piece of memory and only returning slices of it, previously you would have to have multiple instances of a fixed size array in the pool.

</comment></comment><comment><USER39> I wrote an incredible similar class for protected memory accesses for c++ back in 2008. Lead to beautiful code and in debug mode it could verify accesses. Subsets, copies, type conversions etc were beautiful. Also combined it with a shared pointer class as well. Probably should open source those...

</comment><comment><USER40> I'm not sure if I'm missing something, but isn't this basically just the same as Java 7's Buffer, ByteBuffer, etc?

These, too, support the same types of backing memory (backed by native memory, stack-allocated memory, or a Java array), same access pattern, etc, and are also used by many third-party libraries now for such stuff (including many networking libraries, and graphics libraries such as LWJGL3)

What's so innovative about these?

<comment><USER41> > I'm not sure if I'm missing something, but isn't this basically just the > same as Java 7's Buffer, ByteBuffer, etc?

Aren't those Java types heap-allocated and GC managed? I think the big deal is that Span can be allocated anywhere (native, stack, heap).

<comment><USER40> Nope, the wrapper is, but a ByteBuffer also allows different allocation strategies, which is how different libraries use them.

For example, LWJGL3 has a separate stack where it allocates them.

<comment><USER42> There is no way to use stack allocated memory in Java.

LWJGL's MemoryStack _emulates_ a C style stack by preallocating a set amount of off-JVM-heap memory and decrementing/incrementing an index into it.

<comment><USER29> > There is no way to use stack allocated memory in Java.

Not directly, but most JIT compilers do it.

It is tricky and fragile, but one can make use of the JIT logs and try to re- write the code so that it takes the right decision regarding escape analysis.

As for an actual support at language level, we need to wait for the outcome of projects Valhalla and Panama.</comment></comment></comment></comment></comment>


Debunking the Capitalist Cowboy - <AUTHOR> https://bostonreview.net/class-inequality/nan-enstad-debunking-capitalist-cowboy <comment><USER2> > Duke's true "innovation" came not in the 1880s, when the cigarette machine > transformed the production process, but in the 1890s, when business > corporations shed the fetters of state regulation and radically redefined > themselves.

This article runs off of this huge premise that there was no actual innovation, just clever and malicious rent-seeking. But do we really buy that inventing a cigarette rolling machine didn't actually radically reduce the cost of cigarettes?

Let's not throw the baby out with the bathwater - innovation is obviously an important part of the economy. We should not confuse it with rent-seeking behavior. Even in this case, it was a simple Patent that allowed Duke to establish his corporate dominance.

<comment><USER3> You should try reading the entire article.

> Duke was not the first to use the cigarette machine; in fact, all of the > major producers used it by 1887.

He was not the inventor (that was James Albert Bonsack) or even the first to use them.

<comment><USER2> Okay, sure. But the innovation wasn't a myth or illusion. Apple didn't invent the MP3 player either.

<comment><USER3> What innovation?

</comment></comment></comment></comment><comment><USER4> Linux is the first thing that comes to my mind when I think innovation. Not necessarily because it is the top of class, but because of what it's technology and licensing allowed in the rest of the world. Or, I think of NIH and all of the medical technology that it produces.

I don't think that corporations are particularly innovative, nor can they necessarily be, as they are actually hamstrung by the profit requirement, and by the fact that we externalize far too much when it comes to economics: for example, we would probably innovate far more with battery technology, nuclear tech and renewable energy if the true ecological costs of burning fossil fuels were born by the industry.

I simply think that true innovation arises from the scientific method, and that we should start applying that to the administrative and management structures that run our corporations, as I think that people in those spaces are overpaid to guess about how to run a company. Corporate innovations that arise primarily from marketing and a shiny exterior are anything but, and are a dark pattern for me.

<comment><USER5> All of Google is built on Linux. Without Linux Google would not exist. Neither would Facebook. They would all run Microsoft stack, pay Microsoft billions for licensing... and then probably be bought by Microsoft.

<comment><USER6> To be fair, if there was no Linux, Google/Facebook would definitely have ran either Sun or HP boxes.

But Sun wouldn't have been bought by Oracle, which would have been nice.

</comment></comment></comment><comment><USER7> This is one of the most important articles I have read in a long time.

</comment><comment><USER8> In this excruciatingly long and boring article we are meant to learn that since James B. Duke gamed the regulatory system for cigarettes over a hundred years ago, Joseph Schumpeter's concept of "creative destruction" is wrong.

I'll leave that standing as it is, but it's worth noting that "libertarian" economist Schumpeter predicted the demise of capitalism in unison with the concept of "creative destruction":

[https://en.wikipedia.org/wiki/Capitalism,_Socialism_and_Demo...](https://en.wikipedia.org/wiki/Capitalism,_Socialism_and_Democracy#Part_II:_Can_Capitalism_Survive)?

</comment><comment><USER9> > _Business schools fetishize entrepreneurial innovation, but their most > prominent heroes succeeded because they manipulated corporate law, not > because of personal brilliance._

Another week, another swipe at successful people. It's really interesting to see academics who have never built a business, hired employees, etc deflate and downplay the value of hard work.

How many reports like this until everybody is ready to give the wealthy a bath? Or better yet, hand over economic independence to our loving, caring government? Time will tell.

<comment><USER10> What academics are you talking about?

<comment><USER11> Way too many to list. Read the article itself, there are links and references.

Anti-free market thinking pervades academia, despite the fact that free markets have generated an unprecedented level of material wealth. Markets feed, cloth, and employ academics who haven't the faintest idea where the money comes from.

No one disputes the fact that monopolies capture an undue amount of wealth. But to launch a general attack on entrepreneurship is fatuous and offensive. I'm sitting here are my desk living that life right now, creating a product that, down the road, will indirectly make that smug academic wealthier. Maybe he should spend five minutes in the business world. He might learn something.

<comment><USER12> I like the idea that anti-free market thought pervades academia so deeply because people who succeed in academia tend to see the modern school with its strict hierarchical structure as the ideal model of society, missing the fact that they only find it such because they thrived within it.

</comment></comment></comment></comment><comment><USER13> Personally, I find it highly interesting that some of the major, truly changing innovations in my field (The common architecture standard for a PC, the internet, the web, and the various open POSIX-ish OSs, and arguably free software/open source) all came about because normal company controls WEREN'T applied.

IBM did what would be considered a massive business mistake and allowed cheap clones to be made without licensing restrictions. IBM loses, and the world gains. But had IBM followed modern practices, the resulting surge likely wouldn't have happened.

The Internet was a govt enterprise, but is definitely not JUST a govt enterprise. I honestly don't know enough about the underpinnings to say much, but it's clearly not a corporate effort looking to profit.

The Web exploded because of it's open-ness. Back when I started in the late 90s, you just hit View Source on a site and got all the info on the UI. For all that it's cool on HN to mock know-nothing web developers, the fact that someone with a text editor, an FTP client (!), and some persistence can still publish a page is a huge deal. Dropping in CGI for some interactivity that can be as complex as PRINTING TO STDOUT is remarkably accessible. I also remember what corporate networks were like then - sysadmins HATED that you could open up port 80 and a vast amount of basically unrestricted traffic to/from EVERYONE would come through. (In terms of security, they were right, but in terms of functionality, this allowed things to blossom in ways nothing before it could). Heck, MS had locked down the browser market (I recall when they declared that IE6 would be the last version of IE) - while other browsers existed, none got any real traction before Firefox, and Firefox itself was built on the decision of the defunct Netscape to open source their code.

Linux has undoubtedly changed everything - and it (arguably) only got the chance to do so because BSD was locked down in lawsuits. And BSD only came about because AT&T was prevented from doing what a corporation would normally do. And BSD and Linux only prospered because the various Unix vendors all couldn't make anything work that wasn't a nightmare of licensing restrictions. I remember what Microsoft was like in the 90s - I believe they held back innovation then, not that they spurred it. Where would we be if they only had commercial Unix vendors to compete with? Or just AT&T?

I won't have to defend the impact of free/open software to this crowd, and while there are debates as to the sustainability model for extremely large packages without corporate sponsorship, and we do have packages nowadays being born from corporate efforts, I think it's fair to say that the current situation would never have come about from pure corporate efforts alone.

I think capitalism has a lot of good points when it comes to incentives...but every time I hear someone trash a different economic system by saying that it fails to take into account human nature, I think they are doing the same with capitalism. Just because greed exists and can be used as an incentive doesn't mean that's the only element to consider, nor does using greed in one way mean that you've removed it as a concern. (See Wall Street incentives to abuse the market)

</comment><comment><USER14> This article is garbage, and the believe system behind it is the most dangerous thing to modern society.

Imagine a world where meritocracy is demolished; in favor of 'equality.' Being 'good' or making customers happy doesn't matter anymore.

Can we please unite behind things like hard-work, quality and discipline to fight off this thinking?

<comment><USER15> Funny thing is, the author probably is for a meritocracy. He just debunks the myth that we ever had one or that we have one today.

The prime predictor of financial success in life isn't merit or hard work, but still is what it always was: who your parents are.

<comment><USER16> I have recently come to a very inconfortable truth (I mean it was always there, but it hit my brain recently): we owe the Enlightenment to useless parasites. Nobility and monks whose free time allowed them to tinker and pursue intellectual curiosity.

<comment><USER17> And yet you use the phrase "useless parasites". Keep meditating!</comment></comment></comment></comment>


A Second Tour as C.E.O. - <AUTHOR> http://www.nytimes.com/2011/02/06/jobs/06boss.html <comment><USER3> Yes, yes you do! So good, I finally decided to sign up for a Deluxe account after years as a free user(for my personal network), just because of the story! ZipGrid will be a proud user of OpenDns!

How did the new round of investors come to the decision to ultimately promote you(your passion aside)? Were they having a hard time finding a replacement or did they feel you'd been wrongly demoted?

EDIT: I'm a longtime user, but I think you should consider adding a demo page so people don't need to register to see what they're missing.

<comment><AUTHOR> Thanks, and good feedback on the need for a demo -- we're revamping the website now, it's long overdue.

In regards to your question: I was intimately involved in the fundraising process, having already known Sequoia Capital before they invested. So I knew those guys. When they invested, the former CEO was still CEO. About 5 months into their investment the CEO and the company parted ways and I immediately took over in an interim role.

After our first board meeting when I took over as interim CEO the board already seemed pleased with the immediate changes I had made and reminded me that all CEOs are interim CEOs and I should just continue to operate as CEO -- there would be no replacement search.

</comment></comment><comment><USER4> Congrats on the NYT article. That's got to feel great, in addition to being great publicity.

</comment><comment><AUTHOR> How did the title of my post get changed?

</comment><comment><USER5> Hmm, I don't understand how an investor can demote you as CEO of your own company. Can someone explain?

<comment><USER6> He gave up legal control of the company in order to get investment money. It's most likely that the board of directors controlled the company, and the investors controlled the board.

<comment><USER5> Oh, I see, thanks. So, as I understand it, he had just one vote on the board, and thus couldn't veto the decision. Thanks for the clarification.

<comment><AUTHOR> Something like that... :-)

</comment></comment></comment></comment><comment><USER7> Sorry, I missed the connection the article has to getting fired.

Congrats on the article, by the way.

<comment><AUTHOR> Being out of the drivers seat made me realize all the things that I wasn't doing when I was CEO, and which were still not being done the way I thought they should be. But it was easier to see on the outside.

</comment></comment><comment><USER8> Good media, David — glad to see things still going strong at OpenDNS.

</comment><comment><USER9> I find a paywall when trying to access the article.

<comment><USER10> Try going at it through google. [http://www.google.ca/search?q=I+make+getting+fired+look+good...](http://www.google.ca/search?q=I+make+getting+fired+look+good.+:-))

Hm, not sure how to include that ) in the URL, but the shorted search term works anyways.

<comment><USER11> thanks for this!

</comment></comment></comment><comment><USER12> _I GREW up in Del Mar, Calif., north of San Diego. I got my first job the summer after eighth grade at a small Internet service provider. I called the owner, Christopher Alan, one day and asked if he had a summer internship or a job, and he took a chance on me. My mother would drive me to the train, and I'd take along my skateboard to go from the San Diego train station to the office._

Reading stuff like this is so surreal because it nearly mirrors my own experience starting out. I got my first job through a local linux users group mailing list (CEO took a chance on me to do sysadmin and scripting work) - <USER2> mom had to drive me to work after school and pick me up in the middle of the night after I was done.

Now I run a business and when I look back, it's astonishing how large a chance it really is to hire a kid who can't even drive to write software for your business. The 1990s truly were crazy.

<comment><AUTHOR> I have interns now, and I love having them. I don't think it was because of the 90s. Good interns (who have good mentors) have the heart and passion and remind me why I love doing what I do. Keep in mind that I started my internship in like 95 or 96 -- long before the dot-com craze really took off. :-)

And FWIW, I think internships are totally underrated. Whenever I saw my friends in high school spending their summer dicking around it always boggled my mind, even more so in college.

I never was an A+ student (though I did okay) but I did always have jobs and worked my ass off when it counted.

<comment><USER12> I was also a mediocre student because I was usually out with friends or in front of a computer... although I did somehow end up going to UCSD - you must be talking about the solana beach amtrak station in the article right? :) I took the Surfliner home to Ventura county many times during my 4 years in SD.

Either way though, I just think (could be wrong) it's much more rare to find high school kids doing "real" work these days, like admining production servers or writing software that ships to customers.

<comment><USER13> I would agree with you, it's getting harder and harder for high school kids to find work other than customer service in retail joints.

<comment><AUTHOR> If they are able to get to the Caltrain station in San Francisco (which we are next to), they should email david (at) opendns.com and apply to be an intern.

All interns are paid.

</comment></comment></comment></comment></comment><comment><USER14> Cool story bro!</comment>


SaaS Pricing: Lessons from Changes - <AUTHOR> https://blog.canny.io/saas-pricing-lessons/ <comment><USER3> The one thing I've learned from our pricing inquiries over the last year, is that customers will often pay far more than you suspect, provided the product is packaged correctly.

I'll do a write-up once we are more settled in our pricing about our pricing journey, but in a nutshell.

1) early 'customers' said they wouldn't pay anything, or maybe $50/year - <USER2> have no business

2) giving them pricing < $100/year for x number users where they would likely spend $200 / year was a no go.

3) giving them pricing of $800/year with more users than they would likely ever have was interesting to them

4) telling them it was $800/year without limitations on the number of users, and they think it's too cheap.

5) tell them that it's $800 per x number of users so they would need to spend $5000 per year where they are currently spending $3000 on their alternative, and they are still interested.

This is one of our customer segments, the thing is, many of these customers would likely only have paid $150 on a per-use plan. But they want to pay more, and not have to think about per use.

The challenge for us, is our cost for each of their users is high, and as this is a new market, it is very difficult for any of us to forecast usage. We're learning.

Don't undersell yourself, and I've learned that focusing on the packaging is as important as the actual $$.

Also, how many people are charging the same amount in $ and €? We give the same dollar amount to both groups, don't undersell on exchange rate either (I don't think).

<comment><USER4> People were more excited to pay $500/month when we through in a "white-label PDF quick start guide" than $300/month. Only after being beaten over the head with that request on calls did we change things, now they love it.

<comment><USER5> Could you clarify what you mean by "white label," here? Your customers were going to sell the service to their customers?

</comment></comment></comment><comment><USER6> I recommend anyone trying to decide pricing for their SaaS, or any product in general, to study a bit about Consumer Surplus.

There is a very classical paper "A Disneyland Dilemma: Two-Part Tariffs for a Mickey Mouse Monopoly" that discusses, amongst other things, two part "tariffs" (admission + ride) which allow "the sellers to capture part of the residual surplus through an appropriately chosen fixed fee."

Which is exactly what the Article has ended up rediscovering at the end.

Quite a few economists and companies have given this problem a lot of thought, so it might very beneficial to study the body of literature that developed over the decades.

<comment><USER3> A link to 'A Disneyland Dilemma': [http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organi...](http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organisation/Papers/Oi%20-%20Disneyland%20%281971%29.pdf)

<comment><USER7> The typical HN convention seems to link directly, or use a zero-indexed footnote. For example, if all you are doing is providing a link, there's no need for extra markup:

A PDF of "A Disneyland Dilemma": [http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organi...](http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organisation/Papers/Oi%20-%20Disneyland%20%281971%29.pdf)

If you are writing more than just the link, it's common to use a zero-indexed footnote:

The pdf [0] was originally published by MIT press, and can be found online [.... pretend I wrote more prose]

0: [http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organi...](http://people.bath.ac.uk/ecsjgs/Teaching/Industrial%20Organisation/Papers/Oi%20-%20Disneyland%20%281971%29.pdf)

</comment></comment></comment><comment><USER8> This article really resonates with me because we're going through the exact same problem. The most profound thing we've learned is the value of anchoring the users expectations. Our initial price for a consumer product was $2/month. It really only was a finger-in-the-air decision. Now we've grown and companies are starting to use our product. We had a large company with 5000+ employees, ask for the price for 200 users on our product. Since the only price available was the consumer pricing they were expecting a discount on that. Between 25%-50%. 200 employees using our tool daily, for only $200 per month! Now that we have introduced a business option at $15/month per seat, it's impossible to convince them otherwise.

Another learning is that some customers are just not meant for you.

<comment><USER9> This is the exact reason why we recently changed our price structure. Now the price of a resource increases with the size of the plan. Now discounts won't hurt so much.

</comment></comment><comment><USER10> Personally I think you're pricing is too high for startups.

UseResponse costs $15/month. And other SAAS products which are at the $50/month mark are products like Intercom (which actually is three products) and are further ahead in terms of more features and polish.

I just don't feel the value proposition is all that great. And for $600 (cost of a year) I could feasibly someone get offshore to replicate your product.

And I am literally right now looking for a product like yours.

<comment><AUTHOR> Thanks for the feedback! I'd love to learn more about what you're working on. Want to reach out on our live chat?

As we mentioned in our blog post, we tried lower pricing and it didn't work well for us. Customers were less qualified and churn was much higher.

<comment><USER10> I am just a typical SAAS startup and if we know anything it's that you should trust the numbers over individual customers.

Anyway, I think I am going to tackle the issue from the other side though and go with ProductBoard. It's a product management tool with feedback on the side.

</comment></comment></comment><comment><USER11> Nice post (and beautiful charts!). One other quick comment: _really_ appreciate that you never excluded single sign-on from your base plan.

I'm always disappointed when I see SaaS where you have to upgrade to an "enterprise" account just to get reasonable security. Props to you and your team for not forcing customers into that dilemma!

<comment><AUTHOR> Thanks, the charts are from ChartMogul, which is free for under $10k MRR. Can't recommend them enough. [https://chartmogul.com](https://chartmogul.com)

Honestly single sign-on is just a no brainer MVP feature for Canny. Your users shouldn't have to make a separate account to give feedback for your product. That would be like Intercom making your users make a separate account to live chat...

<comment><USER12> Is that a SaaS for SaaS's? Can we go deeper?

</comment></comment></comment><comment><USER13> That's some interesting insight. We trialled £7 per user per month for [https://usebx.com](https://usebx.com), but found our corporate clients were our main income source (paying >£500 per month for customised deployments). We've recently decided that we'll try offering the hosted service for free to single users in the hope that it attracts more corporate customers. Pricing really is an art that I didn't give much consideration to before I started trying to run a SaaS! Glad you are finding your optimal pricing structure... I feel we still have a long way to go yet!

</comment><comment><USER14> Glad to see this! Really stoked to see you guys share all of this with so much depth.

</comment><comment><USER15> Fantastic write up, and definitely helping me as I'm due to launch my MVP in the coming month or two. Subscribed to the blog, interested in both business thoughts and digital nomad experiences :D

<comment><AUTHOR> Thanks for reading and we're glad you liked it! Definitely reach out if you think there's something else we could write about that would be helpful. Content marketing is harddd.

</comment></comment><comment><USER16> I am going to ask a slightly off topic question. I hope someone could point me some direction.

How do different industry price things? Is there a book or other resources on the subject on how to price different items? Clothes, Disk washers, Food, Software, Services.. etc. Or Phones.

Because different industry and products have different way to do cost calculation, and different margins. Or depends on companies etc. Just wondering if i could learn more on the subject.

</comment><comment><USER13> I'm interested to know, how did you guys handle pricing changes for existing customers? Did you change their pricing structure too? Or were they left on the old plans?

<comment><USER17> The article mentions how they handled it.

> While you're making big changes, take care of your existing customers. If > you're raising prices, grandfather them to their current plan. If you're > lowering prices, give them some alternative options.

<comment><USER13> Ah, I missed that. I guess I was more interested in cases where they had difficulty in getting existing customers to accept the changes.

</comment></comment></comment><comment><USER18> Might just be me but I'm finding the axes on most of those charts not quite correct.

<comment><AUTHOR> Could you be more specific? The survey charts?

<comment><USER18> Well, the 'Customers' chart which has date as an axis.

But, you weren't running A/B tests so all those pricing pages weren't active at the same time. I think something like 'time since inception (months)' would be more insightful.

Ditto with 'Average Revenue Per Customer' & 'Churn'</comment></comment></comment>


The Physics of Alice in Wonderland - <AUTHOR> http://www.geekweek.com/2010/03/this-one-makes-you-bigger-this-one-makes-you-small-the-physics-of-alice-in-wonderland.html

<comment><USER2> >You see, whenever an object increases in size linearly, its mass increases exponentially.

Polynomially? I see your exponential equation below, but it doesn't make sense (and I have no idea where it came from; what's a "mass differential equation"?) - quadrupling in height should be a volume (and therefore mass) multiplier of 4^3, or 64. That does put us past 7000 pounds, as you say.

There are hundreds of other physical reasons such size changes are unworkable, many of them _much_ more fundamental than this. Conservation of mass would seem the obvious place to start..</comment>


William Shatner's Seat - <AUTHOR> https://www.quora.com/I-always-see-this-small-black-triangle-on-the-inside-of-airplane-walls-What-does-it-mean-or-do?share=1 <comment><USER2> Perhaps a relevant bit of trivia. William Shatner was on the tv series. John Lithgow remade the same scene for the twilight zone movie. i was never much of a fan of 3rd rock from the sun, but they did have this adorable little (20 second) callback: [https://www.youtube.com/watch?v=gTNOihQnqVQ](https://www.youtube.com/watch?v=gTNOihQnqVQ)

<comment><USER3> Having seen both the tv episode and the movie episode, my recollection is that the tv episode was superior.

<comment><USER4> Just watched the tv episode absolutely mind blown. Impossible to not notice these:

\- they could smoke in airplanes

\- anyone could just open the emergency door mid-flight

\- they had triangular paper cups for water

\- there were curtains running across the cabin on each side

\- all men were dressed in suit

\- you could carry guns on the airplane

\- he wasn't immediately declared a terrorist and shot after plane had landed but instead taken by an ambulance

how civil!

<comment><USER5> I feel like smoking sections were still a thing in the late 80's / early 90's on some Asian carriers.

I was really young though so my recollection is questionable.

<comment><USER6> I flew from JFK to Heathrow in 1986 (don't recall the airline but assume it was either a major US carrier or British Airways) - I vividly remember the cabin being full of cigarette smoke. I suppose there must have been a nominal "section" but can't remember.

According to Wikipedia:

"After years of debate over health concerns, Congressional action in 1987 led to a ban on inflight smoking.

The U.S. ban on inflight smoking began with domestic flights of two hours or less in April 1988, extended to domestic flights of six hours or less in February 1990, and to all domestic and international flights in 2000."

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

<comment><USER7> As an asthmatic, I find the dry air on planes to be bad enough. If smoking were still allowed, I probably wouldn't be able to fly.

<comment><USER8> I was just thinking that, holy cow. It's bad enough when a smoker sits down next to you on the bus. Imagine the guy next to you lighting up on a four hour flight. Holy shit.

</comment></comment></comment></comment></comment></comment></comment><comment><USER9> The second comment also mentions ashtrays, pointing them out as an example of a holdover from a previous time. But that's not true in the US. They're still required by the FAA because even though smoking is never allowed, the reasoning is that if someone smokes anyway, it's safer for them to have a proper place to put it out. See [http://gizmodo.com/5912352/why-airplanes- still-have-ashtrays...](http://gizmodo.com/5912352/why-airplanes-still-have- ashtrays-in-the-bathrooms)

<comment><USER10> I am pretty sure I have been on planes without ashtray

<comment><USER11> Even if the seats don't have ashtrays, there's usually (always?) one in each bathroom

</comment></comment></comment><comment><USER12> I totally thought this was going to be about the Captain's chair on the USS Enterprise before I clicked it.

<comment><USER13> A view from Shatner's other other seat: [https://youtu.be/Uyp8B8Vro-s?t=1m20s](https://youtu.be/Uyp8B8Vro-s?t=1m20s)

</comment></comment><comment><USER14> I know the episode from Simpsons. Never knew where it originated from.

<comment><USER15> So much of my knowledge of my dad's generation is from Simpsons references.

"Who says 'SHAZAM!'?"

"Ah yes, Gomer Pyle."

<comment><USER16> ...which got re-tread in Futurama when Fry goes back in time to become his own Grandpa by way of a nuclear weapon test - the doofy "Grandpa" Fry replaces is most definitely a pastiche of Gomer Pyle.

</comment></comment></comment><comment><USER17> [https://www.youtube.com/watch?v=fFbWJJj9uFU](https://www.youtube.com/watch?v=fFbWJJj9uFU)

<comment><USER15> I'm so damn sick of that stupid song. Teens constantly ruin good content with it. I should know, I did the same thing with that song when I was a teen.

<comment><USER16> You think you're sick of it? Ha! Try being me watching a Lord of the Rings trailer on TV with that epic soundtrack underneath. It actually hurt my head.

Still, nothing quite compares to Carnival Cruises thinking it was a great idea to mold a TV ad campaign around the Iggy Pop song "Lust For Life" which, for me, will forever be associated with the film Trainspotting, petty theft, and heroin addiction. I guess those are better than what I normally associate with most large cruise operators though, which is engine failure, diarrhea, and onion sandwiches.

</comment></comment></comment><comment><USER18> Huh... I always assumed it was marking either the center of mass, or the center of lift...

</comment><comment><USER19> I absolutely love these obscure pop sub-references. Thank you for the post, it tickled my funny bone.

</comment><comment><USER20> Is there really a window under the carpet the pilot can use to check if the landing gear is down?

<comment><USER21> If you go to the link it says:

>If the crew gets an unsafe light when putting down the landing gear, there is an alternate visual indicator on each wing in two locations. If you go to the triangle stickers and look out you'll see the small one inch diameter red post protruding up about 2.5 inches. This confirms the gear is down and locked over-center.

<comment><USER20> I was referring to this comment at the link

>Right below that mark will be a small window in the floor.

>In case of a cockpit gear indication failure, one pilot goes back, peels back the carpet over the window, and checks the manual alignment indicator in the wheel well.

<comment><USER22> [https://www.reddit.com/r/aviation/comments/2x29gv/inside_a_7...](https://www.reddit.com/r/aviation/comments/2x29gv/inside_a_737300_main_gear_wheel_well/)

or [http://airplanereading.org/story/4/loss-of-blood- flow](http://airplanereading.org/story/4/loss-of-blood-flow)

The co-pilot and flight attendants were trying to lift up the carpet in the exit row, apparently to find a floor window which would give a view into the cargo hold. No such luck. The carpet had recently been tacked down to the floor when this particular aircraft underwent some renovations. Unfortunately, no consideration had been made for the floor window in case of an emergency, such as we were presently experiencing.

<comment><USER23> "Are they going to try and land anyway?"

It's unlikely that the pilot simply took a gamble. Presumably ground crew took a look, either on the first go-round or during the second approach, and confirmed that the landing gear was down. I like to think my "screw it we'll see what happens" IT methodology isn't used in all industries...

</comment></comment></comment></comment></comment><comment><USER24> Just for Reference: SNL's take on it feat. Jude Law's clearest view of _Pearl Jam_

[https://www.youtube.com/watch?v=ma_LSr7CwlQ](https://www.youtube.com/watch?v=ma_LSr7CwlQ)

<comment><USER25> SNL Link for those in America [https://www.nbc.com/saturday-night- live/video/nightmare-at-2...](https://www.nbc.com/saturday-night- live/video/nightmare-at-20000-feet/n12760?snl=1)

</comment></comment><comment><USER26> That's interesting, that also resembles the AA symbol.

</comment><comment><USER27> absolutely nobody in aviation ever called it that.

</comment><comment><USER28> no two answers agree, and they're all wildly different, and many of them seem to be from experts.

</comment><comment><USER29> Strictly speaking it'd be the "Shatner Seat", or the "Shatner Viewing Seat". Shatner's seat only works if Shatner owns it.

<comment><USER30> You're right. Good thing Lou Gehrig owns ALS, and Duff owns Duff's device then.

</comment></comment><comment><USER31> > _The Shatner reference is to one of the strangest Twilight Zone episodes, > Nightmare at 20,000 Feet,_

I don't know that earned a title for _one of the strangest_. There were lots of great episodes in the series, it would be hard to argue any of them were other than very strange.

[Edited to address astrodust's comment.]

<comment><USER32> > Part of the beauty of The Twilight Zone, as a science fiction show, was that > Serling could get away with social commentary by disguising it as harmless > fantasy. He was allowed to be critical if he was allegorical at the same > time. As he himself put it, "You know, you can put these words into the > mouth of a Martian and get away with it."

[http://www.plosin.com/beatbegins/projects/brenner.html](http://www.plosin.com/beatbegins/projects/brenner.html)

<comment><USER33> That explains why there isn't anyone doing that today. Hollywood is too PC so there's nothing for them to "get away with".

<comment><USER34> Presumably someone who's _not_ PC could use allegory to get away with being un-PC.

Think of Joss Whedon's Firefly, in which the Alliance is a thinly-veiled allegory for the triumphant Union shortly after it destroyed the Confederate States.

</comment></comment></comment></comment><comment><USER35> Holy shat!

</comment><comment><USER36> A bit off topic... Was just watching the old episodes of Star Trek on Netflix, still classic and very entertaining.

</comment><comment><USER37> William Shatner seat?

No he didn't. Did you William?

</comment><comment><USER4> I know what I'm gonna watch tonight! ▲

</comment><comment><USER38> Getting "The Shatner Seat":

\- On a plane... cool

\- On a toilet... a little too warm

</comment><comment><USER39> Wouldn't this be better called 'The Shatbird Seat'?</comment>


Ask HN: Is it possible to code a self-destructing message? - <AUTHOR>

Like in Mission Impossible, except in software. How could this be done, in the browser? <comment><USER2> Generate a unique ID for the message. Once the page has loaded using the unique ID, pull message from database, display and remove appropriate database entry.

If the page is reloaded the message will no longer exist in the database and throw an error.

<comment><AUTHOR> This is cool. Is there a service for this already? Maybe I'll make one.</comment></comment>


Brief thoughts on getting hired as a senior coder - <AUTHOR> https://medium.com/swlh/brief-thoughts-on-getting-hired-as-a-senior-coder-94f38998bb08 <comment><USER2> > I sent over some horrible code in a language I can barely write that I was > really proud of and explained why.

Why would you ever do that? The whole point of sending over code is so that they assess whether you can write understandable code. I don't know what you have to benefit from this.

> I sent over some different code, it was a 5 line code change that halved the > average response time of an API. But I also said you know, I'm not > interested in auditioning for you. Either we're a good match or we're not, > but I'm not particularly interested in being "grateful for the opportunity > to apply", frankly I think you should be grateful that I took a few hours > out of my day to explore whether we want to build something together…

Why would you even? Just why?

<comment><USER3> That second quote is basically saying "I don't actually want to work for you"; even if the code was good, that would've been a rejection from me. The OP sounds like they're not looking for a job, but looking for people to kiss the ground they walk on and give them money.

<comment><USER4> While I personally respect humility over arrogance, developers are often seen as disposable resources; this seems to be a bit of response to that.

</comment></comment></comment><comment><USER5> Anyone who seriously expects detailed feedback from a failed job interview doesn't sound very "senior" to me. I'm pushing 50 after a lifetime in tech and I stopped expecting feedback about 30 years ago. Also, as someone who's sat on both sides of the interview table many times, I wouldn't hire this junior dev who thinks he's a senior, if only because he goes out of his way to inject snark into the interview process and seems to think that the world owes him something at every step. Red flags left and right.

<comment><USER6> I "expect" it, but realize it won't generally happen. That this shitty situation is the norm doesn't mean it isn't still shitty, and the lack of feedback - or even the common straight up ghosting - is one of the reasons I want to start charging for my time when interviewing. Basically - pay me with money, or information, but respect me and my time enough that you won't waste the investment with silence.

Note: I got feedback from everyone I did an in-person with (3, this time around)

</comment></comment><comment><USER7> Frankly, he doesn't sound like someone I would like to work with. The attitude he exudes in his blog post reeks of entitlement and probably likes to argue a lot instead of having discussions. As someone else put it, he sounds far too emotional and definitely not level-headed, especially after his response to the CTO, admittedly who was also a jerk. More level-headed people would just ignore the email and not respond, but it sounds like he wanted to get his last word in, which is an annoying trait in someone to work with.

</comment><comment><USER8> >#1) [...] it took /a lot/ of applications [...] I don't have the actual numbers

..ok?

>#2) Tech interviews are just stupid broken [...]

..ok?

>I was /never/ offered feedback. Not once! [...] This sucks.

You're talking senior positions. A senior, just going by semantics, should be very aware of his standing, and what recruiters want to see for the specific position he wants to be his job. If you have questions, ask the recruiter, that's appreciated. Why should they spend money on the time it takes? For the luls? When you don't even ask for it? You tried senior and you didn't make it. Either you didn't know about important criteria, or you didn't meet them, in both cases you're just not there yet.

>#4) Recruiters are absolutely useless, unless they are good, and then they are gold. Not much to be said here, general recruiter model seems to be throw all your jobs at every applicant, see if any bite. Throw all your applicants at any job, see if it anyone gets hired. Keep commissions if it works.

the entire paragraph is hot air

>#5) Not publishing salary information sucks. Asking someone what they expect to make without publishing salary information double sucks.

If you don't know your value, you're not worth the value they'd be willing to pay if you did. It's not rocket science...

>#6) Weed out the jerks early [...] CTO wrote back and said verbatim, "I honestly wouldn't have written you back, because the code you sent over is terrible. But my team liked some other things about your resume so I want to give you a second chance to impress me. Can you send over some different code?" [...] And he wrote back and said basically oh I'm sorry, I thought I was clear, I have 50 resumes on my desk from the best CS schools in the country, you went to a boot camp, you /are/ lucky if I decide to interview you. And I was like, no thanks! Can you imagine for working for that guy if that's how he treats candidates?

guy was honest with you, gave you feedback you did't want to hear (heh, #4) and made sure that you would't waste even more of his time (due to complete lack of context-awareness with respect to the position and concurrence), while still giving you a chance, because _some people in his team were interested_. bruh. this is the best imaginable case. get a grip

<comment><USER9> > If you don't know your value, you're not worth the value they'd be willing > to pay if you did.

I disagree with this. Knowing your value requires access to information. For many people, this information is obtained informally, through connections. But this puts people without connections, who were at a disadvantage anyway, at a further disadvantage.

<comment><USER8> I can't really disagree with this, but am left in conflict:

Information should be free, but shouldn't companies be free to

a) negotiate in their own best interested

b) use NDAs?

<comment><USER10> Almost every company that hires software developers are corporations or another limited-liability structure, such as an LLC. These entities exist at the sufferance of the society that grants that charter. They have no natural rights of any kind and they are granted the opportunity to exist _so long as they provide benefits to the society granting that charter_.

So you're asking what is, to me, the wrong question. To me, a more valuable question to community, society, and humanity is "why are we not putting them in a hammerlock and demanding decency?". Like--is there economic benefit to hiding this stuff from workers? Or is there _greater_ economic benefit to at least some significant level of transparency with applicants and with workers after they're hired?

My guess is that that transparency is of significant social, as well as economic, value.

</comment></comment></comment></comment><comment><USER11> Never expect feedback. Never expect to even _hear_ from the company once they decide they're not interested. Any communication is a gift, because any information they give about how they arrive at their decision could potentially expose the company to liability.

This is the reality in $CURRENT_YEAR and it needs to be dealt with, not bristled at.

<comment><USER12> This may be the current reality, but I still think it is a bad one. The feedback could be generic and mostly offered as as a platitude. ("We just felt a few other candidates were stronger in XYZ") If, as an industry, we are going to drag people through 40-60 hour long processes for hiring (which I think is largely unnecessary and a waste of money and energy), we can also learn how to end those relationships (because at that point it is a relationship) with human kindness.

<comment><USER13> Have you ever been in the hiring manager position? Because what you propose is intenable.

Too many things will go wrong when you provide precise feedback.

First, most people don't react well to negative feedback. The natural reaction is to get defensive.

Tell one person you felt other candidates were stronger in XYZ: they get back to you with arguments and examples that shows that no, actually they know a lot about XYZ. Ok, you're nice, you take a look again. Then you decide their XYZ level is still not up to par and you thank them for their time. Once in a while, someone will not give up. They'll argue with you forever. Until you stop all forms of communications. Only a minority of people do that, but out of the one resume a day you receive, you can be sure to hit this problem almost weekly. So you learn to stop giving feedback. And of course, once a year, you have the candidate who threatens to sue because your answers show that your hiring process is biased/unfair.

We'd love to give good feedback. Others ruined it a long time ago for everyone.

<comment><USER12> I have been on the hiring side and always try to offer feedback, even through back-channels.

If you tell me, "Hey, thanks for spending so much time with us, the team really loved talking with you, and we were super impressed with your experience in X and we were really impressed with your take-home and the way you dealt with questions about why you decided to go with the architecture that you did. It was a really hard decision, but ultimately we decided to go with someone that we felt had a bit more familiarity with Scala and also had more client-facing experience because it meets our current needs. We'll each out in the future if we think there's a mutual fit, otherwise best of luck in your search!"

That may be mostly bullshit, cause there are things you can't say, but at least it helps me hone in on either areas where you were looking for something I wasn't, or areas where I might be able to improve. Maybe I get feedback from 3 or 4 places that they want more experience with scaling issues so maybe I spend the next 6 months trying to hone those skills.

I really don't think it's hard to offer actionable feedback, as I've done it for every person I've ever interviewed. I'm not gonna tell someone I thought they were annoying, or underprepared, or grossly over-represented their abilities, it's not a perfectly honest feedback system, but i I liked someone enough to spend multiple days with them, I'm certainly going to try to offer them something honest that I feel would make them a stronger candidate, for another company, or for future-us.

<comment><USER12> and as below comment says, if someone's response is "BUT I'M GREAT AT XYZ" then fine, block their emails. In my experience 95% of the time it is someone that says "Thanks! Sorry it didn't work out this time, but I agree that XYZ is something I need to work on. I'm gonna dive into it thgis year and let's chat in 12 months and see where we are both at"

Why are you burning candidate bridges to someone you clearly liked enough to spend over $10k and lots of time interviewing by sending them a one line canned response?

</comment></comment></comment></comment></comment><comment><USER14> I think the root of the technical interviewing issue is distrust. For some reason, too many programmers seem to have a inherent distrust in other programmers; a kind of "guilty until proven otherwise" mentality, where everyone else is a hack / fraud in disguise.

Whenever I see people defend the current practice, they tend to back it up with anecdotes like "I once had a technical manager who couldn't code his way out of a wet paper bag","We once got this fresh CS grad that couldn't even write basic control statements, ridiculous!", "I have a co-worker that can't code".

I'm not sure why this field is more affected than any other I've been in. Other than "tech", I've been in regular business, and in electrical engineering (at big global corporations) - and the technical grilling is absolutely nothing like what you see in coding-focused tech.

I think technical interviews have their place, and are legit, but not when they're being used the wrong way.

Some guy breathing down your neck while expecting a 100% correct recital of some esoteric data-structure or algorithm, for the sake of correctness, seems like a terribly flawed way to go on about things - yet it's something you can expect to experience in this industry. Reminds me more of quizzing than interviewing.

So yeah, that's my observations on the current atmosphere. There are good companies with good practices out there, but sadly a ton of low-effort stuff that probably hurts both parties in the long run.

<comment><USER15> I'm an EE who has worked with and interviewed a lot of SWEs. Software is a uniquely "fake it till you make it"-compatible career path. There is an oversupply of people who look pretty good on paper but execute poorly.

</comment></comment><comment><USER16> So I do agree with most here that you shouldn't care one way or another about getting feedback and the author seems to be overreacting somewhat, I do want to share that for each of my last 3 rejections from startups, I did receive politely worded feedback as to why I was rejected. So again, while I do agree that the author is overreacting in the sense that it's not helpful to emotionally react this way, I don't think his expectations are necessarily out of line - it's possible to treat candidates better and the more candidates expect to be treated well, the better the industry will be.

On top of this, the criticism regarding how the author is self-unaware (I don't entirely disagree) seems especially misguided because often how self- unaware people become self-aware is through constructive feedback. With that in mind, since the author seems to be here, the one piece of feedback I have is that:

"I sent over some different code, it was a 5 line code change that halved the average response time of an API."

I don't know if the author was at this point interested in the job or not (if this was a joke, please disregard) but some clever 5-liner is extremely unlikely to impress anyone looking for a senior engineer and is impossible to evaluate in isolation. Also most of the work involved in "halving the response time" \- again, assuming a reasonably complex system - is identifying where the bottleneck is, not writing the simple fix to address the issue that was discovered. You're expected to write substantially more code than that even in a 30-minute technical screen. When people are looking for code samples (again for a senior engineer), they are looking to see the ability to design and organize larger chunks of a system, make trade-offs between different architectures and ability maintain good code hygiene over a larger sample and so on - providing a 5-liner raises more questions than it answers.

</comment><comment><USER17> There is a randomness to it. Applying for remote positions I found I could get rejected this month reapply and make it through the process next month with same cover letter/resume.

There is an oversupply of developers generally and an under supply who know your exact stack.

</comment><comment><USER6> Where I'm at, the next time I do a job search, I want to charge for my time. I've got enough public work on Github (or, expect to soon, as this art project progresses!) that you can review _that_. If you want something just for you, pay me. That way I know you value it, as well, because otherwise it's nearly free for you.

A few interesting things happened this interview cycle: 1) I actually did get feedback, at least from the companies I had an in-person with. I think I managed that by enthusiasm and friendliness during the interviews. But, a bunch more didn't give me any feedback and barely told me that they weren't progressing, which sucks. AngelList itself was actually one of them. Penultimate communication was "we really liked your takehome", next communication was nothing, but when prompted they said "actually no" and nothing more. :/

2) I was asked to write a lockable node tree as part of a remote screen-share tech screen. I wasn't too excited about the job, so I felt like taking a risk and pulled out a line I'd wanted to pull out for awhile: "If this is the kind of work I'd be doing, I don't want this job. How about we switch to something more like what I'd actually be doing?". Still wrote the code, and did get a call-back, but by then I'd found something.

3) During an in-person tech screen, they asked me to implement something I'd already done as part of a different tech-screen, so I just pulled that up and we went from there. It was fantastic. That one ended interestingly; I get "we really like you and would want to hire you for a position we don't currently have but we don't have that position yet" rather more frequently than seems reasonable.

</comment><comment><USER18> 40-60 hours for an interview process? Do people really do that?

For my current position, I had a half-hour phone interview, then a 2 hour in- person interview. My previous job was about the same.

For out of town interviews, I've had to fly out the evening before, then a whole day process, so maybe 30 hours total even if you count the time I spent asleep in a hotel. I have _never_ had a process take more of my time than that.

<comment><USER19> 40-60 seems excessive / exaggerated. Maybe it's due to long take home exercises? My experience has typically been 1-2 hours of phone, followed by anywhere from 4 - 6 hours onsite potentially split across 2 sessions. If we include travel and subsequent negotiations, and initial application and research maybe 10 hours total?

</comment></comment><comment><USER19> He does have some correct observations. Information asymmetry, getting ghosted, the ungodly time needed to go through interviews are all real problems. Too bad the points are poorly formed and the whole article is just a rant.

Also, funny what is considered (or at least how one considers themselves) senior now. 15 years in and I think of myself as mid level.

</comment><comment><USER20> I hire exclusively "Senior" devs, and our process is tough to get through. I found the author's details online. Here's my thoughts:

> "Senior Coder" His education and experience puts him on _verge_ of Senior, > but I'd go in expecting not a lot, and probably focus on throwing shit from > right field at him and seeing how he react and learn on the fly. The blog > post strongly implies he'd just angrily hang up (which is actually rare!)

Also, "Coder"? I can see he went from design to PHP to Ruby (via a bootcamp), so I can see why he uses 'Coder' here. I don't want 'Coders', though. I want people who can deliver well architected full stack solutions while being able to mentor junior devs in the process. The article and experience leaves me pretty low expectations of that.

The simple fact is that it's WAY WAY worse to hire a bad fit than it is to let TEN great devs walk away.

<comment><USER21> > The simple fact is that it's WAY WAY worse to hire a bad fit than it is to > let TEN great devs walk away.

This simple statement sums up so much of what is broken about tech hiring. Everyone prides themselves on how they take smart risks and how entrepreneurial they are, and how they "fail fast" and "explore." Yet when it comes to hiring, all of a sudden it's "OMG we have to be super conservative! We can't fire people and one bad hire could ruin us! We must reject 99% of candidates because Risk." What happened to being bold and risk-taking?

<comment><USER20> In theory that sounds great.

But, good/great devs only want to work with good/great devs. You get a bad fit in there that manages to stick around, and your good/great devs start to leave. Then you end up with either only lesser devs or a bunch of devs that hate each other.

</comment></comment></comment><comment><USER22> Regarding the issue of feedback, IANAL, but I would have to guess that this would open the company to liability/lawsuits. Incredibly vague feedback might not be (directly) actionable, but regularly offering feedback raises the possibility that the person offering it says something -- inadvertently, or perhaps because they are in fact biased/jerks -- that implicates a company in discriminatory hiring practices.

Even if feedback in a single case isn't actionable, one can imagine that in aggregate it could be. If during discovery lawyers can find certain themes/patterns in the feedback offered to rejected interviewees, they might be able to use that as evidence. Perhaps I'm paranoid, but my wife's a lawyer....

Aside from that, in simple economic terms, offering feedback makes no sense. After all, if it helps rejected candidate, you're basically helping to improve someone who may end up working for your competition. And if it doesn't, you're wasting time. I'm not saying "in economic terms" is the right/only way to guide behavior, but if you want to understand the behavior of most companies, it's something to keep in mind.

</comment><comment><USER15> I think one of the reasons technical interviewing has become so cumbersome is because companies are very reluctant to fire employees who are not working out. Thus, they have to make sure it's an absolutely perfect match up front.

Wouldn't it save time and cost overall to hire fast and fire fast? Make it very clear that your first two weeks are a vetting period and your first 6 months are still probation?

<comment><USER18> Legally, you'd probably have to structure that as "contract to hire". Otherwise, "fire fast" is probably going to open you up to lawsuits. (You may win those lawsuits. They're still expensive.)

<comment><USER15> What is required beyond "your at-will employment has been terminated"? What are the grounds for your hypothetical lawsuit?

<comment><USER18> It's easy to file a lawsuit. You have to claim something mildly plausible that the court recognizes as possibly legally valid. At that point, the company has to burn lawyer time in order to fight the case. Even if they win, it cost them. (It cost the ex-employee, too, but the company doesn't care about that. They only care that it cost the company.)

Maybe I'm cynical from watching SCO v IBM ( _still_ not over, after 16 years, even though SCO never really had a case), but my perception is that you can file a lawsuit without a case. You just have to, in your initial filing, give the appearance that there might be a case.

</comment></comment></comment></comment><comment><USER23> The point about feedback is spot-on. It's chronic across hiring because hiring teams are trying to find their candidates and save time/money.

What people forget about is the social capital you gain/lose. If 50 people come through your process and you give no feedback, they'll tell their friends about your weak hiring practices and that alone will cost you candidates.

If you've already put in many hours to interview someone, taking 30 minutes to explain some areas of improvement or why it wasn't a good fit is a very valuable thing to do for your business in the long-run.

<comment><USER24> Is it demonstrated that the company actually gets a return, or is it the case that 5–10% of candidates will feel happy to receive feedback, and 90–95% will feel like it's a chance to rebut and defend themselves, leading to a situation to deal with?

<comment><USER12> I think that if a candidate has made it through your entire process, that you already should have a good read on them and trust them essentially. If you decide not to hire them and they write you a note thanking you for the process, offering you some feedback on your interview process (positive and improvements) and ask if there's anything they could focus on over the next year or two that would make them a stronger candidate, that it's pretty clear they aren't going to fight with you.

And yes, I do think you lose the opportunity for someone to reapply to another open position (or refer their friends) which is a shame, because presumably you thought this person was a /strong candidate/, they just didn't quite work out at the end for some reason.

</comment></comment></comment><comment><USER25> > _#3) I was /never/ offered feedback. Not once!_

> _CTO wrote back and said verbatim, "I honestly wouldn't have written you > back, because the code you sent over is terrible. But my team liked some > other things about your resume so I want to give you a second chance to > impress me. Can you send over some different code?"_

So you did get feedback, but only from the company you decided to be a jerk to.</comment>


Occupy.com Launches in Time for May Day Protests - <AUTHOR> http://www.elliotsblog.com/occupy-com-launches-in-time-for-may-day-protests-7696

<comment><USER2> Last night in SF more than 100 people ran about smashing windows and cars on the street. Did that happen elsewhere? Why did they do that?

<comment><USER3> I think it answers this (rhetorical) question <http://whatthefuckhasoccupydone.com/>

They'll probably try to disavow any connection, but that's akin to (and as effective as) a company trying to distance itself from rogue employees.

</comment></comment><comment><USER4> Are they also launching a time-machine to bring us back to last October when anyone cared about them?

</comment><comment><USER5> .com? How long until FBI seizes it?

<comment><USER6> That is dumb. List one activist site that has been seized.

<comment><USER7> True, as long as they don't tick off the MAFIAA they should be fine.</comment></comment></comment>


Who is The Next Yahoo! Ceo? - <AUTHOR> http://www.techcrunch.com/2008/06/15/nytimes-article-reverberates-through-yahoo-whos-their-next-ceo/

<comment><USER2> i dont understand why mike, icahn and other narrow minded people cant see the whole picture —- i remember michael dell once made similar comments about apple …. look what happened, today apple is much more valuable than dell … if micahel dell (who was an entrepreneur himself) can go wrong then who are these people who have never created anything as big as yahoo …. people should give yahoo and jerry&co. a break and let them run the company the way they want and if you're not comfy then sell your stocks and run (like a mice) , u will still profit as stock prices has gone up in last 6 months. What i understand is Yahoo has too many money making properties and it can still make more prop and money out of it … following is my questions to all greedy people:

1\. please explain me why cant yahoo make money from the text based ad (where they are not that strong) by temporarily leasing it to google - isn't it a smart move where you make money from both kind of ads (text and display) from the 2 best ad systems?

2\. why did yahoo made deal only for north-american market and not for other markets which are much bigger than NA? do you think that jerry is stupid that he is keeping other lucrative market i.e BRIC (brazil, russia, china, india) with him? - cant u see how intelligent he is that he is may be trying to roll out his strategy in these markets and eventually make a strong position?

3\. do you think that the whole board of directors of yahoo is stupid to support jerry?

4\. dont you know that the biggest loser (monetarily) is jerry himself, and if he is taking risk and let go millions $$ (for short term) then there has to be something in his kitty (the strategy) that he dont want to disclose it right now?, and may be this is the reason why the board of directors are supporting him because they know this internal confidential strategy ... there is always something called trade-secret that you shouldn't give away no matter how much pressure builds on you by stupid shareholders …

I think if anyone who disagrees with Jerry then they should either sell their stock (and run) OR buy more stock (get the majority) and kick him out - if u dont want to do either then stop making foolish judgments ... everyone is not greedy - there is something like loyalty and integrity and that counts at the end of the day and i think Jerry's loyalty and integrity towards Yahoo is unquestionable.</comment>


I Was Fired from Deadspin for Refusing to 'Stick to Sports' - <AUTHOR> https://www.nytimes.com/2019/11/11/opinion/deadspin-sports.html <comment><USER2> "The new boss tells the employees to make minor alterations to the product to conform to a new company direction. A direction many employees disagree with as they would rather keep business as usual. This new direction is not illegal, not unethical, just not exactly what the company used to do or what the existing staff want to give up doing."

This sounds to me like almost every acquisition ever.

What is different though is a small group of employees respond by attempting to convert the product wholly into exactly the opposite of what the new management dictated. Not just keeping the status quo, but clearly acting in a way as to send a message that the employees are in charge not management.

Management responds by firing the employee leading the revolt. Other members of the revolt see the writing on the wall and quit rather than wait to be fired as well.

In the end we are talking about 20 people who felt they had the mobility to quit rather than curtail the focus of 3% of their articles. What, if anything, transpired that could not be predicted? Why is this even news?

Contrary to the article, I believe not everything needs to be about politics. I don't want politics here on Hacker News, I don't need or want politics in my sports coverage. I don't want politics in my gaming news. If I want politics, there are plenty of venues for that.

Over the last 90 days Alexa suggests a steady decline for Deadspin and "The Ringer" sites that blend pop culture and politics with sports. Over the same period, Alexa also suggests a steady clime by rivals such as ESPN and SI, sites that typically "stick to sports".

</comment><comment><AUTHOR> [https://web.archive.org/web/20191113194531/https://www.nytim...](https://web.archive.org/web/20191113194531/https://www.nytimes.com/2019/11/11/opinion/deadspin- sports.html)

</comment><comment><USER3> [https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...](https://hn.algolia.com/?dateRange=all&page=0&prefix=true&query=%20%E2%80%98Stick%20to%20Sports%E2%80%99&sort=byDate&type=story)</comment>


SpiderOak's Warrant Canary Died - <AUTHOR> https://www.schneier.com/blog/archives/2018/08/spideroaks_warr.html <comment><USER2> A comment on that page corrects the statement and shows that the canary is online. They claim to be an employee. It gives the URL for the file.</comment>