A Still Profitable Tesla Motors Owes Its Success to Government Subsidies - <AUTHOR> http://www.motherjones.com/politics/2013/08/tesla-q2-second-quarter-earnings-elon-musk-subsidies

<comment><USER2> Elon Musk said he appreciates the government assistance, and Tesla's success was accelerated, but not dependent on EV subsidies.</comment>


Google overtakes Facebook in employee satisfaction - <AUTHOR> http://www.zdnet.com/blog/facebook/google-overtakes-facebook-in-employee-satisfaction/10734 <comment><USER2> Google may or may not have higher employee satisfaction, but I sure wouldn't trust Glassdoor to know. This is based on an anonymous 20 question survey of "at least 115 employees" at each company, so you know that one of the two data sets only numbers 115 responses, implying a best-case response rate of 3.8% (Facebook at an estimated 3K employees). There is no information on how the sample set is gathered. Was it self selecting? What type of employees were consulted? Did they span management, or were they all individual contributors? How much can you really learn in 20 questions?

Furthermore, the "best tech company to work for list" that is linked in the article ([http://www.zdnet.com/blog/facebook/facebook-named-best- tech-...](http://www.zdnet.com/blog/facebook/facebook-named-best-tech-company- to-work-for/6268)) is another Glassdoor list, and a highly suspicious one at that. I compared it to the corresponding CNN/Fortune list ([http://money.cnn.com/magazines/fortune/best- companies/2012/f...](http://money.cnn.com/magazines/fortune/best- companies/2012/full_list/)), and out of the top 10 companies on the Glassdoor list, only 3 were on the top 100 Fortune list: Google, Facebook and REI. I've never even heard of 4 of the other 7, including the top 2, and of those 7, 5 aren't even on the CNN/Forbes top 100. On top of all this, this is supposed to be a tech list and it's filled with companies like General Mills, Southwest Airlines, Starbucks, Coach and FedEx, not to mention the fact that the top 2 are also both business consultancy firms.

I could go on, but I think the trend is pretty clear. Glassdoor appears to be basing these ratings on very small (and probably self selecting) samples sizes, and doesn't appear to have a very good means of gathering data from the _right_ companies. Considering it's a relatively new company, this feels like something they want to make big, but they just don't have the brand and sway to implement a well designed study/survey/what-have-you.

If your curious what the CNN/Fortune study's methodology is: [http://money.cnn.com/magazines/fortune/best- companies/2012/f...](http://money.cnn.com/magazines/fortune/best- companies/2012/faq/)

</comment><comment><USER3> Once again, misrepresented interview questions. If you are a programmer and want to know what Google interviews are like, read Steve Yegge's summary: [http://steve-yegge.blogspot.com/2008/03/get-that-job-at- goog...](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html)

Hint: all the questions are about programming. There are no puzzles or tricks, only straightforward problems that require a deep understanding of computer science to solve. And, questions you've read about on the Internet are typically not used.

</comment><comment><USER4> Larry Page gets a 94% approval rating? That seems a bit surprising given the discontent expressed on HN over recent policy changes.

<comment><USER5> Yes, but that's here on HN, which doesn't correspond to a group of Google engineers.

<comment><USER6> I don't think Google's company-wide 10% raise starting in 2011 hurt either.

Approval ratings aren't as useful, as say compared to something like the US Presidental approval ratings: unhappy employees can easily leave (clearly evidenced by a few recent high-profile HN posts), so only the happy remain.

</comment></comment></comment><comment><USER7> I'd just like to quickly point out that the pie charts for "What gets talked about on the inside" are somewhat useless because they not only don't add up to 100%, but the sum of percentages for the facebook charts doesn't equal the sums of the corresponding google chart (e.g. cons: sum of facebook percentages: 26%, google: 22%)

<comment><USER8> I agree it's pretty stupid - my best guess is that it could be % of total respondants, not % of total respondants that selected cons. Said another way - 74% of Facebookers didn't list any cons, 78% of Googlers didn't list any cons.

</comment></comment><comment><USER9> Consider the possibility that googlers dissatisfied with Google tend to leave Google for the bigger and better while there's a strong incentive for a disgruntled facebooker to hang on until his/her options fully vest.

</comment><comment><USER10> You know what's more satisfying than being a wage earner at Google or Facebook? Running your own company.

<comment><USER11> Do you run your own company? It would be interesting to compare side-by-side the benefits of working for Facebook/Google vs. being the CEO of your own startup. Comparing salary, benefits, and perks would be cool, but I'm also wondering if most CEOs find their work more or less interesting and challenging that engineers at these companies do.</comment></comment>


Ask HN: Should I quit for 6 months? - <AUTHOR> Sorry for the typical, unoriginal advice thread.
BACKSTORY:
25 years old. Not married. I've spent the last 3 years working at a FAANG company - more or less right out of college. For the first 2.5 years I lived at home with my parents. As such, I've saved quite a bit. Now I'm living in the city. With recent changes to my team goals and product, I find myself extremely unfulfilled as of late. I now regularly engage in fantasies of quitting, and my gut tells me it's the right call.
I've always had personal projects I work on. Mostly ones that are intended to make a tiny bit of passive income. No one-hit wonders. But none of them have seen the light of day. I lose interest half way through. In my time off, I would like to finish one of them.
I'm somewhat risk averse, so I would only allow myself to go 6 months before trying to find another job (provided I can't come up with any solo income in that time). I hold no belief that I'll make a profitable project being solo. I don't fantasize about being a startup founder who makes millions. I just want some time to work on projects I enjoy. Maybe make some money off them. Probably not.
USEFUL INFO:
* Rent + everything else = ~4k a month. I can get that lower.
* I have 275k in savings. Not counting 401k.
* 6mo would cost about 25k.
* My lease is up for renew in 6mo, which is a nice coincidence.
* Got promoted in the last 6 months. This may help job prospects in the future - companies may more easily hire me at that level, than if I quit without getting promoted.
RISKS:
1) Sucking it up and working at this company the next 8 years would result in a very lucrative career, and that's a large opportunity cost.
2) Getting a job 6 months from now may not be as easy as I pretend it is. (What if the economy explodes!)
3) I may find that I have motivation for personal projects either, and live 6 months in a quiet depression in my underwear.
ALTERNATIVES:
1) I suck it up and do my job. People would love this job. It's cushy and it pays very well. Just do it for 5 more years and then consider this stuff.
2) Change teams at work. I imagine this might be only a mitigation, but maybe it would make things better.
3) Talk to my manager about working on stuff that I want to. I love to create and experiment. I know our problem area well now. I have things I want to create that would be valuable to the company that I would be passionate about. Would it be wise to ask for a 3 month trial of working on my own solo thing within the company? I would like that.
So what do you think? Should I do it? <comment><USER2> I don't know whether you should leave or not, but when I see threads like this a lot of people bring up the opportunity cost like you have. Having stability, health insurance, etc are important, but at a certain point you have to come to terms with whether you're being risk averse, or just chasing some ideal of "success" for your ego. Life isn't the month you spend on some crazy vacation somewhere once a year, or sitting in traffic in your Maserati. It's what you spend your time doing every day.

It sounds like you want to take 6 months as a way to enjoy life before getting back to "the grind". Taking time off is good, but I'd think more about where you want to end up rather than just jumping back into the job market and trying to maximize your income again.

</comment><comment><USER3> Why not just look for a new job immediately? I've never done this myself, but as I understand it the fastest way to rise through the ranks as an SWE is to jump to a different FAANG every 3 years or so with a raise and promotion.

I think there's not much point in quitting if you want to go back to doing largely the same thing in 6 months. If you really need time off you can always talk to your manager for an extended vacation/leave (churn is terrible for teams, so managers generally have strong motivation to retain you. My manager offered me 6 months leave when I quit, but ymmv)

> I just want some time to work on projects I enjoy. Maybe make some money off > them. Probably not.

If you don't have a concrete idea of what you're going to work on or how it will produce income, the probable outcome will be no - In which case, quitting in hopes of having side-project income in 6 months would seem like a bad idea.

I was in a similar spot when I quit 5 years ago. It took me about 3 years and 10+ attempts before my first successful commercial product. 6 months is barely enough time to build and validate your MVP, even if you have a highly specific idea of what to work on.

I think solo-entrepreneurship is an all or nothing proposition. On the one hand, the longer you stay in your career the more invested you'll become and the more difficult it will be to leave. On the other hand entrepreneurship requires a type of experience that is difficult to acquire while working as an SWE (specifically, customer acquisition and the product instinct to make something people will give you money for). I don't think there's a lot of middle ground between these paths, but ultimately it depends on your own skills, experience and aptitude.

Personally I think the ideal strategy is to stay at a high paying job while working on your business, but not everyone can do this (I couldn't, which is one of the reasons I quit)

<comment><USER4> I agree with 6 months not being enough for an mvp, i'm 1 year in and am 85% to mvp, i do have validation from a consulting firm i used to work for where we successfully sold many enterprise clients before our owner sold and retired. Unless your mvp is dumb simple, plan on 2 years to develop a SaaS product that does not require massive manual intervention behind the scenes.

</comment></comment><comment><USER5> If you have $275K in savings, I assume you have no debt? No loans, car payment etc?

Always having passive income is good. Side projects will keep you busy and bring in money. What happens in 6 months, or 1 year and you cant get a job? (worst case). There is a ~10% fee for cashing out 401k early fyi.

Take a long vacation, and come back and grind for a year or more then consider this stuff again. As someone that has 12 years on you, I wish I would have saved more and lived less fruitful so I can travel more now. It's easier to be in the grind now, then later. Why pass up good money/good job? My $0.02. Good luck in whatever you decide.

<comment><AUTHOR> Went to a cheap school and paid it off asap. Haven't had a car for years.

I really appreciate your insight, as a potential future-me. I see two potential regrets in the future:

1) Regret working for 10 years and not pursuing things I was more passionate, just to have a nice stockpile of money

