The Strength of Us Versus Them - <AUTHOR> http://nautil.us/issue/49/the-absurd/why-your-brain-hates-other-people <comment><USER2> This paper is published during an era where the dominant global empire is founded and (mostly) run on principles opposite to ethnocentrism, at least internally.

All of the current POTUS' grandparents were born in Europe, and the previous one's father was Kenyan. The most famous entrepreneur of our generation was born of Syrian parents. The wealthiest self-made woman in America according to Forbes (I did have to Google it), Marian Ilitch, had Macedonian parents.

The best strategy in the Iterated Prisoner's Dilemma is tit-for-tat [1]. The winning groups of today have found ways to cooperate-cooperate systematically, overriding the advantages conferred by the behaviour observed in the paper.

[1] It gets more interesting when both sides know how the other thinks: [https://intelligence.org/files/ProgramEquilibrium.pdf](https://intelligence.org/files/ProgramEquilibrium.pdf)

<comment><USER3> Not so sure. Walk around New York City, a city that proudly claims to be progressive, and observe how segregated the schools[1] and neighborhoods are, and the color of people being served versus those doing the serving.

Those doing well in this social order, per the article, post-facto rationalize this with an essentialist argument: _It 's a meritocracy, I've earned my nice brownstone (and those I gentrified out didn't), my ability to eat at fancy restaurants (worked in the back by cheap labor of a different color), my cheap pedicures (by Korean immigrants who have no choice but to accept the toxic chemicals[2]), and the cheap nannies for my children (invariably black, hispanic or Filipino women scraping by, spending less time with their own children than the ones of their rich employers, some even moving abroad away from their own kids to give them a "better" life[3])._

Normally the reader comments under New York Times articles side with progressive politics, expressing anger at conservatives and Republicans for their self-serving disregard for the poor, for minorities, for women. But if a story points the finger at them[4], these liberal-banner-flying, I'm-with-Her touting New Yorkers, suddenly they start singing the same tune as the conservatives they disdain, justifying their ability to put their kids in the best schools at the expense of the disadvantaged kids, and blaming _the families_ rather than the system that is rigged in their favor from the get- go. Sort by most votes and you have to get to the 15th comment or so for someone to side with the article. One reader had the gall to say:

 _> The good schools all have students that

        Show up every day
        Do their homework every night
        Never miss a test, an assignment or a project
        Ask for help when they need it
        Students create study groups on their own to do the work

> A woman who did my nails each week told me that her daycare in queens was > open 24 hours to support worker schedules and that there were tons of after > school tutoring and enrichment programs to fill the gaps for working > parents. She worked 7 days a week as did her husband, and she paid for all > of these programs...she did it because that is the norm in her community, > and most understood that this is the proven path to the middle class. She > did all of this while sending money home to her parents in Korea. I am sure > her children will be prepared for college.

> There is no substitute for working hard everyday and delaying > gratification._

This is good? That the woman _who is doing her nails_ (see [1] if you haven't already) has to "work 7 days a week as did her husband", no doubt having less time to spend with her own kids, while this woman gets to be pampered in comfort of a pedicurist chair once a week and send her kids to exclusive schools with little effort?

The article is spot on about how we so easily switch sides, whatever it takes to maintain our cognitively dissonant views.

\---

[1] [https://www.vox.com/2016/2/16/10980856/new-york-city- schools...](https://www.vox.com/2016/2/16/10980856/new-york-city-schools- segregation)

[2] [https://www.nytimes.com/2015/05/10/nyregion/at-nail- salons-i...](https://www.nytimes.com/2015/05/10/nyregion/at-nail-salons-in- nyc-manicurists-are-underpaid-and-unprotected.html)

[3] [http://www.newyorker.com/magazine/2016/04/11/the- sacrifices-...](http://www.newyorker.com/magazine/2016/04/11/the-sacrifices- of-an-immigrant-caregiver)

[4] [https://mobile.nytimes.com/2017/05/15/opinion/school- segrega...](https://mobile.nytimes.com/2017/05/15/opinion/school-segregation- nyc.html)

<comment><USER4> Success and comfort often take multiple generations to achieve.

Is that fair? No. But the people and cultures that realize that, and maintain a multi-generational view (rather than looking for comfort in their own life) are much more likely to achieve it.

Life was never fair. If you have a solution to make it more fair, I'm all ears. But just saying that it's unfair offers nothing.

<comment><USER3> Right.

If you think sexism is unfair, don't call it unfair unless you have a solution.

If you think racism is unfair, don't call it unfair unless you have a solution.

Suck it up women, people of color. If you stop complaining, and just work harder, eventually you'll make it. It might take generations, so just maintain a multi-generational view! I mean, many women say that to get the same recognition, they had to work twice as hard as men. So there you go: Shut up and work twice as hard!

If you think Capitalism is unfair, don't call it unfair unless you have devised the next generation economic system to replace it. The only person who had a right to call feudalism unfair was Adam Smith. Everyone else, especially those damn always complaining peasants, offered nothing.

<comment><USER4> Complaining has real costs. It gets people embroiled in intractable political battles. It makes people feel like victims and not tale control of their destiny. Anyone who gets annoyed by the complaining potentially turns from an ally to an adversary when it comes time for a real solution.

These costs may be worth paying when fighting for a tangible goal (e.g. abolition of slavery), but not worth it when the solution is still a ghost.

</comment></comment></comment></comment></comment><comment><USER5> There is _always_ an "Us vs Them" (or tribal) mindset and that's not wrong in itself. There are tribes, teams, and companies and as long as resources are limited (aka always), there will need to be a way to prioritize.

* It's why you provide for your child first.

* It's why you root for your team over those "other guys."

* It's why you help your family before worrying about someone else's.

* It's why your city, state, or country must worry about things within its own borders first.

It doesn't mean the other child is bad, the other family is evil, or some other country is less worthy. It's a matter of "who do I worry about _first_?" Once those needs are met enough (think Maslow), you will worry about #2.

<comment><USER6> I think one of the biggest existential problems facing humanity is exactly the "Us vs. Them" in the sense that it's xor'ed, where it should be "Us _and_ Them." (cf. Pink Floyd)

Priorities and proximity are one thing, but the "vs" necessitates a hard separation where I feel it isn't warranted.

<comment><USER5> If resources were infinite, I would agree 100%. You could be all things to all people and no one would have to prioritize. As is, resources - cash, time, etc - are limited and therefore, the "Us" has to choose who gets which resources first.

Even Bill Gates who has effectively infinite cash resources has to prioritize his attention.. which is probably his only scarce resource.

<comment><USER7> Bill Gates chooses to spend his money largely on "them" though. The Gates foundation is, if anything, a great example of what we can achieve once we look past us v. them thinking.

</comment></comment></comment></comment><comment><USER8> The problem, for those of us inclined towards universal humanitarianism, is that ethnocentrism works, evolutionarily speaking:

[http://jasss.soc.surrey.ac.uk/16/3/7.html](http://jasss.soc.surrey.ac.uk/16/3/7.html)

This is a very tough problem.

<comment><USER9> If ethnocentrism is natural, where is the "problem"?

<comment><USER10> The problem is the high long term (dozens of generations) cost of favoring short term and small area beneficial strategies for a long period of time (millennia).

The problem is kind of like the species level of version of the tragedy of the commons. These different tribes/breeds/races all preferring the short term preference of saving their territory/mate/child/self versus saving the lives (and infinite potential) of their stranger neighbors.

The evolution of life shows us the grand benefit of higher and higher levels of organization. Scaling rules. It forces the previously multi-use smaller pieces to over specialize, but the gain are unimaginable as the voyager space probe is to a amoeba.

<comment><USER11> > The evolution of life shows us the grand benefit of higher and higher levels > of organization.

Multicellular life did not arise from cells being universalist. It arose from cells banding together with their mitotic offspring against other groups of cells. Similarly, the Voyager probe only happened because of us-vs-them competition in the cold war.

<comment><USER12> I'd rather not have another cold war. There are other ways to achieve interstellar probes.

<comment><USER10> Cold war was an arms race, arms race fruit some fantastic solutions. Check sexual selection in beetles.

</comment></comment></comment></comment></comment></comment><comment><USER13> Here's how to use the Us/Them instinct to our advantage.

Us is merely what we empathise with and understand, that which is similar to how we identify with ourselves. The "Other" or Them, is farther away on this spectrum.

We see that in a more primitive time, when societal groups were based on race and ethnicity, we would identify strongly as so, and also select for it.

The brain is very good at "short circuiting" stuff we already know, and engaging with the aberrant parts of incoming information, so the brain scans should merely speak to the familiarity of information and not directly of any underlying bias, even though both may have a common source (i.e. foreign information is the underlying cause, but these variables - brain scans and biases - are merely correlated).

In today's age, we identify based on what we are now seeing as "higher" interests. The intelligent vs the stupid, the skilled vs the incompetent, etc. These are now forming the in and out groups in our collective minds. It must be said though that it would take a significant amount of information about, say, an individual African American skilled person to change them from merely a black person to a skilled person in a White man's head because one can be inferred trivially by a picture and the other by more time and a deeper understanding. (Take with a pinch of salt :)

The point here is that we now understand that society's interests are better served by selecting for traits that are, in a sense, more objective. Things like skill and intelligence and the ability to contribute positively to the world we live in. By encouraging this selection, we are creating an in-group to which an aspiration is a positive thing, positive here being the same as positive for society. It also means that people are less limited by their biological circumstances, which is an equalising platform.

Hard questions remain, such as access to education and information that influences the position of a person with respect to the in-group. But I would argue that this is at least a positive evolution from where we have been.

Something also should be said about the ability to take every individual and every circumstance as unique, and be able to help each attain the maximum potential as per your own selected ideals, but this would require a radical individuality and awareness of self, and an extreme ability to understand and communicate with every other person. In this world, there would be no groups. But we're probably not quite close to this world yet.

<comment><USER5> I would further note that the "Us" and "Them" are different in every scenario throughout your day.

When you listen to the news, the line may be drawn based on geographic/state boundaries. When you talk with your coworkers, the lines are based on competitors vs partners. When you bump into that college friend, the lines are based on shared experiences, fields of study, or teams. When you go home and have dinner with your spouse, it's based on blood and marriage.

We choose, prioritize, and "optimize" based on all those lines throughout the day. We choose our values and connect and share or divide and compete as appropriate.

I was going to say " _until we deny the 'Them' resources, there's not a problem_" but we want to do that every day right? We want our team to get the best players, our companies to hire the best people, and our work to attract the best customers.. all of those things deny resources to the 'Them' in those scenarios.

</comment></comment><comment><USER14> Not what i thought. Just as good though.

U v T works very well in motivation and corporate problem solving.

The read reminded me of the birth order book. Tidbits of "factoids" that makes good conversation and can help predict peoples actions and emotions.

</comment><comment><USER15> If millions of years of evolution have reinforced "us vs them" pathways, it's probably a mistake to dismiss them out of hand as a Bad Thing. This article repeatedly implies that snap judgments are bad, presumably because they aren't subject to the rational part of our brain. I think this is part of a broader trend of devaluing the unarticulated aspects of consciousness and promoting rationality as the only valid mode of thought.

Also, any discussion of Us vs. Them should reference this article: [http://slatestarcodex.com/2014/09/30/i-can-tolerate- anything...](http://slatestarcodex.com/2014/09/30/i-can-tolerate-anything- except-the-outgroup)</comment>


Test of Google's page speed service on my site. - <AUTHOR> http://youtu.be/KwgxE5pCamo

<comment><AUTHOR> Note, this was a U.S. based test.</comment>


The Problem with "Content" - <AUTHOR> https://om.co/2019/06/16/the-problem-with-content/ <comment><USER2> > from the article: "Everyone has a pet peeve" That is true. I feel the word > content has been used and abused over and over but there are valid uses of > the term, much like other terms. 'atmosphere', for example, could be used to > describe a social setting or the planet's surrounding.

The main problem is when people use terms without acknowledging the context.</comment>


Get Ready for the Return of Inflation - <AUTHOR> https://www.wsj.com/articles/get-ready-for-the-return-of-inflation-11587659836 <comment><USER2> Interestingly enough, when Kuwait did basic income issuances to the general public (everyone) they could not mitigate a spike in commodity prices every time the fund was dispersed. They continually blamed the finance ministers and heads of economy, but if you inject a ton of cash into the system, the inflation will be felt somewhere. However, thanks to the staggered nature of the delivery of the stimulus of March 2020 it seems that the US will probably weather the storm with minimal increase in inflation, because the reduction in [restaurant and other] food demand has lowered commodity prices. My guess is that they will level out over the next 6-12-18 months. Economics is awesome.</comment>


IMAP or POP? - <AUTHOR>

Which protocol do you prefer and why? <comment><USER2> Is POP still around? I thought that was a remnant of the "Dude, look at my a Pentium"-age. Is there even a way to work with POP in the current multiverse of connected devices?

</comment><comment><USER3> Depends on what you are doing - if your need is to access email offline use POP, else IMAP

</comment><comment><USER4> IMAP because I use email across multiple internet connected devices.

</comment><comment><USER5> IMAP. Email across multiple devices.</comment>


Tell HN: Startup Riot Atlanta Starting Now - <AUTHOR>

Pretty amazing vibe. <comment><USER2> This isn't twitter you know!</comment>


The World of Perception and the World of Science (1948) - <AUTHOR> https://theworldofperception.wordpress.com/2015/01/22/world-of-science/ <comment><USER2> A book with this and related lectures, [http://timothyquigley.net/cont/mp- wp.pdf](http://timothyquigley.net/cont/mp-wp.pdf)

<comment><USER3> thanks!</comment></comment>


Google demotes Chrome in search results over pay-for-post promo - <AUTHOR> http://news.cnet.com/8301-1023_3-57351705-93/google-demotes-chrome-in-search-results-over-pay-for-post-promo/

<comment><USER2> "During the 60 days, the PageRank of www.google.com/chrome will also be lowered to reflect the fact that we also won't trust outgoing links from that page."

That was the strangest part, for me. Google clearly _can_ trust outgoing links from www.google.com/chrome.

Its clear they had no intention of gaming their own system with this campaign. But they obviously feel the need to act in a 'beyond reproach' way, to avoid the accusation of conflicts-of-interest.

In one way its good that they are being held to high standards; on the other hand, this is resulting in less relevant search responses, for no real benefit to anyone (including those whom antitrust law, which they might be thinking about, is there to protect).

Hard to say what what the right thing to do is. Sometimes, it looks like its a tough job to maintain the 'dont be evil' image.

<comment><USER3> The thing is, this just doesn't matter. They still have a Chrome ad at the top of every page and if people are looking to find Chrome it's already simple. The outgoing links don't matter, because the sites the Chrome page links to are also easy to find.

<comment><USER4> Not to mention if you go to Google from IE it prompts you to install Chrome before you even search.

</comment></comment></comment><comment><USER5> Wowzas. That's a pretty big move for Google to make.

Google.com/chrome isn't even the top result for the query "Google Chrome" or "Chrome"

[https://www.google.com/search?ix=heb&sourceid=chrome&...](https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=Google+Chrome)

[https://www.google.com/search?ix=heb&sourceid=chrome&...](https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=Chrome)

Good on you, Google.

<comment><USER6> It isn't? The first thing I see when I search for "google chrome" is

Google Chrome Download | google.com

www.google.com/chrome

<comment><USER7> That's a paid ad. You can tell from the yellow background and from the text that says "Ad" in the upper-right.

<comment><USER6> I'm aware of that. My point was that not much has actually changed in practical terms. Yes, there is a little "Ad" text and slightly different background, but both before and after, the first thing people see when they search for "google chrome" is the Chrome download page.

<comment><USER8> Here in Denmark Google doesn't advertise their browser. However Microsoft does. So a search for "browser" returns an ad for IE, wikipedia as the top result, and then Firefox, Opera and Safari without Google Chrome anywhere on the first search page. So it definitely has changed in practical terms.

</comment></comment></comment></comment></comment><comment><USER9> I'm torn between "That's almost _cute_ " and "This is wrist-slapping ourselves to give the appearance that we administer our guidelines in a manner which is not arbitrary and capricious."

<comment><USER10> I'm sure trying to decide which snarky remark best conveys your condescending attitude towards a company's attempt to maintain its integrity and good standing is such a terrible dilemma.

<comment><USER11> I'd go with "Apology accepted, Captain Needa."

Snark aside, I have to say that _was_ my reaction - it's a more sincere apology than we usually get, and can be accepted as such.

</comment></comment></comment><comment><USER12> What would happen if an entity started buying links for a competitor product so that it was demoted?

<comment><USER13> Utter chaos, unless Google's anti-spam team is made up of humans, who could see through it.

See also: "If I change my name to Mark Zuckerberg, they _can't_ sue me, because the judge will think I'm Mark Zuckerberg!"

</comment></comment><comment><USER14> Wow. Points to Google for consistency!

<comment><USER6> Yes, this was a smart response to a bad situation. If Google had done anything else it would have been heavily criticized. This was the right thing to do.

</comment></comment><comment><USER15> What I see when searching for "Google Chrome" is support.google.com/chrome, with sub-links underneath and the top-left sublink going directly to google.com/chrome. I think the system has been worked a little bit, but it's still interesting that they made this move. It may be enough to make it hard for people who have to search to find the download to get to it.

</comment><comment><USER16> Can someone explain how they got into this situation? I can't find any backstory.

<comment><USER17> This, apparently: [http://searchengineland.com/googles-jaw-dropping- sponsored-p...](http://searchengineland.com/googles-jaw-dropping-sponsored- post-campaign-for-chrome-106348)

</comment></comment><comment><USER18> Doesn't seem to have amounted to much. In my search results for "browser", I get:

1\. Firefox 2\. Wikipedia "browser" 3\. Wikipedia "Google chrome" 4\. PC Mag "Browser chrome definition" 5\. Google's Chrome download page

For "chrome":

1\. Google's Chrome download page 2\. Wikipedia "Google Chrome" 3\. PC Mag "Browser chrome definition" 4\. Chrome messenger bags 5\. CNet's Google Chrome download page

<comment><USER19> Its disappeared for me for the queries [browser], [internet browser] etc. The change probably takes a while to rollout everywhere. Probably fair that it still shows up for [chrome].

</comment></comment><comment><USER20> Maybe this is a dumb question as no one really asked it so far but, umm, I thought Google couldn't mess with rankings. Like, at _all_. I've read everywhere, even on Google's own properties that rankings are based on their top secret algorithm and that they not only cannot but will not manually manipulate results ever.

I really doubt they'd release a publicity statement that let loose such a big secret so what am I missing or misinterpreting? I really thought there was just no way possible to change results. I get that they can mess with ads but organic results?

Edit: Not to be _that_ guy but what's with the downvotes? I'm honestly asking. If there's something dumb about it I'd really appreciate someone telling me. Then downvote all you like. Am I being naive to think they can't change a ranking? Am I misusing terms? What's up?

<comment><USER21> I suspect you are getting downvoted because it is obvious to programmers that because Google made the ranking system, it is possible for them to manipulate the rankings in whatever way they want.

<comment><USER20> Thank you. I'm a programmer too but I didn't get it. I figured that could be the case but then I wonder how? I, first of all, naively assumed they couldn't do it because they say they can't (shame on me for being so trusting), and then figured that if they changed the algorithm then there'd be collateral damage. I dont really get into algorithms much so I didn't know they could target a single page like that. The smart programmers would probably say I was a yellow belt compared to their black belt. Anyway, thanks for the answer.

<comment><USER22> It doesn't require any inside knowledge to manipulate the ranking system. There are some methods that you can't really architect against (like paid posts) from a software angle, so Google has rules and penalties in place to discourage sites from doing that in order to distort their page rank. In this case, one team seems to have accidentally run afoul of those rule and is being penalized appropriately because it makes sense in terms of the larger picture of protecting the quality of search results.

</comment></comment></comment></comment><comment><USER23> Regardless of the rationale, Google's willingness to manually manipulate page rank for the sake of PR doesn't make a positive impression on me. There was the appearance that Google was gaming SE results, publicly doing so does not seem like a very convincing argument that Google is above such practices.

In other words, I am not inclined to bestow accolades upon them for making real the concerns which were raised.

<comment><USER24> Well, at least they kind try to fix it, or, make it appear like so.

But yeah, it's like praising someone saying "ok, ill stop murdering people now", on a much lower level of course. (specially after being slapped on the wrist)

<comment><USER23> Google didn't say, "We will stop manipulating search results."

Instead, they said, "We were manipulating search results, and therefore we are so sorry, we are going to manipulate search results."

Promoting Chrome through the manipulation of search results was not the root problem. It was merely a symptom. Manipulating page rank for their own benefit is the problem, and that is their proposed solution.

It came only after the manipulation came to light and does not appear to be part of a larger project to end all manipulation for their benefit.</comment></comment></comment>


This Trello client for Roku make your TV into a Kanban board - <AUTHOR> https://www.youtube.com/watch?v=-ZgvlpjLcyA <comment><USER2> Not a fan of the product demo with random background music format, but seems useful.

<comment><AUTHOR> Noted, thanks.

I will make a shorter video with explanations of the features.</comment></comment>


Microsoft's Open Management Infrastructure for Linux Now on GitHub - <AUTHOR> https://github.com/Microsoft/omi <comment><USER2> Oh my gosh. This all looks like a big pile of steaming "how about no".

"Getting started" that has hundred pages, dense with acronyms meaningless outside Distributed Management Task Force committee. Dozens of functions that _could_ be easily and clearly described by terms like "monitoring", "hardware/resources inventory", or "configuration management", all packed into _one product_.

One more example of Microsoft "not getting" what sysadmins need.</comment>


MongoDB – How To Benchmark and Test Performance Using mongo-perf - <AUTHOR> http://blog.beyondfog.com/mongodb-how-to-benchmark-and-test-performance-using-mongo-perf/#.T6NrQKstiDk

<comment><USER2> And the results of on the file systems was...?</comment>


Show HN: Upstart.me – Find newsletters to promote your startup or side projects - <AUTHOR> http://upstart.me/?v10 <comment><AUTHOR> Last time, I posted the pre-launch (V 0.5) of this service, which basically was a weekly newsletter that featured 3 newsletters that you could sponsor. ([https://news.ycombinator.com/item?id=14445239](https://news.ycombinator.com/item?id=14445239))

The feedback was fantastic, and today I'm finally launching the searchable database.

Browse through a growing feed of newsletters and support influencers by advertising in their newsletters. Get your product in front of their thousands of targeted and engaged subscribers.

Play around with it and let me know what you think.

</comment><comment><USER2> Looks slick, though I might personally prefer a slightly denser list. Is there a way to sort by metrics (subscribers, price)?

<comment><AUTHOR> You can search/filter by certain keywords, but I have those filtering options (price, subscribers) on my to-do list. Hopefully it'll be ready later this week.</comment></comment>


How the right syntax can help teach recursion - <AUTHOR> http://akkartik.name/post/swamp <comment><USER2> Explaining recursion is a lot easier than writing recursive functions.

I can actually describe explicitly why I've occasionally found writing a recursive function hard. In fact I expect a UI could be created that would make it much much easier.

Basically, for ordinary functions I'm able to remember the values stored in each of the variables. (I do not mean a real computation, but the pretend computation I do at all times when programming.)

However, with recursive functions, I sometimes find myself having to remember 5 or more levels of these same variables. Therefore if I have 5 variables, I might end up having to hold 25 values in my head; obviously it is less than this since often there is some pattern to the values that aids in remembering them.

Additionally, I need to flow the return values back through the functions potentially performing extra computations on them; this can be extra confusing if there were multiple entry-points at a particular recursion level of a function. For example, what line and column number was the function called at, and which block of a function was it within? And, do these values belong to the 7th or 9th call of the function? Due to this I'm no longer able to rely on my memory, and I don't get the cognitive benefits of associating computations to place.

Another issue is that if you write some code which never matches its 'base case' it never finishes computing. This is often difficult to debug, and it can cause your machine to lock up.

Perhaps the solution might be:

\- A table to represent the values within a recursive function. With colour coded cells that show which level of function a value comes from (and whether it was an argument or return from a deeper level). Effectively, the idea is to reassociate computation with 'place'. Method of Loci.

\- Some tools in order to troubleshoot the times in which they've misprogrammed the 'base case'. For example, set a particular recursion depth when developing and exit if this gets reached. Visualise separately how values are advancing towards matching this 'base case'.

I could probably come up with more, but I need to think concretely again to do so usefully; and I'd need to experiment with different recursive solutions to find out whether I'm solving their individual problems.

<comment><USER3> Maybe it's just that I'm not writing code as complicated as you, but 5 years of school and 5 years of industry, I've never had to hold more than a single level of a function in my head at once. My trick is to explicitly say what contract the function fulfills, i.e. if the input has X property, then the output has Y property. Then when you make the recursive call, you can just assume your called function behaves as advertised. I thought this was the whole point of recursion.

<comment><USER2> What you're describing is how normal functions are generally written.

If there is no difference in complexity between writing a function that calls itself and a function that just computes some data and returns it then surely this discussion wouldn't be happening. I think it's happening for a reason so I tried to articulate this.

I'm speculating that recursive solutions are more difficult for people to write, because (1) whether a function is said to have worked or not could be dependent on a call multiple levels deep from the original call, (2) the immutable constant named `foo` you created within the function body might contain different values at every deeper call (therefore it is no longer an effective name to refer to 'one thing'), (3) the function calls each relate to each other and likewise so do their values, but this mapping is generally not expressed well within the code or within outputs you might debug (after each function application, a value is received for which the context of how it was produced is often lost.)

I'm probably speaking in too abstract a way to be clear. I think the tools could be improved here; I was thinking about the problem earlier on and I realised that generally I solve it by breaking the problems up into tiny functions [0]. Unfortunately, there's a time cost to this approach, so I would prefer it if debugging tools would instead allow you to annotate blocks of code. They could then represent this information visually. This would help me.

I also think that good teaching is important. I remember that I used to be utterly terrible at writing these functions: my main issue was often that I didn't start by thinking about the 'base case' and the simplest inputs. That's easy to get right.

I do think that my mind has never been very well suited to recursive computation, however I believe I'm decent at understanding and problem-solving around this. It's because I have to think carefully and tool myself when dealing with recursive problems, that I'm able to describe the pitfalls. I have never been the kind of person to compel myself into understanding something merely by stating "this is easy".

[0] [https://twitter.com/nouswaves/status/776384680652398592](https://twitter.com/nouswaves/status/776384680652398592)

<comment><USER4> In a way I find recursive functions _reduce_ the complexity required to reason about a loop. What made me grok recursion was realizing that it's just a more explicitly defined loop:

\- You have to define an end condition. (Really this is no different than the 2nd clause of a C-style for() loop, or the expression evaluated by a `while()` loop.)

\- You have to explicitly specify the inputs for each iteration of the loop (e.g: explicitly declare what you need in the function signature, instead of just using whatever variables happen to be in the parent scope as working memory.)

\- It makes optimization concerns very quickly apparent, as you'll pretty quickly blow the stack or start waiting for the heat-death of the universe. The best heuristics I have for a quick optimization pass are: is it tail- recursive, and does it needlessly recompute values?

Once I realized recursion is just another way to tell the compiler "repeat this thing until [x] is true", it became a lot less mystical and much easier to reason about.

I'd agree with OP to an extent that syntax did make a huge difference in how I viewed recursion. I understood recursion on a theoretical level for a while, but avoided it whenever possible because I too thought it was difficult to reason about.

It wasn't until I learned Elixir that it "clicked" for me. Between pattern matching and multiple function heads: Elixir just made recursion really easy to think about. (Not having any traditional loop construct probably helped a bit, too.)

<comment><USER2> I agree with you that it is more explicit than looping: I actually think that with complicated logic, loops suffer from even worse problems, and for simple things most people just `filter`, `reduce` or `map`. That said, I do think the debuggability could be improved.

</comment></comment></comment></comment></comment><comment><USER5> I think the best way to explain it is that a recursive function is a function which should return either:

\- A 'base case' value

\- The result of a call to itself (could be multiple calls to itself also)

Basically when you call a recursive function, unless it hits the base case (usually decided by an if condition), it will keep calling itself (often with slightly different arguments each time) until it returns the base case.

Once the function returns the base case, the recursion will start to 'unwind' \- In the unwind phase, you can use the return values of the previous recursive calls to do more interesting stuff.

The best way to visualize recursion is to imagine that you have a stack of function calls; each time a function calls itself, it creates a copy of itself with new arguments and puts that copy on top of the stack - Then the program pointer moves to the copy (but it keeps a reference of were it was in the previous call) - And it keeps building up the stack with new copies of the function until it reaches the base case (when the function finally returns a concrete value).

The 'unwinding' phase is just when the functions start returning (after the base case has been reached) and all the function 'copies' just get popped off from the top of the stack one by one - Each time the program will continue running from wherever it was in each call stack.

</comment><comment> d--b Wow, the guy really is teaching his students how to program using his side- project language?!

Man, if I was the student, I would be pretty upset. There are plenty of popular programming languages to learn. Each one has its own caveats. It's hard enough to learn CaML, or C, or Lisp, but these are at least used in the world!

Why would the student need to learn a programming language that no-one uses? It's either that the teacher is using them as guinea pigs, which is bad enough, or using them advertisement, which is even worse. All in all, he's certainly not making them a favor!

<comment><USER6> _> Why would the student need to learn a programming language that no-one uses?_

The same reasons many examples in textbooks and documentation are in pseudo- code. Sometimes you want to learn _general concepts_ and don't want implementation oddities of _specific language(s)_.

Theory first then practice. That way you are more likely to end up with a skillset you can easily transfer between languages/frameworks/platforms/other.

Essentially his language is the same as any other "made up" pseudo-code syntax.

<comment> d--b Well, yes and no. The syntax itself looks very verbose, and the language seems to have a lot of idioms of its own.

</comment></comment></comment><comment><USER7> I disagree somewhat, but I don't have time to write a detailed answer. Instead here's a quick sketch that is likely only intelligible if you have a fair bit of PLT background.

The basic point is this: you don't need to teach "raw" recursion, just like you don't teach control-flow using goto. Just like structured programming introduced for/while/do loops to structure control flow, you can structure recursive programs into a few major groups. The most important one is good old structural recursion over algebraic data types. It's follows a very set formula, so there isn't much opportunity to go wrong. It helps to have pattern matching in your language to do this.

This is the approach taken by How to Design Programs ([http://htdp.org/](http://htdp.org/))

Example blog post you might read if you want to know more about the theoretical background: [http://blog.sumtypeofway.com/an-introduction-to- recursion-sc...](http://blog.sumtypeofway.com/an-introduction-to-recursion- schemes/)

<comment><USER8> I think this depends on whether you're teaching down or up. I suspect both work for different people.

(Down == "here's some abstract concept, here's some code that implements it in the language's abstract model", Up == "Okay so everytime you call a function, a new stackframe is created." That's the approach I personally prefer.)

I think the reason why recursion is so hard to understand is that programming languages are incredibly misleading. You see "int a = 5;" and you assume that there's a unique 'a' to which 5 has just been assigned, which is of course a complete lie; 'a' is a _template_ for a memory location which is defined only when the function is _called_. If you don't know this, recursion makes zero sense. "What, now there's two a's??"

I should go do a blogpost on this.

<comment><USER7> I think trying to reason about recursion in terms of stack frames is madness. I find it quickly overwhelms my working memory. This is why we have the patterns---so you don't have to reason on the machine level. It's similar[1] to proof by induction, on the off chance that helps.

[1] By similar I mean exactly the same as.

<comment><USER8> I think _reasoning_ about recursion in terms of stackframes is silly. But stackframes are useful for getting a handle on how recursion functions _at all_.

<comment><USER7> Ah, I see. Agreed with that.

</comment></comment></comment></comment></comment><comment><USER9> Quoting the author:

        With Lisp it's always been non-trivial to know when a
        function is tail-recursive. You can't just blindly count
        parens, you have to try to "run" the function in your mind.

To me, Lisp code is just like a tree (well, sometimes DG) and it's statically obvious where the leaves are---no need to "run" the function in mind. But maybe it's just because I get used to it; once you learned, you forget what you saw (or you didn't see) before.

<comment><USER10> It can still be non-obvious with an optimizing compiler, or with non-Lisp.

I don't see the point in having beginning students think about tail call optimized recursion vs normal recursion unless they're going through SICP. In the end it can totally be a compiler thing. For instance, GCC can optimize this:

        int factorial(int x) {
           if (x > 1) return x * factorial(x-1);
           else return 1;
        }

into this:

        int factorial(int x) {
           int result = 1;
           while (x > 1) result *= x--;
           return result;
        }

([http://ridiculousfish.com/blog/posts/will-it- optimize.html](http://ridiculousfish.com/blog/posts/will-it-optimize.html))

<comment><USER9> When you're using TCO-guaranteed language like Scheme, what's important is you recognize tail position, where TCO is guaranteed. Guaranteed TCO lets you express, for example, state machine using mutually recursive functions. You do see the tail calls as gotos and you heavily rely on that while you're coding.

In that regards, I feel that tail call "optimization" is misleading, since it gives an impression that it's some kind of optional bonus the compiler gives to you. The transformation such as your gcc example is, certainly, an "optimization". If you get one, you're lucky; if you don't, fine, you can live with it. Guaranteed tail call elimination is totally different---if you don't have one, you change the way you write code.

(So, the blanket statement of "Lisp" might be inappropriate, for it's only a subset of Lisps that has guaranteed TCO.)

</comment></comment></comment><comment><USER11> This just looks extra confusing to me

</comment><comment><USER12> I feel like it would be easier to walk through how the machine deals with it at an assembly level. I if you restrict to a really basic level of just pushing, jumping, and linear execution. Recursion then just becomes executing instructions, even if it means calling the same method you're already executing in.

</comment><comment><USER13> I think the best way to understand recursion is in terms of induction. If someone gave you the solution to your problem for different inputs, could you compose them together to solve the problem for your current input?

Then you just have to show termination.

Thinking procedurally (i.e. in terms of 'unfolding' the call stack) is unlikely to provide much insight.

</comment><comment><USER14> It is a little interesting that it takes so few changes to the source to rewrite the recursive call as a loop. But really the only advantage it has over C (syntactically, anyway) is that it doesn't require a return at the end. By which I mean, it's kind of a stretch to call this the "right" syntax.

</comment><comment><USER15> Funnily enough, that Lisp, guaranteed not to run anywhere in _this_ universe, is _almost_ valid Scheme, under SRFI-49 or Wisp. The only thing you'd have change is change def to define, and replace rest.x with (cdr x).

</comment><comment><USER16> This is pretty interesting, and I am tempted to introduce this syntax in my next C programs. Would anyone advise against it?

</comment><comment><USER17> Just throw _The Little Schemer_ at them.

</comment><comment><USER18> Anything better than Haskell's?</comment>


Automate the Boring Stuff with Python (2015) - <AUTHOR> https://automatetheboringstuff.com/2e/ <comment><USER2> This was the book that got me into programming. About three years ago, I was an auditor looking for ways to automate the more mundane tasks of my job, and stumbled a across this book.

I had no prior experience with programming, and at the time I only wanted to learn how to write enough code to help me with my job. This book was perfect for that goal.

It took me a couple of weeks to get through it all and write the program I needed to write, but when it worked, I was amazed. I remember going to grab coffee to celebrate and on my walk I started thinking about other job tasks I could automate. Most of public accounting deals with comparing PDF reports and Excel data, so I genuinely believed I could write programs to automate the majority of tasks at my job.

I started to learn on my own with some common online resources. I would get so excited to come home from work so I could dive further into my studies, and the more I learned, the more opportunities I saw: what if there was a way for a computer to perform all the analysis and statistical processing for an audit? What if a program could monitor financial transactions and automatically complete taxes for clients?

Flash forward a few months and I went all-in on software development. Quit my job as a public accountant, finished a boot camp, and started working as a developer.

It was the best decision of my life and this book was the catalyst. I'm so grateful that Al wrote this, and I highly recommend it for people whose jobs have a lot of boring stuff —- especially public accountants :).

<comment><USER3> I had the same exact experience, however no one really cared when I explained my spreadsheet automation (I'm partially to blame there), so I quit my road to nowhere finance job to move to Australia and also change careers with a boot camp. 1000% changed my life for the best.

<comment><USER4> As someone in a bootcamp right now, I'm really happy to hear this! Im hell- bent on starting a new career as a dev

</comment></comment></comment><comment><USER5> I started reading this book this week in an effort to open up my job prospects down the line. I'm a "technical" Industrial Engineer often serving as a liason between IT and the business. I can program in VBA and do anything you can name in Excel, but I want to move to a more programming oriented role down the line.

I want to be able to do statistical analysis, queries, and just "be better" at breaking down a problem into easily solvable steps.

I'm using this book as a "learn the basics" stepping stone, and Project Euler as a list of solvable problems which will let me practice solving problems. After that I'll move into some personal projects I have in mind.

Does anyone have additional book or resource recommendations beyond that? I know packages like NumPy and/or SciPy will be useful down the line.

* Codecademy feels overpriced at $40/month or $250/year (no refunds for using a partial year).

* Google Python class was free but about 10 years old. With the Python 2->3 debacle, I was unsure if fundamentals had changed and hesitant to sink my time into it.

* Lynda runs $25 or $40/month but would offer python as well as many other resources.

* Udemy - has a number of courses including one by Al, the author of this book. Looked like it'd be a good value, but I'm not sure how much more value the videos add than the book.

<comment><USER6> I'd recommend edx's CS50x, "Learn Python the Hard Way", "The Pragmatic Programmer" and "Code Complete".

<comment><USER5> These look like great resources, thanks!

</comment></comment></comment><comment><USER7> Got hardcopy of this book for Xmas from my 3 year old (yea OK the wife!) about a 1/3 into it.

Have programmed c++ about a decade ago.. Nice to get back into it I have to say, there is an instant gratification from solving something in code, perhaps is the binary nature of something working or not, it's very black and white versus dealing with management issues, which is more like my day job, where your constantly in some grey area or dealing with noise, emails, endless directionless meetings.

Anyway highly recommend this book for non programmers, MU is also a very nice and clean IDE but prefer VS Code.

</comment><comment><USER8> I love this book! I bought the physical copy years ago and it has frequently been a go-to book of mine. So many tech books (not all, of course) either do a great job of theory but are of little immediate, practical value _or_ they are "cookbook" style and give you lots of useful tidbits but fail to help you grasp the big picture. While there are valid reasons for both of these approaches, of course, this gem is one of the few that are able to do both in one text. You learn a new computer language in the first part, and as soon as you have a foundation in the basics, you immediately jump into practical applications that can benefit your life almost immediately. Very well done, IMHO.

</comment><comment><USER9> Aww I wrote the Python docx module years ago when I first got into programming as a sysadmin (I was doing lots of xml munging so knew lxml pretty well at the time). Nice to see it included in a guide like this.

<comment><USER10> Thank you for writing it. I used it for the first time last week and it made my job so much easier than the other solutions I was looking at.

</comment></comment><comment><USER11> The problem with automating 'every day stuff' is that processes aren't formalized in most cases. So there isn't an interface to implement against. There are no clear or reliable sources of data. Management needs to understand the issue, and if it doesn't there isn't much you can do as a single individual. So I more and more often tend to ask myself, if it is really feasible to automate task X.

<comment><USER12> A key question is "will this task benefit from formalization". If the answer is Yes, one can begin to structure it and gain benefits quite quickly. Clear and relatively quick gains, and helping out the people that do these tasks today, is key to buy-in. Then once a structure is in place, one can consider automating it.

</comment></comment><comment><USER13> Honest question -

I'm very familiar with Ruby and for my automation tasks I tend to use it almost exclusively. Of these, is there anything that -

1\. Ruby can't do

2\. Or is more complex / complicated to do in Ruby

<comment><USER14> Honestly, I've done a lot of professional work in both languages, and there is pretty much nothing you can't do with ruby that you can in python. There is no intrinsic difference in power of expressiveness between the languages. Although ruby is lagging a little behind with the asyncio syntactic sugar stuff. You may reach a point where there simply isn't any client written for the service you are trying to automate in either language. And python got more love in that aspect what with all the being the number one preferred scripting language on planet earth, but in case your target of automation provides a simple rest or websocket protocol you could easily do without a dedicated client library for it.

<comment><USER15> > [Python] being the number one preferred scripting language on planet earth

Is it?

I'd imagine JavaScript usage/execution is probably way way higher.

<comment><USER14> Yes python is more preferred when choosing a scripting language and javascript is more executed in browsers. And the two do not contradict.

<comment><USER9> I think you're both correct. For sysadmin definition of scripting, python would be most popular. For the 'fast to write' definition of scripting then sure, JavaScript.

<comment><USER16> I don't think I've ever heard that as a definition of "scripting".

<comment><USER9> Which one?

For the second, the definition of 'scripting language' used to be 'doesn't use a compiler' but JS and everything else has a JIT now, so 'make something quick' is a modern equivalent.

</comment></comment></comment></comment></comment></comment></comment><comment><USER17> This should not be dated 2015 because this is the second edition that just came out today.

</comment><comment><USER18> This is the second edition, which is new, so it shouldn't be (2015).

</comment><comment><USER19> I'm right there with ya calderarrow. I'm a middle aged physician with no prior programming experience, but I picked this book up on a whim a few years ago and it changed my life. I started automating little thing a here and there and now I see opportunities everywhere that a "real developer" could capitalize on. For as expensive as EMR's are, you will NEVER meet a doctor who loves theirs, they just hate some less than others. Patient portals are even worse. This industry is ripe for disruption.

</comment><comment><USER20> I am biased because the author is a friendly acquaintance, but this is a great book (and Al is a great person.)

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


Is eval evil? Just-in-time compiling - <AUTHOR> https://wanago.io/2018/11/19/how-does-eval-work-and-how-is-it-evil-javascript-eval/ <comment><USER2> Here's a really good use of eval:

[https://jsfiddle.net/matthewaveryusa/e6EKV/6/](https://jsfiddle.net/matthewaveryusa/e6EKV/6/)

I could have done this without an eval if I decided to write an interpreter. Instead I whitelisted a subset of javascript and evaled it -- I believe the code is simpler with the eval than if I were to write a parser + interpreter.

I challenge anyone to escape my whitelisting :)

<comment><USER3> Generally I always use Function() instead of eval, because Function doesn't capture the current scope (and also it won't interfere with JIT optimisation, and avoids possible memory bloat of variables in closure if you keep references to the functions).

<comment><USER4> I saw a trick where you just do:

      const eval2 = eval

      eval2(...)

That put's it back in global scope, even when assigned within a closure with access to a local variable. The local variable will be undefined, rather than it's actual value, even when called next to the regular eval(). Odd, I know.

Here's a quote:

"any invocation of eval that is not a direct call uses the global environment as its variable environment rather than the caller's variable environment." ECMAScript 5 standard,

</comment></comment></comment><comment><USER5> Contrary to what the article says, there is no reason whatsoever that code in an eval, even if it uses the calling environment, cannot be optimised.

I work on a Ruby implementation that optimises through eval just fine.

<comment><USER6> Exactly. It's just like SQL: different queries end up as different entries in the query cache; although SQL is beneficially fuzzy in this case, if only the constants differ you should get a cache hit.

The "safe" and fast way to use eval for JIT is to get it to return a function, with all user inputs as parameters (like like the safe and fast way to do SQL is with parameters):

        var f = eval("(function (a, b) { return a + b })");
        f("a", "b");

<comment><USER7> Why not just do:

var f = new Function('a', 'b', 'return a + b')

<comment><USER6> I had no idea that was possible. The concept still applies though.

</comment></comment></comment></comment><comment><USER8> Eval doesn't _have_ to be bad for JITing. Someone oughta write a JS JIT that interoperates with the parser to look for patterns like:

        eval("some code { " + stuff + "} more code")

and runs the parser enough to observe that `stuff` fills in a scope about which it is possible to reason even without knowing about what `stuff` is. In some cases, this will get really lucky:

        eval("some code blah blah object." + field + " more things")

and you can imagine this being turned into object[field] anytime `field` in this expression is an identifier.

Basically, in this world, you'd be able to distill out the long-lived parts of an eval string, and the JIT(s) can focus on optimizing that.

<comment><USER9> What if stuff is `} //`?

Basically you are trying to say we want to discover some kind of semantic structure from just a prefix of the textual form of the code. We can do a partial parse and see what's possible right after the string literal; and if there's only one possibility, we JIT it. But without full code, we can't really do much JIT at all.

<comment><USER8> You just speculate that this doesn't happen, and bail if it does.

</comment></comment></comment><comment><USER10> Last winter I wrote BlockLike.js, an educational library that allows one to use Block programming concepts in JavaScript. This required supporting pacing and waiting while still allowing the user to write simple (and valid) JavaScript.

When I started I had this voice in my head whispering again and again "eval is evil, eval is evil". Then I just got over it...

I ended up with one-pass, event triggered, construct-and-run (essentially "eval") solution. The user writes simple code that is event triggered. The code is converted into a string, rewritten in realtime and "enhanced". An Asynchronous Function Constructor then converts it back to a function and it gets invoked by the triggering event.

It works great and though there is, obviously, a performance penalty for the realtime rewriting, it is never the limiting performance factor for implementations (multiple DOM element animation is).

Examples:

[https://www.blocklike.org/example/12-advanced/recursion_tree...](https://www.blocklike.org/example/12-advanced/recursion_tree.html)

[https://www.blocklike.org/example/12-advanced/color_bubbles_...](https://www.blocklike.org/example/12-advanced/color_bubbles_sprite_factory.html)

[https://www.blocklike.org/example/14-games/avoid.html](https://www.blocklike.org/example/14-games/avoid.html)

Repo:

[https://github.com/ronilan/BlockLike](https://github.com/ronilan/BlockLike)

</comment><comment><USER11> I suppose the biggest problem with `eval` is not getting uncontrolled user data into it.

A kind of filter shown in the matthewaveryusa's reply may be secure, but it's pretty limiting, and may happen to be too limiting for a particular purpose.

It would be great if the AST of the expression to be evaluated could be checked. That is, `eval` could be two pieces: "compile" and "execute" phases; this is how it works in Python.

Another tool could be a type system that marks user input as "tainted" and helps you track where you're using user input in any capacity. But languages featuring `eval` usually lack such a type system.

</comment><comment><USER12> I'm still holding off adding eval() to Snigl [0]. Not because of JIT clashes, since it is a straight interpreter; but because of the can of worms it opens. The thing is that I have to compile code in some kind of context, and depending on what the code says, it may or may not be safe to throw the compiled code away once done. Which means that I'd have to deal with a growing mountain of compiled code or complicate the design to support a feature that's mostly the wrong answer.

[https://gitlab.com/sifoo/snigl](https://gitlab.com/sifoo/snigl)

</comment><comment><USER13> This is tangential, but I think that the way that the way Lisp does eval with its macros is incredibly elegant. There was a post on HN a few weeks ago [1] about doing symbolic derivatives in Lisp via quotations and eval, and while that was probably old news to most of the HN audience, it was downright _magic_ to me, and the use of eval seemed appropriate.

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

</comment><comment><USER14> Just my personal experience, but I used eval way more often when I didn't really know what I was doing. As I've learned Javascript, I've realized that in the vast majority of cases it's simply not needed.

If you're an experienced programmer who understands the risks of eval and there's no other good options, then by all means use it, but for other cases "eval is evil".

<comment><USER15> Eval is a lot like goto in that way. In the vast majority of cases, there's a better way to do things -- but in a very, very small number of scenarios, it's the right tool for the job.

</comment></comment><comment><USER16> Can eval ever increase performance? I'm thinking that for some types of abstractions you can end up with highly nested, indirect calls, and if you can instead generate new code as needed, maybe it could speed things up? Are there any mainstream examples of this?

<comment><USER17> Python uses/used eval for namedtuple at least in part for performance.

<comment><USER18> Used. Raymond revised the implementation.

</comment></comment></comment><comment><USER19> A while back I used eval in a matrix multiplication routine, to make it accept matrices of arbitrary size and generate code to multiply them:

[https://github.com/rogual/mxd/blob/master/Matrix.js#L50](https://github.com/rogual/mxd/blob/master/Matrix.js#L50)

It benchmarked pretty well back when I wrote it, though I haven't checked against current JS engines to see if it's still a performance win.

</comment><comment><USER20> Eval has been evil since medireview times.

[https://revealingerrors.com/medireview](https://revealingerrors.com/medireview)

</comment><comment><USER21> The answer to the question (consistent with all headline questions) is "no."

The article even mentions JSON.parse which itself relied on eval.

Does JSON.parse still rely on eval under the hood?

Regardless... a wildly popular method used to propagate the most popular data format relied on eval. At least for a time. Nothing evil happened as a result.

</comment><comment><USER22> The thing is, it isn't just javascript eval; any eval is bad.

In another life I did PHP shells. PHP (which has a weird relationship with JIT) had so many ways to use eval, without actually typing eval. One of the weird ways that was only removed in PHP 7 was the preg_replace function, with the _e_ flag; which evals any php expression, outside the scope of the function.

My point is that if there is eval used in code; it either is meant for temporary use (because devs are lazy,) or the code needs to be done differently to support the desired outcome.

<comment><USER23> > any eval is bad

Saying eval is just confusing the concept with the implementation. There's no evidence that metaprogramming is "bad" unless you are ready to define "bad". Might as well say pointers are "bad" in the same vein.</comment></comment>


Decoding Popular Mobile Apps by Startups - <AUTHOR> http://canvasflip.com/flipd <comment><AUTHOR> How cool it would be if you could look at your favorite mobile app with developers' perspective and re-create a better version???

Go, checkout [http://canvasflip.com/flipd](http://canvasflip.com/flipd)</comment>


The Metric System in the United States - <AUTHOR> http://www.unc.edu/~rowlett/units/usmetric.html

<comment><USER2> The last highway sign indicating distance in both miles + kilometers that I know of was on northbound I-95, just north of the I-26 interchange. It was replaced with a new sign a couple of years ago that only shows distance in miles. The legacy of the 1970's fades...</comment>


Scorched Earth - if Google can't own the web then it must destroy it - <AUTHOR> http://notes.kateva.org/2013/05/scorched-earth-if-google-can-own-web.html

<comment><USER2> This article is vapid.

"It's almost as if Google wants to end the document-centric open web as we have known it."

Actually, if this happened, Google's $40B+ in revenue would approach zero.

On Reader: Every week there's a new Reader replacement that pops up. I think in a year or two, Google Reader being shutdown will be seen as a positive thing for RSS.

"Apple will switch its default search engine to Bing....The web is a forest, and Google is burning it."

Maybe Apple will do this. It's possible though very unlikely considering Google's ability to monetize search and Microsoft investors' disappointment at losses in the Live division, but that's still not a move that immediately destroys Google.

Again, this article is completely vapid.

<comment><AUTHOR> I haven't found a single Google Reader replacement so far.

Sure, there are many alternatives for a subset of Google Reader's feature set but there is not a single full alternative so far. Google Reader is - soon was – not only a web GUI to subscribe to and read RSS feeds, it was also a search engine, an API for apps and until recently a social network.

<comment><USER3> I'm not really familiar with the parts of Google Reader that weren't just viewing RSS feeds, but have you looked at NewsBlur? I believe it has an API for apps and it has some sort of social network.

<comment><AUTHOR> I have a paid NewsBlur subscription but rarely use it. There is an iOS app but it isn't comparable with Reeder and offline support in particular is missing. An API exist in theory but isn't used by other apps and services. The web GUI of Newsblur itself isn't performant and user-friendly IMHO, it reminds me of an old-style Windows GUI …

I'm going with Feedbin (<https://feedbin.me/>) and the iPhone version of Reeder (<http://reederapp.com/iphone/>) for the moment. Feedbin's web GUI is very simple but there's hope for progress. And the Reeder developer announced that he plans to add Feedbin support to the iPad and OS X versions of Reeder (<http://reederapp.com/reader/>). As a backend for syncing feeds with Reeder on the iPhone, Feedbin has been working well for me so far.

(BTW, Feedbin has no official trial but you can use it for three days without getting charged on your credit card.)

<comment><USER3> Have you tried the dev.newsblur.com interface? I'm really not fond of the normal interface but I like the dev one.

<comment><AUTHOR> Yeah, almost exclusively … it's not much better though since it's mostly a new skin while the philosophy behind the web GUI remains the same.

</comment></comment></comment></comment></comment></comment><comment><USER4> The flaw in this reasoning is that just because Google kills a product it doesn't kill the protocol underneath it. Killing off Blogger won't kill Tumblr, or Wordpress for that matter. It will make it possible to create value in that space again though since Google will have left.

Google cannot "kill" RSS, they can only kill Reader, and if people are so dependent on Reader then someone will make a Reader replacement that makes them enough money to keep it running. If nobody can do that, then the business model for Reader (and RSS for that matter) is in doubt.

</comment><comment><USER5> How does Google destroy the web by not supporting open protocols, any more than any other company does?

Sure, Google may be dropping XMPP support. Guess what: before Google, no major messaging system supported XMPP or federation! That didn't prevent the open web for existing.

All they're doing is reverting to the state before they created those services, back when they only had Search. It's disappointing, yes (though not surprising), but it's no more destroying the open web than not supporting it in the first place would be, like most companies did.

Just stop using their services if there are open alternatives, like I did with mail and RSS way before the death of Reader had been announced, and stop portraying Google as some Internet god. It's just a company, people.

<comment><USER6> "before Google, no major messaging system supported XMPP or federation!"

I think what we are seeing is the end of a poster child. Google has gone from being an engineers dream job to a self serving corporate entity.

XMPP could have been made to do what Hangouts is doing, but instead of improving the web as a whole they are just focused on their own platform and profit line. Which is something they are entitled to do, it just sad.

</comment></comment><comment><USER7> Well ... that implies a long-term strategy with the actor assuming it's a zero-sum game. The other possibility is that Google is simply following a completely economic strategy and that each of the decisions described would end up maximizing their return.

I think the real question is "why did we accept so many Beta services, knowing that there was no guarantee they'd be brought to market". If we'd only let them be a search company, would this even be a problem?

<comment><USER8> We rarely act in our own collective best interest. Rather individuals for a variety of reasons start using Beta services. Many of them end up burned as it shuts down, but far more move on to the next new thing.

</comment></comment><comment><USER9> Yet if Microsoft were in the same position doing the same things the chanting horde would be calling for their heads. Meanwhile Google can do no wrong. Google is in a position where they can greatly affect the usage and adoption of open standards. And increasingly they're subverting open standards. Is that evil? Draw your own conclusions but it was considered evil when Microsoft did it.

</comment><comment><USER10> Very interesting theory. Maybe that's why Microsoft is doing the same to desktop OS? Apple must act quickly to destroy the smartphones.

</comment><comment><USER11> > Apple will switch its default search engine to Bing

Speculation, or has there been some indication of this?

<comment><USER4> Given Apple's response to Maps, doesn't it seem as likely that they are building their own replacement?

<comment><USER12> I think that making a search engine is orders of magnitude complex than making a new maps backend.

<comment><USER4> Can you say a bit about _why_ you think that? Are we talking decimal orders of magnitude? binary?</comment></comment></comment></comment>


Student who wrote story about biased algorithm has results downgraded - <AUTHOR> https://www.theguardian.com/education/2020/aug/18/ashton-a-level-student-predicted-results-fiasco-in-prize-winning-story-jessica-johnson-ashton <comment><AUTHOR> Orwell Youth Prize 2019: A Band Apart

[https://www.orwellfoundation.com/the-orwell-youth- prize/2018...](https://www.orwellfoundation.com/the-orwell-youth- prize/2018-youth-prize/previous-winners-youth/2019-winners/a-band-apart- jessica-johnson/)</comment>