Hacker Newsnew | past | comments | ask | show | jobs | submit | more biznickman's commentslogin

Great job with a sensationalist unrealistic title. This isn't a scenario grounded in fact and it's written by a speculative software engineer. Not a medical professional or epidemiologist.


Sooo this post is flagged, but patio11's conspiratorial epic gets a long day of front page discussion. I'd prefer hn flagged any amateur covid19 policy discussion, it's just a bit embarrassing.


It seems that everyone has become an epidemiologist in the past two months, despite never having even heard of concepts like R0 or herd immunity before 2020.


I've been writing about this for years but it's insane to me that Twitter is not stopping this. They are contributing both to group psychosis and the destruction of democracy through the spread of disinformation.


Likely, they don't really care to stop it. Real people still use it enough that the advertisers don't really mind.

I'd suppose that they cannot really tell the difference between a bot and a real person, at least at scale.

I follow a few non-English speaking hashtags that act as local news sources for their areas. These hashtags have been active for a few years. Though Twitter has a lot of policies for English twitter, these languages really have no policies. By that I mean they live-stream executions, have drug sales, solicit sex-work, etc. Illegal isn't really a thing in these places to begin with. That said, these cases are somewhat rare and these hashtags are mostly used as genuine news sources. Granted, these are 'edge case' languages, but still, it's a free for all that Twitter doesn't care to dive into.

Based on the 'extreme' cases and their long lived incoherence to Twitter policy, it's not hard to conclude that Twitter really does not care to enforce policies unless forced to.


Geoff Goldberg has been analyzing and writing about this a lot[0], he is worth following on Medium, ironically Twitter suspending him from Twitter [1].

[0] https://medium.com/@geoffgolberg [1] https://medium.com/@geoffgolberg/your-twitter-account-has-be...


He was harassing users over his dubious research. Suspecting someone to be a "bot" doesn't justify demeaning and dehumanizing these people.


The point of these bots isn't to spread disinformation or to amplify political content (the article is wrong about this).

The point of these bots is to build up an account with credible behavior that you can use to make money (usually by scamming advertisers into buying paid tweets/followers, or by directly promoting scam products).

Political twitter is so formulaic and high volume that bot/sweatshop posts don't seem out of place compared to the usual traffic from real accounts.

If there were no politics on twitter they'd just send formulaic messages about pop culture or sports or something.


You make a bold claim, do you have any supporting evidence?


Wasn't this somewhat well documented during 2016 where most of it wasn't some coordinated attack from St. Petersburg but teens from south-eastern Europe making money from ads and therefore driving clickbait to its limit because they literally just wanted clicks?


>most of it wasn't some coordinated attack from St. Petersburg

This is completely false. A cursory search will yield results explaining Russia's massive effort on social media (and Twitter in particular) to interfere in the election.

https://blog.twitter.com/en_us/topics/company/2018/2016-elec...

https://blog.twitter.com/en_us/topics/company/2017/Update-Ru...

https://www.theguardian.com/technology/2018/jan/19/twitter-a...

etc....


Not sure if "completely false" is appropriate. There was some Russian activity. The scale of which appears somewhat underwhelming:

> Through our supplemental analysis, we have identified 13,512 additional accounts, for a total of 50,258 automated accounts that we identified as Russian-linked and Tweeting election-related content during the election period, representing approximately two one-hundredths of a percent (0.016%) of the total accounts on Twitter at the time.

If that small of an effort can make that much of an impact on the core democratic process, then we need to consider a significant scale back of XXI century globalism to allow for second half of XX century democracy to survive. Not a popular opinion on a tech forum, where more users means more money, and there are always significantly more users outside one's national boundaries. Sigh.


>Through our supplemental analysis, we have identified 13,512 additional accounts, for a total of 50,258 automated accounts that we identified as Russian-linked and Tweeting election-related content during the election period, representing approximately two one-hundredths of a percent (0.016%) of the total accounts on Twitter at the time.

The comparison of "50,258 automated accounts that we identified as Russian-linked and Tweeting election-related content" to "the total accounts on Twitter at the time" makes no sense at all. It seems intended to mislead.

It would be more informative to know how many total accounts tweeted about the election, or how many politically active twitter accounts that bot army reached.

And in general, the election was decided by ~80,000 people [1]. To think that ~50,000 bots spamming Twitter with non-stop propaganda had no impact on that is extremely naive (especially when you consider that Twitter was just one piece in the overall interference).

[1] https://www.washingtonpost.com/news/the-fix/wp/2016/12/01/do...


Using a very rough ballpark estimate, it costs $1 / month to run a twitter bot using readily available technology, see, for example, https://jarvee.com/get-now pricing list. To think that for $50k / month anyone in the world can have a [significant?] impact on US elections is bizarre.

In practice, there is a negligible probability that posting a tweet from a random bot will end up in the feeds for a target demographic. The feed space of the 80k people WP claims decide the election is finite, and it costs significantly more money to reach them than setting up small scale botnets. Ultimately, Twitter is in control of the feeds, and it's their business model to happily direct any message from the highest bidder to the critical demographic, regardless of who or where the highest bidder is.


Most of those 80K voters weren't active Twitter users so your analysis is invalid.


In comparison, Mike Bloomberg totally failed to take over a US presidential primary, and he spent almost half a billion dollars.


That article says 50,000 accounts were "linked to Russia". Do you know who linked them to Russia and by what criteria? They weren't actually controlled by the Russian government because the article cites that figure at only 3,000.

The hysteria over Russia as an excuse to ignore the concerns of Americans who support populist positions is pretty transparent at this point.


>The hysteria over Russia as an excuse to ignore the concerns of Americans who support populist positions is pretty transparent at this point.

You're calling it "hysteria" to dismiss facts you don't like. "The Russian Hoax!", where have I heard that before?

But, to your second point, I completely agree that many on the left want to pretend it was _mostly_ because of foreign interference. I tend to think that had a pretty small impact, and the fact you pointed out is probably much more consequential: Americans are more receptive to a populist message than people think.


I 'like' it so much (not really) when people from the USA say/write "left" when they have absolutely no idea what left/communism is, apart from what they HEAR. I don't think that more than 1mil people in the USA have lived in the USSR block or the countries of their influence, or have studied communism thoroughly.

And you can recognize the trolls when one says/writes "Left" in the most capitalistic country on this planet. And by "Left" they mean the very minimal/basic social services, such as don't let people lose two legs but only one because the $1k insurance per month doesn't cover that. I wonder how failed is the USA when countries in EU have achieved that with $100 contributions per month. Miracle!!!

Americans live with the dream that they are all billionaire but somebody is blocking them (the commies, the socialists, the left, the Cubans, the anarchists, and in general "they" some without ID).

Russia always plays the looooong game, they try and succeed to sabotage a little bit every step of the way (antivaxers, interference with elections, oil price), you name it, they are in it.

I think I vented/ranted enough. I sometimes feel sorry for the 30-40% of USA citizens, they are confused and haven't read more than 10 books in their lives.. it's a potty for such a prosperous coubtry to suffer like this.


>And by "Left" they mean the very minimal/basic social services, such as don't let people lose two legs but only one because the $1k insurance per month doesn't cover that. I wonder how failed is the USA when countries in EU have achieved that with $100 contributions per month. Miracle!!!

This isn't really true. You're going to get medical help with an urgent medical issue in any developed country, even if you don't have a penny to your name. Doctors/hospitals cannot turn you away for not having money.

There are also very few countries in the EU where insurance payments are $100. The only country I could think of would be Bulgaria and that's because they're the poorest EU country. Virtually everywhere else you're going to pay more than that and everybody has to pay it, including the poor. Depending on the country, if you don't pay that then you won't get medical care (other than the urgent kind) in those countries either.

The US has a lousy health insurance system. The cost is too high, insurance paperwork is ridiculous, and insurance doesn't always even cover you. But healthcare really isn't as amazing in most EU countries as you want to think. Many of them have similar problems.


In the EU, free (at point of use) healthcare is available to all residents, including the unemployed. In several countries, you can get free treatment immediately even if you are not a resident.

That's a lot different from the USA, where tens of thousands of people die from lack of health insurance, and probably hundreds of thousands are bankrupted by the healthcare they get.

A quarter or more Americans put off seeking medical treatment because of the cost. By the time they seek treatment, it may be too late. I'm reminded of a carpenter who won $1 million and said he could finally go to see a doctor. He died a few weeks later from cancer.

A lot of Americans are one accident or illness away from financial ruin and poverty.

For all their problems, Europeans are a lot better off than this.

More than 26 000 Americans die each year because of lack of health insurance https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2323087/

New study finds 45,000 deaths annually linked to lack of health coverage https://news.harvard.edu/gazette/story/2009/09/new-study-fin...

The Americans dying because they can't afford medical care https://www.theguardian.com/us-news/2020/jan/07/americans-he...

More Americans Delaying Medical Treatment Due to Cost https://news.gallup.com/poll/269138/americans-delaying-medic...

Medical Bankruptcy: Still Common Despite the Affordable Care Act https://ajph.aphapublications.org/doi/10.2105/AJPH.2018.3049...