2) Regret abandoning my job and pursuing my passions, which ended up burning through my money, and putting me behind in my career.

Not sure which is worse. By limiting it to 6 months or so, the latter is mitigated, as long as I can get a job quickly again.

<comment><USER6> I think you will end up regretting not taking the time off in the long run. I took 2 months off last fall and feel stupid for not just quitting and doing my own thing. My manager said he never took any time off and regrets it. You will almost certainly never be in a better place to do this in the future.

</comment></comment></comment><comment><USER7> It sounds like a break from work life would be immensely helpful. Here's another alternative that I'd recommend.

You didn't mention taking any breaks / vacation during this period. Take a week or two off and see how you feel. If you feel you should go longer, do it. I'd strongly advise against going right into a 6 month break.

<comment><AUTHOR> Good advice! However, I just got back from a week long vacation and still felt this way... I was hoping it was burnout, and that a vacation would do me well. But it's more a general unmotivation to keep working on this project.

<comment><USER8> A week is rarely enough time to expect a real mindset or perspective change, especially if you're not setting out with intent to do so. I'm not saying you shouldn't quit, but if you wanted to give yourself a chance to avoid burnout, perhaps discuss the possibility of a longer sabbatical with your employer. As someone who's spent some time on full-time side-projects, full-time employment, and in-between, the grass isn't always greener.

</comment></comment></comment><comment><USER9> \- You're probably overestimating your risks. You worked at a FAANG company for 3 years. You will be able to get interviews anywhere.

\- You're 25, if you completely waste the next 6 months of your life, you've lost nothing.

\- Consider asking your work for a 3 month sabbatical. Or some part time role. This can give you enough time to see if its what you want.

\- Make sure you have obsessions outside of work/programming/sitting in a chair for hours. Bonus points if its social/athletic. You might be smart, but you're still an ape.

<comment><USER10> Eh kinda disagree with the first point. I have some fairly elite credentials but job hunts are still not much easier than before I had them. Also we might be due for a market crash.

</comment></comment><comment><USER11> I worked at Amazon for 4 years before starting my own solo bootstrapped venture.

\- 6 months is very short time. Carve out 18 to 24 months for a real shot at monetization

\- Consider moving to a low cost place or even back to your parents house for a year or two

\- Plan finances in a way that you won't regret spending couple of years on a project that produced $0

\- At $2k burn, 2 years of free time to pursue your goals for $50k should be a good deal in your position. If not comfortable, wait it out another year or two at a high paying job. Release 1-2 very small products in that time to understand how this world works.

</comment><comment><USER12> 2 things financially to think of:

1) Burn rate - $4k is pretty high (I assume bay area). You could be living anywhere in the world for that 6 months on that burn rate.

2) Opportunity cost. If you make $250k/yr, you're spending $125k of potential income. Thats what you'll be thinking of at the end of the 6 months as you start to get a job. This is 100% okay, and life should lived - however, if you happen to be used to a certain lifestyle, and expect that lifestyle in the future, that opportunity cost may bite you when you consider how much more it would have made for you in 10 years.

IMO, if you think there's a real risk you actually sit around in your underwear for the 6 months, then make some change at your job, see a therapist, and examine your motivations both for work and those side-projects. If you don't want to work because you can't stand not being able to work on those projects, then quit and do so. If you're just looking for a change or some way to find your motivation, then make a change, see if its better, and if you're still not motivated take a motivation break and do things that are totally outside your comfort zone.

</comment><comment><USER13> Disclaimer: This is a throwaway account

OP,

I'm going through something similar - work at a FAANG company, have 250k+ in savings, contemplating quitting for a few months because things at work seem soul-sucking.

I went through the same trade-offs you mentioned. In the end I've decided to just take the plunge. When I'm 50, I don't wanna look back and think it'd have been extremely easy to take a few months off and see what that turned into.

PS: I'd love to get in touch and share our common insecurities if you're up for it. I live in the Bay Area and am reachable @ firstname.lastname@example.com

</comment><comment><USER14> > I may find that I have motivation for personal projects either, and live 6 > months in a quiet depression in my underwear.

This. I've excercised my quitting fantasies a couple times before (I'm 38) and, without fail, after a couple months of working on a side project the excitement wears off and then it's just work - but without daily routine, coworkers and steady (and big!) pay. I find that, having the opportunity to make great money at job, I'm not passionate enough about anything to work on it for uncertain and delayed rewards. Classic golden handcuffs.

