131 karma · joined September 30, 2016
The best and most durable solution is really some RFID tags embedded in your wrists and forehead.
Consistent with 1, not really with 2. Agree that 2's not a huge deal in the grand scheme of issues with Facebook but yeah, best not to assume good faith lightly.
All that said, I never liked the "well one day the government will accuse you of a crime somehow or otherwise severely limit your speech" argument. To me the better counter-argument is: "Fine, you don't care at all, you don't have to care. Similarly some people are super paranoid and live in a faraday cage etc., they can do that all they want. But a lot of people care to some degree in between, and a lot of other people are uneducated or unaware of the actual risks so aren't even aware of the problem that they could decide to care/not care about. If you don't care at all, again that's fine, just get out of our way as we try to protect people by default. Mass education of every issue is infeasible."
You ought to read Permutation City.
The most important thing is to follow its advice and just start doing it little by little, even small refactors of other people's code. A friend's company had a Book Club and some testing book got on the list at one point, and as they were discussing it they kept having arguments over how effective various things were, so they resolved the arguments by starting a Testing Club where every week everyone would put in at least an hour into getting some part of the system under test, or trying out a testing technique, and discussing it. Over time they got most of the product under test and fixed a lot of previously unknown bugs.
I know I've wasted time tracking down simple issues a static type system would have caught (or just due diligence by the coder -- and some of these issues I've caused myself! Though I really can't remember any insidious to find but quick to fix typo or type fail I caused, but I'm willing to admit to a possible selective memory bias), I've also wasted time tracking down simple issues a type system wouldn't catch -- even ones like Rust's, Haskell's, and dare I say maybe even Shen's? I also spend/waste a lot of time, probably the most time in total, tracking down complex issues that got past the type system and existing tests and code reviews and personal or team diligence, and these days most often in either Java or JavaScript, neither of which are particularly great poster children for their respective type systems. (I don't want to get into the strong/weak axis.)
Issues from NPEs or divide-by-zeros or undefined function calls, or stuff that goes through the type system's mechanisms to escape the type guarantees like reflection, casts to Object, void * , unsafe, serializing class names instead of values, etc., are annoying, a sudden power outage is also annoying. Some of that can be caught and prevented by more powerful languages, but still the time to fix those is nothing compared to more complex issues resulting in all sorts of incorrect behavior. There are so many more causes than type mismatches. It seems in your career the trivial bugs from typos are rare for you too. I'm not convinced the possibility of slight inconvenience those rare issues can create is worth the certain tradeoff in losing expressive power (especially if I can't use the most expressive static languages for whatever non-tech reasons) and possibly more, nor am I convinced a static approach is even the best one when you have languages like Lisp which support types well enough to error out when you call COMPILE on a bad form but still have huge flexibility.
I wonder if all this sounds like I'm a diehard C++ fan and don't need no stinking safe memory management tools because I never get segfaults or security problems. If it does I don't think it should, but it's really hard to explain why my perceived utility of static type systems is low without just appealing to preference, firsthand, or wise authority's experiences. The argument has been going on for decades by smarter people than me on both sides. In the end maybe it's just preference as arbitrary as a favorite color but rationalized to kingdom come. I at least don't draw my preference line so narrowly at static vs dynamic, there are plenty of static languages I'd use over JavaScript, and plenty of dynamic languages I'd use over C++.
I will ask about your experience though: how does it square with people like the author of Clojure? Is he just a god-tier outlier? I don't think one could argue he hasn't done his homework, or doesn't have enough real-world experience. It reminds me of a quip graphic I saw once, it was something like a venn diagram showing an empty intersection of "dynamic typing enthusiasts" and "people who have read Pierce's Types/Advanced Types books".
I'm not a huge stickler for non-local consistency -- one of the things I like about Nim is its apathy about naming conventions (foobar is the same symbol as foo_bar or fooBar, func(arg) is the same as arg.func()...) -- so that's probably why I don't find the consistency factor a huge issue. When a language and its ecosystem has it, it's nice, but when it doesn't, it's not really a thing that annoys me.
Two lesser secrets are using a linter, which catches all sorts of issues too, and second actually getting the full program locally to a state where I can have it execute (most of) the new code I just wrote that I didn't verify in the REPL, or using data sources I didn't just define temporarily in the REPL, so I can make sure it seems to do what I intended. A lot of devs don't seem to do the second bit... Checked in code for Java compiles and passes existing tests and went through a basic code review but inevitably bugs get filed because it doesn't actually do everything the story said, it's like they didn't even try out their own code, it just looked correct and the compiler/tests agreed.
I think when you're working with the REPL interactively instead of relying on the common "edit -> save -> compile -> ship it|start over" cycle you don't miss those details as much, because you're constantly trying out your own code. Maybe my experience is because I don't typically use dynamic languages as scripting languages, at least in the sense of quickly hacking up a script, saving, getting to skip the compile step (look how much faster it is to develop in dynamic languages!!!), and running it until it works. I have done that, but even then, I'm usually writing the bulk of the script in the REPL -- or rather in my editor that can send text to the REPL. It's quite different from what seems to be the thing that made these languages popular to begin with, which is not having to explicitly type everything and getting to skip a (potentially long) compile step (which also encourages more source sharing).
Mindfuck of the day achieved, back to work...
That's not a world I'd like to live in. But it would solve you having a problem with inequality. Or maybe you just need a different perspective to not put so much into genetic determinism in the first place.
If you've filtered for basic competency where you can be sure you're not being BSed about their basic capabilities, I think I as a hiring manager would predict a slight correlation between better negotiating skills and better programming (and other) skills that I actually need them for. Often better negotiating is just asking for a higher-than-average price up front because you know you're worth it, because you know you're probably more skilled than the other person, and you know that in all likelihood you'll be contributing beyond the official bullet-points of your role -- i.e. your "given position" on paper is the same as the other person but you're doing a lot more.
Of course many places just need average skilled programmers, and if you can fill your roles with good enough people at a cheap price that's good business. But the general assumption that everyone implements the same Cog interface so they should get paid the same, while fair, is incorrect -- just like everyone has a different cost of living, I've never come across two identical devs nor two identical (except maybe on a short piece of paper leaving out a lot of details) dev positions. I think cutting out the possibility for negotiating better than others will also cut out the skilled-and-know-it batch from joining you unless they're super passionate about the product for some reason.