WhatsApp encryption is useless - <AUTHOR> http://wccftech.com/does-ss7-render-whatsapp-encryption-pointless/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MobileWccftech+%28Mobile+%E2%80%93+WCCFtech%29 <comment><USER2> There was a fine discussion about it yesterday [https://news.ycombinator.com/item?id=11668567](https://news.ycombinator.com/item?id=11668567)

</comment><comment><USER3> day late and a dollar short

</comment><comment><USER4> Why are crypto geeks always so black and white? Is there really only "perfect" or "useless" with nothing in-between?

Notably, a noted goal of WhatsApp encryption was to stop mass surveillance. I'm no expert but I dont see how these objections make mass surveillance of messages remotely as easy as it was when WhatsApp was entirely unencrypted

<comment><USER5> > Is there really only "perfect" or "useless" with nothing in-between?

Are you suggesting that the ability to completely circumvent a system doesn't make that system broken?

If the goal of WhatsApp encryption is to protect against surveillance, and there's a way to surveil users using WhatsApp, then it's broken, full stop. Are you going to place your trust in a home security system that works pretty well, but only against unskilled burglars? Or what about an authentication system to a server holding sensitive customer information? Or your banking information? Or information that might put your life at risk as a dissident in a repressive state?

<comment><USER6> > Are you suggesting that the ability to completely circumvent a system > doesn't make that system broken?

A system can be broken without being useless.

>If the goal of WhatsApp encryption is to protect against surveillance

You skipped an import word from the post you replied to: "mass". Even with a hole in SS7, it makes it impractical to collect messages from everyone, even if it's practical to collect messages from specific targets.

<comment><USER5> > A system can be broken without being useless.

Sure, just as a completely insecure system can be useful. I'm not arguing that.

But not useful for the purpose of protecting users against surveillance.

> You skipped an import word from the post you replied to: "mass".

skrebbel made a blanket statement, which I was replying to.

<comment><USER6> >But not useful for the purpose of protecting users against surveillance.

I'd argue that it can be useful for that purpose without being perfect. If it stops my communication from being caught in a mass dragnet, then it's useful for protecting me against surveillance even when it's possible to circumvent the security on the scale of individuals (rather than populations).

> skrebbel made a blanket statement, which I was replying to.

Right, they did. They made the statement that even flawed security makes mass surveillance much more difficult than an unencrypted system would (or words to that effect). It seems like "stop mass-scale surveillance" is a separate goal from "stop individual-scale surveillance". I feel like you set up a strawman, rather than actually addressing what skrebbel originally said.

<comment><USER5> > It seems like "stop mass-scale surveillance" is a separate goal from "stop > individual-scale surveillance". I feel like you set up a strawman, rather > than actually addressing what skrebbel originally said.

My point was that security is often black-and-white because a crack can turn out to be a crater, and often is.

With regards to state-sponsored, dragnet surveillance: those are the most skilled attackers, and they've exploited far more subtle issues than the one being discussed here; they're the ones that you need to be worried about for undisclosed vulnerabilities, letalone terribly obvious flaws like this one.

</comment></comment></comment></comment></comment></comment><comment><USER7> Flagged for misleading headline; if keys are verified WhatsApp is secure against this attack. If you don't have out of band comms or a pre-shared key, mitm attacks are provably impossible to prevent.

</comment><comment><USER8> Can we have weekly whining threads about WhatsApp now? Just make it like an automated thing; maybe a sticky!

</comment><comment><USER9> This is offset by two factor authentication: Pin-based or email based. If you want extra security the encrypt your device and two-factor your phone number based messenger.

</comment><comment><USER10> Don't have the link, but there was a better discussion and source a few days ago

</comment><comment><USER11> If this is true, It's really sad. Whatsapp penetration is so high around me that not using it's... very impractical. I do use other channels with some friends, but I don't think people will adopt other channels any time soon.

<comment><USER12> Turn on the setting to warn you when the other party's encryption key changes and go about your business. This is non-news unless you have unusually good cause to worry about targeted attacks.

</comment></comment><comment><USER13> In the case of WhatsApp, your data is only on your device and, optionally, in iCloud. So even if an attacker is able to take over your WhatsApp account, your existing data is still private unless the attacker can obtain your device password (and your device) or your iCloud password.</comment>


Mozilla Introduces Aurora, The Pre-Beta, Post-Nightly Firefox - <AUTHOR> http://techcrunch.com/2011/04/13/mozilla-aurora/

<comment><USER2> What happened to the term 'Alpha' ?

Congrats to the Mozilla team though for their ramp up in production speed. Nice to see.