However - excercising these quitting fantasies have actually lead to a lot of personal growth, as I was able to test myself and to get to know myself better, not to mention branch out into different areas of life (my projects weren't only in software). And also somehow, after each flop, I've landed a job with similar or better pay than the one I've left. That was in Europe though, so I have no idea how likely is that in the US FAANGs.

> I suck it up and do my job. People would love this job. It's cushy and it > pays very well. Just do it for 5 more years and then consider this stuff.

The tricky part here is that, in 5 years, it's likely that your pay will be amazing and you will risk even more with quitting.

If you're 25 and on the fast track to big bucks at a FAANG, the smart move seems to be just to ride it into early retirement. Most people probably cannot resist the tempation of quitting and trying out something else for a while - it's cool, we're not robots. But the default strategy should be early retirement IMO.

<comment><USER15> > However - excercising these quitting fantasies have actually lead to a lot > of personal growth, as I was able to test myself and to get to know myself > better, not to mention branch out into different areas of life (my projects > weren't only in software). And also somehow, after each flop, I've landed a > job with similar or better pay than the one I've left.

This is exactly my experience of quitting jobs to do something else. The grass was never as green as I imagined it to be before quitting, but the amount of new skills I learned and experiences I had were 10x what I would have gained from staying in the same job.

</comment></comment><comment><USER16> Haven't heard anything about a social dimension, other than lack of marriage partner. Are you in any clubs? Do you volunteer?

$275K is retirement money, it's 1% money. Either your risk aversion threshold is really really low or the size of that savings hasn't hit you yet.

Jumping into a 6 mo vacation is a great trial by fire for testing your retirement skills. Keep that brain busy and you'll be good.

<comment><AUTHOR> I have friends and occasionally do things with them. (Just went on a week long vacation with them in fact) but I'm certainly not too social on a daily basis. You make a good point, that that is something to be aware of.

I guess it's a lot of money - I don't spend a lot, other than living in an extremely expensive place... But obviously I don't want to burn through it all. Last thing I want is to get addicted to living without working, and slowly burn through all of my savings. 5 years later, I have to get a job, but I'm no longer a good candidate.

<comment><USER16> Excellent! Good friends are more valuable than gold.

Now, now, a budget is nearly trivial thing. Rent, food, travel, disposable, savings, interest, it's all pretty shallow math. Keep track of your spending and it shouldn't be a surprise as you go along. For a smart guy, running out of dosh shouldn't be a danger.

</comment></comment></comment><comment><USER17> A friend of mine quit his job, lined up a new job at Google with a start date of 6 months from the day he got the offer. He and his gf travelled together and both came back and started working. I'm not sure how rare that is to get a job offer that holds for 6 months.

</comment><comment><USER18> You recently got promoted so your manager likes you and you are in a good spot on your team. So I wouldn't change teams.

I wouldn't talk to your manager about working on stuff you want or mention leaving to work on side projects.

Focus on your job for now, save even more and test out doing side projects on your own.

Check what documents you have regarding IP for things you work on outside of work on your own hardware. I wouldn't raise a red flag by asking this question through HR.

You might like this podcast StartUpsForTheRestOfUs.com listen to the archive.

I would start building some simple side projects that can earn some money and build up your skills and experience in that area following a stair step approach. Rob outlines it on StartUpsForTheRestOfUs.com.

Once you have a few wins under your belt you can think about leaving your FAANG job in the future to start a SaaS or other project that you feel has a high probability of success and generating quit your job money.

Good luck with your transition.

</comment><comment><USER19> Many large companies will let you take an unpaid leave of absence for a few weeks or months without negatively impacting your career. I also work at a FAANG and have seen colleagues take a months-long leave for personal reasons, then come back and get promoted within a year. I've also seen people go on leave and then decide at the end of their leave to either join another team at the company or just quit and not return.

It can't hurt to ask, and going on leave rather than quitting would mitigate risks #1 & #2.

</comment><comment><USER20> I don't recommend changing teams, unless you've found a perfect match with a manager you trust doing work that excites you. You'll find yourself at the bottom of the totem pole, working on the worst projects, and having to spend year(s) to earn trust again. You'll also have to learn all new domain knowledge, which is the biggest pain of all. At this point, you would've been better off switching companies and getting a raise. All of this will only reinforce your desire to quit.

</comment><comment><USER21> I think an important point that hasn't been brought up is health insurance. You're likely covered under your parents' family plan until age 26. This presents you an ideal time to have no job while still having health insurance. Make this decision to leave a year from now and you'll likely find yourself paying an extra ~500/mth. So this may be the most opportune time to take a 6 month leave.

</comment><comment><USER22> Dude... leave. You have 3 years of expenses left in your account.

You will never be 25 again. You will never have your current energy levels, ideas, and zero responsibilities like right now at any point in your life again. Leverage them, build something great or find happiness.

</comment><comment><USER23> I quit my job last year and moved to Lisbon for three months and had a blast. Spent approximately 15,000 dollars. Came back and got a new job.

Just remember that job hunting can take a few months with interviews and all the rest.

<comment><USER24> How did you spend $15k? That's a ton of money for only 3 months. Also was 3 months too short? Sounds awesome though.

<comment><USER23> I traveled a ton. Went to Algarve, Sicily, and Porto. Flights there and back, rent. It adds up pretty quick.

</comment></comment></comment><comment><USER25> Alt 3, then if need be alt 2. That is unless you HATE the company as a whole. When looking at Alt 2, consider talking with HR the often know of opportunities within a company.

</comment><comment><USER26> yathern, what do you do other than working? If you don't have one or more activities outside work that require constant effort, planning and have an objective, find some. Even if work is an essential part of everyone life, I wouldn't choose it as the main source of fulfilment. Work is for money.

I would "suck it up" (option 1, with a sprinkle of 3 eventually) and revisit this problem in a few years if it still persist.

Also, 1 week is not a proper vacation, it's not even enough to disconnect the mind from the problems you have at work.

Good luck.

</comment><comment><USER27> What are you going to DO for 6 months?

Do you feel like those projects will really make you feel fulfilled?

That's really the only question here right?

</comment><comment><USER28> If you do quit and find yourself looking for a cofounder, ping me.

</comment><comment><USER29> What are you waiting for? Go for it!!

</comment><comment><USER10> This might not be the best place to ask. A lot of people here are quite risk averse, ironically with the startup roots. You'll get a very different response asking on Indie Hackers.

I've done a similar thing myself - sold a company, decided to try some small ideas. 3 years later, I've accomplished nothing. Now my goal is to get into the position you are in and work on side projects from there.

Some tips:

1\. Be careful with social pressure.

A lot of people will resent you quitting their dream job or treat you like some spoiled/privileged guy. You'll be tempted to compromise but it'll make things worse.

2\. Don't fall into the freelancer trap.

I see you're not entirely confident with your finances. It's tempting to take on one or two side jobs.

But freelance jobs are a bigger trap than full time jobs. The burst of money can ruin your financial discipline. There's a lot of unpaid hours - you'll be doing bureaucratic things like setting up bank accounts, taxes, writing proposals, unpaid meetings, marketing. It is possible for someone like you to make $200/hour or $300k working 20 hours/week.

Before you realize it, you're running a software agency that's making $1M/year, but barely profitable and high stress.

3\. You may want a financial safety net anyway.

I'd recommend getting through something like Toptal or Gigster early on if you need it. The approval process can take a month and you can probably forget it later unless you need it. It's long and that's why the payment is way better than something like Upwork.

4\. You may be overestimating your work rate.

Most people I know work about 1-2 hours a day on programming. Full time jobs are great at masking this. Most of the work involves planning something out, writing tests, drawing UI, meetings, refactoring, etc.

As a result, I literally did as much side project work while at a full time job than I did working full time on them.

5\. Ideas are gold.

This is probably really controversial. But I think ideas are greatly underrated.

You've said you lose interest halfway. This is likely because the idea does not excite you. It also won't excite people who join you, or people who listen to those ideas.

Ideas are usually hardest early (where there's too many choices) and easiest in the middle (where it spawns more fun ideas, and starts making money).

When in doubt, go for the shortest route to profitability, or at least lots of users.

6\. That said, are you sure you don't want to be a billionaire?

I mean it sounds ludicrous. It's literally much harder to be a billionaire than it is to sail around the world or climb Everest.

But it's easier to work on large projects than smaller ones. All the ones I have boundless energy for are epic.

Just plan it out and see how far it can go. It's easy to lose interest in smaller ideas.

A similar mistake I did was to join people who could not have epic ideas. I'd spend a month or two building something ambitious, getting investors excited, and the business guy shirks away from the pressure.

Anyway, whatever you choose to do, good luck. Maybe this might not apply to use, but it could be other perspectives worth considering.

</comment><comment><USER30> I envy you my friend

</comment><comment><USER31> I am all for going with your guts, that's how I am built, but I would like to offer a different point of view.

 _" Sucking it up"_ seems to have a bad connotation from two different, even opposite points of view. Either you think of it as a coward move, to go against your "real" self and individuality to conform to a cubicle in order to receive a lot of money. It is almost like you are bribing yourself, having both accumulated guilty feelings of corrupting your ideals. On the opposite side _" sucking it up"_ is viewed as a dilemma only for whining, entitled people, who believe they are above the routine obligations of life in society just because they are privileged — the usual "snowflake" critique.

I believe that both views are a dangerously superficial translation of a more profound choice that can lead to fulfillment and maturity; either way it goes.

The benefits of staying in your job can be more than money. There is a lot to learn in facing a harsh environment, facing uncomfortable obstacles, and dealing with unwelcoming people. If you endure all of that, you will recognize yourself as a stronger person, more professionally competent, more prepared to live and thrive out of your comfort zone. It will practially results in you having a better chance of achieving more things decades from now. It comes with the risk of not being any of that and, in reality, is just you staying in your comfort zone, not learning, not enduring, just following spoken and unspoken rules.

The benefits of quitting your job are the number of opportunities that open once you are out of a clear career path where you know all the rules. You gain freedom. You will learn about new things, new people, new cultures, new games with completely different rules you will have to learn. It comes with the risk of losing focus so much that you also learn, endure, and achieve nothing.

Which way to go all depends on which path _you_ are most likely to pursue learning and personal growth, and which path you are most likely to fall back to a stable and unsurprising state, where you are the same person every day. Each person, at each moment of their lives, have their own better path. I am usually the one to go free and experiment a lot, quitting corporate environment as soon as I am bored. My wife chose to endure in a very demanding job because she believed in the mission (it was a non-profit) and successfully arrived at the other end of a tough year triumphantly, stronger, mature, and competent. Very happy with her choice.

We both might invert our positions in the future, and that's a good thing for you. If you quit now, you can work hard to go back to your position later. If you decide to stay, you can quit a year from now.

Good luck with your choice!

EDIT: Don't take this advice from a workaholic paradigm. When I say "learn and personal growth", it can be a year reading, relaxing, meeting people, travelling. To each his own... learning come in many forms

<comment><AUTHOR> Thank you so much - I like your view a lot. I'll need to chew on it a bit more. I'm considering just saying "let me work on something interesting please" and seeing how that goes. Can't hurt!

</comment></comment><comment><USER32> DO IT

</comment><comment><USER33> If you need to quit for 6 months then go ahead. Learn different in 6 months for your better future,,, BEST OF LUCK......</comment>


Ask HN: How to create a dead zone? - <AUTHOR>

I was reading about the existence of briefcase-sized devices that can block GPS signals within a radius of 20 yards or so and it made me think of other methods one could use to block data transmission. I've also heard of cinemas in Ireland incorporating technology to kill cell phone reception. Do any HN'ers have any experience with this sort of technology or know the science behind it works? <comment><USER2> There are two major methods.

Jamming (active):

Broadcast so much noise at the relevant frequencies that it drowns out any other signal the devices might try to interact with. You throw a lot of power into going LALALALALALALALA at the frequency bands you expect the devices you want to jam to be interacting at, then they can't hear each other over you. It's actually not a particularly hard engineering problem until you start worrying about heat and efficiency - you just build a transmitter and broadcast noise at high power.

Blocking (passive):

Use a Faraday cage or sheer mass to prevent signals from being broadcast into or out of an enclosed area. Mass attenuates signals depending on thickness, density, and frequency. A Faraday cage uses a powered metal mesh to maintain constant voltage at a surface, which can kill most transmissions without the need to turn your building into a bunker.

But assuming this is actually allowed by your local laws, you still shouldn't do it. It's hazardous and unethical since it will also disrupt e.g. emergency communications. If you're bothered by impolite cell phone use, you should pursue a social remedy which allows for extreme cases where manners are not the biggest concern, rather than a technical one which is blind to significant edge cases.

For military applications:

You don't have an enclosed area to work with, so you mostly use jamming devices with as much power as you can manage. But this gets used less than you might think from Hollywood, since a major cost of using them is that you're very loudly shouting your general position to anyone who cares about that and access to some basic electronics. Also the really good ones are set up as buildings or vehicles, it's not going to be small if you want power on the order of "shout so loud a civilian radio station can't hear itself think."

Passive compliments:

Anti-radar stealth technology, which is where you try to make yourself as much of a pain in the ass to make out clearly as you can manage. This is far more difficult since you don't have a controlled environment to play with, but there's still a lot you can do with clever shapes and surface design. Also the point is less to make yourself invisible, than it is to reduce the amount of advance warning that an opponent would get, or their ability to respond to changes in your vector.

Chaff countermeasures are easier, you basically launch a bunch of stuff that's highly reflective at the frequencies people are trying to track you with. I think this is mostly an air-to-air thing. It actually works pretty well, at least in terms of "make it less likely that you get shot down." But if the other guy has reasonably modern targeting systems, you can bet he's got chaff too since it amounts to a thing that shoots out tinfoil confetti.

</comment><comment><USER3> With cell phones it is different than the other applications. The easiest thing to do is create a fake tower that the phones connect to happily, but that has no connection to the outside world.

Otherwise I think you just broadcast noise on the frequency your device is trying to use.

</comment><comment><USER4> I'm not up to par with general physics knowledge but this might be a good place to start:

[http://en.wikipedia.org/wiki/Faraday_cage](http://en.wikipedia.org/wiki/Faraday_cage)</comment>


Filling large arrays with zeroes quickly in C++ - <AUTHOR> https://lemire.me/blog/2020/01/20/filling-large-arrays-with-zeroes-quickly-in-c/ <comment><USER2> BeOnRope article linked in the post is the better article in this case: [https://travisdowns.github.io/blog/2020/01/20/zero.html](https://travisdowns.github.io/blog/2020/01/20/zero.html)

<comment><USER3> Currently discussed at [https://news.ycombinator.com/item?id=22104576](https://news.ycombinator.com/item?id=22104576).

</comment></comment><comment><USER4> ...by calling memset(). The referenced article [1] is much clearer and more detailed. The bit in that article about lowering std::fill to memset but only with character types is interesting, e.g.

[1] [https://travisdowns.github.io/blog/2020/01/20/zero.html](https://travisdowns.github.io/blog/2020/01/20/zero.html)

</comment><comment><USER5> In my opinion the most interesting part - that does not even get addressed in the article - is this:

        std::fill(p, p + n, 0)      : 1.71732 GB/s
        std::fill(p, p + n, '\0')   : 30.3459 GB/s
        memset(p,0,n)               : 30.419 GB/s

Ok, memset ist fast, alright. But why the difference between simply setting 0 vs null char/byte? Is this because 0 is actually larger than a single byte?

<comment><USER6> It's likely because std::fill() is a generic function that can be used to fill any list with any kind of value (even class instances).

There likely is some template specialization in place, that if it's called with a 'char' list, that it gets translated into a call into libc's memset(). That's why the results for the last two are close to identical.

Alternatively, there is no template specialization going on, but it's the case that the compiler detects that this is identical to memset() and converts it accordingly. LLVM/Clang does this through something called the LibCall optimization pass, IIRC.

</comment></comment><comment><USER7> It is a very _bad_ blog post.

Pushing C++ dev to make premature C-style type of optimization is counter- productive... And in this case it is even wrong microbenchmarking.

A simple switch to "-O3 -march=native" flag switch in the makefile to enable vectorization and a proper use of '\0' inverse the result make std::fill() globally faster than memset.

```

page count: 262144, volume:1024 MB

std::fill(p, p + n, '\0') : 25.9191 GB/s

memset(p,0,n) : 25.3283 GB/s

std::fill(p, p + n, '\0') : 25.6167 GB/s

memset(p,0,n) : 25.1646 GB/s

std::fill(p, p + n, '\0') : 25.8355 GB/s

memset(p,0,n) : 25.6276 GB/s

```

It would have been much more productive to describe _why_ std::fill with '0' is slower than with '\0' ( integer vs char )

<comment><USER8> Clang produces exactly the same code for both: [https://godbolt.org/z/C7UTqN](https://godbolt.org/z/C7UTqN) and at -O3 gcc produces almost the same code for both (not at O2 though)

<comment><USER7> This is also mis-interpretation of micro-benchmark and illustrate pretty well that benchmarking this kind of thing is difficult.

If you analyze the ASM generated by the benchmark he proposed, you see something very different of what the godbolt "simple" compilation of micro- isolated function give you.

\- Most call to "fill" are generally transparently replace by a "memset" call _directly_ by the compiler in high level of optimization when done in a normal glibc/GCC linux configuration.

\- It can even being removed entirely sometimes and this is also a problem ( [https://www.usenix.org/system/files/conference/usenixsecurit...](https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-yang.pdf) )

\- This does not seem to occur on godbolt for ...reasons. [https://godbolt.org/z/RGEXH8](https://godbolt.org/z/RGEXH8)

\- Enable vectorization + some compiler flags _can_ in some case make the memset call replaced by a bunch of SIMD code depending of your compiler / compiler options and/or cpu.

\- The intel compiler is (like usual) much more aggressive and replace everything by their home-made memset implementation [https://godbolt.org/z/7RAYGc](https://godbolt.org/z/7RAYGc)

</comment></comment></comment><comment><USER9> Programmers "typically" use std::fill?? Where are those programmers? I've been a professional C++ programmer for a while now and I've never seen it used over standard memset, even on different platforms with different architectures and multitude of compilers.

</comment><comment><USER10> Seems like something that could be done in HW? IDK much about HW architecture, but I'm surprised there's no way a CPU can tell the memory to zero out some range in a single command.

<comment><USER11> Well, on e.g. x86 you have "rep stos" instruction which pretty much amounts to memset in HW.

The operation needs to be blocking otherwise you could of course do it without CPU at all (DMA). But you still have to go through the memory controller and actually write each word of memory.

<comment><USER12> Adding an ability to zero-out arbitrary range directly to dram chip is very simple addition HW-wise.

In fact all ones is not hard either, there were some experiments to give RAM ability to perform simple page-level computations with promising results.

<comment><USER2> Thing is, you still need to zero out any cache line that might be caching those lines, which would conflict with the CPU accessing the cache. Might as well just let the cpu doing the zeroing.

<comment><USER12> Invalidating cache lines is not that hard, it happens all the time. Refilling them from DRAM takes time.

</comment></comment></comment></comment></comment><comment><USER13> I bet it's some standardese about pointer aliasing preventing memset-like performance.

<comment><USER2> The reason is fully explained in BeOnRope article. It is due to a missed optimization in the standard library. The optimizer still fixes the issue at O3.

</comment></comment><comment><USER14> I can't imagine any situation, when this could be the bottleneck.

<comment><USER10> A cloud host launching a new 30GB VM securely?

Edit: nvm they probably do this out of band. But still, things like this.</comment></comment>


"Modern" C++ Lamentations - <AUTHOR> http://aras-p.info/blog/2018/12/28/Modern-C-Lamentations/ <comment><USER3> It's really crazy how much C++ has already evolved since the start of my career (with C++98). C++ has been the millennium falcon of languages; creaky and old, not pretty to look at, but still good where it counts.

That said, I completely switched over to rust many months ago and rarely look back. Rust is a tribute to C++, an incorporation of lessons learned that sheds all of the baggage C++ will never be rid of. Rust also has less of learning curve than C++ (although both are quite high), simply because C++ has so many odds and ends to keep track of these days.

Rust has also made me realize how bad class based OO is as an abstraction. OO glues together operator overloading, methods, inheritance, all into one package. Rust breaks those concepts into component parts that provide much better abstractions with less keywords and jargon to worry about.

<comment><USER4> I'm not sure why anyone today would start a greenfield project in C++ instead of D, rust or Nim. Maybe in niches where C++ is deeply rooted, like games.

<comment><USER5> Because C++ is a stable, reliable and well supported (read: production-ready) language that works on many platforms.

Last I heard D was definitely not all of those (it doesn't even have a straight story on garbage collection, as its creator said himself! [1]), and I'm not sure about Rust or Nim.

[1] [https://www.quora.com/Which-language-has-the-brightest- futur...](https://www.quora.com/Which-language-has-the-brightest-future-in- replacement-of-C-between-D-Go-and-Rust-And-Why/answer/Andrei-Alexandrescu)

<comment><USER6> Rust is used in production by hundreds of companies, from ones as large as Facebook, Amazon, and Microsoft, down to tiny new startups.

<comment><USER7> The visual tooling is still very meh though. Just compare the kind of code completion you get for C++ (even something as gnarly as Boost) in modern IDEs, to what RLS can do in VSCode.

<comment><USER6> IntelliJ is heavily investing, and it's already showing. We are too: [https://ferrous-systems.com/blog/rust-analyzer-2019/](https://ferrous- systems.com/blog/rust-analyzer-2019/)

But yeah, if that matters to you, it's less mature. We'll get there!

</comment></comment></comment></comment></comment></comment><comment><AUTHOR> The statement that I found most powerful:

> Compile time of this really simple example takes 2.85 seconds longer than > the "simple C++" version.

> Lest you think that "under 3 seconds" is a short time – it's absolutely not. > In 3 seconds, a modern CPU can do a gajillion operations. For example, the > time it takes for clang to compile a full actual database engine (SQLite) in > Debug build, with all 220 thousand lines of code, is 0.9 seconds on my > machine. In which world is it okay to compile a trivial 5-line example three > times slower than a full database engine?!

<comment><USER8> The size comparisons are also very useful, if anything to show that even the simple "non-Modern" C++ program already has quite a bit of bloat.

 _Compilation takes 0.064 seconds, produces 8480 byte executable_

I am experienced with Asm so I can come up with an instinctive order-of- magnitude estimate, but even those who aren't should try to roughly estimate how many machine instructions are required to implement that code, and come to the conclusion that _over 8000 bytes_ for three nested loops with not much in them, a comparison, some arithmetic, and a handful of library function calls seems rather excessive. Even 800 would be on the high side --- somewhere around 100-200 _bytes_ is my estimate.

Also, watch this 4k demo (everything you see and hear is generated in realtime by a 4096-byte executable):

[https://www.youtube.com/watch?v=jB0vBmiTr6o](https://www.youtube.com/watch?v=jB0vBmiTr6o)

<comment><USER9> I don't think that this is a very meaningful comparison at these sizes, because it entirely depends on your target. Just compiling a "foo.c" file with "int main() { }" for sole content through "gcc -Os" produces a 16kb executable on my linux machine, but I know very well that the exact same compiler will produce something much smaller if I compile for, say, a bare metal AVR target because the ELF file format has a lot of fluff.

<comment><USER10> > because the ELF file format has a lot of fluff.

I wouldn't call it fluff: even assuming no debugging info (which you won't have in your avr object file) it has info needed at runtime (program start time) such as where to load what into memory, how much initial uninitialised memory to allocate when starting up, etc. It all gets used.

</comment></comment></comment></comment><comment><USER11> Excellent article! I stopped using C++ completely after completing the meme that is posted near the end, I wrote gazillions of lines of C++ over 20 years, used all the gizmos, and then, gradually started to cut down on them, eventually settling on stuff like --no-rtti and --no-exceptions.

It's mostly working on the linux kernel and qemu that showed me I _could_ write extremely nicely structured code, in plain C. Very easy to debug, very readable, very quick to compile and run.

And then one day I looked at one of my C++ module and told myself I actually didn't /need/ all that jazz of classes, namespaces, constructors etc etc. It could be done as a small .h/.c couple with 2 functions...

And that day I started to convert many many lines of C++ to plain C. Because it's /indestructible/, it'll continue compiling and working on /anything/ forever, without having to figure out why the new C++ compiler is throwing you a 10 lines error message just because that codebase is 10yo and isn't up to scratch with the 'new' way of doing things.

I _DO_ miss bits of C++, I miss some of the encapsulation it provides, I miss stack-based objects, and funnily enough, I miss exceptions. But I haven't looked back.

The other points he makes about 'junior hires' is also very valid, with C++ you could /easily/ have a new guy write completely bonkers code, add subtle bugs that takes days to find, much much later. I had my own horror stories about that, and that's another factor that pushed me over the edge to drop the language.

<comment><USER12> > the new C++ compiler is throwing you a 10 lines error message just because > that codebase is 10yo and isn't up to scratch with the 'new' way of doing > things

Does this happen? I thought the committee was so into backwards-compatibility that C++ will also work on everything forever.

<comment><USER11> Sure. I remember one. For about a million years, you could declare a naked virtual method with int blah() = NULL; -- perhaps it wasn't /suposed/ to be used like that according to the standard... but it worked, and was used a lot, as it made perfect sense.

Then one day, you recompile it and no, it /needs/ to be ZERO and not NULL sorry.

But it's just one simple to fix example, in plenty of cases, especially as templates (and especially template instantiations) evolved, the whole thing would come crashing on you. For a while trying to compile templated code on MS, CodeWarrior and GCC was pretty much impossible without deploying ruses that made C preprocessor macros tame in comparison.

<comment><USER7> As you yourself admitted, it was not the standard way of doing things. Ever since the first ISO C++ standard, the syntax was =0. And it was never guaranteed that NULL (which is a macro) expands to just plain 0. So even back when it "just worked" for you, chances were good that it only worked on that one implementation that you had, and would've broken if you tried to use a different compiler.

Judging by your mention of CodeWarrior, this all sounds like war stories from pre-standardization days (and of course it still took a while after ISO C++98 was published, for implementations to actually adopt it).

<comment><USER13> > And it was never guaranteed that NULL (which is a macro) expands to just > plain 0.

True, but is _was_ guaranteed that NULL expands to "an implementation-defined C++ null pointer constant" (C++98 §18.1), where a 'null pointer constant' is "an integral constant expression (5.19) rvalue of integer type that evaluates to zero" (C++98 §4.10). So while it didn't have to be just plain (literal) 0, it _did_ have to be a compile-time constant integer 0, which is otherwise just as good unless you're doing macro magic.

(This differed from C (ANSI era), in which a null pointer constant can alternatively have type (void*), and often does.)

The fact that a pure declaration requires a literal single character '0' (rather than 0) is just one sad example of C++'s ad-hoc irregular overloading of things to mean different things.

<comment><USER7> It may be ad-hoc (although I would argue that "0" in this case is really just a token that's a part of syntax - basically a numerical keyword - so expecting a constant expression is too much). But, in any case, the main point is that it never changed - it was always wrong to use =NULL to denote abstract virtual methods, and there were always implementations that broke that. So it's a strange example of the lack of stability in C++.

</comment></comment></comment></comment></comment></comment><comment><USER14> I think that at this point, C++ has basically to be treated the same as the English language. Sure, you could write sentences that span three pages, employ Shakespearean vocabulary or words that hardly anyone has known since the abolition of Classics from university admissions tests, or encode another layer of meaning in the bit pattern of when you do and when you don't use Oxford commas. What makes something good English communication is not whether you used those features correctly, employed the most in vogue ones or found the "most elegant abstraction" ("there's this one word attested in a handful of 14th century sources that captures exactly what I want to say, so I'll use it without explanation"), but whether you have struck the right tradeoff of minimising the combined effort put in by you and your audience and conveying your message faithfully.

Of course, for English, this is exactly the sort of problem that is addressed by style guides (and teachers/peers reacting to you, and natural selection). I think what we need is more and better opinionated C++ style guides that don't just talk about what line to place your { on, but have the confidence to say things on the level of "std::move may add a marginal amount of efficiency, but greatly detracts from the legibility of code. Avoid using it altogether."

<comment><USER14> Personal opinions on the "right subset" of C++:

* Yes to classes.

* Yes to inheritance and virtual member functions, because interfaces are a very useful and easy to understand abstraction. Moreover, especially for games, idioms such as "class Monster : public DamageableObject" are really the most natural thing. However, avoid situations in which you need dynamic_cast like the plague. No to virtual inheritance.

\- I really wish class memory layout were standardised more, but at least some non-standard assumptions are fairly safe in my experience: e.g. class A : B {...} ... B * x; assert((long)static_cast<A* >(x) == (long)x);

* Before you start using "friend class", consider whether you could get around it somehow. If a class is not public-facing, set everything public and enforce encapsulation by self-discipline rather than language features.

* Yes to templates in their C++ 101 application of making a $type-specialised version of classes and functions. No to using them to perform any real compile-time computation, or anything of the type Boost pulls. No to Boost.

* "Keep the parts of your code that only do C stuff in C".

\- printf over iostream.

\- (de)allocate classes with new/delete, but POD with malloc/free

\- exception: std::string over char* , because it is really that much more convenient

* Yes to lambdas, but only pass them as function arguments if there is no good alternative, because of legibility. Avoid stuff like the for_each(..., []{ ... }) in the Ranges example.

* Yes to STL containers and algorithms, because everyone knows how they work and they are usually good enough.

* Range-based for over for(std::container::iterator i=...). Using the Ranges TS when a plain for loop would do strikes me as novelty-chasing and violates "do C stuff in C".

* Cautious yes to auto. It does somewhat detract from comprehension in some use cases. Don't just auto everything because you are too lazy to figure out the type.

* std::shared_ptr only when you actually think you can't answer the question of what the appropriate point to deallocate a piece of memory is, or at least not without significantly changing the structure of your code.

* Avoid std::tuple, std::variant and other awkward STL attempts to replicate functional language idiom without the syntactic support. It's terrible to read. Unfortunately, STL containers sometimes force you to use pair.

* No to exceptions; their interaction with other language features is awkward, and the eternal difficulties with platform support make me feel no confidence in the reliability of the feature. (I'm unfamiliar with the bowels of the implementation, but it seems like unwinding C++ stacks is fundamentally a hard problem.)

* No to novelty features such as user-defined literals.

* goto only to break out of multiple levels of nested loops.

* Coroutines strike me as something that's unambiguously cool but so far removed from the standard idiom of C++ programming that I'm inclined to say no. Maybe there's an alternative style guide you could write that says yes to coroutines and no to some of the things above. Multi-paradigm should not mean "use all the paradigms".

(I'm very happy to be persuaded otherwise on any of these points.)

<comment><USER7> > However, avoid situations in which you need dynamic_cast like the plague.

You need dynamic_cast for dynamic interface queries ("does this object support X?"), even in the absence of virtual inheritance.

Some would say that there's no downside to always using it when you can. If what you're doing is an upcast, it's a no-op. If it's a downcast, then at least you get an exception instead of an invalid pointer that may or may not blow up if what you're casting is not of the correct type.

> Before you start using "friend class", consider whether you could get around > it somehow. If a class is not public-facing, set everything public and > enforce encapsulation by self-discipline rather than language features.

Why? It's a language feature that's there to help you enforce said discipline. What's the downside?

> I really wish class memory layout were standardised more, but at least some > non-standard assumptions are fairly safe in my experience: e.g. class A : B > {...} ... B * x; assert((long)static_cast<A* >(x) == (long)x);

That the object is allocated at the same address as its base subobject is guaranteed by the standard, if I remember correctly. Your particular assert is not, though, because long is not guaranteed to fit a pointer (and doesn't, on Win64).

> printf over iostream.

Not only you lose type safety, but it's extremely easy to write code that kinda sorta works but actually doesn't. The most common case is passing a struct with a single field to printf - this is actually implementation- defined, and some implementations detect it and treat it as invalid, while others just put the contents of the struct on stack. So it happens sometimes that people e.g. pass std::string that way, expecting it to work with %s - _and it does_... on that one implementation, and for that particular string. Then it breaks elsewhere.

iostream is still bad tho, both design-wise and perf-wise. The answer is actually Boost, which has proper typesafe formatting.

> (de)allocate classes with new/delete, but POD with malloc/free

There's no benefit to using malloc/free whatsoever, and it forces you to cast.

> Avoid std::tuple, std::variant and other awkward STL attempts to replicate > functional language idiom without the syntactic support

Tuple has syntactic support as of C++17:

[https://en.cppreference.com/w/cpp/language/structured_bindin...](https://en.cppreference.com/w/cpp/language/structured_binding)

> No to exceptions; their interaction with other language features is awkward, > and the eternal difficulties with platform support make me feel no > confidence in the reliability of the feature.

If you ditch exceptions, you might as well ditch constructors as well, since there's no way to report errors from them otherwise. You're also forced to use new(nothrow) then. Basically, the language is designed around exceptions, and excluding them is fighting it.

But I don't see the point. C++ exceptions have been supported and stable on all platforms for a long time now. On sane platforms (i.e. not x86, but e.g. amd64), they're also zero-time-cost at runtime for the non-exceptional path. It's not the 90s anymore.

<comment><USER15> > But I don't see the point. C++ exceptions have been supported and stable on > all platforms for a long time now.

How come we don't see exceptions being used in serious C++ projects then (e.g. Chromium and Windows)?

<comment><USER7> Either legacy codebases that have rules dating back to the times when avoiding exceptions actually made sense, or else a cargo cult.

</comment></comment></comment></comment></comment><comment><USER16> I was really looking forward to C++ ranges. However, that blog post by Eric Niebler felt like C++ ranges are trying to get everything right from a cs point of view, but in the process completely ignores usability / legibility, just like the previously introduced list operators that suffer from the requirement to specify start and end iterators. Some of the code samples are an atrocity. That C# example looks so much better to read and easier to understand.

<comment> munk-a I put a lot of value into the maintainability of what I'm writing and I think legible syntax is a language quality that's often minimized but provides a lot of value in terms of labour savings over the lifetime of a project. I've been working in PHP a bunch lately and the expressiveness there is amazingly strong, every time I go back to writing C++ it feels much more cargo-culty.

(Also, PHP isn't perfect, but it's really good at allowing clear readable code, while also allowing terrible code, also the performance is terrible... Basically, don't waste your breath on why PHP is terrible - it isn't, it's a decent language - you're just using it wrong)

<comment><USER17> I concur. My biggest gripe with C++ today is that it's conflating two concepts: imperative programming (IP) and functional programming (FP) via templates.

Imperative programming has no future IMHO. Rust is going to the ends of the earth to make it "safe" but my gut feeling is that it will never be fully statically analyzable. Today I only see needless complexity that distracts from the underlying logic. I lost interest in this style of programming around a decade ago.

Functional programming via templates is an admirable endeavor, and I went all the way to the ends of the earth to make something of it. I was left with code that wasn't reusable (wasn't salable) so in the end, just wasted years of my life on needless complexity.

And both of the above only make sense from a performance perspective. An argument that becomes weaker with each passing year as processing speed improves.

I think the future will be something more like reactive functional programming, written in a high level language like Javascript and only dropping down to bare metal optimizations with something like Rust when necessary. It will work like the UNIX shell (which is the only proven model that's endured). So something like the Actor model where a series of black boxes are wired together with pipes and as much FP as possible, and any IP sections are treated like monads and flagged as having unknown side effects. ClojureScript does something like this, running its FP code to completion and then yielding until more input/output happens on the Javascript side. Another way of thinking about this is a spreadsheet with some imperative code within the cells where needed.

PHP is my favorite language currently because it has some notion of constness and fairly decent higher order functions (but who are we kidding, map and reduce give us everything else). PHP is a conceptually simple language that has some longstanding flaws with naming conventions that make it not as easy as it could be. It's largely succeeded in moving away from object-oriented programming, favoring a fairly simple interface implementation instead. I've never run into the implicit context problems that plague languages like Ruby (where convention over derivation is written into its DNA).

And PHP is fairly fast, on the order of 200 times slower than C++ but probably within the same order of magnitude as the newer C++ methods mentioned in the article. My gut feeling is that proper string handling, with every contingency accounted for, runs approximately the same speed in any language. I'm not willing to spend time and effort trading safety for performance anymore.

<comment><USER18> > Another way of thinking about this is a spreadsheet with some imperative > code within the cells where needed.

Uhm, how are cell _functions_ in spreadsheets an example of imperative programming?

<comment><USER17> Oh I was thinking of Visual Basic Excel macros, since VB is imperative.

I'd like to see a spreadsheet that uses something like Elixer or Clojure though because then any cells that don't have monads could be fully statically analyzed and form a purely declarative solution.

In other words, the cells could be decomposed further into cells containing individual functions instead of composed statements. That way the spreadsheet could be transpiled into lisp or a syntax tree. I'm using all these terms loosely, but they are equivalent.

</comment></comment></comment></comment></comment><comment><USER19> > Cognitive load is important

This, to me, is a very powerful statement that points to the major change between old C++ and the current model (which is IMO is a monster). It may have gained a lot in the process, but at a huge cost to conciseness and clarify of written code. And this may be fatal for a general purpose language.

Maybe as other languages with focus on cleanliness and clarity (Pythons, Kotlins and Haskells of this world) become fast and powerful enough for large projects the use case for simple and clear C++ code decreases. Then C++ can still provide benefit for, say, intermediate representations. But this complexity increase may be one of the last nails into its coffin as a general purpose language. My 2c.

<comment><USER20> > clarity [...] Haskell

no. Just no. Haskell is a lot like C++.

<comment><USER21> For the case in point, Haskell is much clearer. You can do Pythagorean Triples in one line. Google it if you don't believe me.

However, in general, (in my opinion of course) the cognitive load for Haskell is low as a novice, but gets higher and higher as you go down the rabbit hole toward learning, understanding and applying all of its power - which is constantly evolving not unlike C++.

<comment><USER22> Just because you can do it in one line doesn't mean that it has low cognitive load. In fact it probably increases the load since you have to think about all of the abstractions that are built into the language instead of reading them off of the screen. The three for loops version lays everything out right in front of your eyes.

<comment><USER21> Perhaps you're right. On the other hand, list comprehensions are a core feature of Haskell, which does not have something akin to a "for loop," so it's something a novice would be familiar with as part of learning the core of the language, just as a C++ novice would learn about "for loops."

So, I would argue the cognitive load is similar, and both lay everything out right in front of your eyes. Although, Haskell will do it with less syntax (alternatively, read that as "with more syntactic sugar").

</comment></comment></comment></comment></comment><comment><USER23> I work using C++17 for high performance applications, and I can relate to a lot of these gripes. I think it's a fair point that C++ is unreasonably complex as a language, and it's been a serious problem in the community for a long time.

One part that really struck me as odd is the focus on non-optimized performance. To me, this is an important consideration, but not nearly as important as optimized performance. Using techniques like ranges can definitely slow down debug performance, but much of the time it _dramatically increases_ optimized performance vs. naive techniques.

How do ranges speed up optimized builds? One of the best techniques for very high performance code is separation of specifying the algorithm and scheduling the computation. What I mean by this is techniques like [eigen]([http://eigen.tuxfamily.org/index.php?title=Main_Page](http://eigen.tuxfamily.org/index.php?title=Main_Page)) and [halide]([http://halide-lang.org](http://halide-lang.org)) where you can control _what_ gets done and _how_ it gets done separately. Being able to modify execution orders like this is critical for ensuring that you're using your single-core parallelism and cache space in an efficient way. This sort of control is exactly what you get out of range view transformers.

<comment><USER24> > I work using C++17 for high performance applications

> One part that really struck me as odd is the focus on non-optimized > performance

I'm guessing your high performance applications aren't interactive? When your application has to respond to user input in real time, a binary that is 100x slower than real time is completely useless. You can't play a game at 0.3 frames per second.

I would be interested in seeing an example of how Halide-like techniques can be used with C++ ranges. I am skeptical that you could get the kind of performance improvements that Halide can achieve. And of course you won't get the GPU or DSP support that is really useful for that kind of computation.

<comment><USER23> Well, you aren't rebuilding your binary every frame, are you? I might be missing something.

Also, I think build time is super important in most contexts - what I think is less important is runtime speed when you've disabled all optimizations.

<comment><USER24> Are you confusing build time with performance of the resulting binary? I'm talking about the latter. Both are important and both are lacking with modern C++ in debug mode.

Edit: I see, I carelessly used the word "build" to mean a compiled binary, which was ambiguous. I've changed it.

<comment><USER23> Thanks for the clarification. I guess like all trade-offs, it's context dependent. I see the advantages of having a realtime usable non-optimized build for debugging. Since I use modern libraries like Eigen, that option has not been available to me for some time.

With "modern" techniques, the performance ceiling is a bit higher - <USER2> that benefit is worth it depends on a lot of factors.

</comment></comment></comment></comment></comment><comment><USER25> C++ compilation feels like what you would experience if you could only understand a sentence by looking up each of its words, and each word was defined in a separate book, and each book was in its own shelf in an enormous room full of shelves, and one of the shelves was in a library on the other side of town, and one was in Alexandria.

</comment><comment><USER26> I have a large C++ code base (mostly C++11), and I agree with this article. My code base is hilariously slow to compile, and the biggest single culprit is the variant header. I sometimes wonder whether I should just remove all the users to save time.

To add insult to injury, std::variant is a rather bad approximation of a sum type. variant<int,int> is only partially functional, and you can't disambiguate the two ints by name the way you could in, say, Rust.

I think that a lot of these problems stem from two systematic problems

1\. The desire to avoid modifying the language. A good modern language should have sum types. Heck, the ranges paper explains how ranges fundamentally have the wrong semantics wrt const and that this can't be fixed without changing the language. So _fix the language_ , please!

2\. The fact that even new libraries are specified to be header files. Surely there could be a variant _module_ even if modules aren't really for full deployment.

<comment><USER9> > My code base is hilariously slow to compile, and the biggest single culprit > is the variant header.

yeah, <variant> is so slow that I wrote my own (domain-specific but could be repurposable) variant-like code generator. It keeps the same API but makes everything sooooooooooooo much faster to compile - especially the visitations with multiple arguments.

(ugly fugly, full of dirty hacks, but it only had to run once or twice : [https://github.com/OSSIA/libossia/blob/master/tools/gen_vari...](https://github.com/OSSIA/libossia/blob/master/tools/gen_variant/gen_variant.cpp))

</comment></comment><comment><USER27> I'm working with C++17 right now and I personally can relate to the author. Reading the discussions around C++20 has been an eye-opening experience for me. C++ was already a difficult language but has become a behemoth of complexity. But it has to be said that once you know "Modern" C++ it's a very productive language.

Somehow, it _feels_ good to use it and after a while you find yourself reveling in complexity. I'm almost ashamed to say really.

<comment><USER28> My personal favorite metaphor for the complexity of C++ (and other languages, like Scala) is a hamster wheel. You enjoy writing it, but from the outside it feels a bit ridiculous to see the amount of energy dedicated to problems of your own making.

R-value references, for example. This is entirely a problem that C++ has created for itself with its copy semantics. From inside the C++ ecosystem, the language feature makes sense, but from outside the C++ ecosystem, the idea that there are now two types of references and two types of copy semantics triggered based on the implicit interaction of reference types, and you sometimes need to do idiomatic things like declaring undefined private copy constructors to lock down unintended implicit behaviors relating to copy semantics for R-value references... yup, hamster wheel.

C++ isn't the only language where I get this feeling. I think Scala is pretty guilty of this too. It's not that I can't grok it if I wanted to (survived my share of proof based, pure theory math classes back in college), it's that I think it's entirely too much energy to be spending on mundane code.

<comment><USER20> > two types of references

include normal pointers and it's three.

<comment><USER29> add const-ness and you get *2. Then ponder what `const &&` even means.

</comment></comment></comment></comment><comment><USER30> Things developed by committees often tend to lack the market-driven features of privately-owned products. On the other hand, privately-owned products are just that, and suffer from the usual consequences of closed systems. Would be nice if there was an intersection of the two, somehow (C# sort of comes to mind, as it was privately developed but has open-source implementations).

The one I always think back to is DirectX vs OpenGL. DirectX has had historically better driver support, documentation, and ready-to-compile example code (OpenGL has caught up a lot admittedly over the years, due to greater proliferation of OpenGL-driven devices).

<comment><USER31> Java has achieved a lot of this.

</comment></comment><comment><USER32> I echo the sentiment of the author. Also, It seems to me that in all three articles, what comes through is not that ranges will be cool or useful, but that coroutines are awesome. With this, I couldn't agree more. I sometimes wonder if we didn't have discussions about or these tertiary[1] TSes, we'd have coroutines in C++17 already.

[1] subjective opinion

</comment><comment><USER33> It's amazing how much of a stir the C++20 ranges have caused. Very entertaining to follow.

</comment><comment><USER24> I haven't seen anyone mention [https://zapcc.com](https://zapcc.com) yet. I've been testing it and it works as advertised, cutting compile times by a factor of 5 or more in real world projects with zero code changes. It's both easier to use _and_ faster than C++ modules could ever be, even in theory. It could go a long way to addressing one of Aras's complaints.

In order to improve C++ compilers, we are going to need to throw away some old assumptions about how they should work. Zapcc challenges the notion that the compiler should exit after compiling each file and start over with the next one. Perhaps some of the other issues Aras points out could be addressed by rethinking some assumptions. For example, tighter integration between the compiler and debugger could potentially make it feasible to debug optimized builds.

<comment><USER9> > Zapcc challenges the notion that the compiler should exit after compiling > each file and start over with the next one.

this idea has been floating for a _long_ time :

ftp://gcc.gnu.org/pub/gcc/summit/2003/GCC%20Compile%20Server.pdf

and

[https://gcc.gnu.org/wiki/IncrementalCompiler](https://gcc.gnu.org/wiki/IncrementalCompiler)

sadly, it seems that modules has put these approaches on hold, even though I am pretty sure that modules won't solve the problem.

</comment></comment><comment><USER34> > the time it takes for clang to compile a full actual database engine > (SQLite) in Debug build, with all 220 thousand lines of code, is 0.9 seconds

I immediately thought about some Java (Gradle) projects at work that take 10 minutes to build, and other transpiled javascript projects that take an hour or so. What am I doing with my life?

<comment><USER35> An hour? For JavaScript? Wtf?

<comment><USER34> Babel + a million lines of Javascript, and a few other build steps. Durying development, only the required modules are built, so it takes only a few minutes to get up and running, but a full build takes ~1 hour and produces ~100mb in bundles.

</comment></comment></comment><comment><USER36> Good article. Compilation time is indeed an important issue, and the main reason why I use C instead of C++ as much as I can.

</comment><comment><USER21> As a long time lover of functional programming, and have not used C++ professionally since the 90s, this whole article feels sort of damning about the future of the language from a functional perspective.

The calculation of Pythagorean Triples is literally one line in Haskell (a language I have used for almost three decades), as a simple list comprehension. It also can then be consumed or used in any fashion, and is calculated lazily.

While I am not particularly adept at other "functional" languages, I would imagine similar brevity in F#, OCaml and possibly even Python (which I believe has some sort of list comprehension syntax).

</comment><comment><USER37> How about going back to and forking C++98 (or whatever version preceded the first syntacical horrors such as reinterpret_cast<>) and start over with more C-like additions.

<comment><USER38> Yeah but what about implementing the real compiler after the spec? While you're at it why not make it a different language?

</comment></comment><comment><USER39> printf code should not appear in timed scope.

<comment><USER40> Why not? It clearly doesn't add anything meaningful to the run time, and helps avoid the question of whether the loop got optimised out.

<comment><USER39> I timed his code on Windows and it certainly adds to the runtime. To prevent the loop from being optimized out I created a pre-sized vector to index the ith ouput and print it outside the timed scope.

I have worked in the game industry and have many bad experiences with printf/logging consuming so much performance it makes games unplayable.

</comment></comment></comment><comment><USER41> I wonder if the state that C++ finds itself now is a result of sub-optimal compromises between different interests in the standards committee. Year long arguments of what ought to be included or how they ought to be done may cause folks to lose sight of what's important, you see.

I still like C++ though. At least a subset of it anyway.

</comment><comment><USER42> A pretty good summary of the state of C++. I actually enjoy the language and most of the new features. The 'modern' part is not at fault here. This has always been a problem. The cult of generic metaprogramming was always a pain to deal with. In part, the new language features can help reduce over reliance on templates. As a community we must push for features that can get is out of this situation, like a sane modules system.

I think Bjarne Stroustrup is partly to blame here. He has succeeded in creating a versatile and popular language but has given little priority to problems like build time, error messages and debug performance. These sound like petty, practical problems that the tooling guys should eventually figure out. Except they aren't. They are hugely dependent on the language design.

Another thing we are missing is a high profile figure that will show the way on correct patterns and that will literally publicly shame the authors of too "meta" template heavy libraries. You are not smart if you are writing these monstrosities. It should not feel good. Making it simple requires much more intelligence.

<comment><USER43> > publicly shame the authors of too "meta" template heavy libraries

Wouldn't they say we should instead shame the people who can't read them? What makes you right and them wrong?

<comment><USER44> It's hard to change people, it's easier to change code.

</comment></comment></comment><comment><USER45> I think that people have been taking Eric example too seriously. I can't speak for him, but I doubt that Eric was suggesting that such code would be routinely written with the range library, he was just showcasing as much as possible of the range library in as short an example as possible. In a way it was designed to maximize complexity.

These excesses have in fact a positive side: the extent that people will go to get a specific functionality (in this case lazy ranges) as a library is a signal that the feature should be part of the language.

This happened with lambdas, boost.lambda, boost.phoenix and to a lesser extent boost.bind showed that the functionality could be implemented as a library, people stated playing with it and demanded the functionality to be baked into the language.

A similar thing is happening now, there is a push to extend the proposed await syntax to become a more general (and more efficient) continuation syntax that, among other things should lead to built-in support for lazy ranges.

<comment><USER46> I can say that I have been guilty of writing such code, and people I worked with have too. When you are given a tool, you want to use it, especially if it gives you a lot of bell and whistle.

</comment></comment><comment><USER8> The desire to overcomplicate and overabstract things does seem to have taken hold in the C++ community within the past few years. It's not anything new, however; just that for C++ to get the "Modern" treatment, is relatively recent. (Look at the Java and C# communities for example. What they don't have in terms of complexity in syntax, they make up for with an abundance of classes.)

</comment><comment><USER47> The problem is not modern c++, it's only when c++ tries to be a functional language that it becomes unreadable.

As I see it, there are multiple "sub languages" in c++:

-Macros: use as little as possible.

-Classic C: use only when interacting with C libraries, or in the few cases where it's more convenient (printf over cout).

-Classic C++ (classes, etc): use it all the time.

-Template meta programming: use only for simple things, eg containers.

-Functional C++: try to avoid.

</comment><comment><USER48> I want to say one word to you. Just one word. [...] Are you listening?

Modules.</comment>


Obama tries to ease NSA tensions and insists: Europe spies on US too - <AUTHOR> http://www.guardian.co.uk/world/2013/jul/01/obama-europe-monitoring-data-surveillance

<comment><USER2> "But all the other kids are doing it, mom!"</comment>


10 HTML tags which are not used as often as they deserve - <AUTHOR> http://css.dzone.com/articles/10-html-tags-which-are-not <comment><USER2> <button> used to be way uglier than <input type=button> on Safari --- looked like a Windows button instead of a Mac button. Is it prettier now?</comment>


US Tax Filings are down 5% as of April 15, 2017 - <AUTHOR> https://www.irs.gov/uac/newsroom/filing-season-statistics-for-week-ending-april-14-2017 <comment><USER2> In the past, many illegal immigrants filed taxes to get refunds. This year, many tax preparers are reporting a large decrease in illegal immigrants using their services, because of fear that the information would be shared with the federal government.

[http://www.npr.org/2017/04/17/523634144/tax-filings-seen- dip...](http://www.npr.org/2017/04/17/523634144/tax-filings-seen-dipping-amid- trump-crackdown-on-illegal-immigration)

<comment><USER3> I seriously doubt this could account for a 5% drop in filings. Also, the primary reason that illegal immigrants file tax returns is to obtain refunds. Yet the total dollar amount of refunds disbursed actually _increased_ this year despite the large drop in filings. If the drop in filings were immigration related, a similar drop in overall refunds would have been the likely result.

<comment><USER4> Why not? 4.5 million people without SSNS filed last year.

[http://www.npr.org/2017/04/17/523634144/tax-filings-seen- dip...](http://www.npr.org/2017/04/17/523634144/tax-filings-seen-dipping-amid- trump-crackdown-on-illegal-immigration)

<comment><USER5> The drop in returns received was 6 million.

</comment></comment></comment></comment><comment><USER6> Could the 5% drop be accounted for considering the numbers are for April 14th 2017 and not after the filing deadline of April 18th 2017? Seems like many people would file and/or postmark their returns Monday or Tuesday.

<comment><AUTHOR> Tax day in 2016 was also April 18th.

<comment><USER7> Why not use stats from April 18th then?

<comment><AUTHOR> Cause IRS devops isn't there yet. They (collect?) release metrics on Fridays.

<comment><USER8> It is Friday? Roughly 4PM on Friday, which means they'll likely be closing down shortly. Seems odd for them to do it as such a last minute thing.

</comment></comment></comment></comment></comment><comment><USER9> I have to wonder how politically motivated this might be.

I met an older couple a while ago who refused to file taxes to protest the war. Wasn't illegal mind you. They simply made sure that they didn't earn more than cut-off ($9k I believe). They just travelled around in an RV, played folk songs, and made their living off the kindness of strangers and random odd jobs.

<comment><USER10> I can imagine the "effectiveness" of this protest... I feel like if you are going to endure personal sacrifice to make a stand, you need to consider what the overall impact/objective is and make sure you are doing the right thing to achieve that objective. There were probably far better paths to go down for these folks.

<comment><USER11> I don't think of it as a personal sacrifice. I longer have the blood of innocents on my conscience. Also: I now own most of my own time, which is my highest value. Low consumption living isn't the sacrifice I thought it would be when I started.

To each their own.

<comment><USER10> Then they weren't really protesting anything. Just living normally.

Also, for me the sacrifice would not be low consumption living but rather riding around in an RV singing folk songs. Sounds like torture. As you say, to each their own. I actually really enjoy what I do for a living.

</comment></comment></comment></comment><comment><AUTHOR> Year on year chart: [https://apps.axibase.com/chartlab/626f6fb9/3/#fullscreen](https://apps.axibase.com/chartlab/626f6fb9/3/#fullscreen)

</comment><comment><USER12> The job reports numbers looked really good for 2016 but there were always questions about the "missing workforce."

A possibility I haven't seen raised yet in this thread is that more people are below the threshold to file, although 5% seems strikingly high.

</comment><comment><USER13> Are there any statistics on how many people file a Form 4868, the 6-month extension of time to file? Since 2006, no reason is needed and it's granted automatically, but this wasn't initially well known, so I'd expect usage of it to be slowly increasing as word gets around. But I haven't found any published numbers.

<comment><USER14> You still have to pay any taxes owed at the time you file the form. That may not count as "filed", though.

<comment><USER15> True, but if you want to maximize a refund without a re-filing, this might be one way people justify the decision.

</comment></comment></comment><comment><USER16> A bit off topic, but I'm going to rant here anyway.

I filed using the Free Fillable Forms. They got rejected with an XML validation error. OK, I'm a programmer, I can (and did) figure it out from that. But most people aren't. Imagine that your grandmother is filing her taxes, and gets an XML validation error. What is an XML validation error going to mean to her?

Now, they've got a handy Web tool that you can paste the error message in, and it will tell you what's wrong. But why should you have to? When they email you that your submission failed, why don't _they_ run the error message through that tool, and mail you the results?

<comment><USER17> Free Fillable Forms is made by Intuit. If you look at the network tab in your browser's developer tools, you will see that it makes requests to Inuit APIs.

They have an incentive to make the service as terrible as possible while still technically being usable.

I believe we'll be stuck with this mess so long as the IRS partners with the Free File Alliance.

<comment><USER11> Well, if they're Inuit APIs, I can see why there might be hangups. Something's bound to go wrong between here and the Arctic regions.

:)

</comment></comment></comment><comment><USER18> It could be because the deadline was the 18th this year.

<comment><USER19> They were due on the 18th last year as well.

<comment><USER20> But not on Easter weekend

</comment></comment></comment><comment><USER21> Out of the people returning, do we know how many fall under the income requirements? Is it possible to ascertain those who aren't paying taxes out of protest?

</comment><comment><USER22> So the national debt is about 70x the annual tax revenue?

<comment><USER23> US individual income taxes are about $1.8T a year (the $250B number in the link is refunds). There's also about $1.2T in payroll taxes paid by employers, $500B in corporate taxes, and a few smaller things like tariffs and interest, etc., adding up to a little over $3.5T total revenue per year.

The current gross national debt is just shy of $20T. So, that's about 6x the annual government revenue.

In theory, national debt is "good debt" like a home mortgage, and having a home mortgage worth about 6x your salary seems pretty healthy.

<comment><USER24> Do you know of any good articles explaining the concept of 'good debt'?

I understand the position that govt taking debt out if the funds can increase economic growth->more tax revenue. However, this concept seems to break down when debt is carried over year to year and used to pay interest expense on other debts.

<comment><USER25> If you can borrow money at X% and put it towards a productive use that generates Y% returns, then it is worthwhile to do so when X < Y. The government can currently borrow money at around 1-3% interest [0], depending on the length of the term.

Presumably, the return you can generate from borrowed money diminishes as you borrow more money, so "good debt" is some amount of money that you have borrowed that allows you to be more productive and pays for its own interest, in a sense. But borrowing even more than that would start to become less useful, and drag down your overall return.

[0] [https://www.bloomberg.com/markets/rates-bonds/government- bon...](https://www.bloomberg.com/markets/rates-bonds/government-bonds/us)

</comment></comment></comment></comment><comment><USER26> Hm, I wonder if that implies that more people waited closer to the final deadline this year?

<comment><USER27> Due tomorrow, do tomorrow.

A lot of people wait till the final deadline since e-filing is so easy. Or at least that's how I tend to do it.

<comment><USER28> That's what I thought, until the IRS needed a credit card last 4 digits and phone number to confirm my identity, and said that my phone company couldn't verify my identity...?

What an awful system. I probably wound up a day late with the postage because of that, but those assholes are lucky I filed at all. I was about ready to just throw my 1040 in the trash chute and give up my rebate as a lost cause. My time is worth more than this antiquated horseshit, and if I've learned anything from my grandpop it's that audits don't mean shit if you just keep ignoring them.

So, there's your procrastinator's attitude in a nutshell I guess.

<comment><USER29> You can ignore audits?

<comment><USER28> Sure. If you aren't self-employed, your employer already pays your taxes and you're likely owed money by the IRS. It's your choice if you don't want to collect it.

If you're self-employed and not reporting income...well, that's another story. But this is terrible advice that you should definitely ignore, anyways.

<comment><USER29> I didn't ask if you can avoid filing taxes or collecting the money you're owed; I asked if you can ignore audits, since the claim was the latter.

<comment><USER28> Right, and it really depends on how serious they are. If they think you owe a lot of money, then no, you cannot ignore them. If they think you're just an asshole who can't be arsed to deal with them or is not capable of doing so, they really aren't going to do anything.

Like I said, my grandfather owns a business and hasn't filed in decades. It caused my Uncle some serious consternation when he took the reigns, but he never faced any consequences in the form of being held in contempt, asset seizure, etc. Just some nastygrams every now and again.

But again, this is awful advice; I was mostly being facetious. You should not just outright ignore your taxes, you should at least make a desultory effort to get SOMETHING in. But damned if I'm going to bother pulling together any more forms than are in arms/web's reach, or mail in anything more than the bare minimum.

</comment></comment></comment></comment></comment></comment></comment><comment><USER30> They will be down 25% next year I imagine ...

<comment><USER31> I'll take that bet.

</comment></comment><comment><USER32> This makes sense because the last day last year to file on time was the 14th or 15th whereas this year it was 17th.

Returns will probably be higher this year once you account for that last weekend + Monday.

<comment><USER19> Incorrect, April 18th was the last day to file in 2016 as well.</comment></comment>


Maths study shows conspiracies 'prone to unravelling' - <AUTHOR> http://www.bbc.com/news/science-environment-35411684 <comment><AUTHOR> The research examines how long alleged conspiracies could "survive" before being revealed - deliberately or unwittingly - to the public at large.

Dr David Grimes, from Oxford University, devised an equation to express this, and then applied it to four famous collusions.

The equation developed by Dr Grimes, a post-doctoral physicist at Oxford, relied upon three factors: the number of conspirators involved, the amount of time that has passed, and the intrinsic probability of a conspiracy failing.

He then applied his equation to four famous conspiracy theories: The belief that the Moon landing was faked, the belief that climate change is a fraud, the belief that vaccines cause autism, and the belief that pharmaceutical companies have suppressed a cure for cancer.

Dr Grimes's analysis suggests that if these four conspiracies were real, most are very likely to have been revealed as such by now.</comment>


Show HN: Who's going to Startup School? - <AUTHOR> http://whosgoingtostartupschool.com/

<comment><USER2> What framework did you use to build it?

<comment><AUTHOR> Express</comment></comment>


A decent way to change your desktop image - <AUTHOR> https://github.com/chrishunt/desktop

<comment><USER2> A decent way to change your desktop image (on a Mac)

<comment><USER3> Is there any other OS?

</comment></comment><comment><USER4> Thank you!

For the past couple of years I've been using Kuvva.com to do this: in addition to having a nice selection of wallpapers their Mac app also correctly keeps the wallpaper the same on all monitors/spaces.

But with this gem I can use my own desktop pictures and still have consistent images across virtual and physical screens!

</comment><comment><USER5> I need that terminal and color scheme, Where can I get it?

<comment><USER6> I'm not certain about the exact color scheme, but my terminal looks pretty similar. I use a ZSH shell, and I use Oh My ZSH to manage my configuration. The ZSH theme I use is called "amuse", and it looks pretty similar to this one. Hope that helps!</comment></comment>


Ask HN: What's your top plugin/tool to help consume ever-increasing information? - <AUTHOR> Recently I discovered https://github.com/igrigorik/videospeed a chrome plugin. And now I can easily breeze through most videos on internet at 2x-3x speeds. It's been awesome! Saves lot of time and increases efficiency. It was a very pleasant discovery. Would love suggestions for similar everyday tool/plugins to deal with ever-increasing interesting content. <comment><USER2> I use Imagus. It expands images on mouse hover. Basically you can look at facebook, amazon, and many other sites that use thumbnails by just hovering over the image instead of clicking on it and waiting for all of the additional crap to load.

[https://chrome.google.com/webstore/detail/imagus/immpkjjlgap...](https://chrome.google.com/webstore/detail/imagus/immpkjjlgappgfkkfieppnmlhakdmaab)

<comment><AUTHOR> Nice. This is quite cool. Just saw the linked xkcd comic by just hovering on the links in some of hackernews comments :)

</comment></comment><comment><USER3> I use google keep to save links, pictures, voice recordings right now. However, for long term storage, I have not come up with a great solution to keeping everything organized.

</comment><comment><USER4> Pocket (a read it later app).</comment>