MinUnit – A minimal unit testing framework for C (2002) - <AUTHOR> http://www.jera.com/techinfo/jtns/jtn002.html <comment><USER2> Why not just 1 line? Of course, the application will halt after one test fails, but some people like it this way.

        #include <assert.h>

Usage:

        void test_foo() {
            assert(foo() == 4 /* foo should be 4 */);
        }

Output would be something like

        Assertion failed at "foo() == 4 /* foo should be 4 */"

If you run the application in a debugger like GDB, you can see the frame when the abort trap is called.

<comment><USER3> I actually implemented a basic unit test framework in C yesterday and started with basic asserts like you point out, however once I got it working I switched to return values not unlike TFA. The obvious problem with assertions in that they kill your test program immediately at the first failure instead of doing additional tests and potentially give a clearer picture of what's broken exactly. They're also not very flexible if you want to customize the error message since they only stringify the assert parameter. "Assertion `ret == 0' failed." is not super helpful. As sibling comments mention there are ways to work around that by using literal strings and && but it doesn't help if you want to wrap around tests using helper functions etc...

I'm also tempted to say that if you need to use GDB to figure out where your tests have failed exactly your framework is not particularly user friendly. Normally when a test fails it should be pretty clear where it failed and why. The root cause of the issue might be further away of course but then again assertions won't help with that either.

<comment><USER4> Assertions don't actually have to kill the program. They send an abort signal, which means you can catch them with a signal handler.

I similarly wrote a simple C testing framework for a little project I was working on, based on assertions. The framework uses signal handlers for aborts and segfaults, and then setjmp/longjmp to handle resuming the test suite at the next test case. This has the particularly nice effect of turning segfaults into (marked as such) test failures, instead of just terminating everything. It probably wouldn't be too hard to fit custom messages in too, but I hadn't felt the need yet.

<comment><USER3> I concede that being able to handle segfaults as test failure is a very nice feature, however dealing with signal handlers is a bit more involved that simply using return values and I believe that it might cause portability issues (does it work on Windows for instance?).

I agree that for a decent test framework it might be the best approach but I think at this point we're no longer talking about "a minimal unit testing framework" which was the point of TFA.

</comment></comment></comment></comment><comment><USER5> One thing I'm pretty doctrinaire about when it comes to this sort of thing is printing out more than just a simple message. Quite often, this makes the problem obvious with no need for deeper investigation.

To do this I have a bunch of macros like this:

        /* check A and B are equal. */
        #define EQ_II(A,B,M) (CheckEQII((A),(B),M,#A,#B,__FILE__,__LINE__))

You use it like this:

        EQ_II(i,3,"blah blah blah");

CheckEQII looks roughly like this:

        void CheckEQII(int64_t a,int64_t b,const char *message,const char *a_str,const char *b_str,const char *file,int64_t line) {
            if(a!=b) {
                printf("%s:%" PRId64 ": test failed: %s\n",file,line,message);
                printf("    Values not equal.\n");
                printf("    Got expr    : %s\n",a_str);
                printf("    Wanted expr : %s\n",b_str);
                printf("    Got value   : %" PRId64 " (0x%" PRIx64 ")\n");
                printf("    Wanted value: %" PRId64 " (0x%" PRIx64 ")\n");
                DEBUG_BREAK();
                exit(1);
            }
        }