<comment><USER3> "This was generally rejected due to alpha having existing connotations. Aurora could be crashier than an alpha. Also, it is better to talk about Aurora as a separate entity rather than an alpha of Firefox (which is why the branding is different)." [http://groups.google.com/group/mozilla.dev.planning/msg/8105...](http://groups.google.com/group/mozilla.dev.planning/msg/81055a18fa8ddfe6)

<comment><USER4> > Aurora could be crashier than an alpha.

I think "beta" (even a "pre-beta") connotes more stability than "alpha". Pre- beta sounds like a "beta rc1".

<comment><USER3> Okay, so there's no problem. Aurora isn't the name for a crashier-than-alpha beta. Beta is still beta, and it _is_ more stable than aurora (the alpha).

</comment></comment></comment></comment><comment><USER5> Can't wait to see how stable this is. The Chrome dev channel has been surprisingly stable for me (usable for day-to-day browsing).

<comment><USER6> Actually minefield (now called nightly) is usually stable enough, it's rare that there is a serious problem. So Aurora will probably be ok in stability.

<comment><USER5> What about extension compatibility?

<comment><USER7> Extensions will be automatically marked compatible with the new release, unless there are known problems: [http://blog.mozilla.com/addons/2011/04/13/add-ons-review- upd...](http://blog.mozilla.com/addons/2011/04/13/add-ons-review-update-29/)

<comment><USER4> Only 1 of my 7 FF4 extensions were compatible with Aurora.

<comment><USER7> The auto-updating process isn't up and running yet, though hopefully it will be in six weeks (when Firefox 6 hits Aurora).

</comment></comment></comment></comment></comment></comment><comment><USER8> Those icons are actually pretty slick.

<comment><USER9> Agreed. The "Minefield" (besides being a _terrible_ alpha/pre-release codename) icon left a lot to be desired.

<comment><USER4> Mozilla nightly builds have always (AFAIK) been called Minefield. The name discourages non-developers from installing it (unless they mistake Minefield for a new version of Minesweep). :)

</comment></comment></comment><comment><USER10> Here's a link to the Firefox Channels page, if you want to check out Aurora. It's rather hard to navigate to from the techcrunch article.

<http://www.mozilla.com/en-US/firefox/channel/>

</comment><comment><USER11> I don't know who named this but they had to be really removed from the browser world to not know about Arora. <http://code.google.com/p/arora/>

<comment><USER3> <http://adaptivepath.com/ideas/aurora-concept-video-part-1> 2008.

<http://www.mozilla.org/rdf/doc/aurora.html> 1999.

</comment></comment><comment><USER12> I give the Mozilla guys kudos for realizing they were starting to fall into the same malaise that the IE team had slumped into and are actively working to get back to a faster, more iterative development model.

<comment><USER13> Maybe you experienced a different history of the last decade than I did, but in my history the IE team completely disappeared from 2001 until 2007. Suggesting that the Firefox team has ever been anything like is just silly.

Yes, a year between major releases is kind of a long time today, but it's not the better part of a decade and it's not "disappearing" either.

Given the choice between 1 release per year with (hypothetically) 12 new features or 3 releases per year with 4 new features each, clearly the faster releases are better for the Web and for users. But delivering 12 new features a year in one lump rather than in three lumps is not a "slump" and can not rightly be called "malaise" either.

The "pace" of _development_ has never been slow at Mozilla, only the pace of "releases" and that's what we're fixing here.

<comment><USER12> Well, I said they _started_ to. You're right, the Mozilla guys never stopped developing but with Chrome coming out and seemingly running circles around them I definitely felt like they were going the way of the dinosaur. I will readily admit it was more perception than reality.</comment></comment></comment>


The Axis of Eval: Browsers will let PLs break free from plain text - <AUTHOR> http://axisofeval.blogspot.com/2011/02/browsers-will-let-pls-break-free-from.html <comment><USER2> Even if you program using data-flow graphs with pretty icons, they still have to be stored in files don't they? Probably XML or JSON (which are themselves plain text files and some people will still insist on editing them that way.)</comment>


Influential Programming Languages, Part 3: Smalltalk  Message-Sending - <AUTHOR> http://www.informit.com/articles/article.aspx?p=1671638 <comment><USER2> Single page: [http://www.informit.com/articles/printerfriendly.aspx?p=1671...](http://www.informit.com/articles/printerfriendly.aspx?p=1671638)

Rest of the Series

      ALGOL: http://www.informit.com/articles/printerfriendly.aspx?p=1671636

      Simula: http://www.informit.com/articles/printerfriendly.aspx?p=1671637

      Lisp: http://www.informit.com/articles/printerfriendly.aspx?p=1671639

</comment><comment><USER3> The second to last paragraph got a laugh:

"The Smalltalk family has lots of other members. Ruby, for example, was intended to marry Smalltalk semantics with Perl syntax. Why anyone thought this was a good idea is unclear."

<comment><USER4> From a brief history of programming languages:

 _'1986 - Brad Cox and Tom Love create Objective-C, announcing "this language has all the memory safety of C combined with all the blazing speed of Smalltalk."'_

<comment><USER5> Aw you missed the best part

"Modern historians suspect the two were dyslexic."</comment></comment></comment>


Ask HN: Why are new nosql databases a dime a dozen? - <AUTHOR>

I don't understand this phenomenon; even I want to make one for my application domain, but at the same time, all of this seems intuitively wrong. Perhaps some of you have some insight, thanks! <comment><USER2> Because writing a NoSQL database is easy. MongoDB is just a thin wrapper around mmap() that makes it look like JSON for example. Whereas writing a new and better SQL query optimizer is hard, and testing to ensure no data loss is tedious, the MongoDB guys just skipped it.

<comment><USER3> Completely agree. I recall when I first saw the nosql craze and asked myself, what does this offer over and above what berkeleyDB did decades ago? Answer is very little.. Yes some features that the nosql packages add are nice, but they are not game changing.

</comment></comment><comment><USER4> I guess it's because people don't buy the "one size fits all" approach to databases anymore... 15 years ago, you had to choose between Oracle, db2 or Sybase... The SQL offer grew significantly too since then.

You're probably right: nosql DB developers spread their efforts too thin. I'm currently only interested in new DBs if they solve a new problem (statistics and behavior DBs look promising).</comment>


EncloseJS: compile JavaScript into native binaries - <AUTHOR> http://enclosejs.com <comment><USER2> For those who prefer a non closed-source, sensibly licensed, tool that does this kind of thing...

... try Nexe [https://www.npmjs.com/package/nexe](https://www.npmjs.com/package/nexe)

</comment><comment><USER3> License is proprietary :/

<comment><USER4> Fitting.

This seems more of a tool for company executives with little to none technical knowledge who fear people will "steal their code" instead of a compiler taking advantage of not having to work fast like a JIT does, to go the extra mile when optimizing.</comment></comment>


I'm a woman in computer science. Let me ladysplain the Google memo to you - <AUTHOR> https://www.vox.com/platform/amp/the-big-idea/2017/8/11/16130452/google-memo-women-tech-biology-sexism <comment><USER2> This is not a comment on the article - but I really hate the words "ladysplain" and "mansplain".

What a way to instantly inject emotion into what I would wish people would de- escalate.

The original memo author committed the same offenses, and the author of this article does the same here. Is everyone completely oblivious to emotionally charged language that makes the opposing side instantly angry and ups their tendency to ignore the content of your arguments?

<comment><USER3> It's because nowadays people live in bubbles. They interact mostly with people who think and behave alike, and for some people using this kind of language has become so natural they'd be offended to hear you have an issue with it.

</comment></comment><comment><USER4> James Damore claims that Google does not discriminate against women. CEO Sundar Pichai claims that Google does discriminate against women. I'm more inclined to believe the CEO.

<comment><USER2> >James Damore claims that Google does not discriminate against women.

False.

From the memo: I hope it's clear that I'm not saying that diversity is bad, that Google or society is 100% fair, that we shouldn't try to correct for existing biases, or that minorities have the same experience of those in the majority.

Perhaps you have a different memo you are reading?

<comment><USER5> That is not the takeaway I am getting from reading the whole piece. Cynthia Lee does a fantastic job digging into the content of that memo.</comment></comment></comment>


In Praise of Haskell - <AUTHOR> http://www.drdobbs.com/architecture-and-design/in-praise-of-haskell/240163246/#1 <comment><USER2> This is yet another shallow puff piece on Haskell. Reading it, you would think that the author has only ever used Ruby and Haskell, as he gives the impression Haskell is the only language that supports functional/declarative style programming.

In actuality the author is trying to sell Haskell because he sells Haskell IDEs.

I'm not knocking Haskell, but let's not pretend that this is a useful piece of journalism.

<comment><USER3> Yeah, definitely just more propaganda from "Big Haskell IDE".

<comment><USER2> The author is the CEO of a company that sells the first (and only?) commercial Haskell IDE. I point this out because the author (from his background) clearly knows about the subject matter, while reading the content of the article would lead you to believe the author was a novice to software development and computer science.

The shallowness of the article combined with the background of the author can be reconciled if you understand the article as an advertisement.

</comment></comment></comment><comment><USER4> One important thing in the article that was a bit obfuscated: modern OOP languages introduce a staggering amount of dependency and complexity. Things like TDD are then layered on top to try to ensure solid code is being built.

In a pure functional environment, you don't have those dependency issues. Your problems boil down to types -- do you have the correct fields and definitions in your inputs? -- and transforms -- are your symbolic transformations what is desired?

In practice, pure FP is the closest I've seen to stuff that "just works". While FP can be a huge pain in the ass mentally, it beats the heck out of the spaghetti dependency issues in OOP. [insert long discussion here about whether pure FP can actually scale in a large organization]

<comment><USER5> Is it irony that the post right below this is complaining about Cabal and "dependency hell?"

<comment><USER6> No because that dependency hell is up front (Haskell ecosystem likes being explicit). Whereas in dynamic languages you just install it all and hope it doesn't crash (and your unit test coverage is sufficient).

<comment><USER5> Firstly, I think this is somewhat unfair to dynamic solutions. I could just as easily reword it as "you try and pull in a library and hope it doesn't break your compilation." Simply put, it could be the up front hell that probably puts a lot of people off of a solution.

Not to mention adding a new piece to a highly type based solution could involve modifying a lot of the existing types to make room for the modification. Whereas with many dynamic solutions, this is not the case.

<comment><USER6> It is more of a contract. The library author is stating this package was developed against these dependencies and versions. It is known to work well in these cases.

This does not mean it will not compile. In fact often the fix is simply for the author or developer to relax the version bounds and everything will be fine.

Lastly, many of these issues arise not because of a direct dependency but an indirect one. The problem is that GHC will not allow you to depend on two packages which themselves depend on different versions of the same package. Once this is fixed, along with sandboxing, will eliminate the vast majority of the cabal hell problem.

<comment><USER5> I still feel you are being a touch unfair to the dynamic world. Many times, bringing in a dependency just works.

The analogy I have in my mind is a digital computer for a bike. The general "contract" is simply that you will somehow get a pulse to the computer for each rotation of a tire with a known size. The details of how the bike is constructed are ultimately irrelevant.

Further, because this is such a general contract, it doesn't actually matter if you hook it to the wheel or not. You can, in fact, use such a computer in a non bike device with success.

<comment><AUTHOR> There's work to provide this "module by contract" notion you're talking about exactly ([http://www.mpi-sws.org/~skilpat/backpack/](http://www.mpi- sws.org/~skilpat/backpack/)) but it's very new and far from implementation. OCaml does a good job of this and is usually the poster child for parametric modules done right.

That said, dynamic languages allow this kind of contractual module imputation by the virtue of allowing absolutely anything to be considered a module and hashed out at runtime. At the least this means carrying around a lot of tagging/runtime typing information so you can call up runtime errors. At the most, it means that your whole system is held together by an increasingly wide set of unchecked and uncheckable assumptions.

Cabal hell is annoying but at least it's checking.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> I have and will continue to maintain that it's Haskell's operational challenges that are holding it back from wide adoption, at least on the web. In a lazy language, your cost model is all out of whack. When your program consumes resources, you can't unambiguously identify the line of code that caused your program to consume those resources. That's because a function application itself does nothing. Needing the result of the application is what causes work to be done. And that function application could be floating through your program as a thunk for who knows how long until its result (probably a partial result at that) is forced. So who's to blame for the work? The function application or the code that forced its result? Who knows.

The typical solution to this problem in production Haskell systems, by the way, is to run the application with profiling turned on.

<comment><USER8> There Is some preliminary work to add a "Strict language" mode that can be selectively enabled per module. Johan Tibbel has some experimental support worked out, and hopefully it can be polished enough to make it Ito ghc 7.10 in the next year.

</comment></comment><comment><USER9>
      What's not to like?

Cabal, which unsurprisingly is not mentioned. Dependency hell makes it stupidly difficult to rely on other people's code on a large scale. I'd rather write uglier code in JavaScript if it means having access to other people's packages immediately and without complications.

<comment><USER10> Also, after a week I still didn't understand its type system completely.

It may be that I am simply too dumb, or that I didn't find the right resources, but 'easy to learn' this language is not.

<comment><USER11> Haskell is really not much more strongly typed than Java, or even C++ (although it's much less liberal with letting you cast than either of those languages). Just like those languages, if a function has been declared to use types a, b and c, then you'd better supply types a, b, and c as arguments. This is the same. The only real extension that I can see is the ability to create functions which accept or return arbitrary types, like `foo :: a -> [a]`, which isn't an option in Java or C++ without some hackery. Of course there are type classes and algebraic data types and other things as well, but I don't think they really make the language "more strongly typed," just more expressive in their types.

What makes Haskell a little challenging in the beginning is its currying, which means you don't need to call a function with all of its stated arguments, and the fact that function application associates to the left; i.e. that `f x y` is the same as `(f x) y`, NOT `f (x y)`, which is closer to how it would be in, say, Ruby or CoffeeScript. There are very good reasons for this, but it does take some getting used to. Currying and associativity rules are responsible for a lot of seemingly incomprehensible type errors. You get better at avoiding them as time goes on. I feel that the weirdness of reading Haskell DSLs, like Parsec, which often make heavy use of customized operators, or do-notation, is an extension of these issues, since most of the difficulty comes from trying to figure out how the types propagate through what amounts to be long, complicated chains of function applications.

</comment></comment></comment><comment><USER12> The example provided is too contrived. By that logic, here's a way to "match" haskell with php:

$a = range(2,100,2); $b = array_slice($a, 5);

<comment><USER13> Haskell's version is type safe. PHP, not so much.

<comment><USER12> Thanks for pointing that out. The author didn't emphasize that point, and it makes sense now.

Is it me, or was it a bad example for where Haskell "really shines"? I don't like the "use Haskell cause it has these really cool functions" approach. Feels so superficial.

<comment><USER14> It wasn't so much a bad example so much as it was a trivial one. Perhaps a more powerful one (that displays the advantages of lazy evaluation and higher- order functions) would be the function to generate an infinite list of Fibonacci numbers.

        fibs :: [Integer]
        fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Even still, it's difficult to get the feel of actually using the language from one function taken from a freshman year CS class.

<comment><USER15> How about demonstrating the power of laziness by generating the power set of a set? (Taken from Learn You a Haskell).

      powerset :: [a] -> [[a]]
      powerset xs = filterM (\x -> [True, False]) xs

      ghci> powerset [1,2,3]
      [[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]

Edit: I read LYaH some time ago but this example stuck with me because it's both wonderful and mind-blowing.

<comment><USER16> Here's a recursive definition which is less cool but less 'magic'

        powerset        :: [a] -> [[a]]
        powerset     [] =  [[]]
        powerset (x:xs) =  yss ++ map (x:) yss
                           where yss = powerset xs

        > powerset [1,2,3]

        [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]

</comment></comment></comment></comment></comment></comment><comment><USER11> Unless someone had literally never seen anything on Haskell before, this kind of article adds absolutely nothing new to the discussion. It's all been said before, and more often than not it's been said by FP Complete. It reads like an infomercial, and it's frankly embarrassing reading it.</comment>


Boeing papers show employees slid 737 Max problems past FAA - <AUTHOR> https://apnews.com/64aa056dc30313ad8785b5b9e226ddc3 <comment><AUTHOR> As more information about Boeing leaks out, the 737 Max story keeps getting worse.

For example:

In one email message from 2015, an employee who apparently is a test pilot wrote that he crashed the first few times he flew the Max in simulator testing. "You get decent at it after 3-4 tries, but the first few are ugly," the employee wrote.</comment>


Google Recalls Staff to U.S. After Trump Immigration Order - <AUTHOR> https://www.bloomberg.com/news/articles/2017-01-28/google-recalls-some-staff-to-u-s-after-trump-immigration-order <comment><USER3> I seriously doubt the intention of people behind this order has anything to do with security and safety of US citizens. In fact from my point of view, looking at the list of the countries which are banned you can see they could not care less about US citizens. For instance, for crying out load, 15 out of 19 hijackers involved in 9/11 were Saudi citizens. But why Saudi Arabia is not in the list? This is just a game of politics.

<comment><USER4> I am not a Trump fan. On the contrary, I'm more one of his biggest opponents of him and ALL what he stands for but the list of countries banned from entering the US and referenced in the text in his EO -- 8 U.S.C. 1187(a)(12)--[0] is compiled by the SoS before him coming in office.

He's just riding on the coattails of former admins to expand the scope of the restrictions and sanctions imposed by them.

[0] [https://www.law.cornell.edu/uscode/text/8/1187](https://www.law.cornell.edu/uscode/text/8/1187)

<comment><USER5> No, it isn't normal or some continuation of normal to ban people WITH GREEN CARDS from getting on planes to the US based on their being muslim. Jesus Christ.

<comment><USER4> This is your DHS acting or overreacting in reaction to this EO. I didn't say that it's normal or non-normal, I just said that the list of those designated countries is compiled by the Secretary of State prior to Trump taking office and not arbitrary like some people think.

<comment><USER6> Just because it was compiled by the Secretary of State, does not make it any less (or more) arbitrary.

</comment></comment></comment></comment></comment><comment><USER7> It's surprising that countries such as Canada, Australia and EU nations are not making any attempt to lure tech companies and students from countries affected by the executive orders. The US is literally leaving some of the best students, researchers and highly qualified employees out in the cold.

<comment> grey-area In the long term, if this madness persists, of course they will. Companies and skilled individuals are transnational now, and if you try to shut them in or make travel impossible, they'll just leave and set up somewhere else, or never come and found new companies in the first place.

I think Trump and his supporters are playing by an outdated rule book and think they can turn the clock back on globalisation and force companies and people to stay within their borders however uncomfortable he makes it. There is a very similar dynamic going on with Brexit in the UK, but this will take years or decades to play out.

<comment><USER8> > There is a very similar dynamic going on with Brexit in the UK

the situation in the UK is very different, the political class are still entrenched and not going anywhere, whereas the US seems to be having a clean sweep

Theresa May's position that the UK is still open to globalism and wants to sign as many free trade agreements, and reduce barriers to trade as far as possible as the UK leaves the EU.

<comment> grey-area On the contrary, I think the situation in the UK is very similar - <USER2> and patriotism are being exploited to sell people a story of immigrants taking their jobs, lowering wages and causing crime. It's an old story but entirely false. Almost all the tech leaders in the US today are immigrants - e.g. Musk, Ellison, Brin, Yang, Bell, Omidyar. Even Jobs was the son of a Syrian immigrant.

As to Trump being a clean sweep, there's nothing clean about his cabinet or advisors - he has one of the most traditional, male, rich, white cabinets in recent history and even includes family in his inner circle and in meetings. I don't think it's clean in any sense, neither new nor free of corruption.

<comment><USER8> > I think the situation in the UK is very similar - nationalism and patriotism > are being exploited to sell people a false story of immigrants taking their > jobs, lowering wages and causing crime.

I haven't seen any evidence of this, outside of the tabloids (which would be business as usual)

> As to Trump being a clean sweep, there's nothing clean about his cabinet or > advisors - he has one of the most traditional, male, rich, white cabinets in > recent history and even includes family in his inner circle and in meetings.

clean sweep as in the old guard and their policies are gone (not the case in the UK)

<comment> grey-area _I haven 't seen any evidence of this, outside of the tabloids_

Recent examples from the conservative conference:

Exhibit 1: Amber Rudd vows to stop migrants 'taking jobs British people could do' and force companies to reveal number of foreigners they employ [http://www.telegraph.co.uk/news/2016/10/04/jeremy-hunt- nhs-d...](http://www.telegraph.co.uk/news/2016/10/04/jeremy-hunt-nhs-doctors- theresa-may-conservative-conference-live/)

Exhibit 2: On immigration and jobs, Theresa May employs the post-truth politics of Donald Trump [http://www.telegraph.co.uk/news/2016/10/05/on- immigration-an...](http://www.telegraph.co.uk/news/2016/10/05/on-immigration- and-jobs-theresa-may-employs-the-post-truth-polit/)

Exhibit 3: Official policy is to cut migration to tens of thousands (that order of magnitude cut would leave many industries short of staff with an ageing population)

<comment><USER8> yep, I knew the Amber Rudd speech would be in your reply to my comment.

1) has been thoroughly debunked: she never said what the press accused her of saying. try and find the speech where she's talking about employers making lists of foreigners... you won't be able to because it doesn't exist.

I looked quite extensively at the time for it, as I was horrified by what press were reporting her as saying... shame it's fake news.

(in actual fact it was one of many potential ideas in a briefing note before the speech)

2) is an opinion piece, not evidence

<comment> grey-area 1) She proposed the idea, on briefing notes or in the speech, it doesn't really matter.

2) You missed the direct quote from May in the article? Her opinions are _very_ clear on this and neatly mirror Trump's populist nationalism. To quote directly, she claims that British people are:

 _out of work or on lower wages because of low-skilled immigration_

Given that employment is close to an all time low and most products bought are imported and thus nothing to do with low skilled immigrants this is clearly untrue. They may be out of work or on low wages due to globalisation, robotics, austerity, the markets, the dominance of china, the decline of British industry etc, but tying this to immigration is mendacious, dangerous, and entirely without basis in fact.

As robotics continues to take over, and most manual jobs disappear in the coming decades, this explanation of foreigners taking our jobs will become more and more appealing and more and more dangerous.

<comment><USER8> it does matter if it's an idea under consideration or a plan in action.

their job is to consider options, and they binned this one (thankfully).

normally this sort of transparency would be seen as a good thing, unfortunately with the vehement overreaction of the press to an immature proposal as if it was policy, I suspect in future we won't find out until the ideas are beyond the proposal stage.

if you take a single quote, and ignore everything else they've been saying and doing for the past 6 months, you could indeed say that the UK Government is similar to Trump's administration, but it's simply not an objective assessment.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> For any Americans reading this, how does it feel right now to have Trump as your leader give what he's enacted in the last week?

<comment><USER10> I can't believe all the other responses to this question were either positive or from someone abroad! Perhaps I live in a bubble (Philadelphia), but there is a pretty unified view of how it "feels" right now: embarrassing. Awful. It feels like a bad dream that we're expecting to wake up from. And people are _afraid_ of what's to come from the administration, and of the attitude that the election has seemed to condone. The feeling is so strong here that it reminds me of riding public transit on a snow day -- you can generally make any remark to any random stranger about the snow and instantly relate to one another. That's how it is about Trump. His rhetoric does _not_ reflect the views of the majority of Americans (as the popular vote shows).

<comment><USER11> Note that the question was asked around 5-8 AM in the continental US on a Saturday morning, so early responses were likely to come from abroad. Like many others here, I'm an American who lives abroad. There are a lot of reasons for this, but part of it was concern about the direction the US has been taking in the last 16 years.

I'm horrified and terrified of what this government holds for the future. It seems like the US is quickly abdicating its role as guarantor of peace (flawed as it was in that role's execution) and I worry deeply about the possibility of a divided and poorly-armed Europe being overrun by Russian influence or the Russian military. In addition, there is a terrible human cost to GOP policies with regards to healthcare, the environment, and of course telling Iraqis who put their lives on the line for the US that they can just go home and get murdered.

I worry that Trump's bluster about voter fraud has less to do with his injured pride at losing the popular vote and more to do with claiming reason to annul any GOP failures in the 2018 or 2020 elections. I can imagine a GOP supreme court, GOP congress, and military with GOP sympathies might be willing to go along with it.

The world's democracies, under both conservative and liberal leadership, have been too willing to infringe on their people's privacy, and I wonder where this goes if you extrapolate the trend over the next decade or two. The closest thing we have to a leader of the free world is Angela Merkel, and she's suffered politically for her policies.

</comment></comment></comment><comment><USER12> Two questions:

1\. What is the difference between elected dictatorship and democracy?

2\. Will Americans stop screaming 'Murica', 'We are number 1' from now? This president and how elections are held in this country are a joke. So much for democratic process and respect for the office.

<comment><USER13> Well, but how is it not democratic? Didn't Trump say many times he'd do exactly this, and he won?

Arguably executive orders should not exist, nor should a powerful President. The Swiss system of a rapidly rotating presidency and strong "state rights" seems preferable to me. But the USA has strong elected Presidents and I never saw any American seriously challenge that setup, I hear more talk of states seceding than I see talk of changing the constitution to limit the power of the POTUS.

So I don't see your point. The people were given a (fairly crappy) choice, made it, now their preferences are being implemented. That's democracy.

Don't get me wrong. I think locking people who live in America out of the country because they happened to be on vacation at the time is outrageous, stunningly stupid. But maybe if prior generations of politicians had been more responsive to anti-Muslim sentiment things wouldn't have got so extreme now.

<comment><USER14> _" Well, but how is it not democratic?"_

It's quite simple, it's not democratic in the sense that the _majority_ of the population voted for another candidate, but in the end Trump got elected.

Final ballot count:

Hilary: 65,844,610 votes

Trump: 62,979,636 votes

Now, I understand these are the electoral rules in the USA and I'm not saying Trump won _unfairly_ , but he certainly didn't win _democratically_ since the majority of voters didn't want him there.

<comment><USER13> That takes you down the road of arguing the USA isn't a democracy, which is a fine semantic argument of little relevance to current events.

If this starts a movement to abolish the electoral college, great, but the core problem here isn't a few million votes. Even with a different system Trump could still have won. The core problem is that such a guy was able to even get close to the White House and the root cause is a dire failure of all the other politicians to address the concerns he addressed.

</comment></comment></comment></comment><comment><USER4> I don't think that this EO is applied to holders of valid green cards in the US but definitely people on visas like H1B are definitely to be affected but I think that a company of the size of Google could make some arrangements as a quick remedial to situation by transferring some to other countries where they have operations to work from there till they figure out how to handle this situation going forward.

<comment><USER15> Applies to all aliens, which includes GC holders:

According to NY Daily News: "Within hours of President Trump's executive order limiting immigration from Muslim countries, green card and visa holders were already being blocked from getting on flights to the U.S."

[http://www.nydailynews.com/news/politics/trump-order- blocks-...](http://www.nydailynews.com/news/politics/trump-order-blocks-green- card-visa-holders-airports-article-1.2957910)

<comment><USER4> I have read the full text of the EO and I couldn't find any reference to this applied to GC holders.

Can you please point me to the paragraph or item in the EO where it mentions this?

<comment><USER15> "It will bar green card holders," Gillian Christensen, acting Department of Homeland Security spokeswoman, said in an email.

[http://www.reuters.com/article/us-usa-trump-immigration- gree...](http://www.reuters.com/article/us-usa-trump-immigration-greencard- idUSKBN15C0KX)

<comment><USER4> I must say that I was stunned to read about these reports as I was thinking that the worst part of this despicable EO was singling out Syrian refugees for an indefinite ban from entering the US followed by the fake concern for the welfare of women and religious minorities in the ME by instructing the AG to publicly shaming wife beaters only of foreign nationals but to deny entry to legal permanent resident who went through all the vetting procedures and hoops is just equally despicable as banning Syrian refugees indefinitely.

</comment></comment></comment></comment></comment><comment><USER16> It is astonishing that people with an already legal card to work in the US and living there are banned from entering the country.

</comment><comment><USER17> Don't forget the initial executive order was signed by Obama. Banning dual nationals from these countries to use the Visa Waiver Program.

<comment><USER18> Could you explain in more detail please?

<comment><USER19> I believe the parent was referring to [1], which blocked dual nationals of the aforementioned countries from using the visa waiver program if they were eligible under a different nationality (e.g. a dual UK-Iranian national could not enter using the VWP on their UK passport). However it was an act of congress, not an executive order, though it was supported and signed by the former president.

[1]: [https://www.theguardian.com/us-news/2016/jan/15/iranian- amer...](https://www.theguardian.com/us-news/2016/jan/15/iranian-americans- visa-regulations-waiver-programme-us-immigration)

</comment></comment></comment><comment><USER20> Assuming the executive order holds up, In the best case they will be allowed to reenter the U.S. after 90 days. The executive order suspends immigrant and nonimmigrant entry for only 90 days for people from specific countries not on a Diplomatic, NATO, UN, or International Organization staff visa.

<comment><USER4> This suspension could be renewed very easily and even extended to other countries. There's a report on NYT [0] which fielded questions to Iranian officials and politicians looking for their reaction to this EO and they made it very clear that they won't share any sensitive info about their citizens with the US admin rendering them to be the most likely candidate to be permanently banned from entering the US esp. when taking into account that they top the list of those seven countries in terms of visa holders in 2015.

[0]: [https://www.nytimes.com/2017/01/27/world/middleeast/trump- vi...](https://www.nytimes.com/2017/01/27/world/middleeast/trump-visa-muslim- ban.html)

<comment><USER6> > This suspension could be renewed very easily and even extended to other > countries

Well, it seems that the current execute order is illegal.

[https://www.nytimes.com/2017/01/27/opinion/trumps- immigratio...](https://www.nytimes.com/2017/01/27/opinion/trumps-immigration- ban-is-illegal.html)

</comment></comment></comment><comment><USER21> We should not be banning our Kurdish comrades!

</comment><comment><USER22> Are there any noises about coming capital controls on foreign remittances? Seems like a logical next step to enforce the lock-out of foreigners and lock- in of assets.

<comment><USER4> Would this actually be legal?

I think that there are international agreements and treaties that ban such draconian and vindictive measures.

<comment><USER22> I don't know the legalities of it. But the government hasn't been bothered by legalities in many things for quite some time.</comment></comment></comment>


The Many Faces of David Bowie in This Beautifully Illustrated Gif - <AUTHOR> http://nerdist.com/see-the-many-faces-of-david-bowie-in-this-beautifully-illustrated-gif/ <comment><AUTHOR> I find fascinating how David Bowie has been able to reinvent himself over time!</comment>


Show HN: A WebGL demo of the Observer Effect - <AUTHOR> http://qntm.herokuapp.com/

<comment><AUTHOR> This is my attempt (and first webGL anything) at a stupid implementation of the observer effect in quantum physics. Essentially, by observing something we are inherently changing its nature. Here, I've replicated a sine wave propagating in two directions (so it can be loosely correlated with some generic electromagnetic wave) which randomly changes in real time for all viewers when someone else starts viewing. (Very messy) code can be found here: [http://github.com/shayanjm/quantum](http://github.com/shayanjm/quantum)

tl;dr - It's a wave that changes slightly when you look at it. Pretty cool, when you realize that every stage of the simulation is unique, temporary, and will never be re-rendered again :)

<comment><USER2> I'd put this as a description on the WebGL demo page. :) Because when I looked at it for a while I was just very very confused.

<comment><AUTHOR> Thanks for the suggestion :) I'll probably throw an overlay in there and stick the blurb in that.

</comment></comment></comment><comment><USER3> Very cool. I looked at it for two minutes and noticed a lot of changes. It must mean a lot of people are looking at it right now. fun stuff.</comment>


Debugging Agile Teams - <AUTHOR> http://tiny-giant-books.com/blog/debugging-agile-teams/

<comment><USER2> For a minute, I thought you were gonna hammer me with the friggin' Food Pyramid BS!

<comment><AUTHOR> It's the Agile pyramid!

I think perhaps it's a sign of something jumping the shark when they start making pyramids for it.</comment></comment>


The Making of NHL '94 - SG- http://readonlymemory.vg/john-madden-hockey

<comment><AUTHOR> """Even without featuring logos and teams from the NHL, Brook thought, there were other ways to improve the realism of this game. For example, it could emulate the ambience of a game day NHL arena by including the proper organ music. The problem, though, was that each team's organist played different songs. 'That's not a problem, actually,' explained Dieter Ruehle, the organist for the San Jose Sharks (and previously for the Los Angeles Kings), 'I can do that.' True to his word, Ruehle provided EA with organ music for every team; and he didn't just provide all of their songs, but also noted which music was blasted during power plays, which tunes were used to celebrate goals, and all the other inside info needed to make each arena feel like home. Ruehle was so diligent about getting it right and capturing that home crowd essence, that during a recording session at EA's sound studio he asked:

'The woman who plays the organ for the Washington Capitals has arthritis; would you like me to play the songs how they are meant to be played, or the way that she plays them because of her condition?'

'Definitely the way she plays it!' Brook answered, after a laugh."""</comment>


The Secret Life of the Aluminum Can - <AUTHOR> http://www.wired.com/2015/03/secret-life-aluminum-can-true-modern-marvel/ <comment><USER2> I've talked about this on HN in the past, but my grandfather was a big part of the development of the seamless can development. He designed the common can bottom used today. People often talk about the shape of the bottom being necessary to withstand the pressure in the can, but the bottom's shape also helps ensure a proper coating of the epoxy this article discusses. Pretty cool stuff. I really wish we had talked about it more while he was alive.</comment>


Search Engine Ixquick does not collect or share information - <AUTHOR> https://www.ixquick.com/eng/privacy-policy.html

<comment><USER2> Nothing collect or share your information as long as no whistleblower makes it public.

</comment><comment><USER3> How do you only capture ips for automated queries? Do you mean you're really logging all ips then scrubbing them after a certain amount time?

<comment><USER4> Not sure how they do it but in part we look for bogus search patterns across a wide variety of IPs. If 1,500 IP's search for (with quotes) "Enter your password or click the button to post anonymously" I'm gonna guess it is some SEO type who has a scripted search looking for forums where they can post link spam. There are a variety of things that in aggregate pop out as not being humans searching for things.

<comment><USER3> I'm just saying though, you have to record the ip in order to provide that functionality, especially for searches over time. So are they recording the ips then dumping them after x amount of time? That's different than what they claim.

<comment><USER4> Possibly.

</comment></comment></comment></comment><comment><USER5> Can someone who has used this search engine compare it with DuckDuckGo?

<comment><USER6> I've been trying out both for the last couple of days. So far I would say that DuckDuckGo seems to have slightly better results but ixquick has the added bonus of not being american.</comment></comment>


Show HN: Git-Ready to Deploy? Check for uncommitted and non-pushed changes - <AUTHOR> https://github.com/oleks/git-ready-to-deploy <comment><USER3> I wrote a git-tag based cli content deployment tool that does something like this as part of the deploy stage. It's intended for use with multiple users with a single remote, so before attempting to deploy anything it does the following to ensure no conflicts and that outdated content is never accidentally deployed:

        - <USER2>
        - Checks the branch you are deploying from hasn't diverged from it's tracking branch.
        - Checks whether each path+tree-object combo trying to be deployed has already been tagged.
        - Checks whether each tree path being deployed is clean.
        - Finally, if it fails to push new tags it reverts everything to prevent deploys unavailable to everyone else.

I built this for a special type of content deployment for the company I work for but I think it's only been used internally so far (albeit successfully) - I made the tool as generalised as possible though as the core concept is quite re-usable, but I don't think I have described it's purpose clearly enough for the rest of the world in the readme:

[https://github.com/LearningScience/pegit](https://github.com/LearningScience/pegit)

</comment><comment><USER4> Do you know about `git-sh-setup`? As in:

        . "$(git --exec-path)/git-sh-setup"
        require_clean_work_tree "bump" "Please commit or stash them."

[https://git-scm.com/docs/git-sh-setup](https://git-scm.com/docs/git-sh-setup)

<comment><AUTHOR> This will only spot uncommitted changes to tracked files. I want a completely clean repository before I deploy, where there are neither uncommitted changes to tracked files, nor (new) untracked files.

But no, I did not know of git-sh-setup, thanks for the tip :-)

<comment><USER4> If that's your goal, it might be better to just never deploy from a checked out repository and instead always make a new copy of the code (git clone, git archive, download the tarball from github etc). As in, make the deploy script do that for you, so you never even get into a situation where you could have a dirty working tree in the first place.

<comment><USER5> You could take it a step further and setup a dead simple server that does it for you and tracks the results in a central place for the whole team. With a manual trigger if you so desired.

<comment><USER6> CircleCI etc are decent at this.

</comment></comment></comment></comment></comment><comment><USER7> I'm confused. How is that different from 'git status'?

<comment><AUTHOR> It first performs a git status, then fetches changes from upstream, and checks if all local changes have been pushed upstream (using git cherry).

<comment><USER7> I'm curious what the workflow is here.

My workflow looks like this:

A feature branch is mature enough to get merged into master. So I merge it into master on the staging server. And then push it to the public server.

<comment><AUTHOR> Yes, so this is useful where deployment is "manual" in the sense that it is not a mere git push. It is bad practice to have git data lying around among otherwise public files, so you have to either set up git hooks on the public server, or fine-tune your public server access rights. Both require (slightly) more work than simply not pushing the git data in the first place.

<comment><USER8> > It is bad practice to have git data lying around among otherwise public > files

Usually I have source files in a "src" subdirectory and assets in an "assets" subdirectory and configure the web server to serve from these two subdirectories.

So the git repo root is one level above anything served by the web server.

</comment></comment></comment></comment></comment><comment><USER9> `git status --porcelain` and `if git diff-index --quiet HEAD -- ; then ...` might be lighter/easier ways (and include non-staged files [as well]).

Er, I guess that doesn't tell if you if you have un-pushed changes... but if your deployment process allows someone to deploy without pushing, your process is broken. Someone _will_ deploy to Prod and forget to push their config changes, eventually.

</comment><comment><USER10> On a somewhat related note, I created check-git a few months ago. It scans a directory tree for unclean git repositories. Maybe someone will find it useful.

[https://kbob.github.io/2016/11/08/check- git](https://kbob.github.io/2016/11/08/check-git)

</comment><comment><USER11> Useful. Maven checks that for autpmated deployments. It delegates that part to SCM plugins as far as I know. Wonder if this one does the same as Maven. On mobile, but may check later (tis probably around here [https://github.com/apache/maven-scm?files=1](https://github.com/apache/maven- scm?files=1))

</comment><comment><USER12> In my job I've written a small script that compares JIRA entries to what lies into git. This I way I can spot things that were forgotten or put on the wrong branch...

</comment><comment><USER13> ok, seriously, is "using git push to do a deploy" a thing? WTF?

<comment><USER14> What is the correct way in your opinion?

<comment><USER15> If you have code that needs to compile, pull in packages, load configuration or for any other reason can't just run in production from a clean checkout, then the proper way is to go through a CI server (teamcity, Jenkins, Travis, etc), and have a script that gets from your clean checkout to a package/zip that runs in production.</comment></comment></comment>


On Premature Optimization - <AUTHOR> http://www.nonblocking.io/2011/02/on-premature-optimization.html

<comment><USER2> I think the "root of all evil" comes from _discussions_ of premature optimization in public forums, not the act itself. Optimization discussions tend to take these archetypes:

* Existing performance problem

* Concerns about planning architecture/approaches

* I want to make it fast, is this plan a good one?

The first two can be OK, although in most cases the second goes nowhere because nobody has the deep and highly specific domain knowledge needed to help with estimating performance in the large.

The last kind is the worst - the person who initiates the discussion has already decided that there is a problem and tried to act on it, and oftentimes wants to brag a bit, and now people can either tell him he's right(boring) or he's wrong/premature(causing conflict). Since these days, most of the time it's premature, there's a huge cargo cult of programmers who essentially say "never optimize." This cult battles against both the performance freaks, and the people who are simply curious about learning and applying more optimization techniques.

Internally to a team, the discussion is fundamentally different as it's made within the context of ship date, spec, etc. Any debate is ultimately settled by the leadership, right or wrong. It only becomes a problem when people can hold the debate in a realm of unbounded perfectionism.

Besides, if you keep your mouth shut, you usually discover for yourself if it was a good idea to bother optimizing.

</comment><comment><USER3> Every time this phrase comes up, we need the context again, which conveys a different picture from the tiny and not-so-useful piece taken from it (and which the author successfully adhered to -- kudos!):

"There is no doubt that the grail of efficiency leads to abuse. Programmers waste enormous amounts of time thinking about or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance a considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3 %. A good programmer _will not be lulled into complacency by such reasoning_ , he will be wise to look carefully at the critical code; but only after that code has been identified." --Knuth, emphasis mine

</comment><comment><USER4> _String builder and concatenation - > use concatenation_

My recommendation: pick some appropriate value of n, and make it a coding standard to use it for chains of concatenation larger than that. You can even profile this in your app, in your actual environment to pick a value of n empirically determined to be around the actual performance crossover point.

Is this pre-optimization? Debatable, if you make your decision based on profiling. The thing is, that in this case, there are a lot of places where this sort of thing can appear. A coding standard like this isn't costly, and by taking this step, you reduce a lot of memory allocation and O(n^2) inefficiency noise when you do your profiling.

Even better: JIT VMs that can optimize out chains of concatenation behind the scenes.

</comment><comment><USER5> I would like just to add that sometimes "premature optimization" is confused with "performance decoration". Performance decoration is process in which you make software to look fast but without any positive impact on actual delivered performance.

Also, there are two ways to make software go faster: do what you're doing quicker or make it do less stuff. It is nearly always better to go "do less stuff" path.

</comment><comment><USER6> Strangely enough, I started my quote website project with a quote on optimization. Coming from the very best:

<http://the-quotes.appspot.com/topic/optimization></comment>


Ask HN: What should I make? - <AUTHOR>

I have to pick a project to make for my special projects class (i'm taking a CS course at a small technical school for an associates degree in business application programming), so I thought I'd take suggestions from HN because why not?
The requirements are:
- has to be written in Visual Studio so obviously it'll be a Windows app.
- written in C# or VB (i'm already picking C#)
- Have to write a .dll to manage a database connection (the database can be either local or online)
- Have to include at least 3 Crystal Reports, including a graph. This one annoys me because I hated Crystal Reports since the moment I laid eyes on it but what can you do?
I can handle all of these specs without a problem but I thought maybe someone had an idea as to what kind of an app to make, because I can't come up with any interesting ideas. Whatever I do make I'll post with the source code as a Show HN for criticism and/or truckloads of money. <comment><USER2> take a data source like some research or statistical data from an online database and use it to create a program that interprets and displays it. Something like google analytics or census data could make an interesting program interface.

<comment><AUTHOR> That could be interesting.</comment></comment>


Alex Payne — Settling Down Without Settling - <AUTHOR> http://al3x.net/2010/10/07/house.html <comment><USER2> _we locked in a 4.5% fixed interest rate on a 30-year mortgage_

Here in the UK, I'd seriously give up one of my gonads for a deal like that. There are almost no fixed deals over 10 years and the only 30 year one I heard of requires 30% down and is about 6%. Instead, we're trudging on with 2 year fixes combined with prayer the interest rates don't skyrocket ;-)

<comment><USER3> Business idea: Have people in the US proxy 4.5% mortgages to UK residents at 4.75%.

<comment><USER4> You'd have to pay too much to hedge the currency risk, no doubt.</comment></comment></comment>


Stalin's Rope Roads (2013) - <AUTHOR> https://www.theatlantic.com/photo/2013/08/stalins-rope-roads/100577/ <comment><USER2> These were quite common across many cities and towns in the USSR. The purposes were quite varied: get people to an attraction, offer a scenic route, serve as a shortcut between a residential and an industrial area, serve as an alternative route to public transport.

Here are the remains of one such road in my home city of Chisinau, Moldova: [http://wikimapia.org/7913907/ru/Верхняя-станция-канатной- дор...](http://wikimapia.org/7913907/ru/Верхняя-станция-канатной- дороги#/photo/907449)

</comment><comment><USER3> The machines that power these are old and incredibly huge. And the cabins look like they will fall apart mid-trip - it took a lot of courage to step inside, but the locals say it's OK. I recommend the place to everyone, Georgia is awesome.

<comment><USER4> It also looked dilapidated when it was new haha.

</comment></comment><comment><USER5> The cable cars, the terminal buildings, and the first dozen or so pictures -- If you removed the people, it would look like an industrial inflected sequel to _Myst._

</comment><comment><USER6> Looks like a soviet dystopian version of Pittsburgh, as if it weren't bad enough already.

</comment><comment><USER7> Discussed at the time: [https://news.ycombinator.com/item?id=6640214](https://news.ycombinator.com/item?id=6640214)

<comment><USER8> This is a different site with a different author, but it's the same article. Blogspam?

Here is the original(?) link: [https://www.theatlantic.com/photo/2013/08/stalins-rope- roads...](https://www.theatlantic.com/photo/2013/08/stalins-rope- roads/100577/)

</comment></comment><comment><USER9> That river rock mosaic is gorgeous. Interesting juxtaposition. Such a beautiful medium portraying two men responsible for such a staggering amount of suffering.

Really fantastic photos.

</comment><comment><USER10> I was here. Miss you Toma.

</comment><comment><USER11> Does Russia have a national paint shortage? So much of this stuff would look 100x better with just a little cleaning/rust removal and repainting. Almost every picture in that album shows something that should have been repainted 20 years ago to inhibit rust formation.

<comment><USER12> Georgia is not in Russia.

<comment><USER11> Yet.

</comment></comment></comment><comment><USER7> Url changed from [https://flashbak.com/stalins-rope- roads-401355/](https://flashbak.com/stalins-rope-roads-401355/), which is cribbed from this. Or rather, particularly shamelessly stolen.

<comment><AUTHOR> Thanks!</comment></comment>


Ask HN: Is the Who's Hiring Thread Postponed to Monday? - <AUTHOR> <comment><USER2> It's always the first US business day of the month, so yes, Monday, but not really delayed.

<comment><AUTHOR> Got it, didn't realize it was to the first business day. Thanks!</comment></comment>


The Complexity Trap: Think Before You Leap - <AUTHOR> https://danielwestheide.com/blog/2018/12/07/the-complexity-trap.html <comment><USER2> As one who frequently deals with Scala code, I have to say that this guy is right: the Scala community in particular seems to relish in complexity.

Scala is a wonderful language and well-designed, especially in contrast to Java. The learning curve requires a good deal of effort, but with experience, it becomes incredibly fun to write Scala code. Once I got past the learning curve, Scala became my go-to language.

That said, there's an underlying arrogance of Scala developers who, in my experience, tend to often abuse the language to show off their cleverness at the expense of users and maintainers. I don't know why this is. I suspect it's because Odersky set the bar so high with his obvious brilliance that some feel insecure.

One take away quote for me:

"Unfortunately, we don't like boring. We like to take the language and the compiler to their limits. We also like to adopt the latest fad. But the software systems we work on in our jobs should not be a playground or a test bed for the latest fad."

Scala developers aren't doing anything new here. People have abused fads in programming for decades. "Design Patterns" and "Test Driven Development" and "RESTful" come to mind. However, it's unfortunate that Scala developers in particular do this. Because, Scala seems to be a language specifically designed to avoid past mistakes.

<comment><USER3> I worked professionally for a year with Scala. For me the biggest problem were functional fanatics that design solutions only top 20% of devs can understand. The rest comes from the object oriented realm and can't deal with monad transformers etc. That might work in small teams, but when you want to scale a team to 100 people you can't ignore this effect. And functional fanatics are strong in ignorance.

<comment><USER4> > _functional fanatics that design solutions only top 20% of devs can > understand_

Not a part of that group, but I think this is a false narrative. 20% might be accurate, or it might be a bit high even. But it has nothing to do with `top` or `bottom` performers. It's purely to do with exposure to functional styles.

Learning Haskell first doesn't make you a top 20% developer, much as I'm sure HN in particular will want to argue with me on that point.

All I'm trying to say is: there's not an intelligence spectrum of `imperative` to `functional` with `object oriented` in the middle. They're different, and many who learn one first struggle with the others, but that doesn't mean they're lower performers in what they do know than the ones who can talk about currying vs partial application.

<comment><USER5> >many who learn one first

Everyone learns imperative first. "Wake up!" or "Eat your vegetables!" are imperative. No-one says to their kids, "map(vegetables, eat)"

<comment><USER4> I mean, those are much closer to functional than imperative tbh. At best it's simply too abstracted to discuss either way. Recipes would be a better example.

If you want to use that example it'd be more like this snippet that no one on earth would tell their children:

> _Starting from n = 0, take the nth vegetable from your plate, insert your > fork into that vegetable, raise your fork to your mouth, bite that > vegetable, remove your fork from your mouth, masticate, add one to n, and > repeat._

</comment></comment></comment></comment></comment><comment><USER6> "Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?"

\--Brian Kernighan

How many times have I bitten myself this way? Dear past me: stop being so smart.

<comment><USER7> This is an astounding quotation

</comment></comment><comment><USER8> I really like it when people become concerned about cognitive complexity. I think it's one of the significantly ignored concepts in our industry and if we ever find a way to address the issue (either with some sort of cognitive complexity solution or some sort of big oh like math framework that describes how things are complex) then the future generations of software engineers will look at what we're currently doing now the same way we look at how people used to do alchemy for our lack of being able to handle cognitive complexity.

Personally, I want a mathematical structure of "problems" such that we can track when we're actually making things more complex or less complex. In the article, removing boilerplate was a problem because internal domain models were being exposed publicly. But what I really want to know is "what are we actually gaining by removing the boiler plate and what are we losing by exposing domain models". In like a general mathematical sense such that if everyone about programming changes (maybe suddenly we switch to APL or something), the lessons we learned are still valid.

So far the best I've managed is [1]. I've done a bunch of refinement in the last year and a half, but the general structure is about the same. I'm not suggesting that what I have is complete or even necessarily the right direction to go for this sort of thing. But what I am saying is that in order to make definite statements about how the problem and/or code you're dealing with is complex (that don't rely on appeals to authority) then you probably need to have done at least as much "work" as I have (if that makes any sense).

[1] - [https://www.sep.com/sep-blog/2017/04/25/objective-code- quali...](https://www.sep.com/sep-blog/2017/04/25/objective-code-quality-blog- series/)

<comment><USER9> I like the alchemy analogy. I think a huge trap we tend to fall into as a profession is presuming to know what software engineering practices are good or bad when we actually have next to zero empirical data on the matter. Most of what the accepted dogma is comes from either authority, or from what techniques lend themselves to the strongest arguments.

</comment></comment><comment><USER10> Has somewhat similar intro to the Rich Hickey's famous "Simple made easy" talk. A good read nevertheless.

<comment><USER11> ...and that's IMO a good thing.

<comment><USER10> Well, it feels borderline weird -- since it's so obviously similar, it could use a reference.

</comment></comment></comment><comment><USER12> >> Hence, we try to isolate business logic from effects and implement the former as pure functions.

This is a valuable insight. Especially if your main programming language supports both functional and procedural and/or OOP approaches; This statement offers a good guideline as to where the boundary should be.

I find that functional programming is great for business logic but not as great for more concrete logic where performance is important. For example, when dealing with low level concrete objects like sockets.

</comment><comment><USER13> It's a refreshing read even for non FP/Scala development world.

It's not hard to see that modern software engineering is cherishing accidental complexity, and as it comes from the "tools we use", the fair share of problem is in the languages, frameworks and tools we use. Unfortunately, there are very little of them that really take a tough stance on fighting complexity, instead of adding more features. Actually I can think only of one such language – Go, and, unsurprisingly, it's critizised heavily in many circles exactly for the lack of accidental complexity.

Tony Hoare wrote this in 1974: "But the pursuit of simplicity is one of the most difficult and challenging activities of the human mind. Progress is likely to be extremely slow, where each complexity eliminated must be hailed as a breakthrough. We need not only brilliance of intellect but breadth of experience, nicety of judgement, excellence of taste, and even more than our fair share of good luck."

I was quite impressed after reading this essay (it's from "The software design: a parable" [1]) – written almost half a century ago, and there seem to be a little progress, if not negative. So books and talks are unlikely to change anything – we, people will still use the path of least resistance and always will be subjected to congitive biases – so probably only tooling can make a change. Go, for example, simply doesn't allow you to do many overly complex things (on purpose) and it results in extremely readable codebase – chances that you open random piece of Go code on internet and will not be able to understand it are almost zero.

I find it a terrific achievement, and wish other (future) languages could embrace the importance of it.

[1] [https://people.dsv.su.se/~jpalme/s1/hoare.pdf](https://people.dsv.su.se/~jpalme/s1/hoare.pdf)

</comment><comment><USER14> Scala is an especially messed up situation. Everything is either overengineered or simplistic; there is no good middle ground because the language is a mess.

This is a little-acknowledged industry-wide problem that extends beyond hot- shot overengineering to reems of banal code too, so I would rather it be written from a less expected perspective.

</comment><comment><USER15> > Doing that certainly means that you scrap quite a bit of boilerplate and > reduce the complexity in your code. However, if you look at the bigger > picture, this is the opposite of removing complexity. Exposing your domain > model like this almost always leads to strongly coupled systems that are > very difficult to evolve. If you ask me, this is one of the most promising > ways to create a distributed monolith. It really amazes me how many people > are totally okay with simply making their internal model their public API, > especially since functional programmers are usually crazy about > abstractions.

Good functional programmers are happy not to introduce an extra layer of indirection yet, because they know that their code is easy to refactor. The article itself seems to come to that point later, yet it gets it completely backwards here.

Generate JSON formats the easy, zero-boilerplate way for now. _As and when_ you have a requirement for a JSON representation that looks different from your domain representation - perhaps because you want to evolve your internal domain model while keeping the JSON representation the same - you can introduce manual JSON codecs (or DTOs, or whatever you prefer) at that time.

> Object-oriented programmers call this technique stubbing, and they get > mocked for doing it, mostly by people like us.

They get mocked for doing it because it breaks all the rules of the language. It usually relies on reflection, bytecode manipulation, or other such horrors. It's often thread-unsafe. Having tests that you can't refactor the way you normally refactor code is a huge, mostly-hidden cost.

> But you have no clue if your production interpreter, which is talking to an > external system, is working correctly at all. So abstracting over the effect > monad and using the Id monad in tests doesn't even help you to write > meaningful tests.

Tests need to be decomposed like any other code. There's a huge value in testing your business logic separately from testing your interactions with external systems. Functional core, imperative shell achieves that, but at a higher cost: you can't interleave your interactions with external systems and your logic in the natural way in code, you have to explicitly, manually push all the interactions to the edge instead.

> What if we did server-side rendering of HTML instead? There wouldn't be any > need to design an evolvable JSON API, which, unlike simply exposing your > domain model, is not trivial, and there would definitely be no need for > defining any JSON codecs. And that's just what you get on the server side. > On the frontend side, you would have one piece of software less to maintain, > you'd get faster load times and you could get rid of duplicated business > logic.

You'd get slower load times as you had to do page transitions, and more duplicate logic as things like form validation had to be done on the frontend and backend with separate code.

> At some point, we realize that we have an architectural problem at the macro > level. Maybe, if we continue to ask why long enough, we will come to the > conclusion that all these services we need to communicate with exist in > exactly this way because of how the company is organized.

And which is easier to fix? At some point you decide that the entirety of western civilization is fundamentally flawed, and you can either start ranting about how we need to rebuild society from the ground up, or you can put a bit of complexity in your software and make something actually useful.

> I was recently talking to someone about Rust, and that person said, "A > language without higher-kinded types is completely useless!". Yes, certain > abstractions are not possible without them, but I have never seen a project > fail due to a lack of higher-kinded types.

That may have been me, and I absolutely have seen projects fail due to lack of higher-kinded types. Not in an obvious way; rather it felt like a general sludginess to development, a need to repeat the same tasks over again, until the project eventually dies from a thousand cuts. (Hell, for all I know the company I left several years ago may still be trying to make that project work).

> Projects fail because the problem domain is not well understood, or because > the architecture is not a good fit for the requirements. They also fail > because of how the organisation is structured and because of politics, be it > intra- or inter-organizational. Projects fail because of people, and because > of people not talking to each other.

This is facile. Projects fail because of people talking to each other too much. Projects fail because people tried to fix their organisational politics instead of implementing technical workarounds. Projects fail because the technology choices were simply bad.

Reading this article was weird, because I found myself nodding along with most of the woolly principles but then massively disagreeing with every single example. It makes me think the article is arguing at the wrong level of abstraction somehow: no-one thinks you should use a complex solution when a simple one will do. Very few people will claim that the problem with today's software is that programmers think things through too much and should rush to write code instead (though for the record I think that's actually the case). But those consensus principles don't actually help us at all when it comes to discuss specific decisions.

<comment><USER16> > Very few people will claim that the problem with today's software is that > programmers think things through too much and should rush to write code > instead (though for the record I think that's actually the case).

People coming from easy to refactor languages have widely different rule books from the ones coming from boileplate-filled ones. It expected that the same person thinks people should rush to write code earlier and gets to understand how a project can fail because of lack of higher-kinded types. The hard part is explaining to people how those weird languages make one more productive, because their thought follows completely opposite rules.

</comment></comment><comment><USER17> I was pleasantly surprised to read an article like this. Less surprised that it came from Daniel Westheide. He know's his stuff.

What I was expecting: I was expecting the fad pushing an article about how too many people push components together and then they're trying to sell some kind of microservices nonsense.

</comment><comment><USER18> See also: [http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLe...](http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html)

</comment><comment><USER19> Scala is for people who weren't around for C++ template metaprogramming.

</comment><comment><USER20> tl;dr [https://en.m.wikipedia.org/wiki/Chunking_(psychology)](https://en.m.wikipedia.org/wiki/Chunking_\(psychology\))</comment>


The real reason why barns are painted red - <AUTHOR> https://plus.google.com/u/0/+YonatanZunger/posts/EfmdR6VWvRM

<comment><USER2> There's a gentle danger with this kind of science myth that people just accept it because "science is cool".

([https://news.ycombinator.com/item?id=1688324](https://news.ycombinator.com/item?id=1688324))

([https://news.ycombinator.com/item?id=5822301](https://news.ycombinator.com/item?id=5822301))

Ferrous Oxide is not only plentiful, but acts as a fungicide. ([http://home.howstuffworks.com/question635.htm)(http://www.gr...](http://home.howstuffworks.com/question635.htm\)\(http://www.grit.com/Community/Why- Are-Barns-Red.aspx#axzz2VI7dVmd9\))

</comment><comment><USER3> Red houses and barns are most common in Sweden and Finland. The reason is that the red color imitated the brick buildings of richer people, it was a matter of class. It also helped preserve the wood, but that is not the main reason.

<comment><AUTHOR> That's interesting, and it still may mean that the article applies in that case to. Just for those who want the tl;dr version, the article states that barns are read because red paint is the cheapest (decent) paint. And the reason red paint is cheapest, is because it has pigments made from iron, which is about the most common heavy element (heavier than neon) element on earth. And this is all due to fusion in stars, and how it stops at iron.

So, the question is, are bricks red due to iron also?</comment></comment>