Medical Bankruptcy Is Killing The American Middle Class https://www.nasdaq.com/articles/medical-bankruptcy-killing-a...

New York carpenter who won $1 million lottery prize dies of stage-4 cancer weeks later https://eu.usatoday.com/story/news/nation/2018/02/02/lottery...

N.Y. man dies from cancer 3 weeks after winning $1M lottery https://www.cbc.ca/radio/asithappens/as-it-happens-thursday-...


Did you reply to the wrong comment?


I purposely left spaces between the different "sections" of my semi-long post, just to separate the items/topics. The post I was replying was too 'thick' (imho) and I was just disentangling that spaghetti. (Russia, Left, caring for the fellow human/social reforms, illiteracy).


Not to be too pedantic, and correct me if I'm wrong, but I think "The Russian Hoax" more specifically refers to the beliefs/claims by some that Trump or his campaign was colluding with Russia directly to interfere with the election rather than simply the belief/claim/fact that Russia (or Russians) interfered in the election of their own volition.


They have conflicting incentives, it's the same problem all social networks have. Bot accounts qualitatively detract from the real user experience, but substantially inflate quantitative activity metrics, if artificially.

Policing bot accounts improves the quality of the site, but hands Elliot Management and others more ammunition that social isn't growing to expectations. Unfortunately these sites continue to pick to optimize the latter rather than the former.


> but hands Elliot Management and others more ammunition that social isn't growing to expectations.

If the growth is largely from bots, then perhaps Elliot Management is right even if you disagree with the business dealings.


There's a good argument to be made that Elliot Management is right simply based on absence of stock growth over the past few years. Facebook has grown 200% while Twitter has had incredibly modest gains. That much of Twitter's little growth might be bot-related just compounds the validity of their argument.

Twitter can't even fall back on being a public good, as it is has supposedly been a large vector for foreign political interference, and they haven't taken nearly the drastic manual moderation steps that Facebook has to combat this (hiring 15k manual content reviewers [1]). Facebook received huge pushback from investors over this decision, but it looks pretty savvy in retrospect.

[1] https://www.theverge.com/2019/2/25/18229714/cognizant-facebo...


it might be awesome, if the signature is somewhat obvious, to have an independent entity flagging / creating a suspected bots database?

_maybe_ that would put some pressure on Twitter?

    https://osome.iuni.iu.edu/tools/botslayer
    https://duo.com/assets/pdf/Duo-Labs-Dont-At-Me-Twitter-Bots.pdf 
    https://sparktoro.com/tools/sparkscore


But they're making money from it. And that's all they (and their shareholders) care about. Same reason FakeBook won't ban false political advertising on their platform even though it's really obvious it's destructive to society.


And how exactly do you propose to stop this on scale? The problem is harder than it looks.


