F – a pure functional concatenative language (2006) - <AUTHOR> http://www.nsl.com/k/f/f.htm <comment><USER2> Implemented in K! And not very much code either. Certainly shorter than some other language definitions I've read:

[http://www.nsl.com/k/f/f.k](http://www.nsl.com/k/f/f.k)

<comment><USER3> That's actually the most verbose k code I've ever seen (but probably also the most reasonably readable)...

<comment><USER4> And yet still very short and very unreadable.

</comment></comment></comment><comment><USER5> "The language is purely functional. There are no side-effects."

This can be interpreted very efficiently by skipping evaluation.

<comment><USER6> It's also Turing complete.

</comment></comment><comment><USER7> Not to be confused with the other F language, which tried to remove all the cruft from Fortran but didn't really catch on:

[https://en.wikipedia.org/wiki/F_%28programming_language%29](https://en.wikipedia.org/wiki/F_%28programming_language%29)

</comment><comment><USER8> Relation to F#?</comment>


Ask HN: What are your favorite AuthorsGoogle talks? - <AUTHOR>

Hello,
I'm talking about Authors@Google talks:
http://www.youtube.com/user/AtGoogleTalks http://www.google.com/talks/authors/index.html
There are hundreds of them. If you are following, what are your favorite ones? <comment><USER2> My intention is not piss anyone off, but my first exposure to atheism was because I watched Chris Hitchens speak at Google. He lead me to Dawkins who literally blew my mind away. That lead to me reading a quite a bit more about the human condition in general, so, just for influencing my life so much, I'm going to pick Chris hitchens. Here's the link if anyone wants to watch it - <http://www.youtube.com/watch?v=sD0B-X9LJjs>

</comment><comment><USER3> For those who like chess, the Garry Kasparov talk was very good. There's a little bit about making mistakes, taking risks, innovation and Russian politics, but perhaps as expected, it is heavy on some chess stories.

</comment><comment><USER4> junot diaz</comment>


Spolsky on Building Communities and More - <AUTHOR> http://www.bothsidesofthetable.com/2011/05/07/spolsky-on-software-on-both-sides-of-the-table/

<comment><AUTHOR> Select highlights version:

The era of software was a narrow period of time. Before 1980, customers purchased hardware and software was bundled for free with the hardware. Microsoft was brilliant because they realized they could sell software and make a hefty profit from it. Today, we're in a post-software phase. The software isn't the valuable asset, it's the ability to tap into a community that is truly valuable.

...software is not difficult to build and hosting element has become a commodity; the hard part is building a community. That's the unique element, the people who you can convince to come to your site each and every day.

Lesson: Whatever you choose to do in your career, think about how you're going to capture a community. Stop blogging to your friends. Start blogging to your customers and your intended audience.

StackOverflow wouldn't have worked unless I had spent 10 years building a community of programmers.

...skeptical about building on the iOS platform long term, feels that it's not a great platform for vendors because they have no control over whether Apple allows your application in their marketplace.

Pageviews are so cheap to deliver that if you can monetize a small fraction of them you can run a very nice business.</comment>


This must already exist - <AUTHOR> http://lbrandy.com/blog/2009/10/this-must-already-exist/

<comment><USER2> While it's not a perfect solution, the Unix command _apropos_ (a program that searches the summaries of the man pages for utilities) can help immensely:

       $ apropos pipe
       IO::Pipe (3p) - supply object methods for pipes
       perlipc (1) - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
       pipe (2) - create descriptor pair for interprocess communication
       ***tee (1) - pipe fitting***
       funzip (1) - filter for extracting from a ZIP archive in a pipe
       pv (1) - monitor the progress of data through a pipe

I find it helpful to run the following once in a while:

       $ for f in $(ls $BINPATH); do whatis $f >> funs; done

(where BINPATH is /bin, /usr/bin, /usr/local/bin, etc.), skim through the list of utilities, and look at the man pages for anything unfamiliar.

As with Emacs, the tool you want probably already exists, and you may already have it installed, you just need to search with the right keyword. (Learning the terminology takes some time, though.) Any system with that many features is difficult to completely remember, but remembering the details can _also_ get pushed onto the system.

<comment><USER3> Relevant to this discussion is hoogle:

<http://haskell.org/hoogle/>

It beats the pants off of google/apropos/anything else simply because the type signatures for functions in a purely-functional, statically-typed language practically tell you what the function does!

Hoogle is a search engine for haskell's standard libraries, and lets you search by name, or type signature. It even helps you discover abstractions that you never knew about before:

<http://coder.bsimmons.name/blog/2009/04/why-i-love-hoogle/>

<comment><USER2> Apropos and the like could also be a lot more perceptive if they only worked for one language, but it's a _major_ trade-off. On this computer, apropos is a uniform interface to search all the BSD userland utilities, the C, Perl, TCL, and Erlang standard libraries, system design docs (e.g. hier(7)), etc.

Come to think of it, apropos could also search Haskell functions by type signature -- Haddock would just need to generate stub man pages for them. (I don't use Haskell anymore, but someone might find it useful.)

Incidentally, the pipe-able Unix utilities are so useful because they all have the _same_ type (line-buffered text stream -> line-buffered text stream), which is a particularly easy one to use across languages.

</comment></comment></comment><comment><USER4> How about putting the commands into a Makefile and running it with make -j 4? Easy!

For a more heavyweight alternative, there are lots of solutions around for running batches of commands across multiple machines. For most/all of these, multiple commands on a single machine are just one of the simpler cases they can handle. Systems that spring to mind are GridEngine (<http://gridengine.sunsource.net>), Qube (<http://www.pipelinefx.com>) and Condor (<http://www.cs.wisc.edu/condor>). There are plenty of others too (including a lot of home-brewed brewed systems knocking around inside VFX houses).

</comment><comment><USER5> With regards parallel jobs, what's wrong with sticking a "&" at the end of the line? Everything he listed is pretty trivial.

It comes down to the idea that the command line is a "non-discoverable" interface. If you don't know what you want, there's pretty much no way to find it.

Any suggestions how to fix that? Google solves a lot of them, but not all. Having said that, I've had fair success recently with just typing entire questions into it as if it were a programmer I'm talking to ...

<comment><USER6> I learned probably around 80% of the shell commands I use through apropos.

For example, if I'd been searching for the "pipe thingy" lbrandy's blog entry starts out searching for, I might have typed "apropos pipe", and lo and behold, there it is at the bottom of the list:

       ...
       pipe(2)                  - create descriptor pair for interprocess communication
       pipe(8)                  - Postfix delivery to external command
       rotatelogs(8)            - Piped logging program to rotate Apache logs
       tee(1)                   - pipe fitting

"pipe fitting" isn't the most useful description, but given how few other things there are, it's not too many man pages to read, especially after culling out the things I already knew about back when I didn't yet know about tee(1).

<comment><USER7> On my machine (debian lenny) it's listed as:

      tee (2) - duplicating pipe content

tee (1) does not show up in the search for pipe, but it's description is:

      tee (1) - read from standard input and write to standard output and files

</comment></comment></comment><comment><USER8> phrase your processes as make rules. then use gmake -j - this will let you restart properly in the case of failures, as well.

</comment><comment><USER9> I've had to run those kinds of jobs before and wanted exactly that kind of tool, not being able to find it at the time, I wrote one:

      http://asymmetrical-view.com/personal/code/perl/parallel-jobs.readme

      http://asymmetrical-view.com/personal/code/perl/parallel-jobs

Example 'command file': # specify several downloads to be run in parallel wget <http://some.host/software.tar.gz> wget <http://some.host/database.mdb> wget <http://some.host/movie-trailer.mpeg> wget <http://some.host/linux- distrubtion.iso>

Run as:

      parllel-jobs --cmdfile=file.cmd --maxjobs=4

<comment><USER10> It turns out you didn't have to write your own program. Sometimes I know there's somewhere a unix tool that does what I'm looking for, but writing it can be pretty fun.

</comment></comment><comment><USER11> Everybody's jumping in with suggestions for a better command line. What about ways to know what you need to know when you need to know it?

Maybe we could figure out a thingy that watches what you're doing and finds ways to do it better.

<comment><USER2> Doing that well is difficult, and (worse still) when it breaks down, it's typically very irritating. There is a sort of uncanny valley of automated helpfulness, where sincere attempts to assist common interactions just end up feeling like Clippy to end users.

</comment></comment><comment><USER12> Wow, xargs can parallelize commands? That's amazing, and could be extremely useful.

<comment><USER13> xargs + ssh = poor man's hadoop.

</comment></comment><comment><USER14> This is why they invented perl.

      #!/bin/perl
      use Parallel::ForkManager;
      $pm = new Parallel::ForkManager(4);
      while ($filename = <*.jpg>) {
        $filename =~ s/.jpg//;
        $pm->start and next;
        system("convert $filename.jpg -resize 320x240 $filename-sm.jpg");
        $pm->finish;
      }

<comment><USER15> So much more readable too.

</comment></comment><comment><USER16> A sysadmin friend of mine swears by xapply - although it is largely a BSD-only application (and tricky to build on linux, to say the least) it appears to have been the inspiration for xargs's -P option.

</comment><comment><USER17> See also the Related Work for shmux: <http://web.taranis.org/shmux/>

</comment><comment><USER18> awk? cut.

<comment><USER19> Every time I go to use awk for something I always think, 'I feel like I would be able to do this with cut so much more easily, but I also know that I always feel like that, but am never able to get cut to actually do what I want.' Despite feeling that way, I usually optimistically go spend 30 minutes trying to get cut to do something simple like give me a specific column from the output of _ps aux_. But it's just 30 minutes of banging my head against the keyboard, and it always reinforces my original strategy, which is to use awk for everything and never, ever use cut.

<comment><USER2> If your issue with cut is what I susect, you need to flatten the whitespace first with sed.

At that point, I'd just use awk, though. It has better defaults for field delimiters.

<comment><USER20> > [...] you need to flatten the whitespace first with sed

by "flatten the whitespace" do you mean turning many spaces into one space? If so, I have always used tr with the -s (squeeze) option for that:

        $ echo "one       two     three" | tr -s " " | cut -d " " -f 3
        three

<comment><USER2> Didn't know about that option, I always did it with sed. Thanks! :)</comment></comment></comment></comment></comment>


Simulate a Nation According to Your Political Ideals - <AUTHOR> https://www.nationstates.net <comment><USER2> My assumption is toys like this always have a didactic political objective: the simulation will be designed so that the simulation designer's own political ideals will "work" in the simulation, and those that he particularly disagrees will will "not work."</comment>


The Truth and the Hype of Hypnosis - <AUTHOR> http://www.sciam.com/article.cfm?id=the-truth-and-the-hype-of

<comment><USER2> Way back during frosh week in university, I went on stage during a hypnosis guy just for fun.

I tried to get into it as hard as I could and go with the flow, it wasn't happening. My friends on stage who did get 'hypnotized' said they were just doing whatever he said to act foolish and have fun.

Either way, it turns into an entertaining stage act having some people running around doing whatever you say. Convincing frosh to do stupid things is as easy as depressing teenagers.

<comment><USER3> Perhaps the state of 'hypnotized' really feels like 'doing stupid things on command' because your brain tricks you?

<comment><USER2> Perhaps the state of 'hypnotized' really is 'following along' because you want to believe?

I hear what you are saying...I just don't believe it.

<comment><AUTHOR> However, that's not it.

Hyptosis is a well-known mind state, and there is nothing strange or mysterious about it. It's even used in medicine, and if you do some google searches you'll see the term mentioned on all the most important medicine journals worldwide. For people who works on psychiatry, neurology, etc. that's no secret at all.

There is plenty of info on its wikipedia's page too if you are curious about it.

<comment><USER3> Thanks for enlightening us.</comment></comment></comment></comment></comment>


Statistics on GDP Correlations - <AUTHOR> http://filipspagnoli.wordpress.com/stats-on-human-rights/statistics-on-gross-domestic-product-correlations/

<comment><USER2> GDP and penis size in 76 countries?!</comment>


You Don't Want to Think Like a Programmer - <AUTHOR> http://prog21.dadgum.com/190.html <comment><USER2> OP says that a masterful understanding of coding in general necessarily leads to a disregard for features that users want.

I think this is a false dichotomy -- developing a masterful understanding of what things cost must be coupled with a masterful understanding of what makes things valuable.

If OP shared what caused him to think this thought perhaps a good conversation would happen. I could see myself write something similar about CFOs after encountering one at a past startup who kept turning the air conditioning off to the point where coding in the office was a sweaty experience.

I think the title of the correct article is "You want to think like a programmer and a customer" or "You don't want to thin like a bad programmer"

<comment><USER3> > _I think this is a false dichotomy -- developing a masterful understanding > of what things cost must be coupled with a masterful understanding of what > makes things valuable._

It might be a false dichotomy in theory ("well, no reason why these two concept should not be orthogonal") but it sure is a real dichotomy for very many developers.

People lost in the details of coding, best practices, new fancy languages, monads et al, while not producing anything of substance for real users -- or getting lost in the process and not getting anything released.

There's even a kind of term for these people "architecture astronauts" (coind by Joel Spolsky IIRC). And the even older, "worse is better" notion is also related to the same issue.

<comment><USER4> There's an even worse kind of architecture astronaut, almost the opposite of this article. It's the architects who don't even know about encapsulation, loose coupling/tight cohesion or even not to duplicate data anywhere without rules for resolving mismatches.

They've never written a line of code and yet somehow are dictating spaghetti enterprise architecture. Their business requirements are things like "must comply with all applicable standards" (isn't it your job to at least work out which ones, or are you above that?) and they never actually stop to think whether any of this will actually work.

I'll take a language hipster and a clueless business user who just wants it done any day.

</comment></comment></comment><comment><USER5> It's really _hard_ to keep moving all the way up and down the stack. If you spend a few weeks hacking on a few key low-level routines, that might enable you to write the rest of the code in python and use some library you really want. In turn, that might enable you to release many more innovations faster than you would otherwise, and create something awesome.

But it's hard to remember all of that when you're in the middle of writing some C code so that it can be optimized with vectorized instructions when targeting newer chips.

Hacking is great, but engineering can inspire and enable hacking. How many of these cool startups would be around without gnu/linux/freebsd?

I think the trick is to go to a higher level once a day, or spend more time at a higher level once a week. What is value you will deliver to at least one other person? Are you making real progress getting there; or are you building an endless series of platforms on top of each other without ever having a clear application in mind?

Even if you are working on a generic performance improvement you can still do that. If 10,000 servers are running your software, and you improve performance by 2.5%, then you can measure the value you delivered in terms of power saved per year and it would be a real accomplishment. That will be motivational, and it will also help you choose a better follow-up project to deliver even more.

<comment><USER6> _It 's really hard to keep moving all the way up and down the stack._

The main advantage, to me, is being able to collapse layers of abstraction. We've done that at one of the startup's I CTO for.

On the backend, we eliminated the entire multi-tier stack we've come to know and love from the late 90s. The database, application server, caching server, and authentication server were collapsed down into a single executable.

We dropped TCP, and went to UDP + NaCl-based crypto. This in turn changed how we did session management and logins (we only target mobile devices), and allowed us to gain further performance by bypassing the Linux kernel entirely, and talking directly to the Ethernet hardware. Our wire-to-wire latency for a UDP packet (without any processing, just heading through the LuaJIT app framework) is ~26 nanoseconds. We measure the entire request/response time in less than 10,000 nanoseconds for updates, and frequently, less than 3000 nanoseconds for reads.

Nanoseconds! Today's hardware is crazy efficient, but yesterdays software architectures waste it all.

For caching, we employ a database library (lmdb) that uses the file system and memory mapping for all data, a lot like Varnish Cache does. We can service reads without a single malloc() call. No more memcached.

Finally, the entire system is built around an event streaming approach (see Disruptor/LMAX). For that to work, we wrote our own cross-platform Core Data alternative on the client, and for this particular application (a social network), the end result is that the user experiences ZERO network latency for everything but search.

Everything is local by the time the user is made aware of it. For updates like making a post, we make it happen instantly on the client, speculatively, and eventually the update makes it's way to the server and back, and then on to everyone else. The user doesn't even need a live network connection to post, and "offline" usage works as expected.

And also (since this is a speciality of mine), our object graph syncing is multi-device from day one. Lots of projects (e.g. Vesper) struggle with that one. We didn't bolt it on, it's a fundamental property of our data model and overall system.

After collapsing the crypto, database, and authentication, we were able to introduce object capabilities that requires zero memory lookups, instead of the usual RBAC, which in my experience is difficult to implement efficiently and hard for people to manage.

And because we have our own network protocol, and are targeting native clients we control, we can easily do client-side load balancing. We use consistent hashing to contact read-only servers (that also handle crypto), mostly so we can spread out the bandwidth without having a crazy expensive load balancer. Thanks to our custom database/app server, we can service all writes on a single machine, although like LMAX, it's designed to run three in parallel, discarding the results of two of them at any given time.

Point is, there are HUGE gains to be made when you (a) understand the whole stack, (b) have the skills and understanding to rewrite any part as you need to, and (c) have the guts to ignore 15 years of received wisdom on how to scale an app and are willing to collapse layers down in pursuit of speed and simplicity.

It may be harder, but the payoff is enormous. I did all of the above myself in just over four months, including building a cross-platform app framework for iOS (porting to Android in March), and the app itself.

<comment><USER7> > UDP + NaCl-based crypto.

I would love to hear more about this. I was looking for a way to send UDP that is encrypted and authenticated, with private contents and no replay attacks. The best option I could find is DTLS, but that has spotty support on Windows and no API in common scripting languages. Can you say more about your approach? If it is roll-your-own, what makes you confident it is secure?

<comment><USER6> _I was looking for a way to send UDP that is encrypted and authenticated, with private contents and no replay attacks._

I use crypto_box/unbox as is, although we do do the crypto_beforenm()/crypto_afternm() as (a) our clients are known, and (b) it's ridiculously faster. The docs on NaCl mention it, sort of, but it's much, _much_ , faster. If you can do it, you always should do it.

As for replay attacks, we use what I'll call "hash chaining" (if someone knows the real name, I'd like to know). We have two kinds of messages, ordered and unordered. Unordered messages can be replayed at any time, as they are read- only, or some other kind of status messages, such as a heartbeat.

For ordered messages, we hash the previous message and use it as input for the next message when it is hashed. Both hashes are sent with each message (we use Sip-Hash 2-4, highly recommended BTW). (One analogy would be how git works, where the previous commit's hash is hashed as part of the new commit's hash.)

The chain of messages from the device to the server is called the "device stream", and we have a second chain going back to the device, the "update stream". The system supports multiple device streams for a single users (e.g. an iPhone and an iPad), but there's only one update stream for all devices, so they stay in sync.

Both ends of the connection test the hashes before applying, which trivially prevents replay attacks, since every ordered message can only be "played" once. We store the current device stream hash when the database is updated, in the same transaction, on both the client and the server. This provides resiliency in the face of crashes.

We also use the hash chain to detect out-of-order messages. In our application, they're pretty rare, so I simply drop out-of-order messages and request the correct one from the client.

This could be bad, because playing back old messages would illicit a response. For that reason, and also because I don't want to store update streams in the database permanently, the messages include their offset in the stream. The in- memory, wire format, and on-disk format of each messages is identical, so we can lay them end-to-end on disk. When a messages comes in, we can trivially determine if it is old, and drop it that way, too. If we need to write an update stream to disk, because the client hasn't connected in a while and we want to free up space, it's a single sendfile() + known offset call, conceptually, to send the update stream since they last signed back on. That way, we don't need a separate index for streams on disk.

Hope that helps!

<comment><USER7> Wow, thank you for such a detailed writeup! I'll need to digest this a bit and see if it makes sense for our application.

</comment></comment></comment></comment></comment><comment><USER8> I disagree with the author over software engineering vs problem domain issues. It's not that the author is wrong. It's that he doesn't articulate the role of the software engineering concerns. It isn't about _whether_ to obsess about these. It is about _when_ to.

The ideal is to cycle. Focus on the problem domain. Get something working. Come back, look at the software engineering domain. Obsess about that for a while. Then move on to the next project. The cycle itself means you get to be productive, get to focus on solving real problems, and get a chance to evaluate your code style and experience, improving it along the way too.

I have maintained 200k line Perl programs written by someone who never stopped to ponder anything outside the problem domain. It was a total mess. The program was basically a textbook in how not to program, particularly how not to write Perl. Matt Trout said it was "written by the programmer that Matt's Scripting Archive would have fired for writing bad code."

If you want your software to last, then software engineering has to be an aspect of it. But the author is also right that you can't let this detract from solving the problems at hand. Consequently you have to be able to really focus on learning each side in cycles.

<comment><USER9> > I have maintained 200k line Perl programs written by someone who never > stopped to ponder anything outside the problem domain

Ditto, though I think I have a unique element to my story.

I spent a week deleting code I couldn't detect a use for. I nuked nearly 40,000 lines and could not discern a difference in functionality (though, couldn't be certain since I hadn't completed the test suite.)

Writing a test suite for software with no spec and only others' vague recollections of meetings to go on (Agile!) is fun - it basically ends up a regression suite enforcing current broken behaviour.

Perl takes no part of the blame for this, some of the Rails code needs to be seen to be believed - looked like an early PHP tutorial in places.

What was great was, the Perl was full of comments about how much easier it would have been in Ruby/Rails because he never bothered to read the docs on references.

<comment><USER8> > I spent a week deleting code I couldn't detect a use for. I nuked nearly > 40,000 lines and could not discern a difference in functionality (though, > couldn't be certain since I hadn't completed the test suite.)

I don't think we deleted 20k lines. Probably more like 5k.

However the kicker was when deleting something that seemed harmless enough broke something. In that case, it was a _comment._ We're not talking about smart comments here. We are talking about comments that are parsed and used by the application at run-time for actual logic :-P.

Oh, and when we added test cases for rounding numbers.... the test cases failed....

Regarding the role of language, I would much rather be maintaining bad Perl code than bad PHP code.....

</comment></comment></comment><comment><USER10> I think the problem is not that you shouldn't think things through with academic rigor.

The problem is that there is so much cargo cult junk in programming as a field that it's impossible for a novice to discern the pseudo-engineering crap from the truly beneficial concepts. Beyond the core algorithms and data structures whose mastery should be kinda obligatory if you want to implement anything in production, it is impossible for a novice to tell what he should ingrain in his daily work and what he should not.

The advice given here is therefore is very good. Get practical experience in building things, so you identify the beneficial abstractions when you learn of them, and have courage abandon those that do not provide value.

The downside is the "expert beginner" who learns a one way to do a thing and thinks it's well and good to do it that way for all eternity. Higher level languages are fantastic because they offer efficient and practical abstractions out of the box for the "patterns" you would implement yourself in a half-assed way in a lower level language like c.

People infatuated with solutions finding a problem are kinda bad from a communication point of view. They are so a plenty that when one tries to offer practical higher level solutions to existing problems the listener often thinks this is motivated out of love for the solution and not out of love for the problem.

</comment><comment><USER10> As a counterpoint, there are very good engineering reasons for standardized code layout and enforcing const correctness.

They are there to optimize the use of the mental energy of the programmer.

Const correctness makes it much easier to read and reason code someone else has written. Or myself, months from now on.

Standardized code layout should be strict enough that you can identify scope at a glance when browsing through a 10 MLOC engineering CAD application and hunting for that one bug or strange call path.

But - these are necessary features for _production_ code. For _prototyping_ code you should optimize for maximal mutation rate and not necessarily legibility rate. Although the code should not be garbage (if you can't read it it's kinda worthless) strict conventions often hinder fast iteration and you should really figure out which ones are necessary constraints for the problem at hand and which are not.

</comment><comment><USER11> I'd take this further and add that you should always be doing something wrong in the pursuit of more than just code. As a novice programmer you can spin your wheels learning every best practice without building much of anything. And HN often compounds this problem - look at every 'You're doing it wrong ...' post. Instead, I think you should make something crappy and make the rookie mistakes. Overtime, simply look to improve bit by bit.

I imagine someone will protest this idea, saying that there's already enough crappy software out there, that the world doesn't need any more technical debt. But this fails to realize that technical debt is a good thing in someways- it's a by-product of learning and crashing through boundaries.

In a way, technical debt is analogous to carbon emissions- yes, by itself it's a bad thing. But in the larger scope, carbon emissions are a by-product of industrialization, a process which has vastly improved our quality of life. Technical debt, like carbon emissions, is a sign of progress.

<comment><USER12> I once worked on a project that pivoted the business logic so many times, with one hack after another, that technical debt went through the roof - at which point it became next to impossible to further evolve it. Because of legacy and tight coupling, simple features would take longer and longer to implement. And because the architecture was completely based on assumptions of low traffic that would grow organically (it was a web service), the shit really hit the fan when we started getting tens of thousands of requests per second, again because the architecture was so bad that it seemed as any optimization we did was worthless and actually made matters worse. The web service actually had to be stopped for a while, because as a startup we couldn't afford to rent a thousand frontend servers and even if we did, you're only moving the problem up the chain, which in our case was the data storage and again, because of tight coupling, it was unfeasible to move it to something that scales horizontally.

So the solution was to basically rebuild this web service from scratch. This decision also came with business logic simplifications - as we realized that certain features were unfeasible at that scale, so many features ended up being dropped based on technical considerations. Which IMHO was OK, because the best way to approach problem solving is to build _less_ and sometimes we end up building features instead of solving the problem that we set out to solve in the first place.

I wish I could say that our initial approach allowed us to iterate fast. But it didn't. I was there from the start, I've built the prototypes, I did the pivots, I made all the wrong choices, I managed the team that came after and I could've made all the right choices without sacrificing fast iterations. All it takes is experience and tools that do "the right thing" in regards to your problem, without sacrificing productivity - being able to recognize the best tool for the job, being able to simplify problems, being able to tell the _cost_ of something - now those are traits of good software developers.

The article does have a point though - you can learn all day about tools, best practices, algorithms, paradigms or whatnot, but in the end the goal isn't and shouldn't be to write "beautiful code", but rather to produce artifacts for solving problems that people have.

<comment><USER8> > I wish I could say that our initial approach allowed us to iterate fast. But > it didn't. I was there from the start, I've built the prototypes, I did the > pivots, I made all the wrong choices, I managed the team that came after and > I could've made all the right choices without sacrificing fast iterations.

As long as you learned a lot from it.... We all make architectural errors. One can't learn without making mistakes though.

</comment></comment></comment><comment><USER13> > You come to understand why every time a useful program is written in Perl or > PHP

Mate, I agree PHP sucks (aside from the legions of maschochists who do useful stuff with it), but a lot of perl (when used in a disciplined manner in communication with ones peers) is a useful and productive orthogonal take on computer science.

</comment><comment><USER14> As someone leaving the beginner stages and moving to intermediate development I found this to be very true and wish I did a lot less tutorials and just started to hack stuff together. I learned far more doing something crappy from scratch than 100% on some "X" clone!

</comment><comment><USER15> I think the article stretches too far away the "think like a programmer" motto by including design patterns and TDD in there. You will have trouble learning if you do not think like a programmer, as in basic CS 101.

Thinking like a programmer is really near to mathematical thinking, just the basic stuff: logic, invariants and program correctness, in paper, and using pseudo-code. After a year one will be ready to throw that stuff through the window, not because it is not useful, but because it is already engraved on your brain and somehow, even if you do not use assertions at the start of your functions or do not write an invariant down for each loop, it will be there and will make your code cleaner and free of copy-pasted code.

<comment><USER16> I guess you like math much, am i correct? Programming is in some wayslike math. Programming is in other ways more about organisation, expression and language skills.

But the real truth is that people are different. Some people are mechanics in the head, they like to optimize small functions and break systems and loved the assembly c time. Some people see the world as states and attribute facts to static objects, these people love OO, its an entire paradigm that complies to their though process! Some people are rigours about how the world moves, they like Haskell and logic programming and always bring these aspects to their code base.

Some people are dynamic and see the world as a continuous flow of time (not pinning attributes to things, seance a thing can change along its time line, thus brining focus on the core of things and ones purpose), they like languages like lisp where transformations of data is the center, not classes with fixed static attributes, that is contrary to their irl thought processes. These are the people who develops non-deterministic programming, because the focus is on time not space. They like macros and other efficient expressive tools because it allows you to express your solution in a better language and automate transformations.

tl;dr / Summary People think differently and programming is merely a means to express yourself, ergo your view of programming will be a view of how you like to think and function, and to say that your own definition is the universal truth is arrogant, narrow-minded and wrong.

[http://wikisocion.org/en/index.php?title=Statics_and_dynamic...](http://wikisocion.org/en/index.php?title=Statics_and_dynamics)

<comment><USER15> Maybe I am wrong, and I am confusing programming with programming for maths. Now again, on the low level, it's really easy to find maths everywhere, while on the high level, one just interacts with development libraries.

As a note, maths are not a field I am really strong on, and had a hard time with them at the university. But, even when it was hard, it helped wrap my brain around programming and provided me with elemental tools. Yes, programming might be drawing pixels in a grid, or could be just throwing words at the computer until the output is what you want.

I do not consider myself a proficient programmer and yet, I pity the programmers that look confused at a chunk of code in Eclipse and just add whatever a set of libraries provide to get something to work, which often ends up with larger chunks of code that basically do nothing, but are there just because (with an special guest, more chunks of commented code that are waiting for someone to delete them). I experienced this feeling the first time I programmed something for Android. And no, in this case there's no 'some people might have a different view on the issue'. There's people who code that have no clue of what is happening, and that is saddening (and I guess, stressful to them).

As an exercise on what I am referring with basic tools let's see the simplest example I can think of: define a function that returns the factorial of a number. We know the answer already, but instead of doing that, let's think first, and generate the code later [∗]

What defines a factorial?

        n! = 1 * 2 * 3 * ... * n-1 * n

Any particular case?

        0! = 1

Let's pick an strategy for our loop:

        - At each iteration, we will mantain that f = i!

        - For all iterations, i ≤ n

The program finishes when i = n

Ok, now code

        // Pre: n ≤ 0
        // Post: returns n!
        int factorial(int n):
            int i = 0
            int f = 1
            // inv: f = i! and 0 ≤ i ≤ n
            while(i < n):
                i = i + 1
                f = f * i
            return f

[∗] = And that's for me the main reason this works. This is a silly example, nobody would think of invariants when you are iterating through a set of records from a database to calculate the median age of your employees, but at least it has trained you to think before cracking code. And this is just the first step on the path.

It is not "the universal truth of programming", and there are many many different "states of mind" that one will need to learn in order to do something (OpenGL and state machines, SQL and declarative languages, etc). But before learning something (unless you are really talented, I guess), one must learn to learn.

<comment><USER16> I am having a hard time how one could have gotten that impression if one has worked in ecommerce or business software, i promise you that mayor ecommerce site is just not interacting with development libraries.

I really can't see the point of your third paragraph, what are you arguing for? That the people who threw code was people who didn't share your view on programming? Or is the paragraf to be interpreted that anyone who try to use leverage in code is a fool? And also how are inexperienced untrained programmers skill really relevant to different views on programming?

Let me give an exercise in return. Add to the code base a module that allows the skin of the site to be changed depending on the users device in a way that it is easy to add skins and also capability to random give users different skins. How much math do you really need beyond Math.rand(0,100)?

This instead is task that is solved by being able to formulate an expression that is general enough and can communicate with the existing system and fit the existing organization without breaking the big structure. No computations is really taking place ( in the seance we want to get some mathematical result from different values ) it's only flag checking at the bottom line.

You learn to learn when you grow up. The things you mention are different ways to look at problem and thus different ways to express solutions.

<comment><USER15> I do not think our views on the issue contradict at all.

Maths may not relate on how you structure code, but (as I see it) an early start with a little dose of maths on understanding algorithms, may make your brain understand the elementary stuff easily, and make you think like a programmer. Are there any other introductory ways to get there? Sure, why not.

My third paragraph was referring to what I have seen on the people that do not think as programmers. Not as a matter on how they got there, but as how they never got there.

</comment></comment></comment></comment></comment><comment><USER17> I agree and disagree here. Disagree because you need to master the rules before you break them. This is surprisingly true for most skills say Cooking, Novel writing, or Sketching. Though you might think that it is best to be completely creative and unconstrained, there are written or unwritten rules in every artistic endeavour which is inherent in the medium.

I agree with him that working on a project is often the best ways to learn a new skill. But for heaven sake, heed to what the experienced folk say and deliberate on whether to follow them or not.

<comment><USER3> > _I agree and disagree here. Disagree because you need to master the rules > before you break them._

This is a truism, but I don't think it's all that applicable to everything.

There are lots of musicians who paved their own way, breaking the rules, without first having "mastered" the previous ruleset. Same for painters (there are pioneer modern painters who could not paint anything Renaissance style for example).

And, yes, there are programmers who created succesful software, even multi- million businesses, without really knowing the whole craft of software engineering.

Isn't, for example, Derek Shivers (who frequents HN from time to time) a classic example of "fake it till you make it"?

Or even this Zuckenberg guy. I don't think Facebook was the result of a master software craftsman.

<comment><USER18> Some early FB code got leaked a while back... Master software craftsman, Zuckerberg was not.

</comment></comment></comment><comment><USER19> I agree with the basic idea but would advise most people who are in it for the long haul to still go through the process of learning to "think like a programmer", just always be prepared to reach a point where you get good enough that you can throw some of what you learned out the window some of the time, when it benefits whatever it is you are actually trying to accomplish.

While some people see that middle bit where you teeter on the precipice of becoming a full blown architecture astronaut as wasted time or effort I see it as a Journeyman phase that most people need to go through to become true masters.

Sort of like photographers should fully understand the rule of thirds and other classic rules of composition because really understanding them gives them better insight into when and why they are better off breaking them.

<comment><USER8> I think the larger issue is that it is hard to learn how to use rules effectively if you haven't learned hard lessons by breaking them.

Part of the problem is that human language is by nature imprecise as is human knowledge. The rules have very fuzzy edges and people need to be introspective about these sometimes. But you can't be introspective about the rules if you aren't pushing the limits. Otherwise you are in safe territory and there's nothing to be introspective about.

</comment></comment><comment><USER20> While the article does make a good point... I find it happens very rarely. Or if it does its almost never vocalized.

It's a little like saying don't think like an English speaker or you're going to pedantically correct everything. Sure it happens, but it's not a lot of people that do it and among those its 1 in a million that actually do it to a point where it gets in their own way.

</comment><comment><USER21> If you make your living as a programmer you most certainly want to be thinking like one. Those patterns, best-practices, design principles, preference for static typing etc. all matter when you are paid to develop systems that perform well, are easy to maintain, have few bugs and are delivered on time. If however you are not burdened by such obligations, by all means, go full cowboy.

</comment><comment><USER22> Don't we tend to discuss a lot about semantics and words?

"Don't think like a programmer, think like a developer"

"Learn to code, not to program"

Most of the cases we have words that mean basically the same, and we almost randomly say, more or less, that X means "a good Y".

<comment><USER23> Agreed! I liked the OP, even though it was quite guilty of this. But what is it about programmers (hackers/coders/developers/whatever it's called in your idiolect) that makes us so pointlessly passionate about diction?

</comment></comment><comment><USER24> Fully agree, even when I bash C and Go design decisions regularly, I wouldn't care using them if that is what customers require me to do.

What matters at the end of the day is delivering working solutions to a problem, not how beautiful such solutions are.

</comment><comment><USER25> Understanding the software of your domain will allow you to be more informed on how to improve it. A mastery of Midi to make better and new musical instruments...

The foundation for these abilities comes from habits this OP encourages you to avoid

<comment><USER3> > _Understanding the software of your domain will allow you to be more > informed on how to improve it._

Or it could result in you getting lost in its minutiae and losing the big picture.

After a while you might not even care to improve it at all, just end happily exploring niche advanced areas.

</comment></comment><comment><USER26> Related: I once had a girl in my bed and I'd done so much programming that day that I started to think of her in code whilst half asleep... Didn't make any sense at all...

</comment><comment><USER27> It sounds like a strong parallel with people who like to talk about doing great things, and people who actually do things.

</comment><comment><USER28> > Take time to line up your equal signs so things are in nice, neat columns.

Anyone else have a gag reflex when they see code like this?

<comment><USER29> If I've got an enum where all values require assignment, lining up the = makes it easier for my human eyes to scan names and values later.

<comment><USER28> I don't buy this argument at all. Let's start with what might be a fairly typical set of variable declarations in Javascript:

        var firstVar = "one";
        var secondVar = "two";
        var thirdVar = "three";

I think you'd be hard-pressed to find anyone that would say this is significantly more difficult to read than the lined-up alternative:

        var firstVar  = "one";
        var secondVar = "two";
        var thirdVar  = "three";

But, of course, variable names aren't always going to be short. You might have something like this instead:

        var firstVar = "one";
        var secondVar = "two";
        var thirdVar = "three";
        var thisVarHasAReallyLongName = "four";
        var thisIsAnotherVarWithALongerName = "five";

My eyes don't have any problem scanning the variable names to see what's what. I also find it very natural to scan the variables by-value to determine which value is assigned to which variable (which I believe is typically the argument for the lined-up-equals alternative). Lined up, this looks like the following:

        var firstVar                        = "one";
        var secondVar                       = "two";
        var thirdVar                        = "three";
        var thisVarHasAReallyLongName       = "four";
        var thisIsAnotherVarWithALongerName = "five";

I don't know about you, but I find it significantly more difficult to visually parse these by-value to determine the variable corresponding to values "one", "two" and "three". The whitespace gap means that visually I may forget the vertical alignment of what I was looking at on the right when I try to find the variable name on the left.

I also think that it's at least a little bit harder to consistently enforce a convention of this kind. If a variable name gets too long, and you're not using some sort of auto-formatting, you have to manually space-out the variables to a new name length every time you introduce a newer, longer-named variable.

I think the real impulse people have for this kind of convention is that it actually just looks a little bit neater, because things are aligned in columns. In reality I think it's much more difficult to parse and maintain.

<comment><USER30> Your last example could be aligned a little bit differently to make it easier to visually parse:

        var                        firstVar = "one";
        var                       secondVar = "two";
        var                        thirdVar = "three";
        var       thisVarHasAReallyLongName = "four";
        var thisIsAnotherVarWithALongerName = "five";

<comment><USER31> My solution:

        var firstVar  = "one";
        var secondVar = "two";
        var thirdVar  = "three";

        var thisVarHasAReallyLongName       = "four";
        var thisIsAnotherVarWithALongerName = "five";

The different length of the variable names should be derived from the fact that the variables themselves are different. So they should be grouped separately.

</comment></comment></comment></comment></comment><comment><USER32> I would love to agree with this, and I do in principle, but the reality of IT technology today means we can't make such assumptions in our abstractions without knowing the implementation details to extreme degrees.</comment>


Warren Buffett's Best Investment - <AUTHOR> https://www.gatesnotes.com/2017-Annual-Letter <comment><USER2> It's hard not to be impressed by what the Gates Foundation is doing. I don't think they get the full recognition they deserve sometimes, maybe because much of their work is abroad in the poorest countries in the world.

Hard to fathom the number of people out there in the world thankful and who owe their lives to the foundation choosing to help their community or their cause.

With that said and not to diminish the good work. It is sad and eye-opening more progress has not been made on these issues.

I think when you really look at the numbers, besides seeing the positive trends one can also see how truly difficult, large and complex these problems are. The foundation has $50 Billion dollars! And Bill can get pretty much any world leader or other billionaire CEO to take his phone calls. Yet, sorry that is not enough not even close. The foundation has to focus on very specific issues and even then it hasn't "gotten to zero" where it wants to (though Polio is close, down to 37 cases). Private foundations can only do so much, the scale of these problems really requires the cooperation of governments. I'm not sure what can be done on that or what that means, just a bit breathtaking how governments can help people or really screw things up on a scale nothing else even comes close to.

<comment><USER3> I wonder how much of this particular philanthropy is just giving back money that those countries spent? I.e. Microsoft licences, or balance of trade with the donor countries?

A kind of benevolent taxation?

<comment><USER4> I'd be more fearful of corruption in those countries. This is where so much foreign aid falls apart, it's siezed by the government, distributed to their favored constituents, and never makes it to the people who really need it.

<comment><USER5> Bill gates talks about corruption in his 2014 annual letter (1). Search for the word "corruption" if you don't want to the read the whole letter. TLDR: Its manageable.

(1)[[http://www.gatesfoundation.org/Who-We-Are/Resources-and- Medi...](http://www.gatesfoundation.org/Who-We-Are/Resources-and-Media/Annual- Letters-List/Annual-Letter-2014)]

</comment></comment></comment></comment><comment><USER6> To Bill and Melinda Gates:

It was really uplifting to read this post.

Because of it, the world now looks a little brighter to me.

We're all surrounded by alarmist news every day and often lose sight of the big picture.

PLEASE write a post like this one at least once a year :-)

<comment><USER7> Not exactly the same, but they've done similar posts the last two years:

[https://www.gatesnotes.com/2016-Annual- Letter](https://www.gatesnotes.com/2016-Annual-Letter)

[https://www.gatesnotes.com/2015-Annual- Letter](https://www.gatesnotes.com/2015-Annual-Letter)

Also, the annual reports are quite interesting as well:

[http://www.gatesfoundation.org/Who-We-Are/Resources-and- Medi...](http://www.gatesfoundation.org/Who-We-Are/Resources-and-Media/Annual- Reports)

</comment></comment><comment><USER8> You don't need a Gates- or Buffett- sized pot of money to make a difference. Sure, they can, and do, place massive orders at vaccine factories to get economies of scale. That's how a dose of the pentavalent vaccine comes to cost about the same as the CD that Windows used to arrive on. You probably can't place a US$50M order at a pharma company. But that's OK.

You can find a local NGO or charity that promotes, I dunno, literacy or first- generation college students or refugee settlement, or something. What matters is that they do a good job and you're interested in their mission. You can commit to supporting them with a regular cash gift. That kind of regular gift lets a charity plan their work. (One-off gifts are good too, but they don't have the planning benefit.)

But be careful: they may want you on their board of directors. :-)

<comment><USER9> Giving money to any charity is potentially better for the world than giving money to _no_ charity. But part of the premise of this article—and of the Gates Foundation—is that some charitable acts have much higher ROI (in lives saved per dollar, or whatever other metric you might want to measure by) than others, and you should focus on those if you want your money to go furthest in doing good in the world.

This approach is usually known as "effective altruism" — there's a whole part of the blogosphere hanging off that keyword. But conveniently, I can just link to [http://www.givewell.org/charities/top- charities](http://www.givewell.org/charities/top-charities) — this is a (very well-researched) consensus list on which charities turn "dollars contributed" into "good done in the world" most effectively.

Reasonably, the entries on GiveWell's list match pretty well with the strategy of the Gates foundation (i.e. vaccines et al.) The differences in the Gates Foundation's strategy mostly come down to the fact that economies of scale for solutions work out differently when you have millions vs. billions of dollars.

Of course, you're allowed to disagree with the ranking criteria the EA people use—maybe the global number of "quality-adjusted life-years" people get to live isn't the #1 thing you care about optimizing.

But even if you disagree about the particular charities, EA—and the parent post—still have an important point you should understand: no matter the charity, _contributing money_ is almost always higher-ROI than _volunteering_. (It might feel "lazy", but it's the principle of comparative advantage: the person a charity could _hire_ for the money you can earn in time X at _your_ job, will almost certainly do more good for them than you'd do by volunteering X hours of your own time.) And that "get the highest ROI for my charity dollar" mindset is what's important, no matter what you're measuring ROI in terms of.

<comment><USER8> Keep the old slogan in mind: the best is the enemy of the good. Even the Gates Foundation had to try various things as they were getting started. So can you. Don't overthink it.

</comment></comment></comment><comment><USER10> You know, we get a fair number of commenters here at HN who are cynical about the world, who say everyone with any power is corrupt, things are getting worse, and there is nothing you can do about it.

Whenever someone like that shows up, perhaps we can refer them to this letter.

<comment><USER11> I doubt that'll work. Once we develop a cynical view of the world, it's quite easy to see the negative side of everything.

Just for example, take the biggest benefit claimed in the letter of 122 million children saved. It seems to suggest that it's because of their work. Has nobody else anywhere , including those in the affected countries done anything to save the children. Why do they or anybody think that all of this can be attributed to to the Gates foundation!!

Moreover as the Gates foundation is focussing on childrens' lives, does it make any sense for anybody with lesser resources than them to tackle this problem? There is no chance of getting any recognition, as Gates foundation will claim it and it will be hard to argue against as well.

These are not my views, I'm just saying that it's possible to have these thoughts if you are cynical.

<comment><USER12> To your first point, if a cynic prefers to credit more than a single foundation or individual for those gains, then that must be so benevolent of them to think so well of a greater number of people. Let us all be cynics then.

</comment></comment></comment><comment><USER13> I truly applaud the efforts of the funds. I don't think I could come up with any more noble endeavor, and I know there are some very capable people throughout their organizations who are dedicated to spending the funds wisely and impactfully.

However, is it fair to credit philanthropy as the sole cause of quality of life improvements across the most destitute populations?

        It's a story about the stunning gains the poorest people in the world have made
        over the last 25 years. This incredible progress has been made possible not
        only by the generosity of Warren and other philanthropists, the charitable
        giving of individuals across the world, and the efforts of the poor on their
        own behalf, but also by the huge contributions made by donor nations, which
        account for the vast majority of global health and development funding.

I think there is a fair amount of evidence that suggests development funding can have as much disastrous consequence as good. In his book The Great Escape[1], Angus Deaton (Nobel Prize economist) describes how non- interventionist economic development seems to have been the main driver of better outcomes across the world, and not the flush pockets of westerners, as convenient as that would be. Another book called The Road To Hell[2] provides many examples where large charitable efforts regularly produce even worse outcomes than no intervention at all. Is there some good evidence to suggest that the money spent by the Gates Foundation and other charities were solely responsible for the improved qualities of life across whole populations?

If you want to posit that their efforts have been invaluable in improving access to medical services across the globe, you'll get no argument from me. However, that's a small part of what makes up "stunning gains."

[1] [https://www.amazon.com/Great-Escape-Health-Origins- Inequalit...](https://www.amazon.com/Great-Escape-Health-Origins- Inequality/dp/0691165629)

[2] [https://www.amazon.com/Road-Hell-Michael- Maren/dp/0743227867](https://www.amazon.com/Road-Hell-Michael- Maren/dp/0743227867)

<comment><USER14> Even the quote you've pulled doesn't claim the outcomes are due _solely_ to the efforts of charities. The Gates foundation has a strong focus on health issues (just about everything listed in the report, for instance) and not the sort of aid the books you mention are criticizing.

</comment></comment><comment><USER15> I wish Bill or Warren would have run for presidency as an "outsider" instead of Trump. I guess our only hope will be their successor Mark (Zuckerberg)

<comment><USER16> Bill and Melinda are better where they are, because they are free from political interference. Can you imagine the opposition they'd get from the GOP for pushing contraception so centrally? And if they get into power, probably from the democrats too, for not focusing on their favourite bandwagons.

OT: Can someone explain the GOP's strident opposition to funding contraception, both domestically and in the US's foreign aid? Apart from the obvious problems with unrestrained population growth, I'd have thought that aversion to abortion would imply whole-hearted support for contraception.

<comment><USER17> There are a lot of Catholics on the conservative side of things, and contraception has been verboten to Catholics since the early days ("sex is for making babies, not fun" is the company line)

<comment><USER18> This is quite false. Catholics split the democrat/republican vote ~50/50\. They voted for Gore, Bush, Obama, and Trump with small margins. [1]

They care about this question, but not very much. Evangelicals, on the other hand overwhelmingly vote republican.

Catholics, in general, are the most liberal religious denomination in the US.

[http://www.pewresearch.org/fact-tank/2016/11/09/how-the- fait...](http://www.pewresearch.org/fact-tank/2016/11/09/how-the-faithful- voted-a-preliminary-2016-analysis/)

<comment><USER17> Looking more closely at your link, the white catholics were more likely to vote for Trump than protestants were (higher than anyone except evangelicals), and as I understand it, it's white catholics that are the most prominent in congress.

Sorry, I meant politicians (as the parent referenced the GOP) rather than laypeople.

<comment><USER18> Trump overwhelmingly won among white voters - with 58% of their vote. White white catholics voted... Pretty much the same way as white non-catholics.

Comparing white catholics to all protestants is comparing apples to oranges.

Catholics are only slightly over-represented in congress, at 30% of Christians in congress (While making up 24% of the Christian population in the US.) They are also split 68/70 between democrat and republican. [1]

They may be prominent, but they aren't trying to turn the country into a theocracy.

[1] [http://www.huffingtonpost.com/2015/01/05/congress- religious-...](http://www.huffingtonpost.com/2015/01/05/congress-religious- affiliation_n_6417074.html)

</comment></comment></comment></comment></comment></comment><comment><USER19> I was wondering today after reading this - what are the statistics on the next stages of the lives of these children? Saving their lives is, undoubtedly, the most important thing anyone can do. I think it's also important to see that they continue to have good lives well into adulthood (perhaps even learning about the frameworks that helped them survive as a baby?). In countries like India (where I'm originally from), child mortality rates have improved, but there seems to be this gravity well made of a mixture of superstition, religion, illiteracy, caste-based nonsense that is difficult to escape from. And this does not help translate this victory into winning the long-term war on poverty.

</comment><comment><USER20> "All lives have equal value"

I hope one day all governments across the world operate with this principle.

Gates foundation is doing some amazing work. Looking forward to their contribution in the coming years.

<comment><USER21> That's only true if you ignore the practicalities and only speak of life in the abstract. Some people, through their deplorable deeds, have made their own lives distinctly less valuable.

</comment></comment><comment><USER22> I appreciate these efforts, but my mind is drawn to a somewhat orthogonal set of tactics.

When I see stats like $1 of vaccines releasing $44 of economic value, I think: there is a market opportunity here.

The question I keep asking is: what would a hedge fund look like that was making a bet that most people in poverty could produce the $44 if we invested the $1? What kind of corporate structure would be needed to distribute the resource AND reap part of the economic value?

Similar hedges can be made everywhere. If I believe black people are worth more than their social status (and commensurate credit access) would suggest.... how do I make that bet with cash?

You can answer "microfinance" but that's just phrasing the question in a different way. The real issue is: how, exactly?

It's not an easy question to answer, but I think unlocking it is a trillion dollar opportunity. You are essentially betting against the entire class of employers. Seems stupid, but so did Michael Burry's bet against the entire class of mortgage lenders.

<comment><USER23> It's not like there's a simple way to invest $1 and extract $44. That $44 is diluted in the total GDP. There's also a quite low limit on how many people you can vaccinate, even if you offer it for free.

This kind of thing is quite profitable for the government though, because they get to collect that $44, even if it is diluted.

<comment><USER22> I don't need a simple way, I just need a way.

The way I am currently pursuing it is basically to build an agency (like a Hollywood agency) for people in poverty and use automation to get economies of scale so it can survive on many slices of small payouts. It's not simple, but it's the only thing I can think of.

Arguably TaskRabbit and Uber are a version of this, but they target poor working class people, not those in actual poverty.

Would be interested to hear other ideas. I don't expect any of them to be simple.

</comment></comment></comment><comment><USER24> Interesting read: [http://web.archive.org/web/20130912101039/http://www.commond...](http://web.archive.org/web/20130912101039/http://www.commondreams.org/views06/0823-26.htm)

</comment><comment><USER25> Thank you, Bill, Melinda and Warren.

</comment><comment><USER26> I see a lots of charts saying things are improving, which is great, but unless I missed it I can't see the piece that says "We spent $xxx on initiative YYY which caused this improvement."

<comment><USER27> Yeah, nobody here appears to have paid attention, but in this piece Gates fails to differentiate things the foundation has actually done from all the major international public health accomplishments of the last 25 or so years -- it's pretty out there when you think about it. The most specific claims made were about the foundation's participation in groups addressing two of the issues.

</comment></comment><comment><USER28> One of the coolest things about this letter is it's presented in numbers--the format Warren appreciates the most.

</comment><comment><USER29> Ghostery identifies 10 trackers and uBlock shows 7 advertising scripts, which seems like a lot for a page that you'd think shouldn't need advertising.

The page doesn't even display if you block some of these scripts. This is terrible.

<comment><USER30> I get this...

[http://imgur.com/a/y7nmQ](http://imgur.com/a/y7nmQ)

<comment><USER31> Yep, I just unblocked the whole site in uBlock. There is tracking but no annoying adverts that I would want to block so I just let it through.

</comment></comment></comment><comment><USER32> This is amazing. Thank you Bill, Melinda, and Warren.

</comment><comment><USER33> For anyone interested in why polio hasn't been eradicated, it is likely related to the capture of Osama Bin Laden.

[https://www.theguardian.com/world/2011/jul/11/cia-fake- vacci...](https://www.theguardian.com/world/2011/jul/11/cia-fake-vaccinations- osama-bin-ladens-dna)

<comment><USER34> I highly doubt this is truly the reason

<comment><USER35> "Over the weekend, relations were pummelled further when the US announced that it would cut $800m (£500m) worth of military aid as punishment for Pakistan's perceived lack of co-operation in the anti-terror fight." It might not be THE reason, but I guess there would be less than the [1]20 cases of polio that there are now in Pakistan if that $800m hadn't been cut.

[1] [http://www.endpolio.com.pk/polio-cases-district- wise-2016](http://www.endpolio.com.pk/polio-cases-district-wise-2016)

</comment></comment></comment><comment><USER36> It is an envious position to be in where you can positively impact such an incomprehensible number of human lives in the best of ways.

It's incredibly heart warming how many people have been saved by the Gates Foundation. Although, the realist in me worries about the possibility that in the long-run, civil liberties and human rights are also of importance to humanity in saving human lives, and human dignity.

Without going into an argument about the relative importance, shouldn't at least some significant portion be distributed towards solving the human and civil rights, liberties, and justice abuses here in America?

After all, the reason Bill Gates and Buffet are in a position to be able to help so many people is due the world they grew up in. The opportunities they were given. A large part of that is individual human liberty. Had Gates lived in another time, and been arbitrarily detained during one of his two arrests for refusing to unlock his electronic devices, would he have encountered a legal battle that derailed his entrepreneurship? If he was a minority, would the police had treated him the same way? If he was abused by the police the way Ian Murdock allegedly was, what would have happened to Gates? Would we have lost the opportunity to save 122 million lives to date through the Gates foundation?

<comment><USER37> > Without going into an argument about the relative importance, shouldn't at > least some significant portion be distributed towards solving the human and > civil rights, liberties, and justice abuses here in America?

I would guess that a country with stable institutions, high GDP per capita value, democracy and the highest absolute military spending this issue could be addressed in the ballot box. In the richest democracies on earth fixing these issues is a question of resource allocation. And plenty of organizations are working towards that already.

<comment><USER36> > this issue could be addressed in the ballot box

I don't believe that is true. Recent history is especially illustrative of this.

<comment><USER38> > _Recent history is especially illustrative of this._

Are you referring to Trump's election?

Well, some people's problems _were_ solved by the ballot box, and they got their man elected. The fact that you disagree with the politics doesn't negate the system working as intended.

<comment><USER36> Well, for instance, I supported clemency for Bradley Manning, and that Edward Snowden should be honored as a patriot for risking his own welfare to stand up for the people of America against illegal government abuses. I had no choice in the election in that matter. I did have some hope with Bernie, but all of the subversion against him by the DNC my hope was burned to shreds.

So there's an example of how, one of the most important issues, has no ability to be addressed in the ballot box in recent history.

</comment></comment></comment></comment></comment><comment><USER39> Rich people circle jerk. Yes I'm impressed but still.

</comment><comment><USER40> Nice <3

On the opposite number side, I hope they can help to find ways to reduce the population growth. It is unsustainable, especially in Africa and Arabic countries. (Pity one cannot just implement a China-like one child policy:))

<comment><USER41> Here is the Hans Rosling video explaining why that's not a problem: [https://www.gapminder.org/videos/will-saving-poor- children-l...](https://www.gapminder.org/videos/will-saving-poor-children- lead-to-overpopulation/)

<comment><USER42> Seems like he's assuming changing one of these changes all: child mortality == poverty == lack of education == large families

High fertility rates, poverty, low education, lack of affordable birth control, child mortality... these and other things cluster together. What's causing what?

If you found a genie and wished for an end to kids dying in Africa, with no intervention in any other parameters, how much do you really think that would change the fertility rate? They're not having lots of kids just to have lots of kids, right? There's some other underlying motivation or cause. Either the kids are accidents, or there's a reason — perhaps an economic motivation — to have lots of kids? What underlying reason for high fertility rates is going to be addressed by stopping kids from dying?

<comment><USER43> The harsh reality is that Hans spent his life trying to educate people and get them draw conclusions from data instead of repeating their prejudices.

<comment><USER40> Sorry, but the harsh reality is that data (models) not always work. Especially for complex things. Remember 'The Limits to Growth'?

His videos are certainly well made. Motion Charts let you visualize/see numbers nicely and help popularize certain insights. But don't be too hasty with conclusions. Much didn't work in the past. Or was know already but knowledge alone doesn't mean that it can be implemented.

</comment></comment></comment></comment></comment><comment><USER44> I find Gates' lack of focus on environmental issues disheartening. I know he does invest in clean energy and feels strongly about climate change, but this doesn't really do anything to prevent deforestation NOW. I know that bringing people out of poverty may have a side-effect of improving some environmental parameters, but it also makes whole swathes of people start demanding more meat, more palm oil, more cars, more disposable goods. The big international benefactors don't seem that interested in rainforest biodiversity.

<comment><USER45> So some trees are more important than saving 122 million children? I know I'm going to get all the nasty replies that it's a larger issue than just a few trees, that without trees there won't be people, etc. But comments like these are the reason that people dismiss environmentalists as nutjobs that care more about trees than people.

<comment><USER46> Climate change is not just about trees, but about the massive loss of biodiversity that goes along with rapid climate change.

Sure most of Europe will be covered in pine trees, but at the same time a lot of species, essentially all that are not able to migrate with the same speed that the climate changes in their habitat will die out.

This article for example claims that 1/2 of the known species have died out within this century and 1/6 will die out if nothing is done about climate change:

[https://www.theguardian.com/environment/2015/apr/30/one- in-s...](https://www.theguardian.com/environment/2015/apr/30/one-in-six-of- worlds-species-faces-extinction-due-to-climate-change-study)

<comment><USER45> Again, you completely missed the point. Bill Gates is one man with a certain amount of resources. He chose to go after a huge problem with known solutions: hundreds of millions of poverty-induced, completely preventable, childhood deaths. Climate change may be another worthy cause, but no one has any business criticizing him for not choosing that particular one over saving a massive number of children because they might cause some additional demand for palm oil.

Find a billionaire that is doing nothing for the world and criticize them for not doing something about climate change. Bill Gates is busy doing great things for humanity.

<comment><USER44> I think Bill Gates would agree that when you control the philanthropic funds of the 2 richest people on earth then you have some obligation to spend the money in proportion to the importance of the issues being addressed.

I won't argue the relative merits of the marginal value of a human life vs. mass extinction of species because I'm sure we both have different values underlying our respective views and will never convince each other of anything.

<comment><USER45> _I won 't argue the relative merits of the marginal value of a human life vs. mass extinction of species_

We aren't going anywhere anytime soon, and when we do, it likely won't be from the effects of _preventable_ climate change. We may in fact have another ice age sometime in the next several million years - but no amount of money, protests, cutting back on emissions, carbon taxes, or other measures will stop it. Dinosaurs had an ice age, and as far as we know they didn't have cars.

<comment><USER46> This is precisely not about the survival of the human species, we are doing _fine_ and humans are the most likely to be able to adapt to rapidly changing climate and collapse of biodiversity. The issue is that the biodiversity will recover only slowly (in the order of 10 million years) and probably won't completely because we have left very few natural habitats anyways.

Humans have completely bypassed all the usual regulatory mechanisms that balance the populations of all the other species and caused mass extinction simply by reproducing well beyond what a natural ecosystem could sustain. Even the ice age set in way slower than how fast we are currently changing the temperature on earth.

As much as I understand that most people have an anthropocentric outlook, especially the >30% religious fundamentalists in the US, I feel like we should value overall biodiversity over pure human survival. Most of the programs the Gates foundation are probably helpful in the long run for this as well. Lower infant mortality, better access to birth control and reducing poverty will hopefully result in slowed down population growth.</comment></comment></comment></comment></comment></comment></comment>


Bumblr  - <AUTHOR> http://bumblr.com/ We are just working out some bugs before our kickstarter launch on Tuesday but check out our new UI! <comment><AUTHOR> <https://www.facebook.com/bumblr> <https://twitter.com/#!/bumblr>

</comment><comment><USER2> It is hard for me to understand what to do here. You may benefit from a one line explanation of your product on the page.

</comment><comment><AUTHOR> We are launching our kickstarter campaign on tuesday, check us out!</comment>


The Tao of Programming (1987) - <AUTHOR> http://www.textfiles.com/100/taoprogram.pro <comment><USER2> Ha! I first came across this verse (7.2) early in my career, circa 2001 or so, and it always stuck with me.

> 7.2

In the East there is a shark which is larger than all other fish. It changes into a bird whose wings are like clouds filling the sky. When this bird moves across the land, it brings a message from Corporate Headquarters. This message it drops into the midst of the programmers, like a seagull making its mark upon the beach. Then the bird mounts on the wind and, with the blue sky at its back, returns home.

The novice programmer stares in wonder at the bird, for he understands it not. The average programmer dreads the coming of the bird, for he fears its message. The Master Programmer continues to work at his terminal, unaware that the bird has come and gone.

<comment><USER3> That feels like kind of a dangerous advice. Seems to me that means that if Google announces that they want to roll out a full cencorship in China so that they can enter the market over there, the most prominent developers will just silently continue to work on it..?

<comment><USER4> I think the context of where this came from helps explain the quote (beginning of chapter 1 of Zhuangzi):

> IN THE NORTHERN DARKNESS there is a fish and his name is K'un.1 The K'un is > so huge I don't know how many thousand li he measures. He changes and > becomes a bird whose name is P'eng. The back of the P'eng measures I don't > know how many thousand li across and, when he rises up and flies off, his > wings are like clouds all over the sky.

The big bird is so huge that it is alien to the smaller ecosystems below it. In the same way, CEOs and upper management are so "huge" (at the top of the hierarchy) that their choices seem incomprehensible from the point of e.g. a junior dev. Maybe they good or bad choices, but in any case their day-to-day choices are different from a single developer's.

> The cicada and the little dove laugh at this, saying, "When we make an > effort and fly up, we can get as far as the elm or the sapanwood tree, but > sometimes we don't make it and just fall down on the ground. Now how is > anyone going to go ninety thousand li to the south!"

Here the small creatures make fun of the bird, not exactly understanding its world or experiences, but instead comparing the Peng's actions and natural inclinations to their own. A dove has no need to travel thousands of miles, which is a short trip for the Peng.

In the GP's comment, the novice programmer "stares in wonder at the bird" because - in the same way - his day-to-day experience is so different from the people who run Corporate Headquarters. The Master Programmer knows that CH is "doing it's thing" so to speak, or just following its own nature. Any attempt to understand the machinations and decisions of upper management from the viewpoint of a programmer simply doesn't work, so they do not bother to think about it.

</comment></comment></comment><comment><USER5> I am already loving it. "1.2

The Tao gave birth to machine language. Machine language gave birth to the assembler.

The assembler gave birth to the compiler. Now their are ten thousand languages.

Each language has its purpose, however humble. Each language expresses the Yin and Yang of software. Each language has its place within the Tao.

But do not program in COBOL if you can avoid it. "

</comment><comment><USER6> Or get it in HTML: [http://www.mit.edu/~xela/tao.html](http://www.mit.edu/~xela/tao.html)

<comment><USER7> And without the various typos, to boot.

<comment><USER8> Said typos are (for the most part) on purpose.

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

<comment><USER7> If they were deliberate, then that would imply that their existence is perfection. To recognize that the typos were accidental mistakes by the human typing them is to recognize the Tao.

</comment></comment></comment></comment><comment><USER9> The Tao of programming is Nigel Tao, long one of the main people on the Go team. Not to be confused with the Tao of mathematics, who is of course Terence Tao, Nigel's brother.

<comment><USER10> Also not to be confused with another brother - Trevor, an autist savant with double degree in mathematics and music, as well as a chessmaster.

That's what you get when a pediatrician and a mathematics/physics teacher have kids. Who would've known. (Not trivializing at all. Complimenting, if anything.)

They're so cute too. [https://media.gettyimages.com/photos/brilliant-brothers- dr-t...](https://media.gettyimages.com/photos/brilliant-brothers-dr-terence- tao-trevor-tao-and-nigel-tao-are-the-picture-id540164715)

</comment></comment><comment><USER11> > Only a fool expects rational behavior from his fellow humans. Why do you > expect it from a machine that humans have constructed? Computers simulate > determinism; only Tao is prefect.

Spelling as plot device, so underrated.

<comment><USER12> > "Spelling as plot device"

I'm curious, what do you mean ? could you point me somewhere to learn about it ? is it something like or related to a McGuffin ?

<comment><USER13> The typo "prefect" at the end is part of the plot, that nobody id perfect.

<comment><USER12> Apparently the typo was "fixed" in the html version [http://www.mit.edu/~xela/tao.html](http://www.mit.edu/~xela/tao.html) maybe whoever ported didn't catch the subtle double meaning ? Or was just a typo.

</comment></comment></comment></comment><comment><USER14> .

[http://www.catb.org/jargon/html/story-of- mel.html](http://www.catb.org/jargon/html/story-of-mel.html)

.

<comment><USER7> And for the best of both worlds: [http://www.catb.org/jargon/html/koans.html](http://www.catb.org/jargon/html/koans.html)

The first one's my favorite:

        A novice was trying to fix a broken Lisp machine by turning the power
        off and on.

        Knight, seeing what the student was doing, spoke sternly: "You cannot
        fix a machine by just power-cycling it with no understanding of what
        is going wrong."

        Knight turned the machine off and on.

        The machine worked.

</comment></comment><comment><USER15> _When the specification is defined by the program, it cannot have bugs._

<comment><USER16> Did he know Python already in the 80s?

<comment><USER17> Yes, because Python is just a small subset of CommonLisp with bad syntax.

</comment></comment></comment><comment><USER18> Windows Haiku are also good.

[https://www.google.co.in/search?q=windows+haiku](https://www.google.co.in/search?q=windows+haiku)

[https://www.gnu.org/fun/jokes/error- haiku.html](https://www.gnu.org/fun/jokes/error-haiku.html)

[http://wiki.c2.com/?ComputerErrorHaiku](http://wiki.c2.com/?ComputerErrorHaiku)

</comment><comment><USER19> I prefer "The UNIX Koans of Master Foo" [http://catb.org/esr/writings/unix- koans/](http://catb.org/esr/writings/unix-koans/)

<comment><USER20> Those are actually pretty terrible, probably written after reading GEB. ESR is trying to emulate Hofstadter but isn't clever enough, so they are all based on a one-trick pony, search-and-replace joke that wears thin quickly.

2/10, would have preferred bobcat?

<comment><USER21> The housecat may mock the tiger, but it will not turn his purr into a roar.

</comment></comment></comment><comment><USER22> I was not until many years after I read this until I realized it was an actual book:

[https://en.wikipedia.org/wiki/The_Tao_of_Programming](https://en.wikipedia.org/wiki/The_Tao_of_Programming)

I now own a copy, and it is glorious.

</comment><comment><USER23> I really _get_ 4.4 for some reason:

> True, sometimes there are difficult problems. I see them coming, I slow > down, I watch silently. Then I change a single line of code and the > difficulties vanish like puffs of idle smoke.

I've started to debug like this. Sure, I also actively debug by adding print statements and manipulating my code. But there's something to be said about just thinking and waiting for the answer.

<comment><USER3> Interesting. Generally, what I do as the first step is immediatelly connect a remote debugger and debug the piece of code that I think is problematic (which is correct in around 90% of the times for me). Then, the answer is generally trivial. I started doing this because it felt way more time efficient than staring into the code and trying to think what goes wrong over there.

<comment><USER7> I've found that sometimes there's additional benefit to the "take a step back and think about what the code is actually doing" step, in the sense that doing so helps gain better knowledge about how the code actually works and often reveals opportunities to simplify the design (sometimes in such a way that ends up inadvertently fixing the problem, though admittedly it'll more often just introduce more bugs ;) ).

</comment></comment></comment><comment><USER24> I've stuggled with 7.1.

The shelter a massive enterprise with a sane middle-manager provides can be a beautiful place for innovation and creative freedom.

However, the older I've become the less corporate bs and re-orgs I'm prepared to live through.

Maybe my Tao is slipping...

<comment><USER7> The trick is to ignore the corporate BS and re-orgs, since they matter not in the grand scheme of things.

In the now-more-prescient-than-ever words of Grace Slick:

        Someone's always playing corporation games
        Who cares, they're always changing corporation names

</comment></comment><comment><USER25> Lots of previous discussions: [https://hn.algolia.com/?query=The%20Tao%20of%20Programming%2...](https://hn.algolia.com/?query=The%20Tao%20of%20Programming%20points%3E3&sort=byDate&dateRange=all&type=story&storyText=false&prefix&page=0)

(Edit: I mention links like this just in case people are interested. If we were treating the post as a duplicate it would be marked [dupe].)

</comment><comment><USER26> I used to own the book but left it at my desk when I quit a job in the hope that it would help the next poor victim for the same position.

Reading the whole thing, I'm again surprised at how much wisdom is hidden in there.

Shouldn't that be:

"Time for you to return."

though?

<comment> qu4z-2 I'm not sure whether you're aware that "time for you to leave" is a reference to the old Kung Fu TV show[0].

I also don't know enough about systems programming to be sure whether RET or LEAVE is the right instruction there :P

[0]: [https://www.youtube.com/watch?v=wQBVYko_uhQ#t=46s](https://www.youtube.com/watch?v=wQBVYko_uhQ#t=46s)

</comment></comment><comment><USER27> > The Tao gave birth to machine language. Machine language gave birth to the > assembler. The assembler gave birth to the compiler. Now there are ten > thousand languages.

Heh, nothing changed.

<comment><USER28> You left out the most important line in the whole treatise :)

> But do not program in COBOL if you can avoid it.

<comment><USER29> Cobol does not look that bad given the mess we are in today.

</comment></comment></comment><comment><USER30> nice, I haven't seen this in years.

I really laughed at the bit about 'structured programming.' As it turns out, long ago, structured programming was a thing.

<comment><USER31> It still is a thing. Today we just call it "programming".

<comment><USER32> And how do you call it if is Not structured nowadays?

<comment><USER7> Javascript.

</comment></comment></comment></comment><comment><USER33> I really enjoy the synthesis of Eastern and Western, Ancient and Modern. Pulling up something from before I was born makes this post that much better.

</comment><comment><USER15> 4.1 is like wtf/min [https://www.osnews.com/story/19266/wtfsm/](https://www.osnews.com/story/19266/wtfsm/) (not xkcd)

It's not the law of _no_ astonishment.

</comment><comment><USER34> I bought a physical copy of this (still have it around somewhere) after reading many of the koans from /usr/bin/fortune

</comment><comment><AUTHOR> When i dreamed the code, Maybe it is the code dreamed me.

When Worlds end, The Rest Is Silence of Code.

</comment><comment><USER35> sheesh - wandered around the site and found angela.txt, an ascii nude (which i now know was/is a thing and wish i didn't). and people wonder why other people think on-line culture is a cesspool.

</comment><comment><USER36> I first read that on POTS with my '486 . Just now, rocked and laughed just like Chris Griffin when he noticed the Jingled keys. Thanks.

</comment><comment><USER37> like

</comment><comment><USER38> awesome!!!</comment>


Ask HN: Gifts for Investors? - <AUTHOR> I've been bootstrapping a product for several years and last week we secured our first seed investor.
I'm so humbled that this investor was willing to take a risk on us, our product, and our vision that I'm confronting a threshold question in my first relationship with an investor:
Do I send him a personal gift to convey my deep appreciation, or do I just stay focused on the product and pretend like I've been here before? <comment><USER2> I've no experience here, but a decent bottle of wine, along with a simple thank you card would almost certainly be appreciated. It might depend how personal of a relationship you have, our will have with this investor though.

I would just say what you did here, you're really appreciate of their confidence in your company and product, and look forward to the future.

</comment><comment><USER3> With my investor hat on: convey your deep appreciation by staying focused (and providing transparent updates along the way, especially when it's going poorly). That is plenty.

</comment><comment><USER4> Stay focused. Your best gift to your investor would be a good return on investment - a successful product.

</comment><comment><USER5> Pick option 2</comment>


YouTube terminates largest Climate Science channel in the World - <AUTHOR> http://climatestate.com/2017/11/30/breaking-youtube-terminates-largest-climate-science-channel-in-the-world/ <comment><USER2> Looks like a clear case of dubious copyright claims OR that they got the free stock images and music from a website that actually didn't have the correct rights for the media?

This is a case that free stock footage and audio from the internet will get you in trouble even though you did everything right on your end. The channel maybe was penalized for what a website did?

[http://climatestate.com/2017/03/11/great-list-of-dubious- cop...](http://climatestate.com/2017/03/11/great-list-of-dubious-copyright- claims-for-climate-change-awareness-video-content/)

</comment><comment><USER3> What a shitty website, it does load without any warnings but it is a fully blank page with zero texts or images... then after a while you realize you need to disable any ad blocking extension for this one to load for real.

<comment><USER4> "I have this collection of semi-random CSS, semi-randomly applied to any page - but hey, it's their fault for not anticipating each and any of those arbitrary modifications!" Cheese, sir?</comment></comment>


GitHub Learning Lab - <AUTHOR> https://lab.github.com/ <comment><USER2> A Very good SEO move, to stir some of the 'lab' traffic away from gitlab.

<comment><USER3> That's an interesting viewpoint. To be honest, I don't understand SEO and it is such a big buzz word. If I look up videos on YouTube about SEO, they appear as if they're selling me a pyramid scheme. Why is the SEO business appear to be so scammy? I am put off from just learning about it. Same thing with SEO books on Amazon.

<comment><USER4> All you need to know about SEO: Create good content that people want to link to, make sure you follow html best practices that have been around since the 90s.

<comment><USER5> Its not enough because you are competing with other for the same spot. You have to do all of you mentioned + something more that is better than other.

<comment><USER6> I'm not sure. It's been pretty good for what I need it for, running small businesses.

I'm constantly bombarded by SEO spam to SEO my wife's site. She just writes content, frequently and have genuine activity and ranks higher than all her competitors who SEO like crazy, but whose sites are vapid.

Granted, would likely get more traffic with SEO, but it's better, I think, to put energy into real, useful pages. Rather than trying to trick users or outtrick other sites.

<comment><USER5> Having good content is important part of seo.

</comment></comment></comment></comment></comment></comment><comment><USER7> Not trying to weaken the GitLab brand at all... /s

<comment><USER8> Strongly suggest they open a GitLab Learning Hub.

<comment><USER9> [https://lab.github.com/](https://lab.github.com/)

[https://hub.gitlab.com/](https://hub.gitlab.com/)

hrmmmm...

Definitely a missed opportunity if they don't.

<comment><USER10> Middle-school tier politics, I like that.

<comment><USER11> I think this rivalry should continue; playfully acknowledge what everyone observes to be true.

Sir Tim said cool urls never die; GitLab, your turn! [https://hub.gitlab.com](https://hub.gitlab.com) \-- make it happen!

Edit: Your use-case; me. I migrated to your platform and, as an autodidact, would greatly appreciate a native resource of similar (IMproved) quality. Thank you.

<comment><USER12> Making the redirect seems like a fun small iteration. We're on it: [https://gitlab.com/gitlab-com/gl- infra/infrastructure/issues...](https://gitlab.com/gitlab-com/gl- infra/infrastructure/issues/6667)

<comment><USER13> and it's LIVE ;)

<comment><USER11> May the arms race continue. Godspeed!

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER14> Note that albeit this is a really nice resource, Learning Lab originally launched in April 2018

[https://github.blog/2018-04-19-introducing-github- learning-l...](https://github.blog/2018-04-19-introducing-github-learning- lab/)

</comment><comment><USER15> I gotta say, the "installing" workflow is pretty opaque and confusing. Why do I need to both authorize GitHub _and_ install a GitHub app? If I elect to only authorize it for specific repos (instead of read/write access to all of my repos), why do I need to install it first for some empty project before GitHub can create the repo for the course I'm trying to access?

<comment><USER16> I agree with this. If anyone from GitHub is here, there should be an option to "create new repository and give access for this course" option.

</comment></comment><comment><USER17> Gitlab is actually redirecting hub.gitlab.com to lab.github.com.

</comment><comment><USER18> This actually looks great for job candidate coding exercises. You can guide them through working out some problems, and validate each step with an Action. Neat!

</comment><comment><USER19> I thought they were going to announce some new features copied from GitLab :o

</comment><comment><USER20> This is just lovely for newcomers to Git. Great little mascot, too.

<comment><USER21> I thought it wasn't good for newcomers to git (which was odd because its GitHub). I only see three labs:

That being said the paths section[1] does appear to have paths for Git, which seem quite good.

[1][https://lab.github.com/paths](https://lab.github.com/paths)

Git can be confusing to those who don't use it a lot, I'm always looking for good entry level resources.</comment></comment>


How Facebook Might Have Landed Its New Patent, and What Happens Now - <AUTHOR> http://www.pehub.com/84815/how-facebook-might-have-landed-its-new-patent-and-what-happens-now/

<comment><USER2> see: <http://paulgraham.com/softwarepatents.html></comment>


"Solve your own problems." - <AUTHOR> https://medium.com/p/3f06bcef49

<comment><USER2> When you are passionate about building products and solving real life problems, it is not always possible to work on our own problems. But there is always one really big problem that nobody else has solved for you. And if you haven't found it yet; then you should keep looking for it. Because I firmly believe, the solution to that one problem take years to build and mature.

Taking example of many successful product builders, entrepreneurs and corporate, they all have had one or two 'winner' ideas.</comment>