231 karma · joined October 24, 2013
To me, Maslow's hierarchy of needs is interesting because it tops out at "self-actualization". Maslow is effectively saying that the most important need a human can fulfill in their own life is the need to have a purpose and to live out that purpose.
The top of the analogous hierarchy of software development needs in this post, on the other hands, fizzles out at "patterns". What about understanding how different patterns are used to make a working piece of software? What about fitting separate software systems together to make a functioning product? What about shaping a product to fill some kind of need in the world?
My hierarchy would look something like this (with less bad ASCII art):
/-----------\
/ Meeting requirements
/---------------\
/ Designing software architectures
/-------------------\
/ Manipulating software systems (e.g. implementing an HTTP service, setting up a database, etc.)
/-----------------------\
/ Writing code (e.g. accessing APIs, implementing a function, etc.)
/---------------------------\
with "meeting requirements" at the top since that is the most important thing to be done as a software developer, and it can't be done without addressing the needs below it. It's not as lofty of a name as "self-actualization", though.I also have some freebie groups that I just know, like 0001 0011 0111 1111, the powers of two, 5 and 6 from working with chmod, etc.
A B D E still give me trouble, but that's what a tool like this hex quiz is good for!
What about 'strncpy' versus 'strlcpy'? Or 'vsnprintf'? 'fcntl.h'? 'execlp'? 'EBADF'? 'SIGSEGV'? 'lstat'?
As a small example, consider Brainfuck. The Brainfuck specification (if such a thing exists) has no upper bound on the number of memory cells, but practical implementations generally do have a limit that "useful" Brainfuck programs will rarely hit. The specification describes a TC language, while the implementation does not.
Therefore, if a language is TC according to its specification, but has an implementation in a language that is shown to not be TC, then it follows that the implementation must be of a non-TC subset of the language. This is, of course, assuming both that the specification has been proven TC, and that the implementing language has been proven non-TC.
I believe the point being made in the paper is that the C specification itself is restrictive enough that it describes a non-TC language. In other words, any implementation of C that is truly Turing complete would be violating the specification in some way. In that case, it follows that a C implementation of a TC language (such as the bignum language) must only be an implementation of a non-TC subset of the language.
(As an aside, consider that nothing running on an isolated machine will ever be truly TC, since an isolated machine has a finite amount of memory and so can't be TC. It's not that much of an inferential jump to see that this kind of TC-breaking limitation could end up in the specification of C, a language quite close to the metal.)
I'd argue that terms like "interpreter", "compiler", "decompiler", "transpiler", etc. are helpful for establishing a general taxonomy of program transformation tools, even if the boundaries aren't so clear.
The way I see it, there are two ways to use a library like this that are worth considering: adapting existing projects, and starting new ones. In my opinion, the gains to be had from rearchitecting an existing project to use such a library are minimal, and for the vast majority new projects, C is not the best choice these days. If you want the performance of C with the programming style of Go, you can probably get away with just using Go!
That said, it's nice to see a polished, working implementation of this idea. Definitely something worth being aware of.
If I understand what you're getting at, you're saying that locking is the solution to all concurrency problems? This section is the most interesting to me, as I've been researching concurrency at a high level lately. I'm a little confused by your conclusion. It seems naïve to claim that multiple hosts can agree on what action to take "just" by using locks. What if a peer is holding a lock and becomes unreachable? What if the peer isn't dead and thinks it still has the lock? What if the core that is issuing the locks becomes unreachable?
As someone who has spent a non-trivial amount of time in IRC development and as an operator on small and medium sized networks, I've noticed that IRC (especially when services are involved) is pretty counter-intuitive for many users, even otherwise brilliant ones. Modes are obtuse and vary wildly from server to server, the idea of a separate nickname and channel registrations seems unnecessarily complex, channels just disappear when everybody leaves them, and so on. On top of this, the IRC architecture is needlessly limited for the most common IRC network use cases these days. In the past where networks were a federation of autonomous servers, it made sense, but these days a network's servers are partly or entirely controlled by a single entity, and things like netsplits are an unnecessary interruption in user service.
There is a working group to define the next generation of the IRC standard, but the additions tend to be patches for small nigglings in the protocol (such as needing to consistently poll for user away statuses and account names) than aggressive overhauls to the whole architecture, which is okay; there's only so much you can do with an effort like that while still seeing progress, and these are things IRC has needed for a long time anyway.
In my opinion what is needed if IRC is to regain its popularity is an innovative new server implementation that challenges the very workings of IRC from the ground up, maintaining only enough of the protocol to interact with existing clients. If users are to feel comfortable with IRC, they need a server software suite that conforms to their expectations of how a chat service should behave, and no solution currently provides that. The problem is, there is an enormous engineering cost associated with this, and the IRC development community is having a hard enough time as it is finding people who are willing to do more than just basic maintenance tasks.