I wouldn't begin to claim I have a solution, but I think there's steps Twitter can take to show they are acting in good faith. I believe often times, Twitter flags accounts for suspicious activity - for accounts to be reactivated, a phone number has to be provided. If Twitter wanted to, are they not capable of deploying an algorithm that serves as a dragnet to catch accounts that tick off multiple check-boxes for bot activity and flag them? This would not mean that the account would immediately be banned or shadow-banned, but they could provide some kind of visual indicator to other users that the account in question has recently been flagged for bot-like activity (on the account's comments, retweets, etc.).


There are many real humans who have no phone number.


Or would never give it to Twitter.


Because number of users is a nice pr metric. Just pretend the 15% which are bots are real, and pretend the 15% of suspended and abandoned accounts are active.


I understand your frustration and share it, but I personally believe that we are at the point where this behavior (i.e., failure to act) should be expected of tech companies. The economic incentives of the companies who run the most popular social networks seem to be negatively aligned against robust responses to the propagation of bots and disinformation, and that doesn't appear likely to change.

I also wonder whether the mitigation strategy for this type of societal threat is not to be found via strictly technological means anyway since the line between bot and human actor appears to be blurring more and more as time passes and technology improves (artificial face generation, improved NLP, statistically-informed posting and behavioral modeling, etc.). Imagine how complicated the process of discriminating between automated and human-controlled accounts might become in ten or twenty years from now; it seems as though there will have to be some sort of public education component to reduce the credulity of human users in online environments - an adjustment of weights in the network of information sources among the general population, if you will, in a direction that de-emphasizes online content.


> I've been writing about this for years but it's insane to me that Twitter is not stopping this.

If it doesn't impact shareholders' profits, it goes to the bottom of the to-do list.


How else will the populist cults survive?! /s


Gotta keep those MAU counts up!


[flagged]


Do you believe the same thing about email spam detection? Various authorities decide on the validity of email and webspam.


If people pick companies to do filtering for them, it is their choice. GMail is causing some problems. In general, most people opt to have suspicious mail sorted into a Spam folder, not deleted completely.


Available evidence doesn't support your claims.


[flagged]


It's a big topic and I am reluctant to invest a great deal of time trying to persuade a new arrival. Try following the links in this article for an overview of recent research.

https://www.scientificamerican.com/article/how-twitter-bots-...


[flagged]



I've been on HN for 13 years, I just don't care for the voting system.


LOL "Before 2019, it felt like the Facebook communications machine was a well-oiled, unstoppable juggernaut." Umm how about Cambridge Analytica?

Facebook's PR has been troubled for a very long time. To suggest that they has a stellar image before 2019 is a joke. I can list many other slip ups where Facebook could have come out and said something (or even better, did something) and then weeks later they come up with a weak statement. If that's great PR, I'd like to offer my services to anybody who needs it.

While I'd agree that "No one ever broke rank. The messaging was crystal clear.", the message was always an awful one and now they have a relatively negative reputation despite being a remarkable success.


Cambridge Analytica is one of FB’s most known debacles but how did the PR team specifically fail?


How about by using "We can do better" over and over after every single gaffe that it's become a joke to people outside the SV bubble?


FB stock hit a low at ~$157 right before Zuckerberg's April 10, 2018 testimony to Congress, and bounced back into a steady increase, hitting a then-all-time high in late July before going into a dive after the earnings report. The July 2018 dive was attributed to missing revenue expectations, but AFAIK, the general opinion [0] was that when it came to public fallout specifically related to Cambridge Analytica, FB weathered it quite well – hence the stock's steady climb from Zuckerberg's testimony until the July earnings report.

That confidence in the stock is obviously not just from good PR, but I don't see the evidence that the PR folks fucked things up either, given how much potential damage the CA scandal was predicted to cause.

[0] https://www.marketwatch.com/story/facebook-stock-crushed-aft...


If one of the goals of a PR department is to prevent debacles like CA from negatively impacting shareholder value, I'd say they were massively successful.


Facebook’s Cambridge Analytica PR was very successful, evidenced by the fact that you have people in this very thread arguing that the blame for the debacle overwhelmingly lies with Cambridge Analytica because they broke the TOS and then lied about having deleted the data, and that the media completely misrepresented the whole thing because it’s biased.


When I lived in San Francisco, the newly built condo building across from me was fully empty (but fully sold) for all the years I lived there. This is a tower in SOMA. There was only one apartment which appeared to be a corporate one that was occasionally utilized.

The rise of foreign money parking money in real estate has screwed things up on a global level. San Francisco has felt the brunt of this due to their insanely restrictive development laws.

Frankly, for the 7+ years I was in San Francisco I was always saying they should pass laws to prevent foreign investment in real estate or at a minimum require people live there for X% of the year.


I used to be instinctively against stuff like this, but I actually think it’s pretty reasonable now. People outside of a given city/country/etc. have no inherent right to participate in that place. Local residents should only allow outsiders to participate if they derive some benefit from it. Now, that said, there may be unintended consequences to eliminating foreign purchases of real estate.


Vancouver, BC passed something like this a few years ago - it’s a 20% tax on all non-resident home purchases. It has actually stopped house prices from rising so fast, but there are still a bunch of empty homes.


Sounds like the tax is too low then. If the vacancy tax is high enough, landlords will have no problems finding a tenant. This is vancouver and sf we are talking about, snap your fingers and you will find a tenant if the price is right. Too many greedy people.


Just tax the vacant homes at high rates and use that money to build even more housing. Win/win for the city.


tough to do when the councilman has two or three piece of property too


I call bullshit. Say what tower it was, and when it was built, and what time frame you are actually talking about so we can verify for ourselves whether it was actually empty or not, or even if it was empty whether it was empty for a good reason (e.g. not having it's habitability permit). Otherwise this is the worst kind of anecdata - not even enough detail to verify that the anecdote is true, nevermind whether it is actually a representative sample of a larger issue or just an odd case.


I'm all for backing up claims, but drive through Pac Heights and Cow Hollow at night - you won't see many lights on in those mansions. Drive by during the day and all you see is construction workers and gardeners tending to the properties there. It's pretty obvious people don't live there more than a couple months a year. These are the ultra rich with property in the most expensive cities all over the world.


> I'm all for backing up claims, but [...] you won't see many lights on in those mansions.

I'm with you 100%. I lived in SF from 1998-2006, then again for a few years in the 2010's, and when rental prices are high landlords seem to prefer holding out rather than lowering their rates. I assume this is to avoid locking a potentially valuable rental unit into a low, rent-controlled lease. (On a side note, this is why many economists believe rent control is bad overall for rental markets: http://freakonomics.com/podcast/rent-control/)


Mansions in Pacific Heights and condos in SOMA are very different. If mansions in Pacific Heights are indeed vacant (which, to be clear, I doubt they are) that would suggest that a better use of the space would be to split them up into new, more affordable, units.


If they live there a couple of months a year it's a vacation home, not a vacant home.


Cannot speak for SF, but that was definitely the case with highrises in downtown Vancouver. Saw quite a few of those next to the waterfront that had 90% of the apartments (visible from the ground) completely empty or even have the plastic cover on the windows on the inside, with very few (i could count less than 5 of those out of about 30 being visible enough to judge) having anything on the inside.


A few starter ideas:

(1) Repealing prop-13 is probably a non-starter but we could probably get away with repealing it for non-owner-occupied homes. Prop-13 was meant to prevent people from being driven from their homes by property tax increases, not to protect speculators from being taxed.

(2) Levy a substantial additional property tax on residential properties that are not currently occupied by either the owner or a renter (for more than e.g. 6 months). These should at the very least be on the rental market.

(3) Subject all real estate purchases and investments to KYC/AML and other rules. AFAIK one of the things driving this loony real estate speculation is that RE has become a preferred vehicle for money laundering after KYC/AML made other financial investments less attractive for that.

(4) Tax foreign (non-US-citizen) purchases of residential real estate. Yes they'd set up shells and recruit locals to be proxy buyers, but at least this would give them more hoops to jump through and would probably reduce the extent of the problem.


> (1) Repealing prop-13 is probably a non-starter but we could probably get away with repealing it for non-residents. Prop-13 was meant to prevent people from being driven from their homes by property tax increases, not to protect speculators from being taxed.

I have never lived in California, and Prop 13 passed before I was born anyway, so I don't know much about the political backstory. That said, if this was the purpose that got it passed, why is the exemption so broad? How does capping Safeway's property taxes keep people from being driven out of their homes?


The corporate protections are unintended consequences of the original proposition. They really weren't on people's radar. (This is why California residents should almost always vote against propositions, even if the idea and goals are good: Fixing the unintended consequences is extremely difficult. It would be better to find other ways to implement the idea.

But getting anyone to fix proposition 13--even in this very limited instance of not protecting corporations anymore--brings out all the apocalyptic messaging (from basically everyone, but especially the corporations) that the old folks who bought in 1970 and have lived their whole lives there will be out on the street when their property taxes go up 10x.

There is no nuance in these messaging battles. And quite frankly, what property owner wants to take any kind of risk with this?


If they went up 10x that means they are out on the street with north of 500k in their pocket. Should be plenty to pay rent at the senior center for the next dozen or two years.


> (4) Tax foreign (non-US-citizen) purchases of residential real estate

So permanent residents and visa holders cannot buy property and are instead forced to rent? What a terrible idea.


Make it a year, not six months. The problem is investors, not vacation homes or snowbird homes.


We should really just repeal prop 13 for commercial and non-primary home real-estate.

edit: forgot to add non-primary home.


Repeal it for everything except owner-occupied residences. That's the way homestead works in Florida.


Repeal it for everything.

Just do what Texas does and allow deferred property tax payments for when the owner dies or sells.

Why should we be giving tax breaks to people who have seen incredible appreciation of their homes. Those are the last people who should be getting tax breaks.


This. The original stated intent of Prop 13 was people not being able to afford to stay in their homes due to rising property taxes. OK fine, but when you sell your house for $2 million, you most definitely can afford it, and you should pay up, with interest.


Texas also has a value increase cap for owner-occupied residences, though not as generous (10% per assessment, since the state uses three-year assessment periods).

> Why should we be giving tax breaks to people who have seen incredible appreciation of their homes. Those are the last people who should be getting tax breaks.

It's about not forcing people to move because he area they live in appreciates suddenly. Basically, the same argument as rent control. That an owner gets to cash out some value is cold comfort when their life is uprooted against their will.


It’s a common method in Canada as well.

The end result is, if the owner chooses, they can continue paying the same property rate until they die or sell. The govt eventually collects the full tax from the equity of the house (or estate).

You solve the issue of people being forced from their homes while at the same time being more equitable in terms of tax burden.


This is what I've been saying for years. I didn't know anyone had implemented it.....looks like they have an 8% interest rate, that's crazy high for the situation.


There's a product called a reverse mortgage that accomplishes the same thing. Having the government offer this instead of foreclosure nullifies the "I lost my house because of high property taxes" argument, but there's no need for the interest rate to be especially competitive. If you can get a better deal on the private market, go get it.


Maybe your parents didn’t teach you empathy when you were growing up, as is so prevalent these days. There are millions of retired people on fixed incomes who bought their homes when they were normally priced. For example, my grandparents bought a house in Los Gatos for $30k in 1969 and now it’s priced at $1.4M. Is that their fault? Why should elderly people, who cannot take the stress of being uprooted and moving, be forced to sell their homes and lose their balance sheet savings in the process? If anything, discounts on capital gains and property taxes should be based on both income and balance sheet apart from real estate ownership. What if that were you?


Who said anything about uprooting?

In your grandparents case, they could freeze their property taxes, but when the houses switches ownership, they’d need to pay all the back taxes they avoided with the cap.

Why shouldn’t your grandparents have to pay current property taxes? They just had a windfall increase in property value.


If that were me I'd be smiling ear to ear paying 30k taxes on 1.4 million dollars. That's like the deal of a life time. You can't even find a 30k home in cleveland.


Fuck at the very least yes. This is the most ignorant law I have ever seen. It blows my mind everytime to think that it not only applies to non-owner-occupied but also businesses.


My preferred policy would be to repeal Prop 13 entirely and end the mortgage interest deduction. Couple that with a statewide ban on rent control, zoning reform, and greatly increased spending on affordable housing, and we'd be in a much better place.

Of course, none of that is going to happen anytime soon…


Wait till you see what Props 50 and 68 do.

Prop 50: pass your current tax rate on to your children.

Prop 68: pass your current tax rate on to your grandchildren.


wilshire country club in LA is probably taxed like its 1880 and covered in cattle shit again.


There are houses throughout the Bay Area sitting empty, just being used as a relatively safe store of value. That goal is already achieved without having to deal with the overhead of managing the property and tenants.

So the homes just sit... empty.


Seems strange. Surely a management company would happily handle all that hassle and provide a secondary income stream. Sign a couple forms and boost investment income by a few percent?

Surely that's not significantly more burdensome than the bureaucratic hassle of purchasing the property in the first place.

I guess there's some significant tax/regulatory difference between capital gains from holding property vs. an income stream from renting said property.


AFAIK, if you CAN rent a property for $X and it remains empty, you can take it as a loss. $X tracks inflation/value, which was a huge problem when I lived in Pittsburgh. Places that were empty for 40 years had ludicrously high rents (4X+ new places), so they just remained empty as tax write offs.


There's large downside risk to renting out property. One bad tenant trashing the place can cancel out years of rent.

And in the Bay Area people invest more for appreciation than rent. The rent/price ratio is much higher elsewhere.


Landlords have insurance too. Plenty of people still rent. If a landlord is struggling to fill their apartment in sf, maybe they should try not asking 3000 a month. The demand is very much there.


> Seems strange. Surely a management company would happily handle all that hassle and provide a secondary income stream.

unfortunately management companies require managing themselves. even if you find a good one, they won't necessarily stay good, so you're firing them, getting new ones, etc.

and i've never heard of one that will let you hand them a property, and then eat all of the risk for you and provide a simple de-risked income stream. even if they'll do a good job of handling 100% of maintenance tasks, they're still going to send you the bills.


Sounds like a new business plan for a new market.


nothing about property management or property management in SF is "new".

anybody who can afford to de-risk a real estate income stream can afford to just buy real estate themselves, they don't need yours. there's no market here.


SF has a lot more burdensome tenant protection laws than most places. Sometimes you can't kick out a tenant even if you want to move back in. That's why landlords sometimes pay tens of thousands of dollars to their tenants to get them agree to leave if they have a rent controlled unit. Even if the tenant stopped paying rent or broke some other part of the lease, an eviction can take over a year - and you're not getting paid for that time and you don't get to use your house.


Surely a management company would happily handle all that hassle and provide a secondary income stream.

Sounds like an opportunity here! The Chinese market for "stores of value" is quite high! There are tons of largely empty high-rise condos in China for this very reason. What about a company that has the connections and know-how to smooth over the transactions, then puts management into place to get AirBNB/rental income?


Renting a home devalues it through normal wear and tear. We see this during housing price drops in our local housing market (Montana) as well. The investors would rather a house sit empty than rent it or sell it at a lower price.


Counterpoint: I live in a newly-built condo building near Mission Bay and I don't know of any vacant units in the building. My neighbors very much exist.

These debates always turn into anecdotes that cover up the real reasons why people oppose or support housing—a preference for the suburban or urban lifestyle respectively. People who argue that newly-built condo buildings are mostly vacant always happen to prefer the suburban lifestyle; people who argue that newly-built condo buildings provide much-needed housing always happen to prefer the urban lifestyle (including me). It's all a facade.

The actual vacancy rate in San Francisco, as we expect, is relatively low for US cities.


Some countries in Asia have restrictions regarding ownership by non-citizens. If you’re not a citizen it basically has to belong to a local —could be a spouse.

On the other hand that can be detrimental to the economy depending on how something like that is implemented.


Why should different rules apply to foreigners in this context? An American billionaire buying a few condos and keeping them empty has the exact same effect as a Chinese billionaire doing so.

Rules around vacant homes are good, though, and I strongly support them.


> An American billionaire buying a few condos and keeping them empty has the exact same effect as a Chinese billionaire doing so.

There are more nuances to this. Chinese millionaires and billionaires don't care about the sales price. They do it to diversify their portfolio to avoid CCP. Some of them did this to launder the dirty money as well.

Their numbers might be small but the chilling effect of outbidding everybody else outrageously will incentivized realtors to spread the "good news" to their customers/clients that "hey... that unit over there is sold $ x million dollars, would you be interested to sell yours as well?"

Suddenly before you know it, the market is f*cked.


At least an American billionaire pays some American taxes. If a foreign speculator makes a lot of money they aren't even paying any income or capital gains taxes here.


An vacancy tax deals with both domestic and foreign buyers keeping homes unoccupied. Here is the link to the city of Vancouver’s Empty Home Tax: https://vancouver.ca/home-property-development/empty-homes-t... .


They are still paying plenty in property tax. From the city's perspective, you couldn't ask for a better resident. Somebody who pays full property tax and consumes almost no services (schools, police, etc).


Why is the city's perspective purely financial? Shouldn't it be driven by the needs of the residents? City residents need housing and the the local business need inhabitants. If you extend your "city" to the limit it would just be a giant physical investment with buildings no one lives in. The city, basically just an investment company would have a lot of money from the taxes and providing minimal services but until that happens the actual residents should drive the policies, in my opinion.


They often pay very little property tax, thanks to California prop 13. Long-time property owners are incentivized to just ride the real estate boom with a vacant building that costs them nothing. The city gets almost no tax revenue, and the neighborhood is crippled in its development.

As a bonus those property owners are politically active and fight zoning reform and development/transit projects to protect aforementioned real estate boom.


They do consume one thing: housing stock that would otherwise be available to residents. Whether or not that outweighs the benefits of paying taxes but not consuming city services is a different issue.


The roads, pipes, cables, buses, firefighters, and cops have to go past the empty house to reach the occupied houses on the other side of it.

Even if the empty home consumes no water, electricity, classroom capacity, bus seats, etc., it still consumes police and fire protection services. Someone else's empty home can be used for crime without worrying about civil forfeitures.

A better resident lives in their home, and cares about what is happening in its neighborhood.


They drive artificial demands which increases the overall price.

At the end of the day, it's not good for the local residents.

It's not as simple as "they're not here thus they're not consuming any services". The resulting effect of sky-high property cost ripples to everything else below it (jobs, transportation, etc).


But they also don’t participate in the local economy and can just blindly vote against anything that impacts their bottom line (e.g. tax increases) rather than having to interact with and see the impact on people who actually live and work there whose lives are impacted by local and regional politics.


> if a foreign speculator makes a lot of money they aren't even paying any income or capital gains taxes here.

False, even if you're not US resident, you still have to file non-resident tax returns and pay taxes on all US sourced income.

https://www.irs.gov/individuals/international-taxpayers/nonr...

> A nonresident alien (NRA) usually is subject to U.S. income tax only on U.S. source income.


American billionaires dont pay much taxes either.

The solution to this is to fix the tax code, not retreat further into nationalism.


[flagged]


"God forbid we feel any natural affinity towards our fellow countrymen"

Such an affinity is not "natural" because no one is born with any sort of innate ability to distinguish among nationalities, much less feel any affinity towards certain nationalities.

Any such distinctions and feelings are taught through indoctrination such as nationalistic rituals, media, and the attitudes of those around you.

A nationality is a legal fiction which changes absolutely nothing about who a person really is or what they do.

Nationalism and group affiliation have been the causes of some of the worst atrocities in history, so we should be very wary of encouraging either.

Regardless of their nationality, I personally feel much more affinity with someone who is helping others over one who is hurting others.


I say national but I mean local as opposed to global. My town is more important than my county which is more important than my state, etc. my philosophy also extends to animals and plants, meaning it’s not a human-centric view but biocentric. It’s doesn’t seem natural to care less about local Bird/insect populations and local ecosystems as much as human poverty on the other side of the planet.


There is a good and perfectly natural reason to favor people from our own country: they have to live under the same system as us. They have skin in the game on our team. Someone acting in our country but operating out of a different one can exploit the difference in rules to our detriment (e.g. a Chinese company competing in Western markets, but with the finger of state backing pushing on the scales). On a large enough scale it's a threat to democracy etc. if our group decides that groups no longer matter, and another group doesn't.

You can iteratively, conservatively try to approach an equilibrium where borders and divisions no longer matter and all of humanity joins together in enlightenment. That seems to be the general direction we're going and it's a good thing. What you can't do is unilaterally make a cooperative system out of a competitive one. If you go all at once by yourself you just get killed.

Nationality is a big (and in some cases literal) Chesterton's Fence. It is somewhat arbitrary, but that doesn't make it meaningless.


correct! I believe that the only groups it is moral to care about are:

* people you love, care about, or otherwise know socially

* groups that are oppressed along some axis

* all of humanity


[flagged]


> I care more about the dying bird populations in my forest than “humanity” on the other side of the planet.

Yeah, that's gross.


The cynic in me would correct you that neither pays much taxes.


[flagged]


it does make a difference to locals.

the homes are sold for profit, which does leave the country. but more importantly, there is a housing shortage. plus, the costs are kept high.


Because I am a committed internationalist and believe that national borders are the greatest moral atrocity that exists today.


> national borders are the greatest moral atrocity that exists today

I think this a fairly superficial claim. I agree that there are reasons to question the moral basis of national borders (why should someone be given additional rights based on where they were born?) but there are immense practical benefits that arise from having national borders. From a utilitarian perspective, these practical benefits likely outweigh the costs.

In the case of placing additional taxes and restrictions on foreign investment in real estate - yes, this may restrict the freedom of foreigners, but the overall benefit of these laws could be sufficient moral justification.


Kim Jon-Un will downvote you.


Everyone gets to feel good if they can blame "the wealthy foreigners" rather than look at their own crappy housing policies, such as the rampant NIMBYism and huge market distortion from Prop 13.

Faceless "wealthy foreigners" are easier to dislike than their own neighbors who show up at planning commission meetings to rant about someone adding an extra bedroom to their home (this is an actual thing I read about in San Francisco).


Where I live "wealthy homeowners" are the NIMBYs. They suddenly appear out of nowhere to argue in city council meetings against more housing, then leave their homes empty more than half the year (or all year). That most of them are also foreign is incidental: it'd be just as bad if it were Americans doing this.


Foreigners cannot vote, so it seems odd that the city council would pay that much attention to them.

My point is that there's a small but persistent current of thought regarding the housing crisis that wants to pin the blame on "wealthy foreigners buying up all our real estate", as sort of an 'out' for taking a good, hard look at local housing policies.


> The rise of foreign money parking money in real estate has screwed things up on a global level.

If the property tax is paid and the maintenance is kept up what is the problem created solely by the fact some homes are empty? The only reason these properties have such high values is because there is a demand that is not being supplied. Supplying more housing makes this a non-issue.

> San Francisco has felt the brunt of this due to their insanely restrictive development laws.

This is the real issue. Governments restrict housing supply for whatever misguided reasons and prices go up, those prices make it a good place to park cash. Government should stop picking winners and losers.


The fact that there are so many empty homes should be a bright, shining clue that basic supply vs. demand isn't the only factor at work.


Correlation doesn't equal causation. How would parking money in a depreciating asset benefit a foreign investor? They clearly aren't cashflow positive, so some other outside influence is causing this and it is limited to a few specific cities, so it has to be some localized effect.

Some look at the situation, question what's different about SF that might be causing this, and point to the highly restrictive development laws the city has. These prevent new comers from entering the market leaving only those who are primarily playing the long game and looking to build wide moats. If investors who required a much shorter return could compete, it's assumed the situation would normalize

If this isn't the case, then what is the underlying issue? Simply attacking wealthy people for doing something that is a) completely legal and b) obviously providing them some sort of benefit doesn't solve the underlying problem. To look at it another way, SF has clearly been trying to "solve" this problem through increased regulation for many decades now. Where are the success stories we can point to that show the direct approach is working?


When it's pretty much not legally possible to increase supply, runaway demand explains the problem pretty well.


38000 empty homes is problematic in a city the size of SF with population size 900k. This isn’t just a problem of supply shortage (regardless of the reason for the shortage).


> This is the real issue. Governments restrict housing supply for whatever misguided reasons and prices go up, those prices make it a good place to park cash. Government should stop picking winners and losers.

Restriction of housing is not limited to Government, housing developers also do it:

"[Kate] Barker reached a similar conclusion in her interim report, where she noted that in order to maximize their profits, developers control the rate of production and ‘trickle out’ no more than 100–200 houses a year from a large development. ‘This may not be desirable from society’s point of view,’ she wrote." (from https://www.annaminton.com/bigcapital)

Personally, I trust the reasons that a Government would limit housing more than I would a for-profit company who are probably operating in the interests of investors who don't live in the affected areas.

Even more than Big Government control though, I would prefer the people that live in an area to have the biggest say into how things are run.


Corporations who collude with or otherwise use government/laws to manipulate markets in their favor are even worse in IMO.

The fact still remains though that the housing developers wouldn't be able to trickle out homes at their whim if the government enforced limits on housing weren't preventing other developers from competing.


You can't satisfy demand for speculative assets. China tried to do it by building entire cities, and still failed.


Because they are a contraction on the housing supply in a city with too many jobs and not enough homes. It's an ouroboros; by taking more supply out of existence, prices go up, and the play becomes even more profitable.


If there are homes that are vacant and people that are living on the streets at the same time, that's an inherently unjust situation I think.


If an injustice is one symptom of a deeper problem, is it a good idea to focus on treating the symptom? That approach helps minimize the visibility of the problem while diverting energy (public attention, political capital, financial resources) that could be used in solving the root issue.


The next financial crisis will take them all like a tsunami. I really wouldn't want to be in their shoes.


If they wait it out 5 years they'd probably be back in the black.


There is an easy solution preventing empty homes in markets with a high rate of vacant homes combined with a high rate of involuntary homeless: a tax of 40% of the value as recorded at deed transfer per year of emptiness. Exceptions only given in case of reasonable vacancy (e.g. due to construction works or damages).

If the property ends up vacant for 2 years, government appoints random renters - for a maximum rent no higher than the rate the lowest 10% city-wide is. No possibility of eviction for ten years, except for willful/grossly negligent damage to property or unfit conduct (e.g. disturbing the peace, running drug dens or harassment of other renters). If an owner intentionally does not repair damages to claim the tax exception, government is authorized to do the repairs themselves and recoup costs from the owner.

That should be proper incentive for developers to build housing that is actually wanted and for speculation owners to rent out homes and to keep them intact/rentable.

Edit: for the downvoters, please explain why. This is a system that is the law in Berlin, only with a drastically higher tax rate and lower minimum rent.


You would have fared much better if you led with the fact that a similar system is already in place in Berlin.

The comment reads as an extreme solution that no one would ever implement. The fact that it is already implemented somewhere gives it a lot more credibility.


I think this is the kernel of a great idea. Empty homes in urban areas especially ought to be relatively rare and we need to have ways to incentivize utilization--with both carrot and stick.


I think the main idea is what's known as a vacancy tax. If people want to park their money in SF property but not use it, that's fine, they'll just have to pay more.


Some questions:

Was this system intended for the homeless?

Were there many vacants before?

How has the offer responded to such measures?

How difficult is to evict a grossly negligent or misbehaved tenant?


I was thinking about this exact subject matter the other day. We invest so much time in our digital content but what happens with death? How long can we really expect our content to last?

Ultimately we are all dependent on the functionality of the internet and making a physical copy is the best way to make something last. However if we intend to not only have it last but be accessible, some of the suggestions are helpful but the most significant is: where can I host something indefinitely?

Will Netlify, Github Pages, AWS, etc all be around in 50 years? 100 years? 500 years? Heck, the internet hasn't even been around for all that long.

As I write this, my only thought is that you need a system of fallbacks. Frankly, this seems like a business opportunity in which the cost of the infrastructure is purchased based on some formula. DNS is configured programmatically. File locations are distributed and redundant. I'm not sure what the best approach is but one thing is certain: the page accessibility is the least of this author's issues. He just needs the site to be hosted...


I think this most effectively demonstrates why I like a lot of OOP: it can be verbose. This is example function is relatively illegible:

  alignCenter :: [String] -> [String]
  alignCenter xs = map (\x -> replicate (div (n - length x) 2) ' ' ++ x) xs
      where n = maximum (map length xs)
One of the most verbose languages I've used, Objective C, has made this a best practice. Despite the brackets (which scare people off), it can be some of the easiest to read code.


I think this is a question that's orthogonal to OOP-versus-functional-programming, but is rather about programming style. Haskell programmers like being terse, but there's also nothing stopping you from writing Haskell like this:

    alignCenter :: [String] -> [String]
    alignCenter lines =
      let maxLineLength = maximum (map length lines) in
      [ leftPadding ++ line
      | line <- lines
      , let leftoverSpace = maxLineLength - length line
            leftPadding = replicate (leftoverSpace `div` 2) ' '
      ]
You could have verbose and easy-to-read functional code—you don't see this often in Haskell by convention, but you might in OCaml or in Scheme—and you could also have terse OOP code filled with single-letter variable names (less so in Objective C by virtue of the method call syntax, but I've definitely seen code like this in Java and JavaScript.)


Functional programming seems to let people lapse into "point-free style" fairly easily, which (imho) has a much greater chance of becoming rapidly unreadable. Not to say FP can't be readable as you've demonstrated very well.

https://en.wikipedia.org/wiki/Tacit_programming


Point free can totally be abused. It's also, in my opinion, often very useful for clarity.

It's my experience that, especially with FP code, often the important things to write down are the stages/steps in a transformation and that the intermediate outputs do not, by themselves, hold much semantic meaning.

Pointfree lets you write just those steps. Moving to "point-full" coding forces you to give names to these semantically meaningless intermediates. This can sometimes just be noise.

Terseness is also just shocking sometimes. It can take time to get used to it. I feel like when I read more verbose languages I skim each block of code numerous times and collect the meaning iteratively. When I read Haskell, I depend upon each name having distinct and important semantic meaning, I leverage type information heavily, and when I do read something I read each word carefully.

Totally different styles, but I've found strong preference for terseness.


This may be more common with Haskell specifically, because Haskell makes currying so easy and has tools like http://pointfree.io/ (which I’ve definitely abused before).


Point free style possible in languages like Haskell and SML where the syntax makes it practical. Haskell and SML make it easy, Scala does not. If you made an OOP language with the right syntax features, you could have point-free style in that language too. You can do point-free style in Python with just a little effort. It's orthogonal to the FP/OOP debate.


Maybe true, but writing readable code is a difficult thing in any language. No matter what language you're using, you're going to have to come up with a set of coding standards in the long run.


Honestly...how is that more readable? It's more verbose sure but the first example is much more readable and straightforward. Here, you have to remember Haskell's list comprehension syntax and you have to scan up and down a few times to keep track of the variables.


> …you have to remember Haskell's list comprehension syntax…

I get the point you're trying to make, but this feels like a huge stretch. Haskell's list comprehension syntax is straightforward and in many cases a terse and useful way of implementing complex functionality. You'll find multiple uses of it in the base libraries; notably, catMaybes is implemented in terms of list comprehension:

    catMaybes :: [Maybe a] -> [a]
    catMaybes ls = [x | Just x <- ls]
I'm all for reducing cognitive load, but Haskell has such a sparse syntax and this specific feature is so useful (and honestly, so consistent with the rest of Haskell's syntax) that arguing it's some kind of unnecessary cognitive burden feels ridiculous to me.


Yeah I mostly agree but I mentioned it because I spent some time trying to figure how how the leftPadding variable in the let block can be referenced outside the let block. It's been a couple of years since I've used Haskell.


The main benefit of example 2 IMO is that some variables got readable names. E.g. n became maxLineLength and x became line.

But bad naming practices have nothing to do with FP per se. Although it does seem to be fashionable in part of the FP community to have everything as terse as possible including variable names.


To me, code with terse variables are much more readable since it's much easier to keep track of the variables when scanning the code. When I read that piece of code above, I didn't try to ascertain meaning from the variable names which, it's arguable whether I (or anyone) should or not since coders can assign variables arbitrary names.


I honestly think a good amount of legibility is a matter of familiarity. I've used Haskell for a couple of years, and I didn't find this code particularly illegible (if I had to guess, this is probably more easily-understandable to me than the equivalent OOP formulation).

That's not to dismiss your criticism, not at all; rather, I think that the challenge would decrease with experience.


To underscore the point that legibility is as much a matter of familiarity as anything else: I think a big difference with an "OOP language" like the above poster seems to prefer versus Haskell has a lot more to do with the English language keyword operators that most contemporary OOP languages favor versus Haskell favoring more mathematical notation.

There exist "OOP Languages" like OG Smalltalk, Self, Io that might make for better comparisons to Haskell by virtue of being closer to the simpler syntax and general focus on more "mathematical" operators. Just as there exist more functional languages that use much more of an English keyword approach than Haskell.

(Some forms of Lisp/Scheme are so English keyword-forward with micro-DSLs that they may be a better example in a lot of posts like these for comparing "contempory OOP languages" and "functional languages". Plus there's all the bits of hybridized "functional languages" embedded directly inside contemporary "OOP" languages such as LINQ syntax in C#. It's interesting to me how many of these sorts of articles jump straight to Haskell.)


To me this looks like perl golfing, but for some reason perl golfing is bad but writing extremely terse functional programs is not.

Personally I like to combine both approaches. In swift I would write something like this:

    let l = ["abc", "ab", "abcdef", "abcdefgh"]
    width = l.reduce(0, { max($0, $1.count) })
    let centered = l.map({
     (line: String) -> String in 
      var padding = (width - line.count) / 2
      return String(repeating:" ", count: padding) + line
    })


Obligatory C#:

    var input = new string[] { "abc", "ab", "abcdef", "abcdefgh" };
    var maxLength = input.Select(e => e.Length).Max();
    var output = input.Select(e =>
    {
        var padding = (maxLength - e.Length) / 2;
        return new String(' ', padding) + e;
    });
Most modern `oop` languages these days all support functional constructs and achieve the same thing in same amount of code & style. Language and oop/functional style are not mutually exclusive anymore, which this article seems to overlook by comparing both languages and styles at the same time.


This looks like the Java if the Java was written by someone who knows Java:

    List<String> alignText(List<String> texts) {
      int maxLength = texts.stream().mapToInt(String::length).max().orElse(0);
      return texts.stream().map(text -> {
        var spaceCount = (maxLength - text.length()) / 2;
        return " ".repeat(spaceCount) + text;
      }).collect(Collectors.toList());
    }


/nit Move the lambda to private method and replace it with method reference and it’ll be just perfect


Good feedback. +1


I tend to avoid doing a Select followed straight by a Max when you can just pass the select function directly into the max. Also multiline lambda expressions feel ugly but that's probably just me! This is what I would do these days:

    string pad(this string e, int padLength) => new String(' ', padLength) + e;
    var input = new string[] { "abc", "ab", "abcdef", "abcdefgh" };
    var maxLength = input.Max(e => e.Length);
    var output = input.Select(e => e.pad((maxLength - e.Length) / 2));


Sadly C# is still missing a few important ML features that making functional programming more difficult than in a true ML.


It would be interesting if you could mention which feature/s you think it most sorely lacks. Some of the recent syntax additions have made it really easy to write concise functional code. I don't even use curly braces much anymore. What about f#?


Personally, I’d replace

  width = l.reduce(0, { max($0, $1.count) })
with

  l.map { $0.count }.max()


Much better indeed!


"To me this looks like perl golfing"

I think that's preposterous and totally unfounded.

The identifiers have names like "alignCenter", "replicate", "maximum" and "length". Those are all actual full English words, nothing remotely obfuscated about them.

"map", "++" for concatenation, and "x/xs" for an arbitrary list of things are all idiomatic so can be kept short because they are used so often, like pronouns in English.

Lastly, your program looks very similar (almost isomorphic) to the Haskell version, so I think it's just dumb you use it as an argument to criticize the Haskell version as "extremely terse".


Ok.

My problem with functional programming written like this (I admit that this example is too short) is that once there are too many functions combining with other functions it is very easy to lose thread of what is happening. My comparison with perl is more to the point that these programs are way easier to write than read.

Again, this example is too simplistic to illustrate my point, but what I like with combining imperative and functional programming is that it is easier to keep trace of what is happening by using intermediate variables that hold the state and thus break the chain of functions.


That is why the importance of being terse but following the rule of not going too far with nesting and pointfree is so valuable. I don't share your difficulty to follow the flow of the program as usually the name of the function, type, and documentation say all you need to know about it.

That said, I find it difficult to follow what is happening when using several variables as you're then likely doing something wrong in the complexity of the function. A function should say much with very little and control flow should be clear instantly. The only thing outside of this would be a procedure which do-notation allows one to express.

Imperative programming is already within Haskell with do-notation an it's composition is that of imperative. Mixing functional with something else makes it much harder to make use of combinators and other forms which ends in more messy code (in my experience). If one could go pure functional without do-notation emulating the "C monoid" it would be rather nice.


It does look like APL or Perl without enough understanding of Haskell (which I know very little about). I am guessing you have some experience writing Haskell code, so it looks clear to you.

The example used idiomatic one or two letter variable names (x, n, xs) which I found difficult to read. The rewritten example was much clearer to me because I could see the variables.


> $0, $1


> for some reason perl golfing is bad but writing extremely terse functional programs is not

Because the Haskell has types checking that you're not doing anything completely stupid.


and in Kotlin

    fun alignLines(lines: List<String>): List<String> {
        val maxLength = lines.map { it.length }.max()!!
        return lines.map { " ".repeat((maxLength - it.length) / 2) + it }
    }


This opinion is flameworthy and stereotypes heavily: what seems to happen in FP is that the overall community is substantially math-IQ smarter than the imperative languages. Alas, that ALSO means the overall community loses social-IQ in the process.

This leads to:

1) higher barrier to entry for the general programmers, in language semantics, documentation, examples...

2) a tendency to overabstract, underdocument, and write clever code

3) write code that is obvious to the person who wrote it (at least for a few months), but being CODE is tougher for people to unpack.

