1. 2

    I feel like a lot of the author’s concerns (interruptibility, urgency) can be addressed by putting into place the recommendations of The Asshole Filter. Specifically:

    • Encourage people to use low-interruption methods like tickets, email or bugs (whatever you or your team has declared ‘the right way’ to be contacted).
    • If anyone attempts to priority-bump in an inappropriate manner, refuse to help until they go through the proper channel. “Sure I can help, can you please file a ticket so we can track this?” etc.
    • Actively check and respond to items submitted ‘the right way.’ This is critical – people need to feel that the best way to get what they need is to go through the appropriate channel. As soon as people get the impression that tickets/emails/bugs are never checked, they’ll attempt to priority-bump and then you’re back to square one.
    1. 23

      I am often a dick, I am often difficult

      Turns out this matters more than you’d think.

      1. 2

        I am curious why SmartBear would change their own graph…

        1. 18

          I’ve worked on a team with twenty minute builds (also a C++ application), and found that all sorts of practices are rejected because “build times”. Test-first? I’m not waiting twenty minutes to see my failed test, so I’ll get it working then I’ll add tests. Actually, it looks like this is hard to test, I’ll skip it just this once. Continuous integration? I’m not twiddling my thumbs waiting for Jenkins, I’ll merge then fix any problems later. Pay down some technical debt? Why would I spend half a day moving the build from 20 mins to 19.5 mins? No thanks.

          On the other hand, who’s doing clean builds? If you change one file then your incremental build is, based on your estimate, around a third of a second. That’s acceptable. And Google presumably have some computers to throw at the problem to use distributed compilation and artefact caches. It’s possible that Google does not have compilation time problems, but does have data centre management and CI scale problems.

          1. 7

            There’s also the issue that some changes require recompilation of almost everything. Want to disable debug mode such that debug assertions don’t crash Chromium? Well, time to find something else to do for the day and let the build server compile chromium overnight. Let’s hope no issues come up during the compilation, because then maybe only half the project was compiled, and most of tomorrow goes to waiting for it to compile too.

            You’re probably right that Google has a ton of compute power to throw at the problem though.

            1. 6

              Our build system keeps two build trees, one for debug and one for release.

              1. 6

                Google has a ton of compute power to throw at the problem though.

                It does, and is how Chromium works around the problem – super beefy development machines.

              2. 1

                Test First in C++ can be beneficial. It can bias you toward making new abstractions with fewer dependencies rather than hacking things onto existing structures - because the latter gives you those 20 minute compile times. Better to have something that can just compile as cpp/h pair that stands alone with only a few includes.

                1. 1

                  we have even longer build cycles, but we’ve learned the hard way enough times that a bug caught in CI is worth 10 caught in production, easily.

                  Being patient and making sure that test tooling is always improving is also super important. Tests shouldn’t be written in a throwaway manner, because that makes the experience even that more miserable.

                1. 17

                  If only json had allowed trailing commas in lists and maps.

                  1. 9

                    And /* comments! */

                    1. 3

                      And 0x... hex notation…

                      1. 3

                        Please no. If you want structured configs, use yaml. JSON is not supposed to contain junk, it’s a wire format.

                        1. 4

                          But YAML is an incredibly complex and truth be told, rather surprising format. Every time I get it, I convert it to JSON and go on with my life. The tooling and support for JSON is a lot better, I think YAMLs place is on the sidelines of history.

                          1. 4

                            it’s a wire format

                            If it’s a wire format not designed to be easily read by humans, why use a textual representation instead of binary?

                            If it’s a wire format designed to be easily read by humans, why not add convenience for said humans?

                            1. 1

                              Things don’t have to be black and white, and they don’t even have to be specifically designed to be something. I can’t know what Douglas Crockford was thinking when he proposed JSON, but the fact is that since then it did become popular as a data interchange format. It means it was good enough and better than the alternatives at the time. And is still has its niche despite a wide choice of alternatives along the spectrum.

                              What I’m saying is that adding comments is not essential a sure-fire way to make it better. It’s a trade-off, with a glaring disadvantage of being backwards incompatible. Which warrants my “please no”.

                          2. 1

                            http://hjson.org/ is handy for human-edited config files.

                            1. 1
                            2. 5

                              The solutions exist!


                              I don’t know why it’s not more popular, especially among go people.

                              There is also http://json-schema.org/

                              1. 3

                                I had to do a bunch of message validation in a node.js app a while ago. Although as Tim Bray says the spec’s pretty impenetrable and the various libraries inconsistent, once I’d got my head round JSON Schema and settled on ajv as a validator, it really helped out. Super easy to dynamically generate per message-type handler functions from the schema.

                                1. 2

                                  One rather serious problem with json5 is its lack of unicode.

                                2. 3

                                  I think this only show that JSON has chosen tradeoff that make it more geared to be edited by software, but has the advantage of being human editable/readable for debugging. JSON as config is not appropriate. There is so many more appropriate format (toml, yaml or even ini come to mind), why would you pick the one that doesn’t allows comments and nice sugar such as trailing commas or multiline string. I like how kubernetes does use YAML as its configuration files, but seems to work internally with JSON.

                                  1. 8

                                    IMO YAML is not human-friendly, being whitespace-sensitive. TOML isn’t great for nesting entries.

                                    Sad that JSON made an effort to be human-friendly but missed that last 5% that everyone wants. Now we have a dozen JSON supersets which add varying levels of complexity on top.

                                    1. 11

                                      “anything whitespace sensitive is not human friendly” is a pretty dubious claim

                                      1. 5

                                        Solution: XML.

                                        Not even being ironic here. It has everything you’d want.

                                        1. 5

                                          And a metric ton of stuff you do not want! (Not to mention…what humans find XML friendly?)

                                          This endless cycle of reinvention of S-expressions with slightly different syntax depresses me. (And yeah, I did it too.)

                                          1. -5


                                            1. 13

                                              Keep this shit off lobsters.

                                    1. 2

                                      It’s a bit long, but buried in the document is this:

                                      Well-defined strict priorities, communicated to everyone, can get you to launch 2x-4x faster than just letting engineers work on whatever seemed important at the time.

                                      1. 7

                                        A friend of mine is Québécois and lives in a French-speaking town on the border of English-speaking Ottawa. Using Google maps navigation is apparently a huge pain there, because the text-to-speech doesn’t know how to flip between languages mid-trip.

                                        1. 4

                                          It also cannot cope with Dutch street/place names when giving instruction in English. It really mangles things like Lage Rijndijk and Willem de Zwijgerlaan.

                                        1. 3

                                          Dhall looks really interesting. After being burned by turing-complete configuration languages in previous projects, I’m glad someone has taken the time to tackle the problem seriously.

                                          1. 32

                                            His stance is laid out more clearly later in the thread.

                                            People should basically always feel like they can update their kernel and simply not have to worry about it.

                                            I refuse to introduce “you can only update the kernel if you also update that other program” kind of limitations. If the kernel used to work for you, the rule is that it continues to work for you.

                                            And I seriously will refuse to take code from people who do not understand and honor this very simple rule.

                                            1. 23

                                              Also relevant is John Johansen’s response.

                                              1. 29

                                                What a difference between his first post and this one. In the first one he comes off like a colossally toxic asshat. I know this is no surprise to anyway, but still. That kind of behavior is not OK. Period.

                                                This post on the other hand is clear headed and explanatory. It lays out the rules and why it’s important to follow them.

                                                Maybe Linus just needs a 1h send buffer? :)

                                                1. 2

                                                  “That behavior is not OK” is equivalent to “I am offended”, for this case.

                                                  For all types of behavior, you can always find someone that thinks it is not OK. Should it matter? It would be severly limiting for everyone on a place like the Internet.

                                                  1. 19

                                                    It’s not “I am offended”, but rather probably 95% of people would be offended if they would hear something like this headed their way. Linus probably forgot how it’s like to hear this level of toxic communication because nobody speaks with him like that. I know his “ideology” behind his behavior (he talked about this several times), but honestly saying such “sh**” to people is low, and most people are above that, that’s why he stands out.

                                                    1. 3

                                                      Personally this power relationship is why I’m against BDFLs once a project reaches a certain size.

                                                      1. 1

                                                        I agree in principle. In practice I have to wonder - what are the alternatives? Design by committee has some well known flaws :)

                                                      2. -1

                                                        Do you even know what toxic means ?

                                                        1. 8

                                                          Toxic means that it is in some way damaging to a relationship between two individuals, groups, etc. In this case it is indeed toxic because it seeks to gain in some goal at the cost of the relationship with the submitters. Toxic isn’t strictly bad, sometimes a goal is so important that you need to break the relationship, however you should always choose the least toxic strategy that will ensure success. After all who knows when you’re going to need those people’s help in the future.

                                                          In summary, dark_grimoire seems to have a correct understanding of toxic, and mytrile does not which I assume is why they are being downvoted.

                                                      3. 22

                                                        It would be severly limiting

                                                        It’s already limiting though – many people silently stop contributing when they receive messages like this or never consider contributing in the first place. This means the negative impact is hidden. Since it’s hidden, it becomes much easier to defend the status quo when an alternative might result in a better kernel.

                                                        1. 6

                                                          By the same logic, the positive impact is also hidden. Because it is conceivable that without these messages, the kernel might have imploded upon itself, and the prevention of said implosion is doubtlessly positive.

                                                          If you are going to argue with hidden stuff then it goes both ways.

                                                          1. 10

                                                            Do you really believe that it’s not possible to enforce rules and maintain high standards without calling people idiots, their contributions garbage, and so on?

                                                            I can certainly believe the parent comment, as it’s something I hear regularly, from people who decide not to get involved in projects/make further contributions/pursue opportunities at companies/etc because of things like this. FWIW, one of my friends can be found in the kernel CREDITS, and decided to walk away because of the LKML.

                                                            1. 6

                                                              it is conceivable that without these messages, the kernel might have imploded upon itself

                                                              As a counterpoint, I’ve worked on a project that has a similar code size, customer reach, and zero-tolerance stance on security and stability bugs as the Linux kernel: Chromium. Chromium does not have anywhere near the level of abusive discourse on its mailing list as the LKML, and it has not imploded on itself as you have suggested. So the burden of proof is on the abusive language to show it is needed and not the other way around.

                                                          2. 7

                                                            I disagree. I am not offended by his behavior, I find it to be unacceptable by virtue of the fact that I feel human beings should treat each other with a modicum of respect. Linus’s communications very often do not meet that standard. Hence from my book they do not represent an acceptable way to treat people, especially people volunteering to donate time to an open source project.

                                                          3. -5

                                                            Who are you to say what’s OK?

                                                            1. 16

                                                              He can certainly say what’s OK and NOT OK in his opinion.

                                                          1. 7

                                                            A while back we had an effort to make a ‘constitution’ which resulted in the text linked here. Whether we use that particular text or not, I still think we need some kind of official posting guidelines for the site (a stance which the OP disagrees with). I can see two main uses: clarity on moderation for cases like this one, and as a guide for newcomers to the community who want to know what is acceptable and unacceptable here.

                                                            Right now the entirety of the written guidance is on tagging, not posting.

                                                            1. 12

                                                              (a stance which the OP disagreed with at the time).

                                                              I still stand by my previous comments on the subject. Quoting myself from the linked thread:

                                                              I never saw substantial abuse in this community and if that happened we have moderators in place to take care of it.

                                                              Personally if I have to go through a document like the suggested draft before commenting/submitting an URL I would be not contributing to this community.

                                                              We are not a bunch of kids and the transparent moderation policy is all we need to keep things in line.

                                                              I am currently exercising the transparent moderation policy to know why a comment thread was censored and why down-voting the thread was not sufficient enough.

                                                              1. 6

                                                                I still stand by my previous comments

                                                                (I didn’t mean to imply you didn’t now, there wasn’t a good way to phrase it neutrally. I’ll update the original comment to reflect that)

                                                                1. 7

                                                                  No worries, I didn’t misunderstand your intention - just voiced my current stance in case anyone wondered.

                                                            1. 1

                                                              Does this also break motions on verbs? Losing d<N>j seems like a big loss if you use relative numbering.

                                                              1. 1

                                                                I turned off relative numbering – as you point out, it’s not very useful if you don’t have hjkl. With absolute numbering you can jump wherever using G. d142G works just as well as d5j or whatever.

                                                                1. 17

                                                                  The wikipedia comparison is pretty good, but it’s still lacking. Some things that are important to me in a serialisation protocol:

                                                                  • Binary: As soon as you open the door to text you get questions about encoding and whitespace, and it becomes very difficult to process efficiently. The edge cases will haunt you in a way they never will with a binary protocol.
                                                                  • Self-describing: It should be possible for a program to read an arbitrary object (unlike XDR, Protocol Buffers, etc)
                                                                  • Efficiency: JSON/MessagePack/XML are out, but so is DER (ASN.1) because integers are variable length
                                                                  • Explicit references/cycles (e.g. plain JSON, but not Capt’nProto or PHP’s serialize)
                                                                  • Lots of types: ASN.1 has the right idea here, but it still falls short.
                                                                  • Unambiguous: Fuck MessagePack. Seriously.

                                                                  On the subject of types: k/q supports booleans, guids, bytes, shorts(16bit), ints(32bit), longs(64bit), real(32bit), float(64bit), characters, symbols, timestamps, months, dates, timespans (big interval), minutes, seconds, times, all as arrays or as scalars. It also supports enumerated types, plain/untyped lists, and can serialise functions (since the language is functional). None of the blog-poster’s suggestions can stand up to the kdb ipc/protocol, so clearly we needed at least one more protocol, but now what?

                                                                  Something else I’m thinking about are capabilities/verified cookies. I don’t know if these can/should be encoded into the IPC (I tried this for a while in my ad server), but there was a clear advantage in having the protocol decoder abort early, so maybe a semantic layer should exist where the programmer can resolve references or cookies (however if you do it as a separate pass of the data, you’ll have efficiency problems again).

                                                                  I think that if you can get away with an existing format, you should use it because you get to inherit all of the tooling that goes with it, but dogma that suggests serialisation is a solved problem is completely and obviously wrong.

                                                                  1. 9

                                                                    Cycles are hard to use safely. In my opinion, it’s much better to encode them explicitly when you need them (not that often) than to include them in the format itself. Other than that, I agree completely.

                                                                    It is also important for the format to have a canonical form for when you deal with cryptography. Also, not having various lengths of numeric data types that are all treated differently is a great boon for current scripting languages.

                                                                    Have you seen RFC 7049: Concise Binary Object Representation (CBOR)? It has JSON semantics with additional support for chunked transfers and sub-typing (interpret this string as a date or something).

                                                                    RFC 8152: CBOR Object Signing and Encryption (COSE) also sounds promising. I believe that it’s time for DER and the whole ASN.1 world to go.

                                                                    1. 7

                                                                      I was surprised not to see CBOR in the list of formats, it’s actually an incredibly elegant encoding which can be efficiently decoded and provides a huge amount of flexibility at the same time (and is sensible enough to leave space to add more things if they become necessary). Haskell’s serialise and cborg libraries have adopted it, and I hope these will become the canonical serialisation format for Haskell data, replacing the really ad hoc and less efficient encoding currently offered by the binary and cereal packages.

                                                                      CBOR is a protocol done right, with standardisation and even IANA registry for tags and other stuff. It’s also part of the COAP REST-for-IoT-but-efficient standard (thing - I’m not familiar enough with exactly what COAP does).

                                                                      Edit: video describing the protocol and how it’s likely to be used in Haskell https://youtu.be/60gUaOuZZsE

                                                                      1. 0

                                                                        What do you mean by “JSON semantics”? JSON has really terrible semantics, especially around numbers.

                                                                        1. 5

                                                                          I should have said JSON-compatible semantics.

                                                                          Most of the types in CBOR have direct analogs in JSON. All JSON values, once decoded, directly map into one or more CBOR values.

                                                                          The conversion from CBOR to JSON is lossy. CBOR supports limited-size integers, arbitrary-precision integers and floats. It also has support for NaN and Infinities.

                                                                          1. 1

                                                                            By this definition, is there any serialization format that is not JSON-compatible?

                                                                      2. 1

                                                                        Always great to see another k programmer around. Been several years but man that was a trip.

                                                                      1. 5

                                                                        Aw, I was hoping it would link to my super-old math.stackoverflow question :). The top-rated answer is a super concise version of the above, helpful if you know some of the background and just need to stare at symbols a while until it clicks. Still, a nice article @aperun!

                                                                        1. 2

                                                                          Reminds me of the classic https://github.com/Droogans/unmaintainable-code

                                                                          Some companies have a strict policy of no numeric literals; you must use named constants. It is fairly easy to foil the intent of this policy. For example, one clever C++ programmer wrote:

                                                                          #define K_ONE 1
                                                                          #define K_TWO 2
                                                                          #define K_THOUSAND 999
                                                                          1. 1

                                                                            Never underestimate the power of a bored college student and a preprocessor: https://github.com/Hashdump/Goodbye-World/blob/master/hello_random.c I still go back to that and disgust myself with what I created.

                                                                            1. 2

                                                                              what is that supposed to do?

                                                                              1. 1

                                                                                It prints “Hello World!”

                                                                          1. 12

                                                                            I recommend going back to school if you actually want to learn something, not for credentials. Once you have enough experience and skills, getting a degree doesn’t really have any relation to getting good programming jobs; I have multiple friends who dropped out from college and have worked at major software companies and startups.

                                                                            If you’re having trouble getting interesting jobs there are probably other things you can do. For one thing, stop worrying about “do they care about degrees”. Other than companies that get flooded by resumes so use bullshit credentialism to filter candidates (waves at Google), most companies don’t care.

                                                                            Personally I dropped out in 1990s from CS/Math program.

                                                                            When I moved to Boston in 2004 I went back to college, but not to CS - I got a liberals arts degree, focusing on humanities, from the Harvard University Extension School. Basically it’s Harvard professors who enjoy teaching enough to do so in the evenings, so really great experience.

                                                                            Learning things like writing and close reading was quite useful to my career as a programmer. But mostly it was fun.

                                                                            1. 3

                                                                              I recommend going back to school if you actually want to learn something, not for credentials. Once you have enough experience and skills, getting a degree doesn’t really have any relation to getting good programming jobs

                                                                              Unfortunately, this is either not my experience or the professional years to academic years exchange rate is 4:1.

                                                                              If you’re having trouble getting interesting jobs there are probably other things you can do.

                                                                              I’m all ears. ?

                                                                              When I moved to Boston in 2004 I went back to college, but not to CS - I got a liberals arts degree, focusing on humanities, from the Harvard University Extension School. Basically it’s Harvard professors who enjoy teaching enough to do so in the evenings, so really great experience.

                                                                              This is awesome! I’m actually originally from Western Mass so I’d have a lot of connections in the area to move back. I’ll make a note to check it out.

                                                                              1. 4

                                                                                Note that Extension School classes that are more professional track (CS, business) are not necessarily Harvard professors. Also note you can take many classes remote, these days, too.

                                                                                As far as getting jobs:

                                                                                Have a resume that emphasizes the right things can help, though not clear how much:

                                                                                • Eh: “I used technology X.”
                                                                                • OK: “I implemented this feature using technology X.”
                                                                                • Good: “Based on customer feedback I came up with a new feature, and then implemented it with technology X, resulting in 15% increase in user retention.”

                                                                                Make sure you’re at point where you can work independently, and that it’s clear in both resume and your interview.

                                                                                Figure out which skills you have that you take for granted but are actually valuable; in particular, things beyond “I know JavaScript.” Like, “I learn new technologies quickly”, “I am really good at extracting details out of users’ head”, “I can take a complex domain and build a simple model to reason about”, all backed by actual stories.

                                                                                Advice from former coworker: find the thing the company needs but no one else will pitch, and talk about that. His example was something like “everyone will say they know Python, but I was only one who said ‘I can help you grow team since I’ve done that before’”. Original quote here: https://codewithoutrules.com/2017/01/19/specialist-vs-generalist/

                                                                              2. 3

                                                                                I recommend going back to school if you actually want to learn something, not for credentials. Once you have enough experience and skills, getting a degree doesn’t really have any relation to getting good programming jobs; I have multiple friends who dropped out from college and have worked at major software companies and startups.

                                                                                While that’s true, there are a lot of companies that filter on degree, regardless of experience. Obviously a person can find a good job without a degree, but not having one does remove some options.

                                                                                It doesn’t matter so much in Silicon Valley and trendy startup areas, but some sectors (like defense contractors, finance, etc.) can be really picky.

                                                                                1. 3

                                                                                  Sure, but… that’s the initial filtering. If you know someone inside the company you can bypass that. E.g. I worked out at Google as a Product Manager without a CS degree, because company I worked for was acquired. I knew a really good Product Manager there who wouldn’t have been hired under their new criteria, since they started requiring CS degreee and he only had an MBA and Computer Engineering degree.

                                                                                  1. 3

                                                                                    If anything, that just emphasizes what I was saying.

                                                                                    It’s not impossible to get a programming job without a CS degree, but having one removes a hurdle.

                                                                                    1. 3

                                                                                      It’s a hurdle you can remove in much easier ways than spending tens of thousands of dollars and years of your life, though.

                                                                                2. 2

                                                                                  use bullshit credentialism to filter candidates (waves at Google)

                                                                                  The interview process at G-unit is capricious and arbitrary so I am loathe to defend it, but one of the most senior and capable people I know there doesn’t have a college degree. It certainly helps to have one, but it’s not a dealbreaker.

                                                                                1. 2

                                                                                  I repurposed an aging linux desktop by putting SteamOS on it, and I actually think it’s pretty nice. I mainly play quirky indies which tend to be released on Linux/SteamOS anyway. The Steam controller is okay but I prefer dual-stick to stick-and-touchpad. I’m considering buying an Xbox controller for dual-stick games (currently Enter the Gungeon for me).

                                                                                  Two things that are legitimately annoying about SteamOS:

                                                                                  • Basically no support for 5ghz USB wireless sticks (almost none of them have native Linux support) and support for 2.4ghz sticks is spotty. I live in an urban environment so 5ghz is a necessity; I ended up buying a TP-Link AC750 and setting it to client mode to fake a wired network connection.
                                                                                  • No standby / wakeup from the controller. I have to walk over and turn the machine on, which isn’t a big deal but it would be nice to remotely control the whole thing from your couch.
                                                                                    1. 5

                                                                                      Only two posts before you hit a racial slur. Why would you link to this?

                                                                                    1. 3

                                                                                      One thing I’ve been wondering is: how do people make CI builds work in a monorepo? Do you rebuild everything on every checkin, or do you detect that a subproject hasn’t changed, and thus is not rebuilt? In the latter case, how does that then give you (what I assume is) the main benefit of monorepos: simplified dependency management, because you just use the dependency with the same revision.

                                                                                      1. 2

                                                                                        What I’ve done in the past is build “everything,” with build caches and aggressive dependency markings. If you’re at the scale where having a monorepo is genuinely a pain, the it’s time to get a sane build system (literally out-of-the-box Gradle works fine if you just have Java/Kotlin, for example, but something like Bazel/Pants/etc. works great for more generic workloads), at which point the builds that don’t need to happen will be no-ops, and you never need to worry about forgetting to rebuild/upgrade something.

                                                                                        For me, this is really coming down to trade-offs. Configuring something like Bazel or Pants (or even potentially Gradle at the scale we’re talking) does take some effort. The advantage, to me, is that you either will end up doing this anyway with multirepos (at which point, you might as well have a monorepo where you can monitor all the changes anyway), or you handle all the upgrades piecemeal and bespoke, at which point it’s gonna be really tricky to ensure you’ve actually upgraded everything. In other words, we’re trading human steps for automation: if you’re at a size where you “need” multirepos, you’re also at a scale where automating all of this will be a huge win, which in turn, IMHO, negates needing multirepos.

                                                                                        1. 2

                                                                                          The chromium project uses the analyze functionality of gn (initially implemented in gyp) to determine which test binaries are affected by a change and only build/run those tests. Since this relies on the gyp/gn dependency graph, various checks and whitelists are added to cover edge cases. This, combined with the task-deduplication abilities of Swarming heavily reduce the load of ‘building everything’ in a monorepo. For Swarming, test binaries are compiled in a deterministic way so the same code produces the same SHA, if a SHA already ran and succeeded you don’t need to run it again.

                                                                                          1. 1

                                                                                            We use Teamcity, and it has a way to make triggers only work for a regex of directories. So, only commits to X subproject trigger builds of X.