(DEBUG_BREAK breaks into the debugger if you're running in the debugger.)

The FILE:LINE notation is probably clickable in your favourite text editor. (For VC++, use "FILE(LINE):". Just do #ifdef _MSC_VER or something.) Very convenient if you run tests as part of the build.

And you can flesh it out for strings, arrays, floats, doubles, and all the rest. You can fit everything you need into about 500 lines.

This isn't quite as impressive as the 3 lines here, but compared to something like Catch - which is a huge amount of C++ code, crazy C++ code to boot, that adds literally _seconds_ to your build time - and, no, the fact that seconds is a drop in the ocean in C++land is _not_ an excuse - it's in the same ballpark. At least, its extra utility should prove, over the course of a project, in my view, commensurate with the extra LOC.

<comment><USER6> That's why I love pytest.

You just `assert` an expression, and on failure it'll break down each sub- expression and show whatever it yielded, plus by default it captures all output (stdout and stderr) and prints it out only on failure (so logging and other console output is not painfully annoying while testing) _and_ the fixtures systems is just fantastic _and_ parameterised tests make for much clearer data-driven (/table-driven) tests _and_ the tests selection at the CLI is awesome.

And all the complexity is in the test framework and runner, all you do is write

        def test_thing(a_fixture):
            assert foo(bar) == a_fixture.some_thing()

or whatever.

<comment><USER7> On top of that, it'll compare complex structures to each other, so you could have a very large list of dicts that contain a custom data structure and it'll show you a diff and exactly where the mismatch is. Then it can auto-drop to the debugger and you can inspect previous variables to inspect the root cause, if not immediately apparent. Going back to C land, as much as I enjoy it, the tooling feels like the stone ages. I get that it's a lot harder for a language that compiles down to machine code, but dang.

<comment><USER8> Static reflection is one of my most looked-forward-to features in C++2x. All the information needed to introspect complex data structures is available to the compiler. We just need a way to access it.

</comment></comment></comment></comment><comment><USER9> So, the revelation is that a unit test is an if statement, and if you wrap that into a macro you can call it a framework.

<comment><USER10> For many novice engineers this is a huge revelation.

<comment><USER9> Really? Is it perhaps because of those libraries that do their best to make test call sites look like weird pseudo-English. Stuff like having a library function named it():

it("should be confusing", function() { ... })

<comment><USER11> It always really bothered me that there had to be so much syntactical sugar on top of testing frameworks. Unit testing should be written in exactly the syntax of the language you are working with. I don't want to have to carry that additional crap in my working memory while writing code. I can't stand having to look up Gherkin syntax just to write a few dumb tests.

The only reason I see the usefulness of additional syntax just for tests is the case to have non-technical people writing tests. From my experience, this is a terrible idea.

<comment><USER12> OTOH never rule out how KISS is the enemy of billable hours and don't underestimate CDD's ability (consultability driven development) to come up with solutions to non problems.

YMMV, the BDD implementations I've seen so far did not convince me of its value to put it mildly.

<comment><USER13> I never understood the value of Gherkin/Cucumber style testing until I worked with a QA engineer. The engineer started writing the tests (in Cucumber format) as a way to write __manual__ tests: they allow you to write 'do this, then that, verify this' in a structured manner. Automating this was a secondary goal: once you have (relatively) structured manual tests, it's nice if you can automate them, while still retaining the possibility to run them manually. This is actually important, and they would typically be end-to-end UI tests, which can be quite fragile when completely automated. Having them in a human-friendly format allows you to have a manual fallback if e.g. a changed identifier blocks you from running the automated test.

<comment><USER14> Yep. The value of Given When Then ends, not begins, once you have implemented the steps with some automation.

</comment></comment></comment></comment></comment></comment></comment><comment><USER15> (2002) according to the HTTP headers:

        $ curl -s --head http://www.jera.com/techinfo/jtns/jtn002.html | grep ^Last
        Last-Modified: Fri, 06 Sep 2002 07:16:46 GMT

</comment><comment><USER16> I'm not very familiar with C and macros so it took me a while to realize that this line:

      mu_assert("error, bar != 5", bar == 5);

will return out of the function before reaching the next line.

For anyone else like me, I put together the "inlined" version of the code to help me understand what is happening:

      #include <stdio.h>
      #include "minunit.h"

      int tests_run = 0;

      int foo = 7;

      static char * test_foo() {
        do {
          if (!(foo == 7))
            return "error, foo != 7";
        } while (0);
        return 0;
      }

      static char * all_tests() {
        do {
          char *message = test_foo();
          tests_run++;
          if (message)
            return message;
        } while (0);

        // ... more tests here

        return 0;
      }

</comment><comment><USER17> I have a library [link redacted] that was originally designed to extend MinUnit. I love the idea of an all-in-one unit testing library without complicated set up.

<comment><USER18> Well, there's a fine welcome from HN: new account that's fifteen minutes old, which posts what could be useful information (I just skimmed it) in a non- controversial manner and...insta-dead.

I obviously vouched for the comment, but yeesh.

<comment><USER19> I hear you, but since we don't have software that can determine whether posts follow the guidelines, sometimes (especially for brand new accounts) the anti- abuse software gets it wrong so then we have vouching.

<comment><USER18> Yeah, I get what you're up against (I _do_ skim New once in a while). Just a good thing someone has Show Dead on _and_ has sufficient points to vouch, eh? :-)

</comment></comment></comment></comment><comment><USER20> For everybody who demands from their test framework that it prints expected vs actual values and file/line references, and that it can be adapted to embedded and bare metal targets I recommend the excellent Unity framework[1], example[2].

\--

[0] [http://www.throwtheswitch.org/unity/](http://www.throwtheswitch.org/unity/)

[1] [https://gitlab.com/oliver117/blut/blob/master/test/test_math...](https://gitlab.com/oliver117/blut/blob/master/test/test_math_double_special.c)

</comment><comment><USER21> And then in D it's built-in to the compiler so it's a 1 liner of sorts:

unittest { ... }

and they all run during compilation.

[https://dlang.org/spec/unittest.html](https://dlang.org/spec/unittest.html)

<comment><USER22> I'm surprised that isn't used in other languages, having the test right next to the code seems such a good idea.

<comment><USER21> Rust went this path too, there's something I love about having unittesting readily available. I can choose to use it or not use it. My asserts are available to me as I so desire. Python too sorta has some unittesting in the standard library, but that's not a compiler level thing.

</comment></comment></comment><comment><USER23> Well, big minds meet.

Here is mine Minimal Unit Testing FW for C:

[https://github.com/gon1332/minut](https://github.com/gon1332/minut)

</comment><comment><USER24> Why stick to three lines? With only a couple more you could reduce the boiler- plate needed to use it.

I wrote a minimal C test framework too: [https://github.com/codeplea/minctest](https://github.com/codeplea/minctest) It's got some real-world usage. Still only just one header file, but it'll time each test and if an equal assertion fails it'll print the variable values.

</comment><comment><USER25> Whats up with the do/while loops? Does that just make the return syntactically valid?

Apologies, its been a while since I've touched C/C++

<comment><USER5> This is dealt with at the bottom of the article. It's a C FAQ: [http://c-faq.com/cpp/multistmt.html](http://c-faq.com/cpp/multistmt.html)

</comment></comment><comment><USER26> I did something like that once in Classic ASP (VBScript). I think I only wrote two Assert functions and that was enough. The code ended up being really robust after I wrote a bunch of test cases that eventually passed (after writing the code of course).

</comment><comment><USER27> I did mine using assert.h and a signal handler. More code, but advantage is you can also use assert.h internally anywhere in your program without it needing to know about the test framework. On other hand, makes testing optimized builds difficult.

</comment><comment><USER28> FCTX is in a similar space, and quite good: [https://github.com/imb/fctx/blob/master/README.rst](https://github.com/imb/fctx/blob/master/README.rst)

</comment><comment><USER29> Libcheck does the nice thing and let's you optionally fork each test resulting in parallelism and test failures from segfaults and such not causing the whole suite failing. Does this do something similar?

</comment><comment><USER30> The examples suggest that maybe the implementation should use "#str" in the macros (i.e. when you want your string to contain the same thing as the expression itself).

</comment><comment><USER31> Works great in Embedded Linux, and it is easy to crosscompile.</comment>


All startup school talks as individual videos - <AUTHOR> http://blog.justin.tv/2008/04/startup-school.html

<comment><USER2> These are also going up, with slides, at <http://www.omnisio.com/startupschool08>

<comment><USER3> the quality is better at omnisio

</comment></comment><comment><USER4> Can you guys recommend any of these? I found DHH's talk to be very good.

<comment><USER5> My other favorites were Paul Buchheit and Peter Norvig, but it depends what you like. Here are my summaries:

David Lawee: Launch quickly! Google buys technology and people.

Sam Altman: How and when to get funding for your startup. Easy and detailed explanations.

Jack Sheridan: There are four important legal areas to consider for your startup: Who owns the company? Who owns the tech? Who controls the company? Who gets what in case of liquidity? Analysis of each of these.

Paul Graham: like the "Be Good" essay, but much more fun in-person

Greg McAdoo: What Sequoia looks for: big total market, company that defines a new category, rapid iteration, accumulated advantage.

DHH: "Step 2: Price!" In the context of the prior two talks, this one was explosive. Aggressively stated position that differs from the implicit philosophy of the rest of startup school, and a certain Web 2.0 scene in general.

Paul Buchheit: Inspirational. Leave your job if you feel drained. Left Intel for Google. Then left Google. What if Woz had stayed at HP?

Jeff Bezos: AWS is great! It's scales up and down elastically!

Arrington: "I genuinely look up to entrepeneurs." Roosevelt "man in the arena" quote. Engage in dialog with people who criticize you.

Marc Andreessen: Read "The Black Swan". High-level philosophy. Experiences in the first bubble. How to avoid mediocrity in growing your company.

Peter Norvig: Nerdy math/algorithms fun. "It's more agile to work with data than code."

</comment></comment><comment><USER6> this is a great resource! Thanks for posting about this one!

</comment><comment><USER7> thanks justintv guys</comment>


Microsoft lists web sites broken by IE8, beats Google at indexing the internet - <AUTHOR> http://uncov.com/microsoft-lists-web-sites-broken-ie8-beats-google-indexing-internet

<comment><USER2> Summary...

Microsoft: "Internet, please help IE8 not look so bad...if you could just insert this tag here."

Internet: "Go away."</comment>


Show HN: Notchy – add the notch back to your iPhone X screenshots - <AUTHOR> Notchy is a simple iOS app that adds the notch back to your iPhone X screenshots. A few friends and I thought that iPhone X screenshots looked weird, given that they have sharp corners, and no notch. The iPhone X doesn't look like a rectangle...so why should the screenshots?
So, after 8 rejections from App Review, countless icon redesigns, and lots more work than you'd expect for an app this simple, it's finally out.
Notchy was built to be speedy and efficient. Just take a screenshot on your iPhone X, use the share extension, and then share your screenshot via iMessage, Twitter, etc.
There's also no tracking or analytics. It feels weird to have to call that out but it was a deliberate decision. There's a $2 In-App Purchase to remove the watermark from screenshots and add the ability to add the iPhone X frame.
If you have any comments, the team will be checking HN, so please post any ideas or thoughts about the product. Cheers!
Link: https://www.notchyapp.com <comment><USER2> Did Apple provide feedback why the app got rejected?

<comment><AUTHOR> Yep, they did. We had a mini notch in some of the original app icons, and according to Apple, they had "patented the notch", so were bringing the hammer down hard on anyone that designed anything that looked like it. Of course, I can send you links to 50+ other apps on the App Store that have an app icon with a notch in it, so who knows.

To me, it seemed like a pretty silly thing to reject us for, but Apple is ultimately the gatekeeper, so we just gave up on the fun icons we'd designed. So now, we have a more boring one that Apple was satisfied with (the current black background with a solid white N).

<comment><USER2> Yes, that sounds silly. Great that you didn't give up.</comment></comment></comment>


How the "token network effect" is a new business model for the decentralized web - <AUTHOR> https://medium.freecodecamp.com/token-network-effects-a-new-business-model-for-a-decentralized-web-6cde8b4e862 <comment><USER2> I really loved this one, thanks!</comment>


Thoughts on Vim Bindings - <AUTHOR> https://blog.jonstodle.com/thoughts-on-vim-bindings/ <comment><USER2> Generally agree with this article. Vim bindings for non-Vim editors is a nice idea, but I find that they're not ever _quite_ complete. This leads to some kind of uncanny valley feeling when editing. Now I've gotten used to how to open/find files in Vim (:e and :find), and taken the time to understand how buffers work, I think I would also miss these outside of Vim.</comment>


The 40% Rule - <AUTHOR> http://avc.com/2015/02/the-40-rule/ <comment><USER2> I'd never heard of this rule, so I can't say it was planned but I've just done the maths on our startup ([http://macropod.com](http://macropod.com)) and we're exactly on 40%.

I certainly didn't use this equation, but our monthly expenditure is controlled quite heavily by our growth rate. So maybe there's something in that....I think I'll go work out whether this hold true for various growth rates using our method...

FWIW:

\- I have a spreadsheet which maps out our revenue and expenses over the past 2 years.

\- It estimates our future growth

\- It combines that with our bank balance and our expenses to work out an "optimum burn rate".

\- We use this number as a guide to how much we should be spending.

The "optimum burn rate" is the spend that will see us use as much of our cash as possible without us dropping below a certain threshold (which at the moment 3x our monthly burn).

</comment><comment><USER3> Maybe I'm missing something important, but I don't see any rationale behind this. What makes 35% or 45% worse than 40%?

<comment><USER4> I would guess he is suggesting that less than 40% means you are over-spending or under-performing and more than 40% means you are under-spending (eg. you should invest more in growth).

<comment><USER5> The way I read it, it was more like a rough guideline rather than a strict rule... but when you put something forth as a guideline, it does not sound as crisp and presentable. I mean, there is no basis put forward, simply said someone uses that figure when they want to get a rough idea bout a company. I imagine once something passes that filter, they would do a more thorough analysis.

</comment></comment></comment><comment><USER6> You could apply the 40% rule to personal finances as well. If your income/salary is increasing 20% a year, put 20% into savings. If your income is increasing 5% a year, put 35% into savings.

<comment><USER7> I disagree, in personal finances you aren't afforded the same kind of burn rates because there isn't an investor model for individuals. If my salary has increased 100% YoY for the last 3 years, I would be in a troubling amount of debt.

This applies in reverse as well, if you take a salary cut you likely aren't going to be able to save more money as a result.

For personal finances I think its better to tease out a baseline amount for expenses and save everything above that, re-calibrating occasionally as required.

<comment><USER8> This is exactly what people do when they go to school: they take on huge amounts of debt in order to make their income grow by >100% YoY for a few years.

Very few incoming college students know enough about finance or exactly what different choices will payout to make smart trade-offs in this area, but this reasoning is pretty common with MBA and Law School students. Occasionally it even works; I've known a few young lawyers who ended law school with $200K in debt, but it was paid off within 4 years and their income was roughly 8x what it was before law school.

<comment><USER9> Some go to school to learn.

<comment><USER10> You don't need to go to school to learn, so if it's just learning you're interested in school isn't a very good investment.

<comment><USER9> Where can one go to learn lab chemistry or biology? High energy particle physics? The list can go on and on...

</comment></comment></comment></comment></comment></comment><comment><USER11> I think this rule is a nice generalization overall but for my money I would discount natural segment growth from the company's year on year.

So, if the market (ie mobile payments) is growing 50% YoY and the company is only growing at a rate of 25% that's actually pretty bad.

<comment><USER12> Would you always expect to grow at a rate higher than natural segment growth for a "good" company?

<comment><USER11> That's a though question as there are always exceptions to the rule but generally I would be cautious in investing (money) in a company that is growing slower than its sector would allow for. However I would happy to invest time in such companies, but that's because I'm a consultant :-)

</comment></comment></comment><comment><USER13> This works as a good "rule of thumb".

</comment><comment><USER14> _Your annual revenue growth rate + your operating margin should equal 40%_

My immediate reaction: So I guess I need to cut Tarsnap's prices and slow its growth rate?

On further thought, I suspect "should equal" should be "should equal or exceed".

<comment><USER15> It means Tarsnap isn't spending enough on growth.

<comment><USER14> The only way Tarsnap could have growth rate + profit margin equal to 40% is if it was losing money. Given that Tarsnap is bootstrapped, that's not an option for me.

<comment><USER16> >Given that Tarsnap is bootstrapped, that's not an option for me.

Indeed. I think the advice is for VC funded companies. Whole different ballgame. In the ideal case, VC funding lets you grow faster and ultimately make more money. Whereas bootstrapped companies are constrained by the requirement to make at least some money from the getgo.

On the flipside, this constraint of bootstrapping ensures that we actually do make money. Whereas in the less than ideal case for VC the outcome is zero for the founder.

(Bootstrapping can result in zero too, but you usually find this out faster than in a startup.)

There are tradeoffs to either method. I prefer the bootstrapped way. But you can apply that rule to a bootstrapped business to some extent: if your budget allows it, then it can make sense to trim margins if your growth rate is high and you can increase growth by spending.

</comment></comment></comment></comment><comment><USER17> This literally means that you can lose as much money as you want as long as you grow at a stupid-fast rate. It doesn't matter what you're building or whether anyone wants to pay for it, as long as you get what the monkeys call a "hockey-stick curve".

You're OK even if you literally win at losing. Good to know.

This explains so much.

<comment><USER18> It's not user growth -- it is revenue growth.

If you've got a hockey-stick curve for revenue and you're losing money, that's not necessarily a problem (within reason). At some point you can start spending less on user acquisition/marketing and you'll go from losing money/growing fast to profitable/growing slower.

<comment><USER17> This explains even more.

I've noticed that a lot of startups delay making _any_ revenue, and that this might not be for bad reasons, because plenty of companies start to really suffer once they start making revenues (but fall short of what they "should" be seeing and how has they "should" be growing) not because there is anything wrong with them as businesses, but because their ADD investors lose faith and interest.

So now it makes sense that companies would delay revenue until they have enough of a free-tier footprint that they can control revenue growth for a few years and ensure exponential growth (this may involve intentionally tamping down early-year revenue in order to have a sharp upward trend).

<comment><USER19> That makes sense. If your company doesn't have revenue, it _could_ be worth 200 billion dollars! Once your company has actual revenue, it's pretty obvious it's worth whatever it's worth.

It's advantageous to remain in the mystery-land of hype and unrealistic expectations as long as you can keep drumming up easy investor money.

</comment></comment></comment></comment><comment><USER20> When I was in school the professor said something about interest rates and opportunity costs that was more algebraic than arithmetic; but I guess that is all academic.</comment>


The Monty Hall Problem - Would you switch to Door #2? - <AUTHOR> http://jacobirw.wordpress.com/2011/12/11/the-monty-hall-problem-explained/

<comment><USER2> Umm, the correct answer is to switch doors. It has been discussed ad naseum as you mention. The simplest way to see that the switch doors gives you a 2/3's chance of winning is as follows.

Without loss of generality, assume that you always pick door 1.

If the car is placed randomly, you have a 1/3 chance of getting the car. To see this, note that when not switching, you only win if your initial guess has the car behind it, which happens 1/3 times.

When you switch doors you only win if not switching loses. Since not switching wins 1/3 times, switching wins 2/3 times.

You can write a simple program to simulate the game and see that switching wins 2/3 times.

</comment><comment><USER3> Wait so he's arguing that switching wont make a difference?

The host is guaranteed to open up one door that is a goat. So, instead of thinking at the beginning that you have 1/3 chance of picking the car, instead think that you have 2/3 chance of picking a goat. If you pick a goat and you switch, then you win because the host HAS to show you the other goat. So think about it that way: try to pick a goat and not the car at the beginning. That is the simplest way I can explain why your chance of winning is 66% if you switch when asked as opposed to staying with your original choice.</comment>


Has Cron been dethroned as the king of scheduled jobs? Try systemd timer units - <AUTHOR> https://www.putorius.net/using-systemd-timers.html <comment><USER2> This seems way over-complicated as compared to Cron. I don't see it gaining that much acceptance.</comment>


Minimal Gramophone - <AUTHOR> https://www.startnext.com/minimal-gramophone

<comment><USER2> See also: Crosley Revolution Turntable [http://www.amazon.com/exec/obidos/ASIN/B00F0YXHGK/](http://www.amazon.com/exec/obidos/ASIN/B00F0YXHGK/)

Smaller than a record case, able to run off 4 AA batteries, and weighing in at under two pounds, it also has a USB port than can be used for power or for ripping your vinyl to a computer.

</comment><comment><USER3> this is interesting, but does anyone really want to play a record by spinning a rod between their fingers?

<comment><USER4> According to the description, it's more of an art project or educational tool than a practical music player. However, it still raises the question of why this isn't just being slapped onto Instructables or somesuch. I guess to raise money for the designer, but still.</comment></comment>


Scientists argue that beer motivated our ancestors to start grain farming - <AUTHOR> http://m.nautil.us/issue/8/home/beer-domesticated-man <comment><USER3> Reminds me of the Johnny Appleseed story -- e.g., a lot of Americans grow up learning that he traveled far ahead of the settlers in North America planting apple seeds everywhere, so everyone would have apples -- the interesting twist is that apples planted from seeds aren't normally edible... but they can be used to make hard cider.

</comment><comment><USER4> Medieval monks drank beer with breakfast before their pre-dawn prayers, hence the robust brewing tradition in monasteries. Essentially, our ancestors ground whatever grain they could get their hands on, mixed it with some water, slapped it on a greased, hot rock and called it breakfast.

[https://www.timeline.com/stories/if-you-like-beer-for- breakf...](https://www.timeline.com/stories/if-you-like-beer-for-breakfast- you-have-medieval-monks-to-thank)

</comment><comment><USER5> Site is down at the moment so I can't RTFA, but I remember my brother-in-law (PhD religious studies, Oxford) telling me this in 1997. So it ain't new news.

</comment><comment><USER6> We're talking agricultural revolution; about 15,000 years ago.

It's striking that yeast makes both bread and beer (e.g. rising dough smells like beer), but beer is simpler and easier to make.

Humans at that time would have little genetic alcohol resistence - <USER2> with the average genetic makeup of today.

Perhaps early cities grew, not because of efficiency, but the municipality gave out free samples - gateway agriculture.

But I doubt it, as fermented fruit is a far easier source of alcohol. Just let it rot.

<comment><USER7> I guess that the first beer was what we now call a sourdough starter. So something like pancake (american) batter.

<comment><USER8> Probably quite close if you want to recreate it I mix a thick stout like Guinness with something like semolina or wheat middlings or maybe groat and boil it, won't taste good but it sure will fill a man. Beer has very low caloric value a pint has on average 150 kcal or so, so you need something much more nutritious than that (500-800 kcal per serving) to make it worth your while, especially when you were living in a time where your daily caloric expenditure could be easily twice what is today.

</comment></comment></comment><comment><USER9> I saw this "documentary" a while back: "How Beer Saved the World" [http://www.imdb.com/title/tt1832368/](http://www.imdb.com/title/tt1832368/)

I had to spend an hour on wikipedia afterwards to determine if it was a spoof or serious show! (I still don't know about some parts of it :)

</comment><comment><USER10> This is a great book on this subject : [http://www.amazon.com/A-History- World-6-Glasses/dp/080271552...](http://www.amazon.com/A-History- World-6-Glasses/dp/0802715524)

It's a pretty fun read, I recommend it.

</comment><comment><USER11> This is mentioned in the first Crash Course World History video.

[https://www.youtube.com/watch?v=Yocja_N5s1I&list=PLBDA2E52FB...](https://www.youtube.com/watch?v=Yocja_N5s1I&list=PLBDA2E52FB1EF80C9)

</comment><comment><USER12> Keep in mind medieval beer was quite low in alcohol, and brewing it was meant more to purify questionable water than because everyone wanted to get wasted all the time (although it's easy to develop that sort of mental picture.)

<comment><USER13> [http://leslefts.blogspot.co.za/2013/11/the-great-medieval- wa...](http://leslefts.blogspot.co.za/2013/11/the-great-medieval-water- myth.html)

</comment></comment><comment><USER14> Beer when it was first created I believe was both clean water and a way to get essential nutrients. Basically soylent of medevil times.

<comment><USER13> A popular myth.

[http://leslefts.blogspot.co.za/2013/11/the-great-medieval- wa...](http://leslefts.blogspot.co.za/2013/11/the-great-medieval-water- myth.html)

</comment></comment><comment><USER15> "Scientists argue that beer motivated our ancestors to start grain farming", start a brawl and get thrown out of pub.</comment>


How MIT Became the Most Important University in the World - <AUTHOR> http://www.bostonmagazine.com/articles/2012/10/mit-important-university-world-harvard/

<comment><USER2> No mention of Stanford? [http://news.stanford.edu/news/2012/october/innovation- econom...](http://news.stanford.edu/news/2012/october/innovation-economic- impact-102412.html)

</comment><comment><USER3> Significant, yes. Most important, not established.

</comment><comment><USER4> Interesting that they also took a stab at Harvard, pointing out that Gates and Zuckerberg had to leave to fulfill their ambitions.

</comment><comment><USER5> Through hard work and continuous innovation. Scientific innovation is necessary for long term growth.

</comment><comment><USER6> *Citation needed</comment>


I am 35. Tried numerous but just can't grasp programming.  Is it too late now? - <AUTHOR> <comment><USER2> No, age is irrelevant except that it may serve as an excuse for giving up. You already know how to do some programming in your life (configuring a controller, setting an alarm clock, etc) but this programming is just a bit more in-depth. But this never changes. As a programmer you never stop learning, not after 35, not until you decide it's no longer for you.

Learning to program can be hard. It can make you feel stupid. But for me this didn't last long. It threw up a barrier that seemed like I could never break through and then light bulbs began firing. You really just have to spend the time with the code, reading it, trying small stupid things, making stupid mistakes, building off what you have already done. Eventually it begins to make more sense. You find you can do things without having to Google around for answers. At this point you are beginning to internalize the programming language.

What may work against you at 35 is time and patience. It's interesting to see 14 year olds post here proudly over what they have done with programming, yet I feel like 14 year olds have the biggest advantage of anyone. They have summer vacations! Imagine having that long of an uninterrupted block of time to be able to explore whatever you like I'm not impressed when a 14 year old posts something, I'm impressed when a 35 year old with a family and work posts something. ;)

</comment><comment><USER3> You seem to be missing the most important question of all: what is it that you want to do? Just "learning programming" is like learning to hammer nails. Sure, it's a useful skill, but if you don't have a slightly higher goal you'll get bored quickly.

I'd recommend Python, but them I'm pretty biased, having used it since about 2000. If you can give us more of an idea about your background and what you're trying to achieve, I'm sure you'd get a much better response

</comment><comment><USER4> Ignore people telling you to try javascript, python, C++, C, ruby, go, typescript, forth, java etc. Just do what millions of people have actually enjoyed doing: learn BASIC.

<http://www.freebasic.net/> <http://www.zetcode.com/gui/fbgtk/> <http://www.petesqbsite.com/> <http://www.dbfinteractive.com/forum/index.php?board=2.0>

<comment><USER5> \+ 1

</comment></comment><comment><USER6> I am on the wrong side of 30's. My background is Econ and I am working towards an MS in software. It is pretty hard but you can do it. Try codeacademy.com for simple tutorials. Youtube has lots of resources too. Once you still to a regime of learning, it is possible. Here is a link to my journey in grad school - <http://datagrad.blogspot.com/>. Hope it helps

</comment><comment><USER7> Invest in a local, private tutor. If you've been reading books or watching videos and hitting brick walls, you might be the sort of person who'd find asking questions directly and having quick back and forth conversations beneficial. Even if the tutor isn't a world champion coder, it might be the medium you're having friction with rather than the underlying concepts.

</comment><comment><USER8> Definitely not too late, but it's hard to tell what you need to change in order to finally get programming without knowing more about your history. What is it that you don't grasp? The conceptual ideas behind programming? What programming does in the first place? The specifics of whichever language you're using?

Scratch (<http://scratch.mit.edu>) could be a good starting point for you— it's very visual and helps conceptualize programming (loops, instruction blocks, etc.).

If you have background in design/art/illustration/etc., then Processing might be for you— I recommend this book highly: [http://www.amazon.com/Getting- Started-Processing-Casey-Reas/...](http://www.amazon.com/Getting-Started- Processing-Casey- Reas/dp/144937980X/ref=sr_1_2?ie=UTF8&qid=1351928921&sr=8-2&keywords=processing)

If you have any specific questions, feel free to send me an email or ping me on Twitter (all info is in my profile)

</comment><comment><USER9> The meta question is: is every human being able to learn and do anything with a reasonable level of competency (subject to your definition of "reasonable"). I would like to think so. I would like to think that my own inability to do X stems from lack of perseverance, discipline, and/or hardwork. But I'm not quite sure of this.

I enjoy coding. Some of it has to do with having a reasonable level of competence; I'm not straining to understand everything. But there are a lot of areas of programming that I'm not well developed; I'm not able to grasp (as quickly) certain concepts.

There isn't enough said about embracing our limitations. This is goes against the optimism and can-do spirit of the American (or perhaps Western) ethos. But there is something to be learned from knowing oneself, measuring one's strengths and weaknesses, and then leaning into ones strengths.

There will always be the tension between overachieving because you actually have the ability to and being unable to succeed because you were a poor judge of your own skillset.

I don't know if you'll be able to acquire the skill of programming. Certainly age has very little to do with being able to acquire this skill. I myself have sat down and personally tried to help others to learn this skill. I've found that it isn't because of a lack of desire to learn. I remember starting with fundamentally simple models and then trying to connect it to the abstractness that is represented on a computer screen. It's very difficult for certain minds to make this connection. Or perhaps it was the lack of skill of the teacher.

In any case, I do hope you will be able to acquire this skill. I would also encourage you, though, to make an inventory of the skills you do have, the things you are good at already. Maybe putting more time in to things you are good at would be more fulfilling. Be true to yourself and remember that your ability to program has nothing to do with who you are as a person. I forget this sometimes.

</comment><comment><USER10> Wow - lots of great encouragement and you should heed that if you are inclined to give it another try.

As an alternate view - you might like to consider that some people seem to have an aptitude for programming but that most people do not. In the early days of the industry when computer training opportunities and even computing time was limited and expensive businesses went to a lot of trouble to test for that aptitude. Those tests were probably crude but in my experience rarely wrong (I can remember one notable exception).

Anecdotally, I found that good sales people had just about zero programming aptitude (there is also a strong case for the inverse being true). Certainly this is not an issue with intelligence - lots of very intelligent people cant program although a measure of intelligence is required to be a programmer.

</comment><comment><USER11> You might want to read the talent code for a few ideas on how talent is developed and then figure out what to do from there.

I am a professional developer for all of 1 month now, and when I started to learn and really dive in so that I could get a job, I wanted to give up every day and it sucked. I never could figure anything out.

But guess what? That is exactly how talent is built it. You only learn as you push or self to figure stuff out. You're probably doing the right things, but if you've never programmed before you probably have a lot of building to do before you 'get it'.

</comment><comment><USER12> Can you follow a recipe? Like for making a simple dinner? Turn that around, could you explain to somebody how to do something that you are good at, say making a great cup of coffee using an espresso machine.

Programming is like that. The bits and processes are different but the overall concept is similar. As petercooper suggested, hire a tutor or attend some introductory course. A competent teacher should be able to identify where your stumbling block is and present the material in terms that fit with your cognition processes.

</comment><comment><USER13> Maybe not, make sure to try different ways of getting into programming if the simple command line stuff isn't working for you. Maybe try something like codepen.io and just get a basic start and dig into javascript that interacts with the page.

</comment><comment><USER14> No. Age is irrelevant in this sense. Find something you enjoy and just keep hacking.

</comment><comment><USER15> No, it's NOT. Try some beginner courses at [http://www.udacity.com/overview/Course/cs101/CourseRev/apr20...](http://www.udacity.com/overview/Course/cs101/CourseRev/apr2012)

</comment><comment><USER16> Its never too late to start over again. and surely age should not be the defining factor... if you feel like doing it, just do it and make the most of it.

</comment><comment><USER17> I agree with others. Age is an excuse. Start simple. Java is great (use netbeans). Go is another option. JavaScript/C/C++ are definitely not for the beginners. Java probably is the best. But please accompany it with a good book on algorithms.

there are also many free material on the internet. Start with this first and the use java in parallel with a second reading. Just buy a cheap black and white laserjet.

Good luck, success is imminent.

<comment><USER18> Java is great, but JavaScript gets lumped in the same bin with C? Strange priorities...

<comment><USER19> I'd have to agree. Java is probably on of the worst for beginners. Especially, if you're by yourself. Setting up your workspace alone could be enough to stop you from getting to your code.

If you start with javascript, at least you could just open up your web browser to see if your code worked.

</comment></comment></comment><comment><USER20> ok what about how long do you think it would take to ramp up to where I could make a decent living doing it? Do you have to go back to school or should I just jump into a jr development position?

</comment><comment><USER6> PS -- Good luck</comment>


Show HN: Get HN Top Entries, Stock Quotes and Breaking News on Google Assistant - <AUTHOR> https://pepperparrot.com/ <comment><USER2> I love the idea of pepperparrot.com. Every day, I can get all information (stock, breaking news, ...) in one place using Google Assistant on my mobile device.</comment>


Teaching Computing with... Computers? - <AUTHOR> http://www.bogost.com/blog/teaching_computing_with_comput.shtml <comment><USER2> What, no comments? Both sides have some valid points. From the NSF point of view, it is hard to teach abstraction and they also want to develop teaching materials that don't rely on expensive and proprietary educational toys. Then again Bogost reasonably asks how you can expect kids to stick with the program when you move from the toy to a screen of code.

I wish he had explored his alternative ideas further (although the comments do pick up where he left off). Computer games can definitely be used to teach basic concepts, and indeed some very good games have used programming-type puzzles as part of the gameplay.

A kid-friendly programming interface, to me, could just be a skin on a full programming environment. As you would complete basic programming tasks, you could then unlock higher level features.

</comment><comment><USER3> this sounds like the "new math"... why not start young children with actual programming? programming is _easier_ and more intuitive than thinking abstractly about algorithms and compression</comment>


Ask HN: What do you think of reusing code you write between diferent jobs? - <AUTHOR> I don't feel like reinventing the wheel every time I have to implement the same functionality. Often times, I find I'd write the code in the exact same way if I had to do it all over again.
Code that's in production use is proven.
Conventional wisdom is that you can always improve your code, but sometimes it's already as good as it will get. I'll only rewrite code if I find I can improve it considerably. I always try to write the cleanest, best code possible, and I think I do a pretty good job at it.
Though I have been thinking that if someone competing with someone I'd already been paid to deliver code for, they could ask for (almost) the same exact features, possibly giving them a competitive advantage. I could obviously decline, but where to draw the line would be iffy.
For context, my situation is special in that I do contractual work, and all of my code remains my intellectual property, so it's all unquestionably legal. I do tell clients that I reuse my code often, though I don't go on a monologue about it. All code is written by me. This is more a question on "if you could, would you?". <comment><USER2> My solution is to have side-projects that are open source, which I reuse across multiple jobs. Wherever possible, I get permission to "contribute patches to Open Source projects" included in my contracts, and thus grow the body of reusable code over time.

It usually takes some nights and weekends to get the initial body of open source code written, but since it is usually more-or-less a clone of something I've previous written and want to use again, it is fairly mindless effort.

If you're in a position where you retain the IP for what you write, (I assume you're permitted to use open source?) you could just do whatever tidyup is needed, and push it to GitHub, ready for reuse?

<comment><AUTHOR> This is a good idea, I should definitely consider this. I do enjoy having the full "exclusive" licensing rights to my code, but in many situations in the future this probably won't be possible, especially when working in different domains.

</comment></comment><comment><USER3> A couple of things.

It's cheaper and lower risk to hire a contractor to provide a solution to a problem when the contractor has domain knowledge, tools and code to provide a solution. Forcing him to create a solution out of whole cloth is just dumb. More expensive and comes with a much higher risk of failure and slipped deadlines. There are a ton of customers that only care that a solution was provided and have no economic interest in the software itself.

Working with a codebase you're familiar with has a few advantages. You are using a worked out API which allows you to customize it without writting yet another broken wheel API from scratch. You know where bugs are, and you often avoid exposing existing but unknown bugs due to habit[1].

[1] I learned this a along time ago watching technicians use buggy software. Over time the number of crashes and bug reports declined not because the bugs were found and fixed but because the techs unconsciously learned how to use to software in ways that didn't expose bugs.

</comment><comment><USER4> There a difference between best practice architecture and copying code: No one will sue you if you implement things the same way in different projects, but if you copy & paste a large amount of code from one project to another it might be problematic.

An employee also owns the copyright to his/her code (at least in most European countries), the company often just gains the exclusive right to use that code through the contract with the employee (or the law, in some countries). So whether or not it is you intellectual property does not matter that much, what is important is what's actually written in your freelancer contract. If you build a custom software system for a company I'd assume they will not simply let you sell "your" exact code to their competitor afterwards, at least if it's something that has some inherent competitive value (e.g. not simply an off-the-shelf solution like a CRM or website). Most companies make sure this can't happen even when working with a freelancer, so have a close look at your contract (if you have one). If there's no explicit contract it'll depend on the country you're in.

<comment><USER5> In the US, most code written by an employee is considered a "work made for hire", and the IP devolves automatically upon the employer. This is also usually written as a clause in most freelance/consulting contracts.

<comment><AUTHOR> I looked into this a while ago. If I'm recalling correctly, code in particular is treated legally akin to a literary work, so it wouldn't be "work made for hire" by default. I might not be recalling correctly.

</comment></comment></comment><comment><USER6> I use the same movements to fill and reprime oil burners every day.

Why can't someone re-use the knowledge they have to write code that has the desired functionality?</comment>


Ask HN: can you review my idea, please? - <AUTHOR>

Hi, I want to have some feedbacks and advice about my idea before to jump onto it.
Here it is, able to get good offers from your local hairdressers business matching only your request.
Ex: a user submit a request(style, location, avaibility...).
The hairdressers get the request and make an offers.
So the user gets offers matching his need and availability at good price and can choose the most suitable. Saves money and time.
For the hairdresser to fulfill his planning. Gains customers and automates bookings.
Thanks in advance for your help. <comment><USER2> 1\. Who is making the offers? Your average hairdresser is an employee, they have no interest in spending their day managing offers online, and it doesn't offer them the experience they're looking to gain. This means the salon will need to hire another person that can make offers to individuals online, or the owner themselves will need to take on this extra work. This can't be anyone, they need to be familiar with different hairstyles, their difficulty, and rates.

2\. How much time does it take to acquire a customer by making offers? What happens if the customer asks questions online? How much is a price for X? Oh, that's too much, what about if I do Y? Would you be willing to lower your offer from $25 to $20? Then, they disappear. I have a feeling they'd waste a lot of time making offers, while seeing little return. The cost is simply too little for the time spent communication with individuals.

3\. How does this compare to hiring someone to stand in front of the store waving a sign? As someone else said, haircuts are impulse purchases for a lot of people, so if you have someone standing on the street, telling people walking by that haircuts are 10% off today only, would they bring in more customers then someone online making competing offers? With the sign, at least the person is already standing next to your salon, so they'll convert to customers better than someone online.

4\. Who is this for? Most people have a regular hairdresser that they have a relationship with, so I'd think they're unlikely to change. When I relocate to a new city, I just check Google maps for barbershops or salons, and the majority have reviews. I pick one closest, with positive reviews, that focuses on men's hair. That's it.

The idea of businesses making offers to customers isn't a bad one, but I think you need to rethink the niche, hairstyling isn't a business where I could see this working.

Edit: I had to step out for a bit. To expand though, what if you applied this to a different industry, like cars? I could say I'm looking for a 4 door car, max budget X dollars, and local dealers could submit cars they have available with their best offers. Car dealers are pretty competitive, so I think they would be more willing to put forth effort to chase customers than a hairstylist. Also, if you make a sale, you could earn a thousand in commission, instead of $2. I'm not saying it'll work, that was just a general suggestion for why you might want to look towards other markets.

<comment><AUTHOR> Thanks a lot to point me all these questions.

If you don't mind I will try to answer you.

For Q1. because I will not have a lot of customers (but if I got them I will be more than happy) at the beginning so the hairdressers can handle making offers. Of course I will provide them a system to assist and help them. And because it will be not in real time (at least not at the beginning) so they have a time to do it. And when customers grow I will provide a new way to make offers, by having a pricing calendar. So they can put price by shift time (ex: 9-10 at 15$, 10-11 at 18$...) in advance and update it occasionally.

For Q2: I hope to make it simple. One request to receive differents offers from differents hairdressers matching the request and choose one. But for the question online I did not have a think about it yet. Thanks for it.

For Q3: I agree and disagree with you. But hairdressers are going to make offers only for customers that are looking for. But let's say if I add the real time offers. So this gives the ability to the hairdresser to target only people close to him in real time to fulfill the empty time. But real time will be not the first step but who knows.

For Q4: for anyone looking for good offer matching his avaibility. (Or for regular customers provide booking feature and adding the reward. However I have to review my idea for this. Good point to warn me about the relationship customer-hairdress).

I came up with this idea cause there is many deals in the web but they do not match always my need at that time. But with my idea I wanted to move the search and comparison to the software and local shops. So I have to make one request and got (hope) offers fitting my need.

And again thanks for your feedback.

</comment></comment><comment><USER3> I want to help you so I'm going to be honest. I don't think its a good idea. Maybe i'm not understanding it correctly but how i see it is that this is AirBnb for haircuts.

If so i think there is a contradiction. I think there are 2 types of people who get haircuts. One that goes for cheap and other goes for quality. Both of these are achieved by picking the right salon. Thats why hairdresser works with the salon...

I dont think future of haircut is to remove the middleman of salons. Salons are essential.

I hope this helps.

<comment><AUTHOR> Thanks for your return. The honesty is all what I am looking for.

What I want to achieve is to be able to book haircut for my suitable time and at the good price in my local area.

<comment><USER3> hmm down votes. I was just trying to help. I do believe its a valid point though.

Anyways I think in that case what I would recommend is to make a centralized reservation software for the Salons. I think almost every salon I've seen is still using the traditional paper/pencil booking system. How about target them?

<comment><AUTHOR> I was wondering if I have to use this feature at the beginning. Also I want to check if the offer feature is more atractive. And to see on what I have to focus more.

Maybe I have to review the strategy of the idea and test some models to find the one I should follow.

Thanks for your return and time.

</comment></comment></comment></comment><comment><USER4> May want to check out [https://www.styleseat.com/](https://www.styleseat.com/)

I don't see a bid component, but certainly related.

</comment><comment><USER5> Have you considered asking hairdressers if they'd want this?

<comment><AUTHOR> Good point. It's the next step. But looking how they lose with groupon and other group deal. I hope I am coming with new way to lose less and also they are able to handle butter their offers.

But I agree I have to deal with hairdressers first. But I wanted to know if people want it.

Thanks.

<comment><USER6> This is step 0. Like before HN, talking to the hairstylists is the way to go. In fact, you should be maybe talking to 5-10 hairstylists a day. Seriously. Buy coffee, drinks, maybe lunch and chat them up.

</comment></comment></comment><comment><USER7> Sounds like impulse purchases, nothing I would plan ahead on...

<comment><AUTHOR> Thanks anyway.</comment></comment>


Ask HN: Edtech hackers, what are you struggling with? - <AUTHOR> <comment><USER2> I work with Edtech but I will like to know more details on the premise of this question. What specifically are you interested in and what is your background ?

</comment><comment><USER3> I worked in edtech for 3 years (left job last November). Spoke to many others at events (ISTE, etc). The main struggle was how to move content from one platform to another. Every product had its own proprietary format and most didnt have a way to export. I worked on a solution with a publisher but abandoned the idea the moment they mentioned not wanting to do an open format.

I also had some issues with student data being different across all SIS. Had to implement my own solution to normalize the data and serve it to my own production systems (eventually was sold to clients). This was never truly solved because the moment I left the company focused on another product (it wasnt a "data" company like Clever).</comment>


Chinese News says 80% of its Violent Prisoners were Gamers - <AUTHOR> http://kokugamer.com/2009/12/29/chinese-news-says-80-of-its-violent-prisoners-were-gamers/

<comment><USER2> In other news, 100% of violent prisoners were smokers. Thus, smoking is a gateway to violent crime.</comment>


Ask HN: Does the valley really have Engineer shortage? - <AUTHOR> For the past few months I have been interviewing at various big tech firms in the bay area. Ones that start with F, G, U, A.
Have a CS degree, > 5 years experience. Full stack engineer and have a good paying job. I want to interview to basically test the waters and see if something good comes up.
It seems the tech companies will spend calling you, paying for your flights and meals, spending entire days interviewing you but at the end say "sorry we will not go ahead with you, we don't give feedback"
May be the more time you spend writing code on an editor, the worse you get at writing code on a whiteboard.
I can't quite figure it out. Anyone else feel the same. May be the valley has shortage of "cheap" engineers. <comment><USER2> I was interviewing at Google, I don't know about the other companies. Paying for good engineers was never a problem. Finding engineers with good algorithmic skills is hard. So maybe the problem was not with your coding skills, but your algorithmic skills. That's what an interviewer is looking for, it's not important if you make some syntax mistakes. Anyways it's better to prepare without an IDE and using a simple editor (sublime, vim, emacs...). At Google anyways there are internal languages without IDE support, so you'll need this skill. If you really want to work at Google, it's best to study some algorithmic books and write lots of testing code. My favorite site was UVA online judge: [http://uva.onlinejudge.org/](http://uva.onlinejudge.org/)

Solve half of the problems there (500 from 1000). It will take couple of months, but you learn a lot from the experience and get to understand what the interviewers look for.

<comment><USER3> According to their website, only 4 people have achieved 500 problems solved. That seems like a pretty high bar to set.

<comment><USER4> Where did you get that information from? It looks like there are actually hundreds of people who have solved over 500 problems[1].

Which is not to say it is easy, but putting it at only 4 successes makes it much more intimidating.

[http://uva.onlinejudge.org/index.php?option=com_onlinejudge&...](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=20)

<comment><USER3> I clicked "Site Statistics" -> "Overall rankings"

[http://uva.onlinejudge.org/index.php?option=com_onlinejudge&...](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=14)

</comment></comment></comment></comment><comment><USER5> I looks like they rejected you after interview so you didn't even go to the part where you receive an offer and reject it for being too low so the part about "cheap" engineers is just a cheap shot. Pardon the pun.

The companies you did interview at do have a high standard for hiring but generally speaking at the very least you should have an idea how well you did during the interview without them spelling it out for you.

If you couldn't answer the questions or write the code they asked you to write then that's why they didn't hire you.

If you think that you did brilliantly then maybe you're not coming across as someone the interviewer would like to work with.

<comment><USER6> > I looks like they rejected you after interview so you didn't even go to the > part where you receive an offer and reject it for being too low so the part > about "cheap" engineers is just a cheap shot.

Even more so, if they were worried about cheap engineers, I assure you that they wouldn't be spending money to fly you around the country, buying you flights and meals (and often drinks and hotels and taxi/uber rides and sending you away with swag). The companies you listed pay the best amongst those in SV. I don't think price was the issue

<comment><USER7> Not sure if that logic holds. Seems like a viable strategy to show your best side while trying to lure a candidate. Once they are hired, they probably won't be showered with swag and limo rides anymore. In fact I would consider it a warning sign if too much fancy stuff is going on before the interview (even though I know Joel from FogCreek does it, whom I generally like).

</comment></comment></comment><comment><USER8> Re: your last line, almost any situation described as a labor shortage is actually just a complaint about the price of said labor. Offer a $10 million/year salary, and see how easy it is to get the engineers you're keen on. "That would be a ridiculously high salary", you say? Great, you've established my point; now we're just haggling...

<comment><USER9> It's true that there's rarely a shortage of anything if you're willing to pay arbitrarily high prices for it, but that's not really what the word means. That like saying there isn't a water shortage in California as long as anyone, anywhere in the world is selling bottled water at any price - that's obviously absurd, and no, it's not just haggling.

If you can only hire qualified software engineers at $250k, then there is reasonably some sort of shortage. That's not the same as suggesting that very rich firms shouldn't pay up (and they are), but let's not rob perfectly good words of their meaning just to make a point.

<comment> UK-AL There are many high paid careers that earn that much, but they never get the amount of publicity and discussion about shortage than engineers do.

It's artificially generated.

<comment><USER10> So you haven't heard about the teacher shortage, the nurse shortage or the doctor shortage? They usually get way more publicity than the engineering shortage.

<comment><USER11> Oh wow, I really disagree. The engineer shortage gets a tremendous amount of press.

</comment></comment></comment></comment></comment><comment><USER12> My sense is that the Valley (and other little Valleys) has a serious shortage of the same 100 engineers.

With HN as the only sample, companies don't seem to be very interested right now in taking good engineers and molding them into great ones, or in building a business structure that can benefit from good engineers.

Instead, they're all competing for the top 1% of the top 1% of the top 1% -- and complaining that there aren't enough of those to go around, so the visa program needs to be restructured to draw that talent from the rest of the world.

 _shrug_ Honestly, I think the best thing you can do in that kind of environment is focus on looking outside the Valley, or do some freelancing if you think that would be a good fit, or start your own business if you think you can and maybe see about hiring the good talent that nobody else wants right now.

<comment><USER6> > With HN as the only sample, companies don't seem to be very interested right > now in taking good engineers and molding them into great ones, or in > building a business structure that can benefit from good engineers.

There's a few reasons why this is. The first is that startups are often, if not always, extremely bandwidth limited. It's hard to spend time doing the training, allowing a person to experiment, and giving the freedom and mentorship that is needed to take a good engineer to a great one, or even a mediocre engineer into a good one, when you have only a limited amount of time and limited amount of funds to do so with. Molding engineers is a very long term investment, which suits companies like Google well, but doesn't fit as well into much of the rest of SV.

The second is that even where you want to do such molding, you need the base set of great engineers to help with that. Harder still is finding the set of great engineers you know how to teach and train, and are interested in doing so. While there are some people who enjoy teaching as well as engineering, a lot of people in engineering don't like to or want to spend their time training someone else.

<comment><USER12> That all makes fine sense, but it isn't without its disadvantages. Those top engineers come with a price tag, and the harder everyone competes for them, the more they realize they're worth. For startups working on particularly intractable problems, the cost is easier to justify, if you have enough money available.

But -- again, with HN as my only sample these days -- this hiring strategy seems to be spreading beyond the relatively small number of startups working on technically challenging problems.

<comment><USER13> I personally avoid this hiring strategy and hire people I can mentor and build up. Companies that don't want to do this do our society a disservice by only hiring people who already are at the position they want (or less). In addition, it signals to me that they are not likely to promote from within or compensate fairly as time goes on.

I have no interest in working for a company not willing to do this.

</comment></comment></comment></comment><comment><USER14> There's a lot of competition for the big-name companies. Think of it like applying to an Ivy League school. They can afford to be selective and completely arbitrary. It's the nature of competition. You can either a) learn to play the game better than everybody else or b) decide it's not a worthwhile game and select a different path.

</comment><comment><USER15> Especially for more experienced positions, strong written communication is often "table stakes," positioning you as a competent engineer who can work well with others.

One way to start: using "maybe" instead of "may be", "a shortage" instead of "shortage" and "Valley" instead of "valley."

<comment><USER16> I would be shocked if a talented engineer didn't get an offer because he didn't capitalize Valley in his cover letter.

</comment></comment><comment><USER17> So you've interviewed for the ones that have engineers from all over the world begging for a job and who's recruitment process suffers from the issues that come with scale, and from that you draw conclusions about the entire industry?

Also, you really think you're that good an actor interviewers can't figure out you're just testing the waters and aren't really motivated?

Since you also don't have a clue as to why you've been rejected, I suggest you're not very good picking up communication signals that aren't very explicit and verbal. Hell, that might actually be the reason why you get rejected in some cases.

</comment><comment><USER7> I'm not in the valley, but I have the same impression: companies are not overly desperate for developers. I'm also over 40, perhaps they are only desperate for developers fresh out of school who are still passionate.

</comment><comment><USER6> It's not actually a shortage of engineers. I can post a job and have an endless stream of interviewees in the door. There is a shortage of engineers with the requisite amount of experience and the right skill set for many jobs.

This holds especially true with startups that don't have the time or money to spend 6+ months getting you up to speed from zero on whatever they're working on. Hiring people based mostly on intelligence (what big firms like Google try to do) works when you have the capital to spend 6 months training them towards being productive.

</comment><comment><USER18> i've found attitude is sometimes different when "testing the waters" vs "looking for the next gig". this can lead to your situation in certain instances.

</comment><comment><USER19> Could be due to [https://news.ycombinator.com/item?id=9180229](https://news.ycombinator.com/item?id=9180229) (depressed at my job). Interviewers can catch on if you're unhappy and it can also effect your interview performance.

Ironic, trying to leave a job because you're blue makes it harder to get another.

<comment><AUTHOR> You are right. I am blaming too much on external circumstances. Will work on it.

</comment></comment><comment><USER20> I know a few examples how major companies have rejected a very smart experienced developers. Also a friend of mine was interviewed in a few major companies and every single interview was extremely stupid (by his words) because they didn't ask any question about his real experience but instead spammed with typical tasks from glassdoor.

</comment><comment><USER21> Are you interested in startups at all? We're looking for a full stack engineer.

<comment><AUTHOR> See if you like my work at [https://nojvek.com](https://nojvek.com) (contact at bottom)

</comment></comment><comment><USER22> What starts with U?

<comment><USER23> Uber.

Stumped me at first, too...not used to seeing it in this list but I guess I should get used to it :)</comment></comment>


Changes to Flickr Pro - <AUTHOR> http://blog.flickr.net/en/2016/03/08/changes-to-flickr-pro-and-coupon-for-30-off-annual-rate/ <comment><USER2> Wow! —I can't believe that access to Flickr Uploadr is actually being touted as a benefit of Pro membership. I'd see it more as being a benefit of Standard membership that you no longer get exposed to that dire piece of software.</comment>


Building a $30k/Month User Testing Service – Askable Co-Founder Interview - <AUTHOR> https://launchbasket.com/building-a-30000-month-user-testing-platform-an-interview-with-askable-co-founder-andreas-zhou/ <comment><USER2> There are a few better known competitors in this space. I definitely want to see & learn more from Askable. Very cool.

</comment><comment><USER3> As a sidenote, I'm absolutely amazed by the lack of HTML links in the article. Even the company website and the Medium page need to be copy pasted.

</comment><comment><USER4> Anyone knows why nobody is using "AI" to test those websites.

I suppose a few heuristics and some sort of recognition of state machines would suffice to be able to test 80% of all sites.

<comment><USER3> Since they are doing user testing, what would be the value of AI? Unless AI is the target audience of your service, you'd gain very little insight.

<comment><USER4> Well, I'm assuming of course that you can find many mistakes much faster with "robot testing", so it'd be cheaper. Of course you wouldn't find "semantic" mistakes.

<comment><USER5> This kind of testing isn't about that kind quantative, QA type testing; it's about qualitative feedback, for example:

\- "We have these wireframes of this new major feature, let's get a group of people from our target demographics in a room and have them react to it and give us early feedback"

\- "We think we have an idea for a new product for managing widgets, so we want to talk to professional widget managers about how they currently manage their widgets; and test our hypothesis that this is a better way of doing it"

As the previous poster pointed out, this is something that isn't easily or readily generalisable into AI.

</comment></comment></comment></comment><comment><USER6> Askable Customer here. Fantastic service, would recommend to anyone in Australia. Vivien, who we work with, has done a great job (not too sure who this Andreas guy is).

<comment><USER7> He's a cofounder. It says so in the title.</comment></comment>


Android 5.0 'Jelly Bean' to Launch by June 2012 - <AUTHOR> http://thenextweb.com/google/2012/02/16/google-reportedly-to-release-android-5-0-jelly-bean-by-june-2012/ <comment><USER2> Have we even reached 2% penetration for ICS yet? Stop rushing out these new releases, start working with OEMs and carriers well in advance of release so we can stop this ridiculous BS where basically no significant amount of Android users are at the latest OS at any given time.

I see more users with old versions of Android more than anything else. It reminds be of BB or WinMo back in the day, where it had the OS it shipped with and you were lucky to get bug fixes, let alone a major version upgrade. That sucked then, and it sucks now.

</comment><comment><USER3> > The news comes in the form of a Digitimes report, which is known for being > hit-and-miss with its accuracy, but should generate some traffic if we > summarize it.

The actual and probably just invented for traffic story:

<http://www.digitimes.com/news/a20120215PD209.html></comment>