4) people don't collaborate in packages, so they tend to be single-hero projects that are abandoned, and since FP code is a bit harder to parse for typical programmers, don't get adopted/unorphaned. Thus the library code beyond the standard library gradually degrades.

5) I won't say that FP is the only domain of religious zealotry in language minutae (syntax, etc), but it does seem to have a higher proportion or much louder zealots.

I've been in the industry for 30 years, and while it could just be mental ossification of age, nothing seems to have changed since the usenet days with Scheme/LISP, despite the fact the toolchains are now free and downloadable, and despite some of the smartest people in the world preferring them.

The fact that Rust is gaining some momentum with its fairly alien memory management is yet another example to me that the IQ barrier of purer FP (no infix, lots of recursion, etc) is just too high to surmount.


3) write code that is obvious to the person who wrote it (at least for a few months), but being CODE is tougher for people to unpack.

Exactly this.


> 3) write code that is obvious to the person who wrote it (at least for a few months), but being CODE is tougher for people to unpack.

One could have a decent debate about much of what you say. This is the only one where I utterly object. The Haskell code I write is far easier to come back to months later than the Python code I write.


Maybe we just need to have more math training for people who want to become Computer Programmers.


That's kind of another aspect of the social-IQ divide.

Programming is very democratic and blue collar as white collar jobs go: you can get stuff done without a lot of formal education (OR the formal certification of (ahem) REAL engineering professions).

