It was too detailed to use as an icon, and the lines were too thin to look good when printed.
977 karma · joined July 29, 2016
It was too detailed to use as an icon, and the lines were too thin to look good when printed.
The hand drawn gopher just looked... childish? It definitely didn’t give me the impression of an efficient and well put together programming language.
When I was doing a small startup, we had a small phabricator installation which I loved using. It’s very engineer-focused in a lot of its tooling and features, but has an integrated task management systems and wikis, and tools for pre-commit reviews, or post commit reviews/audits, and I found it much easier to run and maintain than github enterprise or the Atlassian suite (and it’s free).
> issues a write every time someone types into a text field
With more than a handful of people, this is getting into conflict territory pretty rapidly, especially if the document is structured as a single row (hopefully it's more granular than that). Time for some back of the envelope maths:Assuming that an average person types at around 200 words per minute (number pulled from https://www.livechatinc.com/typing-speed-test/#/), that's a character every 300ms on average. With 10 people editing the document, that's a character every 30ms on average, which can easily lead to conflicts if they're all trying to update the same resource.
Have you explored implementing a CRDT based solution like WOOT instead?
- Replication factor increased to 5x (rather than the 3x default)
- 8 indexes on the table being modified which also needed to be updated
- Nodes spread across North America, incurring higher RTT latency between nodes
- Relatively high contention on the data triggering client-side retries
- HDD's as the storage medium (RockDB is optimized for SSDs)Compare that to Node, which, while organized by the Node.js foundation, makes it very easy for people to contribute bug fixes and ideas. The core node repo is nearing 2,000 contributors. Having people help out, even if it's just with bug fixes, allow core developers to focus on new features. I don't think iteration speed is a sign of instability. Node has a well established release cycle and LTS process.
They drew a comparison to the early days of elevators, when everyone was terrified of them, especially after transitioning away from having a lift operator controlling it. The solution at the time was the big red emergency stop button.
I used linux for a good long while. Started with Ubuntu, then on to Mint, then Arch as I became more of a "power user". But you know what? Sometimes I don't want to put in manual effort to get things to work, even if that means I lose some customization. Over my years with linux, I've had driver issues with displays, with the network manager, with mounting remote drives... Basically any interaction with the hardware was a solid kick in the groin. Since switching to a Macbook, everything has been smooth sailing.
And especially nowadays with homebrew and docker, all the tools I need are available on a Mac, and it's a more integrated experience, and IMHO it looks better. But if you like linux and it works for you, that's also fine by me. To each their own.
I know a lot of folks will probably see this as an old company trying to catch a ride on the cryptocurrency hype train, but to me this has always been the dream of cryptocurrency; a new class of technology to help solve types of problems previously very difficult to address, and it's awesome to see a >125 year old company taking a shot at adopting it for a novel use case (licensing of and payment for photography).
I'd very much rather see more stories like this than more early stage ICOs from alt coins made by a handful of people with unknown/dubious intentions.
Go for instance makes use of Duff's devices generated for each architecture in its core runtime. You can see the code to generate the devices here - https://golang.org/src/runtime/mkduff.go
Check the sequence number map to determine if the PID is already present.
If it is not, check sequence number.
If it is 0, insert the PID, epoch, and sequence number into the PID mapping table and proceed to append the entries.
If the sequence is not zero, return the InvalidSequenceNumber error code.
If the PID is present in the mapping, check the epoch.
If the epoch is older than the current one, return InvalidProducerEpoch error code.
If the epoch matches the current epoch, check the sequence number:
If it matches the current sequence number, allow the append.
If the sequence number is older than the current sequence number, return DuplicateSequenceNumber.
If it is newer, return InvalidSequenceNumber.
If the epoch is newer, check the sequence number.
If it is 0, update the mapping and allow the append.
If it is not 0, return InvalidSequenceNumber.
That's a pretty straightforward approach of enforcing idempotency; checking producer and sequence IDs and throwing them out if they aren't correctly ordered. The other big addition to the code base was cross-partition transactions, which, while pretty cool, is a far cry from "Exactly once delivery".To start, I always phrase the question as a real world example - "I have a server, and we currently have some functionality X. I want to augment it in way Y, and I want you to help me do that". I structure it like a real problem rather than a toy "write an algorithm that does this, and demonstrate that you know this one arbitrary data structure I have in mind" type of question. The end task is the same, but it gets the candidate in the mindset of doing actual work and thinking about the implications of their design decisions.
The question starts simply enough, with most candidates at the level I'm interviewing for able to complete it in ~10-15 minutes, focusing on basic language structure common to most languages, and simple DS/A.
Then we get to have a little fun. Based on the role that the candidate is being considered for, how they did on the first part, and the feedback on other interviewers on their strengths and weaknesses, I can steer the question in several directions:
- Let's talk about concurrency (also plays nicely into the "this is in a server we have" setup, since thread safety is not just a nice-to-have, but a real requirement)
- I'd like to augment it even further with new functionality (which involves much more deep knowledge of various data structures and their nuances)
- I'd like to build this into a whole separate service to handle this functionality. What would that look like?
I come with a laptop and some skeleton code in a handful of common languages, and give the candidate the choice of white boarding or typing, as well as allow them to make use of the internet, to look up libraries, APIs, etc. This all also plays into the general theme of "structure the interview like the work they'll actually be doing".If the candidate is not doing terribly well, the question can also stop after the first part (which even the weakest candidates can generally get to a decent solution on after the length of a full interview). This avoids the candidate from feeling like they did terribly, and leaving the interview with a negative impression.