So either you ivory tower and sniff at the lower classes and use FP and higher tools, or you "get stuff done" actually making tools (like the dude who make the OSX package management getting stiffarmed by google).

The old CS vs no CS divide actually fissures quite dramatically in alignment with FP vs no FP.


I suck at more advanced math. I am simply not able to grasp it. However I am very good at logic and systems thinking, which makes me a good programmer for certain kind of tasks, provided I can use imperative programming. Force me to use functional programming (like my current Angular/RXJs assignment) and I'm a lousy programmer.


This deserves a blog post of it's own. You are on to something here that needs to be acknowledged!


Opinions only backed by ~"I know due to my experience" but nothing else are not even "flameworthy".


And this opinion is backed by your experience?


No, by basic rules of intellectual intercourse.


As a lisp programmer who never wrote in Haskell the snippet you quoted is crystal clear to me, while with explicit loops I always have to double check, because I am pattern matching the code "ah, a map or reduce was meant" but I still have to double check assignments and the abort condition (off by one, incrementing the wrong index etc).


I write Lisp but I have no idea what /x means in the example above for instance.


That's a syntax knowledge problem, not a readability problem. \x -> introduces a lambda function with a parameter x, like (x) => in javascript etc.


The "\" (which is "\" rather than "/", as already pointed out) is just an ascii approximation of λ (just like "u" is used to approximate μ).


It means a 1-argument lambda, where that one argument is named x


I think this is definitely a problem with a lot of functional code styles so when working functionally myself I try to be quite verbose and explicit within functions, spacing things out in recognizable patterns and using lets to capture intermediate computation steps.

I love side-effectless code, but I hate the assumption that side-effectless code is maximally perfect when on a single line - don't use variables for variable usages, use labeled pre-computations to clarify what you're actually doing to try and maintain readable self-documenting code.

(all that said, the example above is... sort of a weirdly terrible one like most string manipulation tasks are, string manipulation usually has a high ratio of computation to significant design decision making)


I'm finding that in Javascript, I really enjoy map() and filter(), but map() caused some friction on code reviews at one place, from someone I don't think had any FP background. The are best when they are one liners, of the form .map((val) => someFunction(val)) or .filter((val) => val.length > 1)

reduce() on the other hand is always illegible to me. I get pretty grumpy when I am 'forced' to use a reduce because the code calls for it. It just looks like I'm trying to write obfuscated code.

Often I'll just unroll it to a forEach.

This code structure in your example reminds me of some Python code I was reading recently (Norvig's Sudoku solver). Putting the conditional at the end of the line fights the way humans process data. Quite often we are trying to filter lines of code that could be involved in a problem and saying things like "do an action (if this condition is true)" increases the amount of short term memory I have to use to process the function. That's bad ergonomics.


"but map() caused some friction on code reviews at one place"

Someone not familiar or comfortable with "map" should not be working as a professional programmer today. Most languages now support "map" or something very similar.

Try to move to a different team or different company with actual professional developers.


> Someone not familiar or comfortable with "map" should not be working as a professional programmer today.

I completely disagree - you are measuring the quality of a programmer on a single dimension.

I have worked with very weak programmers that produce gold e.g. great at pulling a team together, great at producing outcomes that clients love, great at focusing on features that sell.

I have also worked with great programmers that just stick to what they know - they don't know map() because they concentrate on being productive rather than continually chasing the next greatest language or library.

I have also worked with technically awesome programmers that produce absolute crap e.g. struggle to communicate, struggle to make good engineering compromises, struggle to understand requirements. One smart guy was so creepy no women could work with him which meant he was actually pretty useless - I saw one friend who worked as a consultant there hide under her desk to avoid him!


I almost fully agree. A professional programmer, how can such a person not know about stuff like map, filter and reduce? It can only happen, when they never cared to learn programming languages, paradigms or concepts of various kinds. This would betray an attitude of not continuing to learn. Even, if they have not come into contact with other programming concepts, how can any professional not have heard anything about map-reduce stuff at some point somewhere? Seems very unlikely to happen without learning-resistance or disinterest towards learning or informing oneself.

However, I would exclude junior software developers from this, as they might have just come from university, where they might not have learned about this at all, depending on the university. Still computer programming is then what they do as "profession", so we would have to count them as "professionals".


That was more of a "it's not universal" comment. Sometimes the right solution is self obvious, other times it needs PR.

If I write a piece of code so others don't have to, then it's a service I'm providing. If they don't 'get' the code then the problem is not always with them. It's important to watch for patterns in the questions or complaints you get. There are often multiple acceptable ways to solve the same problem and everything goes smoother if the one you use doesn't trip people up.

In this case I pointed him to some documentation on filter and map.


I've been noodling with Julia recently and the dot-syntax is really surprisingly ergonomic for transforming hunks of data. It has the benefit of making vectorization easier for the compiler, but I enjoy the syntax.

https://docs.julialang.org/en/v1/manual/functions/#man-vecto...


That's a cool trick but I'd like an operator with more pixels for that behavior.

When I used to track new languages, I ran into one where the . was implicit. You could change a member of an object from a single value to an array and it would iterate over all of the values. So you could do an information architecture that was 1:1 and change to 1:many later and things would still work.


If you think of 'reduce' as instead 'accumulating' a value, then it takes a function that adds a single element to the accumulation, and a base accumulation to use if the list is empty, and a list, and returns an accumulation of all of the elements of the list in a directional (in this case right-to-left) order.

(accumulate plus 0 lst) is equivalent to (sum lst)

(accumulate multiply 1 lst) is equivalent to (product lst)

(accumulate (lambda (x acc) (cons (fn x) acc)) '() lst) is equivalent to (map fn lst)

(accumulate (lambda (x acc) (if (fn x) (cons x acc) acc))) '() lst) is equivalent to (filter fn lst)

and so forth. The essential insight is that reduce/fold/accumulate reduces the problem of accumulation to a base accumulation and a function that only has to add a single item (i/o)nto the accumulated value. Using them to directionally processes a container is idiomatic in a functional style.


C++ even calls it std::accumulate. (There’s a std::reduce in C++17, but it’s just std::accumulate with the restriction that the operation is commutative.)


> reduce() on the other hand is always illegible to me.

I used it recently in ruby to write an sql query using Rails' ORM and it seemed quite nice to me. Something like:

  foos.to_enum.with_index.reduce(initial_query) do |query, (foo, i)|
    query.joins(...).where(...)
  end


I agree it can be hard to read at first, but after learning the syntax, it's not hard to read. It's also about what the language allows you to do (or prevents you from doing) that determines, to me anyway, the utility. I love Objective-C but it allows you to do a lot of things that can lead to bad code (mostly related to state and hidden side-effects). FP overall is a paradigm that helps prevent you from doing that and helps you rethink and describe problems declaratively.


Haskell is very terse, but it doesn't mean that this is true for every FP language. Code below is in Gerbil Scheme and should be readable even for OOP programmers.

    (def (alignCenter strings)
      (def n (apply max (map string-length strings)))
      (def (align s)
        (let* ((count (round (/ (- n (string-length s)) 2)))
               (whitespace (make-string count #\space)))
          (string-append whitespace s)))
      (map align strings))
Here also the same code in JS, which is almost identical.

    function alignCenter (strings) {
      const n = Math.max(...strings.map(s => s.length))
      const align = s => {
        const count = (n - s.length) / 2
        const whitespace = ' '.repeat(count)
        return whitespace + s
      }
      return strings.map(align)
    }


Once you become used to reading it, it doesn't seem like a big deal. But Haskell has a steep learning curve if you have never used functional programming languages before so it may take a while to pick up a few things.


What are some of the better ones to start with? I've tried Erlang and F#, but the hardest part is figuring out whether I'm writing code that's too procedural.


If you're looking for statically typed FP, honestly, start with Elm. You can do it in a weekend it's so conceptually contained. Then F# and OCaml are highly regarded. Avoid Haskell - worst bang for your buck on seeing returns on learning. It has some interesting concepts, but is a terrible language for learning statically typed functional programming.

If you're looking for dynamically typed FP (ex. LISP), go with Clojure, or lesser rec possibly Racket flavor of Scheme.


I don't think you should judge it based on the syntax. With UFCS (Uniform Function Call Syntax), or a pipeline operator, it could easily be rewritten to something like:

xs.map(\x -> (div (n - length x) 2).replicate(' ') ++ x)

This is just pseudocode obviously, but you get the point I hope. There is nothing fundamental to FP about this particular syntax.

Also to be honest, I don't find the original unreadable at all. But that may be because I have more exposure to this style of programming? FP doesn't somehow remove the inherent complexity in tasks like string manipulation.


I don't really like 'where n' afterwards instead of say 'let n' at the beginning, but I'm not very familiar with haskell (really just enough to know the first line is a type signature) and I found this ok. Maybe objective C is better though.


You can write code without ever using `where ...` :)

It's just how mathematicians are used to express their version of "top down problem solving". It's also similar to what you do when you define a function/method before the smaller ones it calls and before the even smaller ones they call (using what's called "function hoisting" in Javascript for example).

Now, if you really dislike "top down problem solving", you might have an allergic reaction to `where ...` which applies the same pattern but does it down even to the micro level of small functions of few lines...


My first thought, too. OTOH, with indentation like in the example I could live with it.


Indentation is always like in the example. Haskell has either semantic whitespace of braces everywhere, and nobody uses the braces.


A list comprehension in python would be more comprehensible than either AND less verbose.


Arguably, list comprehension in Python is already functional programming :).


Once you start nesting them then they become a nightmare to read. So you might as well mix some imperative style intermediate variables.


What is illegible about that?!

It just says, in code: "replace each line of text with itself prefixed by a number of spaces equal with half of the difference between its length and the length of the longest line in the text".

It's like the most obvious way to think about this particular problem!

Now, how well this scales to different problems, and especially to problems where mutation is a natural way to think about things... that's a different problem and part of the reason I'm not that much in love with extremist functional programming. Mutation has its place and the monadic abstraction is something I dislike.

But for simple examples like this pure FP rocks and is very readable and intuitive!


As usual in FP code, the order of your words are completely different from the order things appear in the code. Also, most developers aren't used to concise function declarations (yeah, even with JS pushing them), what further adds to the problem.

This is not something people with no experience on FP can read easily. Now, calling it illegible strongly implies that people with no FP experience are the metric one should code for, what is perfectly valid if you are at a company aiming to hire cheap coders, but not something to brag about.


Order of words is not that relevant, in English I can say instead of the above:

"take each line of code [map ... xs] and replace it with [\x -> ...] a number of spaces equal to half the maximum line width [replicate (div (n - length x) 2) ' '] prepended to it [... + x]"

All languages have passive voice and other tools so you can make the order of words be whatever you'd want for customizable emphasis while keeping meaning the same.

Sure the order for arguments for `map` may not be the most intuitive, but that doesn't make things harder. See ReasonML for an example of functional programming with regular C-like syntax.

Now, if you want to see hard to read functional code, look into code abusing point free style (I'm not even sure there is a fine way to use it at all...), plus mind bending types (usually to satisfy some monadic style abstractions), plus over-currying stuff all over the place.

But the snippet above is only unreadable for people who stubbornly refuse to invest a couple hours of their time into learning a new notation for things! Heck, you can even translate it almost 1-to-1 to modern Javascript, or even add an extra function name and some more sensible variable names to make things more readable while keeping it functional:

    function alignCenter(lines) {
      let width = Math.max(...lines.map(ln => ln.length));
      let getPadding = len => ' '.repeat(Math.max(0, (width - len) / 2));
      return lines.map(ln => getPadding(ln.length) + ln);
    }
...the above is more like something I'd actually let pass code review in real life :)


But the example you posted has more to do with whether a language or author has the aesthetics of preferring succinctness and symbols (Perl-like) to words (Ruby-like).


TXR Lisp:

  (defun align-center (strings)
    (let* ((maxl (find-max [mapcar len strings])))
      (mapcar (op fmt "~^*a" maxl) strings)))


> I think this most effectively demonstrates why I like a lot of OOP: it can be verbose.

Verbosity is not inherently good. In fact, I think verbosity is inherently bad. Have you read much first-year programmer code? It's absurdly verbose at the cost of legibility.

The real issue is clarity. Your code should be sufficiently verbose that its purpose is self-evident, but it should not be overly verbose such that your screen is cluttered with meaningless junk (see: Java).

---

To me, there is a fundamental distinction between the intents of functional programming and imperative programming that a lot of these articles either gloss over or miss completely.

Imperative programming is about describing to the computer a procedure by which to accomplish a goal.

Functional programming is about manipulating the relationships between data directly such that you transform your given input into the desired output.

If you want to understand what a program does, then imperative code is going to be better to read. But if you want to understand what a program means, then (well-written) functional code is going to be better. This is also why so many functional languages have strong static type systems: to better enable the programmer to express programs' meanings outside of the implementation.

However, as others have mentioned, string manipulation is always kind of hairy anyway, so reading this function will result in understanding what it does instead of what it means (unless you just read the signature, which is actually what I do a lot of the time). My thought process of reading this particular function without prior context would be something like:

- The function is named `alignCenter` and takes a list of strings and gives back a list of strings... so the strings are being centered amongst themselves. I know they aren't being centered relative to anything else because there are no other inputs to the function — which I would not know in an imperative language, where there could be hidden state somewhere. - It maps some function over the list of strings. I assume that function will do the centering. - This inner function takes a string and does something to it. Let's investigate. - We replicate a space character some number of times and prepend the resulting string to the input string. (I think the author's reliance on operator precedence is disappointing here, as it detracts from the clarity IMO. I would rather put the `replicate` call in parens before the `++`.) - The number of spaces is determined by dividing by two some other number less the length of the string. - That number is the length of the longest string.

So: to center a list of strings, we indent each string by half the difference between its length and the maximum length among all the strings. This seems like a reasonable way to center a group of strings. (Notice that I did not use words like "first", "then", etc. which indicate a procedure. Instead, I have described the relationships of the strings.)

(Of course writing it all out makes it seem like a longer process than it is, but in reality it probably took me 10-15 seconds to go through everything and figure out what was going on.)

---

I think this isn't a great example for the author to have chosen. My go-to example of a beautiful functional solution is generating the Fibonacci sequence.

A "good" imperative solution uses iteration and might look like:

    def fib(n: int) -> int:
      a = 0
      b = 1
      while n > 1:
        t = a
        a = b
        b = t + b
        n -= 1
      return b
If you were to just glance at this code without being told what it does (and if you'd never seen this particular implementation of the algorithm before), you would probably need to write out a couple test cases.

Now, the Haskell solution:

    fib :: Int -> Int
    fib n = fibs !! n
      where fibs = 0 : 1 : (zipWith (+) fibs (tail fibs))
We can easily see that the `fib n` function simply retrieves the nth element of some `fibs` list. And that list? Well it's `[0, 1, something]`, and that something is the result of zipping\* this list with its own tail\* using addition — which very literally means that each element is the result of adding the two elements before it. The Fibonacci numbers are naturally defined recursively, so it makes sense that our solution uses a recursive reference in its implementation.

\*Of course, I'm assuming the reader knows what it means to "zip" two lists together (creating a list by performing some operation over the other two lists pairwise) and what a "tail" of a list is (the sub-list that simply omits the first element).

To me, this data-relationship thing often makes more sense than a well-implemented imperative solution. I don't care to explain to a computer how to do its job; I care to think about how to move data around, and that's what functional programming is all about (to me).

Of course, this is just my subjective opinion, but I think there's some merit to it. I'd like to hear your thoughts!


> Verbosity is not inherently good.

Agreed.

> In fact, I think verbosity is inherently bad.

Here I disagree. To take it to an absurd extreme: LZW compress your source code. Hey, it's less verbose! But that's not a net win.

Instead, I think that there is an optimal value of terseness. More verbose than that, and you waste time finding the point. More terse than that, and you waste time decoding what's going on.

Now, what is "optimal" is going to depend on the reader, both on their experience and their preference. With experience, certain idioms are clear, and don't require thought. The same is true of syntax. (Both Haskell and C become more readable with experience.) But some people are still going to prefer (and do better reading) a more terse style, and others are going to prefer a more verbose style.


I think we have different interpretations of what it means to be "verbose", which is why I instead directed my previous comment towards "clarity".

Wiktionary gives the following definition of "verbose" [0]:

> Abounding in words, containing more words than necessary; long-winded.

My point is that adding words for the sake of adding words is bad, always. It's one thing to say "My code tends to be on the more verbose side of things" and another to say "I prefer writing very verbose code." You should always be seeking to make your code as concise as possible while maintaining clarity.

It's that "while maintaining clarity" bit that's the tricky bit, really. On this, I think we agree. I always try to make my code as short and direct as it can be, but never at the cost of clarity. For example, I don't use cute inlined tricks unless they're idiomatic (or used everywhere in the code and explained in at least a couple places). I try to strive for clarity instead of verbosity.

[0] https://en.wiktionary.org/wiki/verbose


> You should always be seeking to make your code as concise as possible while maintaining clarity.

Absolutely.

> It's that "while maintaining clarity" bit that's the tricky bit, really. On this, I think we agree.

Yes.


You chose a very bad example for "imperative code". It seems artificially complicated.

    def fib(n: int) -> int:
        prev, cur = 0, 1
        for _ in range(n-1):
            prev, cur = cur, prev + cur
        return cur
I think most humans will find this variant more readable and understandable then functional one.


Ah yeah, I think you're absolutely right: this is much better. It's been a while since I've implemented Fibonacci iteratively haha. Thank you for pointing this out. :)

Personally, I still find the functional version a bit more direct. The iterative code still relies on me understanding what the program is "doing"; it requires me to hold state in my head and think through "okay, now `prev` has this value and `cur` has this other value" to reason about what's going on.

I would be interested to find some people with minimal programming experience and show them imperative vs functional implementations of simple functions or algorithms and see what they prefer. Maybe I'll try to do a small study on that or something.


Fibonacci is usually introduced as "the next term is the sum of the two previous terms" (sometimes with the story about rabbits or whatever). There's two obvious ways to implement this:

  1. Direct recursion
  2. Keep track of the two previous terms
If you start with (1), you run it and it takes exponential time, and so you should instead remember the two previous terms, leading you to (2). When you go with (2), you either use 2 mutable variables and a loop in the imperative version, or you have 2 accumulators and tail recursion in the functional version... which is the same thing, since a tail recursive function is just a named loop.

There's nothing about laziness or self-referencing an incomplete structure here, which is just a Haskell thing. Taking the tail of an incomplete structure, in particular, is indirect and hard to understand.

If you want to demonstrate laziness, you can still do it directly by doing something like:

  fibs a b = a : fibs b (a + b)
  fib n = fibs 0 1 !! n


Yes! However if you bill yourself as a "freelance web developer" you have instantly commoditized yourself. The only problem you are solving is someone who's thinking to themselves "man I could really use a developer". This is a lot of people who on average have small budgets.

If you package yourself properly (for example, "I help founders take their startup idea from dream to reality"), you have now placed yourself in a new, more valuable, bucket. You have to hunt for the proper client fit but your offering is of greater value (in this circumstance you make dreams a reality).

Granted, entrepreneurs aren't the best market but the key is having some differentiator in your market and not offering a commodity service (which is what Wix, Squarespace, and frankly "web development" is).


While I agree that they will eat into affiliate marketing revenue, this title is completely misleading. The links still work, consumers just may not access them if Google's review algorithm becomes robust.

Frankly, this is not a new issue. It's just the effort by Google to use publisher content & data for their own profit continues to expand.

I always end up going to Wirecutter and their related sites for product reviews as they are the modern Consumer Reports. In those circumstances, the affiliate link will still function as anticipated.


>Frankly, this is not a new issue. It's just the effort by Google to use publisher content & data for their own profit continues to expand.

True. Publishers always hated that Facebook and Google would share too much of an article on their own platforms that no one would click through, and they'd miss the ad impression.

This thing is a similar issue but missing out on affiliate clicks instead of ad impressions.

I'm glad the author is keen and pointing it out, though.


AMP-shopping is next


Is the Amazon’s one-click shopping patent still valid?

Google could add a ”Buy now” button there, handling customer shipping data and payment and just forward the order to merchant that serves customer’s location.

For smaller vendors it might be interesting to replace AdWords with the possibility to list stuff for sale. Instead of click price, you would tell how big cut of price you give to Google if customer makes the purchase.


Amazon's one-click shopping patent expired on Sept 11, 2017: https://qz.com/1057490/a-patent-that-helped-amazon-take-over...


Lol this title is literally a recipe for fighting. That said, I love how they eliminated the need for JQuery with all the functions up top. Super minimalist.


What's your twitter username. I want to add you as a maker to the producthunt project :)


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: