Loopless Programming - <AUTHOR> https://code.jsoftware.com/wiki/Vocabulary/Loopless <comment><USER2> Most programmers have worked in a largely loopless programming language: SQL. IT lets you easily build the same sort of 'Boolean state for every item' as this discusses, but it requires you to be much more explicit about which items you want to line up next to one another if you're joining two lists together.

In modern languages we usually just use mapreduce like functional approaches to handle the same sort of thing, so I'm not sure this approach is as unusual as the author seems to think.

<comment><USER3> From someone who has experience in mostly SQL, Python, Linux commands, and a smattering of other languages that I've played with (Haskell, Common Lisp, F#, Ada, Prolog, Julia, Forth, Fortran...etc) I can say that J and modern APL systems are completely different in a lot of ways. Yes functional languages have a lot built around map/fold/filter that is very similar to J's tacit programming, but the implementation makes all the difference. With J you just have math basically (assuming you don't use the non idiomatic if-then constructs). I'm not saying J is better than Haskell at all, but keep in mind that when they say "loopless" it's possible that what they're trying to convey is that there are no imperative loops AND the combination of dynamic typing and tacit trains means you have something terse with zero boiler plate.

<comment><USER4> It seems to me like it is terse because this is a DSL for dealing with vectors and arrays of numbers.

Sure the equivalent C for loops are a lot more wordy for the problems that this language solves, but you'll drive yourself crazy trying to write a simple event loop for your GUI in J.

<comment><USER5> You do everything differently in j/k/apl, so the notion of eventloop is not what you want to do there (under the hood that happens ofcourse). People would not typically write GUIs in these languages but you can [0]. They are actual languages, not DSLs.

[0] [https://www.jsoftware.com/help/primer/gui.htm](https://www.jsoftware.com/help/primer/gui.htm)

</comment></comment></comment></comment><comment><USER6> > Looping - performing a computation repeatedly - is what programs do. In most > computer languages, all loops are expressed by one of two statements:

> Do While - repeat a code block until a condition is met

> For - repeat a code block, with a loop index indicating how many times the > block has been repeated.

> Programmers trained on scalar languages have spent many years internalizing > the Do-While and For paradigms. Discarding these paradigms is the biggest > re-think they need to make when they learn J.

A lot of languages have these kinds of semantics and arguably in a more streamlined / better organised way - Haskell typeclasses for example. I don't know if it's true that 'most languages' only support for/while loops, but probably not. It also doesn't take 'many years' to internalise for/while loops, these are fairly basic constructs which are learned by most novices in the beginning of an introductory programming course.

> (x + y) is an expression rather than a statement. The J programmer can embed > (x + y) in a larger expression, perhaps a matrix multiplication (w +/ . * (x > + y)) which adds the equivalent of three more nested loops, but is still a > single expression. Expressions can be combined; statements cannot.

(x + y) is going to be an expression in almost any language...

> Many modern languages have iterators, which slightly streamline the For > loop, but without addressing its fundamental deficiencies.

What are the 'fundamental deficiencies'?

This seems like a pretty low-effort write-up.

<comment><USER7> It's disappointing to see someone aggressively defending their ignorance like this. It's okay if you don't understand what the article is saying, but it's unfortunate that you are blaming that on the article.

Maybe your time would be better spent solving some coding challenges in J or another array language like Dyalog APL, Kona, or A+, then comparing your solutions with others' using the same language, rather than posting voluminous comments about how your lack of understanding means there's nothing to understand. It probably won't change your life, but it might be a useful tool in your mental toolbox when you're using more mainstream languages like R, SQL, or Octave; libraries like TensorFlow, Numpy, Pandas, PyTorch, or parts of Boost; or hardware like GPUs or processors with NEON and SSE.

(Related: Blub.)

<comment><USER8> I agree with you on the fundamentals but that first paragraph isn't helpful. The second paragraph is fine.

I suffer from the same annoyance about the same thing, so I know where you're coming from; I still do it myself and ought to moderate my own comments when I do. But blunt statements about others' ignorance only lead to pain instead of pleasure, and drive people further away. Not only does accuracy in such blunt statements not help, it makes their effects considerably worse. One of my teachers had a Ph.D. in psychology from Stanford and told me that he learned one thing from his Ph.D.: punishment is not conducive to learning.

In case it helps with bona fides, we're somewhat licentious about bending the rules in favor of APL and its family on HN. Of the great alternative programming universes (Lisp, Forth, Prolog, ?) it is surely the least understood.

<comment><USER7> I appreciate the feedback! I'm not a user of J or APL in any regular way, but I feel that there's something going on there that I don't understand (and, due to spreadsheets serving APL's 1970s constituency better than APL did, perhaps nobody ever will). I suspect that J itself is fatally flawed, but I don't understand its merits well enough to be sure how to fix it.

My frustration comes from the quality of the discourse rather than from some feeling that my favorite language is being slighted. Perhaps it's unfair of me to be so demanding of others when I'm so often stubbornly ignorant myself, but I would like people to _just not post_ middlebrow dismissals of this sort (and to tell me when I'm doing something similar); they make rational discussion impractically difficult to find in the interstices between the aggressive posturing. (As inimino said, [https://news.ycombinator.com/item?id=21302174](https://news.ycombinator.com/item?id=21302174) "This is why we can't have nice discussions about programming languages." I believe that's actually true.) Can you imagine biologists attempting to discuss the evidence about the evolution of a particular signaling pathway at a conference where Creationists are shouting that evolution doesn't create new species?

Clearly the folks voting on HN have different preferences.

I want to emphasize that it's not the poster's cluelessness that I'm criticizing. Everyone starts out clueless about everything and stays that way about most things; there is nothing wrong with that. Nor is it their willingness to spout off about their cluelessness — expressing your misconceptions is very often the quickest way to get people to correct them, which happened in this case; both inimino and I wasted our time laying some deep knowledge on the dude. Rather, it's their _persistent refusal to notice their own lack of understanding_ — and the public approbation of that refusal — that I think poisons the well of rational discourse. That's what reminded me of my encounter with Kent Hovind on the streets of Berkeley.

Think, by contrast, of Leibniz's ideal: _Quando orientur controversiae, non magis disputatione opus erit inter duos philosophos, quam inter duos computistas. Sufficiet enim calamos in manus sumere sedereque ad abacos, et sibi mutuo (accito si placet amico) dicere: calculemus._ Think of the pleasant collegiality that in fact exists among mathematicians, where a few minutes of discussion commonly suffices to convert an opponent into an ally, and the youngest and least experienced can point out an error made by the most respected with the full expectation that their correction — if correct — will be gratefully accepted. In this case, at the other extreme, we have a controversy which is easily resolved with three minutes watching YouTube, but which instead spawned a long thread of aggressive comments, complete with boasts about how easy it is to understand while loops. This is the kind of thing that led to JWZ's famous gibe.

How can we foster an environment more like Leibniz's ideal, if not by pointing out the most egregious discrepancies in behavior? Perhaps my arrogance is not the way — this is IIRC why you didn't want to work with me at Skysheet — but what is?

<comment><USER9> At the risk of taking this too meta... there's something interesting here about online communities like HN.

In everyday human interactions, we have a lot of contextual and social cues about who is more experienced, respected, expert, even who is older; in short, all kinds of social hierarchical information that guides and constrains our behavior. Online, especially in a community of sufficient size that most interactions are between strangers, as here, we lack these cues and must approach each other as equals, or at least as unknowns. It's very democratizing, and sometimes it's incredibly aggravating.

There are things a professor can say to a student that a student can't say to a professor. The professor can police students' behavior and ask a student to leave. So we would not expect this kind of "aggressive defense of ignorance" in a classroom, because there is someone there who is responsible for creating a different environment, as part of an effective, millenia-old tradition of inquiry.

The zen master can whack the novice with a stick. Sometimes leading to enlightenment, sometimes just to the master getting some peace.

As with the professor, it's the relationship and the environment that makes this acceptable. You won't get far by telling strangers on the street that they are woefully uninformed, or by whacking them with a stick. Online, we're essentially all strangers on the street.

Certain basic life skills and attitudes can be communicated and acquired almost immediately when you can get whacked with a stick that can hardly be acquired online at all. Online communities seem to be a terrible place to learn humility, for example.

In response to these realities of online engagement, there are community-level and individual-level approaches. Leaving the former aside, as an individual there are two things I find helpful, one is detachment and the other is to remember the audience.

The "wrong on the internet" compulsion maybe comes primarily from expectations developed offline, where we can talk sense into people, generally within some institution that facilitates this (school, church, work, etc) and which generally doesn't exist online. This can be annoying. Perhaps it's this annoyance that largely leads to endless online arguments. Sometimes you want to communicate to someone, gently but unmistakeably, that you know more about the topic at hand than they are likely to learn in the next ten years. This is likely something that would be communicated _automatically and invisibly_ by environment and context offline, but is almost impossible to communicate at all online. Online, the distinguished biologist and the earnest creationist high school student appear to have equal weight, especially to the high school student. Sometimes you feel the need to communicate to someone that their ignorance of the topic is matched only by their ignorance of their own ignorance, but you can't. You wouldn't be heard, the environment doesn't support it, and anyway it looks bad. If we're all as equals, or at least unknowns, the next person who copies your strong style, more likely than not, will lack the experience that justifies it.

Remembering the audience means that any interaction in a public forum is more likely to influence bystanders than the one directly addressed. It's like a debate, in which debaters address each other but actually aim to persuade the audience. Unfortunately this usually means it's all rhetoric and favors shallow attention-getting over deep discussion and exploration, but that's another topic. Anyway, you can reply to the person but aim more to persuade the audience, which in general is bigger and more likely to be swayed by your reasons than someone who is already arguing against them.

Beyond promoting your position, trying to encourage better discourse, from the audience, rather than the person addressed, seems to help.

<comment><USER7> Those are wonderful points, and I really appreciate them. I am persuaded that it is important to set a good example of behavior for the kids. (And, perhaps, for myself when I'm talking about things I'm even more ignorant of than I am about J; an example is linked below.)

There is _some_ amount of "social hierarchical information" available, if you look carefully — the original poster in this thread has "karma" of 47, while you have 2957, I have 12549, and dang has 52985, plus 29993 as gruseom, although that's less visible. But of course most of the people at the Hackers Conference don't have HN accounts on here at all, so this is at best a poor guide; and, even for those hackers with accounts on the site, surely it would be a grave error to consider me senior to, say, lutusp, lispm, davewiner, Arnt, tonyg, kens, masswerk, or DonHopkins, simply because my account has higher karma. An even more extreme example is my friend johncowan, who has 6 karma and is one of the major authors of R7RS.

High karma is perhaps more an indicator of the kind of poor impulse control that results in wasting our time trying to educate the deliberately clueless, or in my case just going off half-cocked on topics I don't know enough about, than of actual seniority. All of the people in that list are more accomplished hackers than I am, but they have less karma in large part because they post less, perhaps because they're hacking.

To some extent, spelling, vocabulary, and punctuation are similar signals, but consider [https://news.ycombinator.com/item?id=20404735](https://news.ycombinator.com/item?id=20404735), written by someone who apparently really knew what they were talking about, in depth, in a way that I absolutely did not — "Lol" or no "Lol". And even at best those indicators only serve to indicate social background and literacy, which are only weakly correlated with competence.

I wonder if there is at least something we could do to make voting more thoughtful; for example, put the voting arrows at the end of the comment rather than its beginning, or even after all the replies to the comment. (People could collapse the replies to find the arrows if they were really determined to vote without looking at the responses.) Or use a PageRank-style or Advogato-style trust metric rather than raw vote count, so that the votes of people like the ones I listed above would count for more; or, like lobste.rs, request a reason for downvoting. Fundamentally, though, I think there's a kind of insuperable conflict between thoughtful discussion and hair- trigger interactivity. Long comments rarely get many votes, either up or down, because they take too long to read.

I'm really sick of seeing thoughtful comments like vkou's in [https://news.ycombinator.com/item?id=20395050](https://news.ycombinator.com/item?id=20395050), mine in [https://news.ycombinator.com/item?id=20276994](https://news.ycombinator.com/item?id=20276994), and eloff's in [https://news.ycombinator.com/item?id=20275006](https://news.ycombinator.com/item?id=20275006) (although it was mistaken) punished by downvotes and even flags like we're filthy spammers.

Again, I really appreciate your thoughtful reply. Maybe we should set up an "Old Hats" mailing list or something for discussions like these. Maybe it's possible to rescue HN from the "finance-obsessed man-children and brogrammers" JWZ refers to.

<comment><USER8> Karma is mostly an indication of how much time people have spent posting to the site.

I agree with you about some of those examples and have reset the score on them; we do that routinely when we see good comments unfairly downvoted. So do a lot of users, while the upvote window is still open. The corrective upvote is a standard practice here. And yes, that still leaves some good comments in negative space. Voting is a big messy statistical cloud. I don't think there's a way to make it precise. Maybe it's worth noting that the examples you cited are already months old? There have been about a million comments posted to HN since those. It's inevitable that a sample that large will contain some shitty outliers, i.e. really unjust cases. Comments tend to fluctuate up and down in score; some are going to end up in the red just stochastically. Perhaps we should be more open to experimenting with the voting system, but years of looking closely at that data has diminished my sense of what's possible. I think the two biggest factors are human nature and randomness, and we can't do much about either. There could still be better mechanisms for channeling them, though.

<comment><USER7> I'm glad you're here too.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> This reminds me of regex, and the struggle 2 months later to remember wtf I was trying to do there. Easy to write, hard to maintain, so thank you but no thank you, I prefer the loops instead even if it means going down at individual elements in a list/matrix. For any meaningful project maintenance is the threshold that will make it or break it.

<comment><USER11> > _I prefer the loops instead even if it means going down at individual > elements in a list /matrix._

Actually you have it backwards, probably because you confused J's somewhat cryptic notation as the only way to implement the same concept.

It's the for loops, with their sprawl of non-declarative code, that would be equivalent to the regex opaqueness, and a well named operator or function to achieve the same thing that would be more like J.

E.g. would you rather use a:

      sort(myList, order=desc)

or write your own sorting with for loops?

Similarly, think of operations like:

      findElement(myList, predicate)

      filterElements(myList, predicate)

      keepElements(myList, predicate)

      forEach(myList, myFunc)

      forEachParallel(myList, myFunc, chunks=5)

In other words, reduce, map, and specialized versions of them.

If 10-20 such language provided functions covered all cases, I'd use them over for loops all the time. In fact that's how people use e.g. lodash.

What J adds is a succinct syntax to write and compose such primitives at the language level.

But such a syntax is not necessary to achieve the same concept (although not the same brevity/expressiveness) and be better/more readable than for loops...

P.S And regexes themselves should be compared to the equivalent parsing code -- which could require a FSM, or an ad-hoc buggy implementation of the same checks/captures spanning 10s or 100s of lines depending on the regex. Except if you just use a regex for very simple things where e.g. a "contains" function or some splitting etc will be simpler.

<comment><USER5> I have a substantial library with those functions for C#. Why not use Linq? Because I see people struggle with it (usually external clients who license our code and outsource development); when they do, they resort to loops. So I wrote these simpler functions which are implemented mostly with Linq but they keep people who do not understand linq (again, yes, they are there and rather a lot of them) from messing up the codebase. Advantage is that these functions translate to any other language, while Linq doesn't, so we have the same (partially implemented) semantics for the same things over a few languages we use.

</comment></comment></comment><comment><USER12> I still remember as a kid back in the 80s when a friend and I were making BASIC games on our Tandy 1000s with just the reference manual that came with the computer, and he was trying to explain to me what a FOR loop was, and I was _not getting it_. "Why would you want to do the same thing twice?"

Just this morning my own 10-year-old was looking over my shoulder while I was debugging some C, and I explained for loops to him. Since he plays violin I said it was like a repeat in music, and he seemed to grok that right away.

My other memory of those days is, after years of dismissing GOSUB as useless ("Why would I want to go back to the same place I just left?"), finally having a flash of enlightenment and getting the point. It's a function call! (Not that I knew what those were....)

Sorry this has nothing to do with the wiki page. :-) Except maybe that to at least one kid loopy programming was unnatural.

<comment><USER5> Ha! Yes, I only had the reference manual and some (published by photocopying matrix printed writing) magazines to work with begin 80s as a kid and I remember making goto's jump forward and then when done backward; some older guy at a meetup (I was the youngest for many years there) told me to check out gosub; that suddenly clicked after that. At first I thought they were just inconvenient goto's.

I guess my relationship between that time and j/k is that I really like the concept of just needing a (printed!) reference manual and being able to do everything you need. It is so liberating (for me anyway); it is also the reason why I like embedded asm/c programming: mostly I need nothing but the reference manual (and after all these years, not that even). To me it makes other types of work (web frontend/backend or native apps) with all their (unstable) libs tedious to work with; I am good at those (esp native apps) but I don't really enjoy it as much.

</comment></comment><comment><USER13> As far as explicit loops, I probably use write out a loop once a month and maybe not even that often. Using map/filter/reduce [as well as sugar funcs until/any/all] solves virtually all the common cases of working with lists. Granting it's not sufficient if you're writing specialized code like sorting arrays efficiently, but for general development, going higher-order is the way to go.

<comment><USER14> You can say this now but not long ago map/filter/reduce were almost esoteric.

<comment><USER15> I'd say even just 5 years ago they were weird FP features, with LINQ being the most mainstream version. Now Go is the only mainstream language without them hehe.

<comment><USER16> You can write your own LINQ in Go with a very short program. See [https://github.com/nukata/linq-in-go](https://github.com/nukata/linq-in-go) for example.

Here is a self-contained excerpt:

      type Any = interface{}

      type Enumerator func(yield func(element Any))

      // Select creates an Enumerator which applies f to each of elements.
      func (loop Enumerator) Select(f func(Any) Any) Enumerator {
        return func(yield func(Any)) {
          loop(func(element Any) {
            value := f(element)
            yield(value)
          })
        }
      }

      // Range creates an Enumerator which counts from start
      // up to start + count - 1.
      func Range(start, count int) Enumerator {
        end := start + count
        return func(yield func(Any)) {
          for i := start; i < end; i++ {
            yield(i)
          }
        }
      }

Now you can write the following:

      squares := Range(1, 10).Select(func(x Any) Any { return x.(int) * x.(int) })
      squares(func(num Any) {
        Println(num)
      })
      // Output:
      // 1
      // 4
      // 9
      // 16
      // 25
      // 36
      // 49
      // 64
      // 81
      // 100

I'd say it is so elegant in Go!

<comment><USER13> It's a little annoying though to be forced to use interface{} as type parameters for higher order list operations as there's a performance overhead when using it. Hopefully this is remedied when Go gets type generic support.

<comment><USER15> Not to mention the complete lack of type safety (there are unsafe-style casts even in the example code.)

<comment><USER16> Good point! I'm looking forward to generics in Go.

</comment></comment></comment></comment></comment></comment></comment><comment><USER17> Last time I did APL programming I was a bit bothered by the performance implications of some of the standard loopless programming styles. In particular, it's hard to nest loops.

As an example of the implications, consider computing the Mandelbrot set. I'll be using Numpy here to ensure people can follow what I'm doing, but for the point I wish to make, it's similar to how you'd write it in APL. The Mandelbrot set is compute by applying a function like this to each of a bunch of complex numbers:

      def divergence(c, d):
        i = 0
        z = c
        while i < d and dot(z) < 4.0:
          z = c + z * z
          i = i + 1
        return i

To apply this to many points simultaneously in a vectorised "loopless" style, we'd write it like this:

      def mandelbrot_numpy(c, d):
          output = np.zeros(c.shape)
          z = np.zeros(c.shape, np.complex32)
          for it in range(d):
              notdone =
                np.less(z.real*z.real + z.imag*z.imag,
                        4.0)
              output[notdone] = it
              z[notdone] = z[notdone]**2 + c[notdone]
          return output

There is just one `for` loop, which is pretty easy to do in APL. The `while` loop has been subsumed into control flow encoded in boolean arrays. This is not _exactly_ how you'd do in APL, but it has a similar feel. It's also pretty slow, because we are manifesting the entire `z` array in memory for every iteration in the outer loop. In contrast, an old school loop over every point, with an inner while loop for every point, would involve only two memory accesses per point. On a GPU, I have measured the vectorised style to be about 30x slower than one with a conventional `while` loop.

<comment><USER18> _In theory_ you could escape that by using generators rather than explicitly creating the intermediate list. No idea if J does that under the covers though.

</comment></comment><comment><USER19> > add each number in a list x to each number in the corresponding row of a > two-dimensional array y

I mean, I could write a function `add(x, y)` that does that in any language. You could even inspect the data or type to make it polymorphic. I believe NumPy does this, for example.

Skimming the rest of the article, I don't get how this is different from any other language. The primary difference seems to be the function names are all one or two characters long for some reason. I must be missing something...

<comment><USER20> The fact that they're built into the language is in fact significant. Yes, you obviously could implement J's set of primitives in nearly any language and then use those. In practice though, you won't, and if you did then many of the people reading the code wouldn't understand it very well.

Imagine if lodash was built into JS, and optimized by the implementations to the point where it was faster than not using it. Idiomatic JS would look very different even though it hasn't made anything possible that wasn't previously possible.

</comment></comment><comment><USER21> Almost any functional programming language has the same power and quality of life in programming, except with the added bonus that things have _names_.

If you come up with a new looping construct (which you probably won't), just create a type class for it and you're done; any data structure you want now has that construct, if you give it a sensible implementation.

It would be very unusual to write a Haskell program with explicit loops in it. The closest you ever get would be something like `forM_` and even that doesn't really count. I suppose a more direct example would be a recursive function call, but imperative programmers may be surprised at just how few of these actually crop up in production code.

<comment><USER15> And even when recursion does show up, the return value tends to "read" better. Like "the sum is the head of the list plus the sum of the tail." Whereas with an imperative loop, I have to either recognize an idiom or manually execute the loop in my brain's VM.

</comment></comment><comment><USER22> J is one of the strangest programming languages I've ever tried. I would reccomend giving it a go, though I wouldn't personally write actual software in it.

<comment><USER23> J is APL in ASCII. My first PC was a hand-me-down from a family member who had installed APL on it and put a bunch of stickers on the keyboard for typing all the strange characters.

Where I work, we have some production code in another APL-family language, q, which is the main interface to kdb - a remarkably fast time-series database in a remarkably tiny binary, with a remarkably expensive price tag.

I think APL and its kin disprove the "Blub Paradox." Here's a language that in certain aspects is far more powerful even than Lisp, and in others falls down on tasks that are trivially simple elsewhere. And that's fine. Horses for courses.

</comment></comment><comment><USER24> See also: array programming [0] (apparently 1970s APL, on which J is based, didn't even have explicit for/while loops).

Nowadays even common imperative languages have higher-order functions, so I don't find it very exciting. Though still quite handy in R and similar languages where you deal with array-like structures almost all the time.

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

</comment><comment><USER25> In C#/.Net there's language constructs like LINQ, and framework methods on generic collections like Select() and Where() and SkipWhile(), etc.

For example, if you want to write code that returns the first X items in an array that satisfy a predicate P, it will look a lot neater and readable using code like that, than if you were to write it with for loops and if statements.

But it's still just syntactic sugar, the neater code just masks the underlying code that contains the actual loops and conditionals.

As always, it's a tool, and can be misused like all tools. It's a balance, the neater code might be more readable, but the for/if code might be easier to change or optimize down the line if conditions change. It all depends. There are no silver bullets, just tools, and trying to minimize the amount of tools in your toolbox is just dumb.

<comment><USER26> > But it's still just syntactic sugar, the neater code just masks the > underlying code that contains the actual loops and conditionals.

It seemed to me that was often more performant than using a loop.

<comment><USER25> It depends on what you do, and the underlying code can be pretty smart. But it can also be pretty dumb.

The main difference is that if you use .Where(P).Take(X), you're actually generating a new enumerator, a new coroutine, and that code doesn't get called until you actually enumerate it.

But if you write your for/if loop, you run the code immediately, you go through the source array, run the predicate on each item, until you have your X items, and then you return a new array with those elements.

</comment></comment></comment><comment><USER27> 2 questions:

\- Doesn't "loopless" actually mean "implicit looping"? (unless you assume infinite parallelization)

\- How do you debug a chain of "loopless" functions when some corner case invalidates your assumptions?

<comment><USER28> 1\. The article describes different types of loops. If you buy that, then "looping" can mean several similar but distinct things. To me, the big distinction is whether or not we "know" how long the input is. Or more broadly, whether or not we can assert that the input terminates.

If we can assert that that the input terminates then we can use "for i; while i < input.length" logic. If we can't assert input termination then we have to use "while input.next != EOF" logic and we might wind up calling "input.next" forever (but the system will probably crash first).

2\. If the second form of looping -- calling input.next -- is like what you mean by "loopless" then debugging corner cases means something like looking at crash logs. But debugging any crash means looking at crash logs.

Or sometimes it means just restarting the system. Which is what a lot of debugging looks like at the interesting scale of widely distributed significantly concurrent computation.

3\. For problems of interesting size, assumptions about the data can be made based on statistical analysis of the input. Then corner cases become statistical anomalies that may or may not be worth engineering against. Systems crashing are as inevitable as off by one errors.

</comment></comment><comment><USER29> C++ devs are encouraged to do loopless programming by using algorithms in the standard library; plus C++20 ranges should improve the ease of loopless programming.

Where J shines is array based programming. The C++ algorithms are concerned with vectors, but in J you can combine matrices, vectors and scalars in concise expressions.

<comment><USER30> The C++ <algorithm> library has a huge limitation: algorithms return a single iterator that cannot be further consumed by other algorithms. This makes it impossible to chain algorithms in a manner like LINQ. The ranges library will make a dramatic difference for this programming style.

</comment></comment><comment><USER31> This article doesn't actually list any self-claimed "fundamental deficiencies". There's a reason that C (any many other languages) have been using pre and post conditional loops for over fifty years - because it's what the machine actually does, and they are straight forward to follow.

The article mentions "A C programmer would write", and then shows two nested for loops. This is almost correct, but I think any good C programmer would write this once as a method or a macro, and then calling it is as simple x + y, without the snake-oil.

In either case, both are going to execute something like

.loop CMP r0, r1 JNZ .end_of_loop ADD r2, r1 ; move some memory around JMP .loop .end_of_loop ;

And what does that look like... oh wow it's a loop.

The J language was written in 1990. It's now 2019. The language is just wrong.

<comment><USER32> I have no real comment on C vs J in this instance, but I find it ironic these two statements appear in the same comment:

> There's a reason that C (any many other languages) have been using pre and > post conditional loops for over fifty years

> The J language was written in 1990. It's now 2019. The language is just > wrong.

Is some practice being old good or bad?

<comment><USER31> It's highlighting that C (and related languages) have been using loops for over fifty years, and that J has been around for 29 years with no marketshare. Therefore, it's safe to assume that A) C is correct, and people use loops for a reason, and B) J is wrong.

<comment><USER9> > safe to assume

Assuming that because something is popular it must be good is an example of assuming that things are as they should be, or deriving ought from is[1]. Assuming that because something is unpopular, it must be "wrong" is worse.

Do you make all your technical decisions based on what is most popular? Do you always assume that whatever has not become popular must be "wrong"?

[1]: [https://en.wikipedia.org/wiki/Is%E2%80%93ought_problem](https://en.wikipedia.org/wiki/Is%E2%80%93ought_problem)

<comment><USER31> Except I'm not assuming it's wrong because it's unpopular. Read the original comment, I clearly stated why it's wrong. My last comment was giving you a possible explanation as to why the witnessed behavior has occurred.

Also, please show me one successful software package (and by successful, I mean largely consumed by consumers and a product leader) that does not use looping techniques.

Like all technical decisions, they are made by using the most correct and appropriate choice. Which is why the industry has been using pre and post condition loops since the beginning. This "don't use loops" attitude is equivalent to trying to reinvent the wheel.

<comment><USER32> > Except I'm not assuming it's wrong because it's unpopular. Read the original > comment, I clearly stated why it's wrong.

Except you clearly are. The only other reason stated in the original post seems to be "because it's similar to what the hardware does", which in my opinion is completely irrelevant - how does that in any way change how useful it is to program with?

> Also, please show me one successful software package (and by successful, I > mean largely consumed by consumers and a product leader) that does not use > looping techniques.

Must functional programming languages have no loop construct or using loops is heavily discouraged.

> Like all technical decisions, they are made by using the most correct and > appropriate choice.

I don't believe that you're naive enough to think that one decision is correct in _all_ scenarios, or that programming paradigms cannot evolve over time.

> Which is why the industry has been using pre and post condition loops since > the beginning.

Congrats, we're back to "it's popular so it's good".

</comment></comment></comment></comment></comment></comment><comment><USER33> I recall another language that was trying to do something similar. In most languages you have to decide about x:1 versus x:* relationships very early and it's a painful refactor to go back and fix it. This one tried to fix it as well so that much of the time you only changed the variable declaration and the code just worked.

jQuery made a similar observation, and many of its functions are list comprehensions. If they had chosen a different default behavior for empty lists I might still be championing it today. But the silent failures were a bitter pill to swallow.

In fact I sometimes still fantasize about building a mini front end framework containing the inverse behavior and some other more modern ideas.

<comment><USER34> What's the inverse behavior?

<comment><USER33> Ah, yes.

I meant fail on an operation on an empty set. The number of times that I've had a potentially empty set is a fraction of all situations. Often a select all/select none situation, and adding a flag for silent failure in that case is cheap compared to all of the other bugs I've had to fix.

</comment></comment></comment><comment><USER35> You see some of this with Numpy, where a +, for instance, has been overridden to mean addition of n dimensional arrays, and Numpy is foundational for a lot of the data science programming these days

</comment><comment><USER36> Tl;dr : APL has implicit loops because almost everything is an array, and mentioning an array implies a loop to process it.

In C++, nowadays, people are encouraged to use Standard Library algorithms in preference to most loops; and to make an algorithm out of any loop that can't be cleanly replaced with a Standard one, and call that. The reasoning is similar to that explained in the article, except that saying which you are doing, by naming the algorithm, communicates better what you are trying to achieve than does coding the loop in place.

In APL, of course, naming anything with more than two or three letters, or wrapping a one- or two-operator expression in a function, gets you looked at funny, so that reason wouldn't apply.

<comment><USER3> From what I've read, your last paragraph is true, but only because the naming often isn't necessary. The importance of abstraction in a codebase that is 60 pages of code is high, but it fades away if the equivalent J program can be 5 pages of expressions. Instead of defining some numerical operation that is only 5 characters long, just use the 5 characters in the 2 to 3 places where it is needed in your 5 pages of code. This way everything is explicit and you don't have to reference back to the definition. This would be an awful idea in Java, but it works great in J and APL. Aaron Hsu talks about this with his parallel APL compiler and refers to this as working at the macro level. Note that he has plenty of named items that are passed around in a data flow fashion, but he doesn't need to name every little function.

<comment><USER36> The naming is never necessary, in any language. Even where a function is called, the name may be uninformative.

A name is an opportunity to provide useful information about intent to the reader. Open-coding, however concise it may be, fails to communicate intent.

</comment></comment></comment><comment><USER37> Loops of known size is the one of the best hints you can give to your compiler though. If the computation inside the loop isn't too complicated, the compiler will unroll these, often resulting in amazing speedups. In fact if you know that your array is pretty long but don't know its size, it's often worthwhile to structure the computation as a nested loop, where the inner loop processes chunks of known length (which should be fairly short, and picked to utilize the widest SIMD on your target CPU, e.g. 8 for fp32 on most Intel chips). Then when you run out of chunks you "mop up" at the end. Furthermore, if your chunk size is a power of 2 (which it should be), don't be afraid of the modulo operator (which is normally very slow): the compiler will automatically apply the x % chunk_size == x & (chunk_size - 1) trick for you. All of the above obviously only works if chunk size is known at compile time.

<comment><USER38> Good modern compilers do all of that for you, even for unknown sizes. For example, see how clang unloops (and vectorizes) a simple loop: [https://godbolt.org/z/NPfnhb](https://godbolt.org/z/NPfnhb)

<comment><USER37> Yes, in trivial cases like this one, the compiler will generate assembly that's hard to improve upon. But if there were more meat on the bones there (as there is, most of the time, if you aren't just summing ints), this technique could help. As always, benchmark before and after and keep the best variant.

</comment></comment></comment><comment><USER39> > In J we do this by _creating_ a Boolean list, one value (0 or 1) per item of > z

Does the word "creating" here mean you can't do a relatively simple check across array elements in J _without_ allocating memory? E.g., soft realtime scheduling for such a simply operation is essentially just not possible in J?

<comment><USER40> I don't recall offhand the answer to this specific question, but many common operations in J are highly optimized under the hood. So even though you are doing "conceptually expensive" things, J will often implement them efficiently under the hood.

J is quite fast, shockingly so for an interpreted language.

</comment></comment><comment><USER41> Unless you can leverage special instructions / hw to realize your array operations, loops will be the fundamental operations generated by the compiler executed by the CPU. For a lot of scenarios, loopless code is surely more expressive. However, I would not say that it is per se in any kind superior. Rather, it is a feature of each language, how much to abstract from the actual CPU instructions.

So to have fine granular control over your generated code, classic loops in C always relevant, while a simple array operation can be expressed in such high level way for other use cases.

</comment><comment><USER42> Swift provides many of the required Collection operators to go loopless - map, reduce, flatMap, compactMap (eliminate nil values), filter, first, contains, prefix/suffix, ... there's even an OSS library that gives a compile time guarantee that a Collection is non-empty.

There are only some instances where I ever need a loop:

\- map cannot produce a Dictionary, so Dictionary manipulations usually require a loop

\- Sometimes, a more complex qualifier or stopping condition is needed. Like striding through a Collection in a non-linear way.

<comment> dorian-graph > \- map cannot produce a Dictionary, so Dictionary manipulations usually > require a loop

Assuming you meaning mapping over a list, some sort of fold function could produce a dictionary, in some languages, such as Elm. [1]

[1] [https://package.elm- lang.org/packages/elm/core/latest/List#f...](https://package.elm- lang.org/packages/elm/core/latest/List#foldl)

</comment></comment><comment><USER43> Quote:

"(x + y) is an expression rather than a statement. The J programmer can embed (x + y) in a larger expression, perhaps a matrix multiplication (w +/ . * (x + y)) which adds the equivalent of three more nested loops, but is still a single expression. Expressions can be combined; statements cannot."

What about an expression like (x * x + y * y)? This would still be a single loop in C. Is J smart enough to figure that out, or will it turn that into three loops?

</comment><comment><USER44> That table if alternatives to loops is really interesting. I wonder if there is a similar table for C++ in some form on another website?

<comment><USER36> cppreference.com

The Standard Library algorithms explicitly implement such a taxonomy.

</comment></comment><comment><USER14> I find that most programming languages are often wasting time on the notion of plurals .. loopless sounds appealing there.

</comment><comment><USER45> First I've heard of J! Say you want to compute the product of integers in a list. Should you encounter a zero, you can exit immediately since the product is known. In C this would be an `if (arr[i] == 0) break`. How would one express this in J's loopless style?

</comment><comment><USER46> There is a CS concept with a similar name, but completely different meaning:

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

</comment><comment> fake-name s/loopless/explicit loop/

</comment><comment><USER47> If you really want to play with loopless programming, I recommend Python's numpy. It implements many of the same constructs, but using regular English words instead of punctuation.

<comment><USER48> Well numpy doesn't totally obviate the need for loops though, although it is a good mental exercise to try to write as few loops as possible.

</comment></comment><comment><USER49> I've gotten to where I see loops as a code smell. That includes thinly-veiled loops like ruby's Enumerable#each.

<comment><USER50> And instead you use...?

<comment><USER51> Yeah I'd like to know also. Loops are a foundational operation. Instead of a loop you could use a function/operator overload, which would just call another function which contains the loop. But that isn't doing away with loops, it is just encapsulating them inside a function and calling them in order to avoid polluting up the higher level code context with loop code, and makes that upper context easier to read.

<comment><USER52> You described the GPs point perfectly. This is also covered in the article; it exhaustively covers the use cases for loops and provides higher level functions and operators instead.

<comment><USER50> It covers the use cases for loops over arrays/lists, not over more general graph-like structures.

<comment><USER52> For which there exist a slew of higher order graph traversal algorithms.</comment></comment></comment></comment></comment></comment>


Don't look stupid: Stop calling parts of Canada Silicon Valley North - <AUTHOR> http://startupnorth.ca/2011/08/08/on-becoming-silicon-valley-north/

<comment><AUTHOR> I hate this label so much. It makes people (journalist and policy makers) look silly.</comment>


How TV propaganda is affecting Russian society - <AUTHOR> http://www.bbc.co.uk/monitoring/how-tv-propaganda-is-affecting-russian-society

<comment><USER2> This isn't unique to Russia.

Anyone who was in the US around 2003 will know how warped people there were when the war in Iraq was starting: [https://youtu.be/DJ3RrqBqk14?t=3m34s](https://youtu.be/DJ3RrqBqk14?t=3m34s)

The same is true for just about every country, the UK when you start mentioning every genocide and famine they started (there were a rather lot of them), the French when you mention how much they screwed up Africa and Indochina, the Turks when you mention the Armenian genocide, etc.

Hopefully we will use the clear example of another country slowly going insane to stop the same thing happening here. But somehow I doubt it, because we are special.

</comment><comment><USER3> Whole thing leads to really weird situations. I have few friends from Russia, who visited USA few times, praise it for freedoms, commerce, life, etc. Some seriously considered moving. Some - moved for good. People who mostly doing their business online (yet I know they watch TV more than I do for example.)

And these people are supporting everything propaganda is pushing.

So from outside it looks really disconcerting - on one hand they praise west, on the other - they hate it... and this hatred feel very unnatural. It is like person get second personality.

<comment><USER4> I don't think that's fair. "The West" is not a monolith. You can like and dislike certain cultural, political, and social realities and like others. Your characterization of issues seems very tribal.

<comment><USER3> Well, from personal conversations russians as a whole blame "westerners" as a whole. I.e. if there will be post about guy, who made floor from recycled wood, there will be tons of hatred comments towards this particular person. And this hatred is based only on the fact he is from USA.

I.e. this hatred targets not officials or politicians. It targets whole population.

</comment></comment></comment><comment><USER5> Since BBC decided to talk about propaganda, I will call them out on their own coverage of civilian deaths from the war in Eastern Ukraine.

When civilians were killed in Kiev controlled areas BBC described their deaths as result of rebel activity. When however civilians were killed in rebel controlled areas, they were described as having died from shelling without perpetrators being accused but the fact that it was a rebel area highlighted. A lot more people fall into the second category than the first. Even in straight forward cases of deaths resulting from air strikes against cities, BBC did not assign blame to the government.

It was so bad, I have been tempted to go over every BBC story about the war in Eastern Ukraine and analyze for the language it used to discuss the causes of civilian casualties. Maybe I will.

EDIT: It appears I am not the only one to have noticed this particular bias of BBC. Alan Dix, a professor at Birmingham University, goes at length with examples about this issue at the BBC[1].

[1] [http://alandix.com/blog/2015/02/13/lies-damned-lies-and- the-...](http://alandix.com/blog/2015/02/13/lies-damned-lies-and-the-bbc/)

<comment><USER4> The media, whether Western or Russian, exists in order to rally support for the actions of the elite, usually by misrepresentation, oversimplification, and blatant lies. When Euromaidan was in progress, it was impossible to even hint that there was a presence of political groups with Nazi sympathies. You were immediately discredited as a pawn of Russian media. I have no idea why the emotional zeal. Of course, it was true, but the West needed support from the demos and downplayed anything that would hurt the geopolitical sparring match with Russia.

Ukraine in general has a history that has been unaddressed. Ukrainian collaboration with Nazis during WWII, genocide against Poles (which many continue to deny, downplay, or rationalize), and Western Ukrainian reverence for national heroes and militant groups entangled in these events (e.g., Stepan Bandera and UPA) remain taboo subjects. They're topics that will likely remain untouched as long as Ukraine is being bought over by Russia and the US.

<comment><USER6> Oh, old 'Ukraine is Nazi' card? You know that this is played mostly by Russian media? And do you know that part of Russian history where they collaborated with Nazis (how about a million-strong Nazi collaborationist army which flag Russia uses even now?) and that they invaded Poland _with_ the Hitler?

And as for reverence - Russian praise for Stalin and Lenin, two of the most bloodiest dictators in modern history - can speak volumes about Russian soul.

</comment></comment></comment><comment><USER7> This seems like an equally propaganda-laden piece intended to influence Western attitudes towards the Russian government.

Anecdotally, I was in Russia about a year ago and did not sense any resentment towards my Western-ness.

<comment><USER8> Propaganda is aimed to hate "western governments", not usual people. And russians have asian mentality mostly - they'll never show you they dislike you while you're their guest. Drink with them couple of bottles to know their real minds.</comment></comment>


Inequality: Why aren't the poor storming the barricades?  - <AUTHOR> http://www.economist.com/blogs/democracyinamerica/2014/01/inequality-0 <comment><USER2> Maybe they're scared of police brutality, being sent to prison for resisting arrest, having a felony conviction, being unable to get an honest job and feed their kids, etc.

The status quo allows even the poor in the first world to survive with some basic comforts - that can all be easily taken away.

</comment><comment><USER3> This is transparent left-wing propaganda; not sure how it's relevant to HN.

To address the article's question, a recent poll[1] found that only about 1% of the population answered "inequality" in response to the question "What do you think should be the top priority for President Obama and Congress in 2014?"

"Jobs" was much higher at 16%. Therefore one might conclude that most people don't particularly care what their percentage share of the economy is as long as they feel they are fairly paid and reasonably comfortable. After all, we could achieve equality by making everyone equally poor.

Furthermore, the idea that most people would rather work hard and earn their money, rather than seizing it by force through mob uprisings, does not seem to have occurred to the author. The author is similarly apparently unaware that where this has been tried -- by the likes of Lenin, Mao, and Fidel Castro -- it was a failure, and a rather ... bloody one at that.

[1] [http://www.quinnipiac.edu/institutes-and-centers/polling- ins...](http://www.quinnipiac.edu/institutes-and-centers/polling- institute/national/release-detail?ReleaseID=1999)

</comment><comment><USER4> Not only are the poor not storming the barricades, in the USA especially many (most?) of them vote against their own interests.

</comment><comment><USER5> I think that this may be a case where it will take at least generation to really sink in. A lot of the poor are now on borrowed time. If the debt levels for the poor stay consistent, then when they retire they'll have nothing, or worse - be deep in debt but unable to work and make payments. They will need to rely on kids to take care of them, when they are likely not going to be in a great position to do it.

In the US there is still hope for a poor kid to learn some skills (e.g. how to code) and do alright.

If the balance tips, and the average poor hardworking kid has no hope of working his way out of poverty because of crushing poverty or obligations we're likely to see a revolution.

</comment><comment><USER6> The premise is so far off, I don't know where to begin. Revolutions have complex causes, so trying to predict it from a one-dimensional value like income inequality doesn't make any sense.

Americans revolted over fairly minor issues. Other people stay under very serious oppression for many generations.

<comment><USER7> Pardon the snark, but I think that you and that misnamed philosophus dude missed the boat on this one - perhaps you didn't read the entire piece?

The punch-line is that non-participation in shared (public) resources by the wealthy is a more significant problem then disparity. An interesting premise having both plausibility and examples. Somewhere back in HN, within the last year is an interesting study of the exact question focusing (I think) on education systems. But healthcare systems also work.

<comment><USER6> Perhaps I took "storming the barricades" too literally, but the author kept repeating it.

If the author did mean some kind of violent uprising, then I stand by my point. There is little historical basis to think that the sort of inequality should be expected to lead directly to a revolution.

If that's not what the author meant, what did he mean by "storming the gates"? I guess it was a metaphor, but for what exactly? What purpose did it serve? I guess you can say the real point is elsewhere, and the title was just linkbait.

Regardless, it would almost be a challenge to _not_ read the entire piece. It was incredibly short -- but I double checked just because you asked, and yes, I did make it to the end.

</comment></comment></comment><comment><USER8> "...the poor man's $550 fridge from IKEA"?

I'm sorry, but if one is poor they are not buying $550 fridges from IKEA. They're buying $100 fridges off of Craigslist.

</comment><comment><USER9> Stopping the Google buses isn't storming the Bastille and demanding for heads, but it ain't sitting on the couch watching TV either...

</comment><comment><USER10> Could I so boldly ask you to take a look at the work of Brian Arthur and Carlota Perez? They are struggling with these kinds of questions.</comment>


HN Post Update - From Concept to MVP, but the interface and UX is terrible.  - <AUTHOR> http://www.bradslavin.com/2012/03/16/my-baby-is-ugly-from-concept-to-a-nearly-functional-mvp/

<comment><AUTHOR> 394 days ago I posted to HackerNews that I not only had a startup idea but after a few brief conversation I had also "secured" some funding to build an MVP. <http://news.ycombinator.com/item?id=2223764>

This is a followup post to update you on my progress and to ask for help - [http://www.bradslavin.com/2012/03/16/my-baby-is-ugly-from- co...](http://www.bradslavin.com/2012/03/16/my-baby-is-ugly-from-concept-to-a- nearly-functional-mvp/)

</comment><comment><USER2> Wow! Kudos on executing! Sounds like you learned a lot getting to a MVP.

You may want to read over this article at SmashingMag on how to recruit a UX designer. [http://uxdesign.smashingmagazine.com/2012/02/16/how-to- recru...](http://uxdesign.smashingmagazine.com/2012/02/16/how-to-recruit-ux- designer/)</comment>


Gamma Knife: a radical treatment for obsessive-compulsive disorder patients - <AUTHOR> http://www.guardian.co.uk/lifeandstyle/2009/dec/15/obsessive-complusive-disorder-gamma-knife

<comment><USER2> """These beams converged on a pinpoint-accurate spot where they created a lesion that damaged a tiny area of tissue, blocking the pathway that caused the OCD symptoms.

This is modern psychosurgery, a hi-tech, experimental, descendant of the now infamous frontal lobotomy"""

Accurately damaging a small, specific area which has been identified as causing a particular problem is a far cry from jabbing ice-picks through the eye sockets, scrambling the frontal lobe and claiming it's a treatment for anything from depression and hysteria to "being a bit of a twat".

Surely it's more a descendent of traditional scalpel neurosurgery? Still sounds a bit creepy, but there's no need to tar it with that kind of negative association, is there?</comment>


Slack Plans to Follow Spotify on Unconventional IPO Route - <AUTHOR> https://www.wsj.com/articles/slack-planning-to-pursue-direct-listing-11547202723 <comment><USER2> One of the big roles an Investment Bank plays in organizing an IPO is building brand awareness and product understanding with potential investors. Places like Slack and Spotify likely feel that 1) their product has sufficient market awareness and 2) is fairly intuitive to understand. So, why spend the $$$ on an expensive middle-man if you don't need it? (Provided that you can hire a competent legal team to organize the process for you!)

<comment><USER3> Is point #1 necessarily true? (Asking upwards, not down)

I would imagine that most companies that are gearing up for IPO feel well- known to the tech community, but are mostly unknown to the outside world.

For example, with Slack, if I asked my non-tech friends, most would would have no idea what that is.

<comment><USER4> The key is awareness with large institutional investors which is more about building trust. The banks have a monopoly in terms of trust with sovereign wealth funds or mutual fund managers... since they do multiple deals over a long period of time.. they are incentivized not to screw them on any single deal.

Increasingly though these entities are more interested in direct connections with management teams, thus cutting out middle men like Goldman Sachs.

This dynamic is what drives entities like Goldman Sachs to invest in late stage rounds so as to build a deep understanding of the business prior to IPO.

It's so great that more companies are going "straight to the money".

<comment><USER5> > _banks have a monopoly in terms of trust with sovereign wealth funds or > mutual fund managers_

Deep well, not monopoly.

</comment></comment></comment></comment><comment><USER6> The risk with any IPO where you see a 30-40% pop means the company sold shares below what they were worth, diluting the cap table more than necessary, because they needed dollars in the bank.

Since Slack has tons of cash in the bank, they don't need to raise any capital - just provide liquidity to shareholders/employees.

So this makes 100% sense for them. If they need to raise money later, they can do so at the market-clearing price, rather than the low-ball number that the investment bankers usually give them so they can allocate "instant profit" IPO shares to their wealth management clients...

<comment><USER7> how do you know how much cash they have in the bank ?

<comment><USER8> They've said it themselves multiple times:

[https://techcrunch.com/2018/08/21/slack-confirms-it-has- rais...](https://techcrunch.com/2018/08/21/slack-confirms-it-has- raised-427m-at-a-post-money-valuation-of-over-7-1b/)

 _In previous rounds, Slack's CEO and co-founder Stewart Butterfield has said that the company raises "opportunistically." That is, it doesn't have to raise money because it's already making money and still has some in the bank, but as long as VCs are knocking, it's worth taking the funding if it's coming in at good valuations because you never know what might lie ahead._

[https://bits.blogs.nytimes.com/2015/04/16/is-slack-really- wo...](https://bits.blogs.nytimes.com/2015/04/16/is-slack-really- worth-2-8-billion-a-conversation-with-stewart-butterfield/)

 _And as a board member and a C.E.O., I have a responsibility to our employees, to our customers. And as a fiduciary, I think it would be almost imprudent for me not to accept $160 million bucks for 5-ish percent of the company when it's offered on favorable terms. We don't have an immediate use for that money. But it increases the value of our stock and can allow potential employees to take our offers, and it reinforces the perception for our larger customers that we'll be around for the long haul. All of that stuff._

</comment></comment></comment><comment> semi-extrinsic As per usual, Matt Levine has interesting insights on the possibility of a Slack Direct Listing.

[https://www.bloomberg.com/opinion/articles/2019-01-11/direct...](https://www.bloomberg.com/opinion/articles/2019-01-11/direct- listings-are-a-thing-now)

</comment><comment><USER9> > "While much of Wall Street missed out on fees from that deal—a typical IPO > has far more underwriters than a direct listing has advisers—the three were > paid about $36 million in total for their work on Spotify."

Why does it cost so much to IPO?? $36 million for a cheap IPO seems excessive.

<comment><USER10> Without condemning nor condoning the cost of IPOs in general: it's because it's very expensive to "make a market" for public consumption of a previously (ostensibly) unknown security. The modern model of IPOs may not be as applicable these days due to the rise of private equity, but the essence of the problem is that you're herding a lot of very expensive cats to do due diligence on a thing involving a lot of money.

When you're deploying a small army of lawyers, investment bankers and accountants, the costs tend to add up really quickly. To respond to your specific question about the cost of the IPO in proportion to its size: there is a floor on how expensive a traditional IPO will be when all IPOs have a certain minimum amount of due diligence required. Even if the IPO itself is not remarkably large, there is something of an "activation level" that you'll pay just to initiate the process and get everything moving.

<comment><USER11> What kind of due diligence is required? Isn't the concern here mostly how the stock should be priced?

And why then are private funding rounds so much cheaper to get done? Diligence still has to be done for private funding. Why is more diligence required for an IPO?

<comment><USER10> It's hard to give a comprehensive answer to your first question since it would require so much background knowledge of valuation. But in short:

 _> Isn't the concern here mostly how the stock should be priced?_

Yes, and this is extremely nontrivial :) There are many competing incentives _and_ metrics to evaluate. Public investors want to buy at a discount relative to future growth. The company wants to get as much money as possible. Investment banks don't want to be associated with fraudulent or poor performing IPOs. They also want to ensure there is sufficient liquidity to make the market move on the new security when it's listed while making everyone happy. And aside from these logistical obstacles, you have the standard financial problem of price discovery and valuation for a security which is fundamentally new.

As for these questions:

 _> And why then are private funding rounds so much cheaper to get done? Diligence still has to be done for private funding. Why is more diligence required for an IPO?_

Private funding involves proportionately greater amounts of money from fewer overall investors. It does not as a rule involve the general investing public. By law _public_ investments must be secure against a number of risks that can be accepted in private investments. You're offering a novel security to a large population of amateur investors who cannot tolerate as much risk as professional investors who either represent institutions or are independently wealthy. Insulating IPOs from that kind of risk requires a lot of due diligence.

</comment></comment></comment></comment><comment><USER12> I hope when they get enough money it doesn't take 15 seconds to switch from one slack organization to another. Working for x different companies at the same time can be infuriating.

<comment><USER13> Separate tabs don't work?

If not, then switch to Firefox, and use Container Tabs. :-)

Then again, considering Slack's memory usage, that might not be such a great idea...

<comment><USER14> Their Mac App is electron garbage. I have no idea why they can't use some of that cash and hire real Swift developers. I know even a "simple" app isn't easy, but for a company with their resources, it can't be that difficult. I love Slack, but despise their app. Using a web browser is a pain for me because I want things like email and chat to be separate from whatever browser I might be using. Also if done right, an actual native app (not some React pseudo-native app) is much more performant.

</comment></comment></comment><comment><USER5> There are three things an IPO traditionally did:

1\. Raise money for the company;

2\. Let existing investors sell; _and_

3\. Jumpstart price discovery by stoking investor interest on the secondary market.

These were done simultaneously. That made IPOs risky and expensive and, in turn, IPO bankers rich.

Nowadays, the venture secondary market is thriving. Something like $4 billion of Spotify stock traded in the weeks preceding its IPO. That--singlehandedly-- removes the urgency from points 2 and 3.

Raising money is hard. But not as hard as Nos. 1 through 3 together. No. 1 alone is less risky, and thus less expensive, than a traditional IPO. For venture-backed companies worth over $1 billion, the only reason to pursue a traditional IPO is because (a) management is currying favors with bankers or (b) they're trying to pull a fast one on public investors over a wrecked private market valuation.

<comment><USER15> Isn't there a fourth reason for tech companies to IPO these days: let RSU- holding employees sell? The secondary market doesn't seem to solve that.

With the amount of RSUs tech companies are giving these days, the pressure to IPO is not negligible.

<comment><USER5> > _Isn 't there a fourth reason for tech companies to IPO these days: let RSU- > holding employees sell? The secondary market doesn't seem to solve that._

There are solutions. They're messy, but they exist. In any case, both a traditional IPO and side-winding IPO address RSU-holders' problems. And at the end of the day, having sat in on more than my fair share of underwriting discussions, employees' preferences never factor into timing nor strategy. If employees need cash, companies have an easier way to solve that problem.

</comment></comment></comment><comment><USER16> Hopefully with the influx of cash they can hire someone to implement a dark mode.

<comment><USER17> Hopefully with the influx of cash they can hire someone to implement a real native app that doesn't fail.

<comment><USER10> Why would they? People will use Slack regardless. It's not a business imperative for them to make their desktop performance competitive with native applications. They'll probably get a much better return for their effort if they continue doing feature engineering.

<comment><USER17> I mean that makes sense. But they have a huge team and I really can't think of any new feature in the last 2 years.

</comment></comment></comment></comment><comment><USER18> So this is the reason Slack was cracking down on accounts of people from sanctioned countries.

</comment><comment><USER19> Good. Screw the bankers. Who needs them anyway? These CL pansies already have the mindshare and plenty of connections to people who already invested between them and selling directly to the public why would they need costly banks to help them IPO?

<comment><USER20> >Good. Screw the bankers. Who needs them anyway?

I'd say many companies who don't have the same level of mindshare and brand awareness, perhaps?

<comment><USER19> Sure. But I'd love to see a startup do something akin to ipo-as-service to distrupt the fat margins and conflicts of interest the on the side of the investment bankers

<comment><USER20> I'm not sure you understand the role of bankers in IPOs. They financially underwrite the IPO, which is a huge financial risk. They're also responsible for book building the entire thing, leveraging access to their network of institutional investors. Their fees aren't cheap, but for a company that needs to IPO, they're _often_ very worthwhile. I'm also not sure where you think the conflict of interest is, if they over price then then lose money, and if they underprice, then they lose money... I'm not sure this is a market that's especially vulnerable to disruption either. Unless you wanted to create a network for book building directly with individuals, but I couldn't see the value proposition for the listing company here, as getting the pricing right with unsophisticated investors sounds like an enormous risk for your averaging listing company.

<comment><USER19> Eh I guess you're right on many points. There's just something interesting about not using the traditional banks to get listed on the public market. And as more companies stay private but VC backend for longer perhaps we will see more of these less traditional ways of getting listed.

</comment></comment></comment></comment></comment><comment><USER21> I see a lot of Slack billboards in West LA. Nobody cares. I don't care. I guess it's brand recognition efforts prior to the IPO. All the best to them in their future endeavors..

</comment><comment><USER22> No paywall link [https://outline.com/bwtHqv](https://outline.com/bwtHqv)

</comment><comment><USER23> awesome move!</comment>


Justice Department meeting state AG offices Tuesday to discuss Google: sources - <AUTHOR> https://www.reuters.com/article/us-tech-antitrust-google/justice-department-meeting-state-ag-offices-tuesday-to-discuss-google-sources-idUSKBN1ZX2LG <comment><USER2> The best remedy for these tech giants is to force the use of open standards or to allow integration with other products on their platforms and products without profit sharing (e.g. 30% take) or any other share-cropper tactics.

Their big unfair advantage comes from the network effect of consumers using their products and the closed access to those customers.

Open integration benefits everyone except those with the monopolies.

<comment><USER3> Or separate their products. Imagine if Google Maps had to compete as its own company.

<comment><USER4> It would probably do quite well with Google Search being it's main customer.

</comment></comment></comment><comment><USER5> I wonder if US officials will be concerned by the prospect that breaking up these companies may potentially cede market share to tech companies in other countries, such as China. Especially if other countries don't bother breaking up their tech companies if they get too large.

<comment><USER6> I think fear of China is a common bogeyman to throw out to try to avoid tech regulation. And I don't feel it's a very compelling argument: Tech monopolies squash newer, more innovative competitors. The monopolies are holding us _back_. For all of the innovation you may believe tech monopolies have accomplished, it pales in comparison to what we'd accomplish without them in a competitive environment where the best technology wins, instead of the biggest monopoly.

The ability to foster rapid, zealous competition is the strength of capitalism and it's what we have over China. We need to get the established corporate entities using their market power to harm competition out of the way.

<comment><USER5> Wouldn't opening up competition to other companies be exactly the reason why such non-US competitors may be able to acquire more market share?

The only way I could see the US being able to regulate non-US competitors who grow too large is to fine them, such as what the EU does. Although that may not be enough to stop them from acquiring market dominance and may cause retaliation (such as the current trade war).

To be clear, I'm not a shill for these big tech companies. I don't currently work in any of them nor have stock in any. I'm concerned about their dominance, stifling of competition and their use of market position to render consumers powerless just as much as you may be.

<comment><USER7> It's hard to see search as anything but a winner takes all affair. If you have the best results, why wouldn't the world come to you?

</comment></comment></comment></comment><comment><USER8> My question is what comes after? Look at AT&T, which was once part of the aftermath of Bell. It now owns so much of the telecom market, that it's only challengers own pretty much all major network stations and entertainment companies. And Verizon is no slouch either.

They can split these companies up but eventually some piece/s will gobble up the rest through dark mergers and aggressive business dealings and become bigger than their predecessor.

<comment><USER9> It's actually quite simple: Nationalization.

Edit: instead of downvoting me, you may want to argue why AT&T is any different than Amtrak, The Postal Service, and the TSA.

<comment><USER10> _> you may want to argue why AT&T is any different than Amtrak, The Postal Service, and the TSA_

It isn't. But that's not an argument for nationalizing AT&T; it's an argument for privatizing the others. In fact, two out of three of them already have private competitors in the US; the only one that doesn't is Amtrak.

<comment><USER9> Considering how the postal service has been hobbled by politicians attempting to privatize it[1] and as for the TSA, it used to be private, do I really have to argue why that was a bad idea?

[1] [https://www.fool.com/investing/general/2013/03/04/how-the- po...](https://www.fool.com/investing/general/2013/03/04/how-the-postal- service-is-being-gutted.aspx)

<comment><USER10> _> the postal service has been hobbled by politicians attempting to privatize it_

So what? That has nothing to do with the fact that private companies have proven, through the entire history of the United States (including before the USA was even an independent country), that they can provide postal service. So there is no need for the government to be doing it.

 _> as for the TSA, it used to be private, do I really have to argue why that was a bad idea?_

If you have such an argument, you should make it to the airports that use private screeners today.

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

<comment><USER9> > If you have such an argument, you should make it to the airports that use > private screeners today.

Sure!

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

<comment><USER10> You are aware that the program I linked to was put into effect _after_ 9/11, right?

</comment></comment></comment></comment></comment></comment></comment><comment><USER11> Very savage to "leak" this when Alphabet's earnings are released. Probably a predictor of a bad outcome for Google. Or, everyone in this administration is an inside trader.

</comment><comment><USER12> Outside of Chrome being the default browser on Android, I don't see what antitrust Google could be hit with. Their market dominance in almost all of their sectors seems to only exist due to either it easily integrating into other Google products or their product being better than the rest, and nearly every time there are other comparable players you can easily migrate to.

<comment><USER13> There are other ways Google "leverages" its market share that are questionable. Look at the recent controversy about making all search results look like ads. They are also making it harder for ad blockers to exist in Chrome with every release. Favoring sites that implement AMP, removing urls...

I think our industry as a whole would benefit from Google being broken up.

<comment><USER14> If AMP favoritism isn't an Antitrust violation I don't know what is.

It'd be like if Microsoft rigged Windows to run .NET applications twice as fast as anything else, and made it very difficult to open any other type of application... where second-class applications are unavailable from being found in desktop search, can't have custom icons or be in Program Files.

<comment><USER15> AMP is faster by design, and it is impossible to get a generic HTML page to load as fast from a SERP (even a non-Google SERP), so your .NET analogy doesn't fit. Is it an antitrust violation that other search engines (Bing, Baidu, and Yahoo! Japan) also prefer AMP results?

<comment><USER13> It's not "faster" if I have to wait for the AMP site to load, then figure out where to tap in Google's UI to get the page I actually wanted to go to, then wait for it to load. Especially the case if I want to share the url (the real one, not the AMP one).

I don't need an intermediary popup page between me and the destination I seek.

<comment><USER15> If the AMP page doesn't have the content you want and the non-AMP page does, that is the publisher's problem and the search engine's problem for displaying an inferior page. It is not a problem with AMP, which usually has the information I need. Similarly, if a mobile-optimized page does not have the same content as a desktop page, that is also a problem with the publisher and the search engine. The same for if an RSS entry does not have the full content of an article or if a transit feed does not match the data that is on a transit provider's web page.

> the real one, not the AMP one

Is that the mobile URL or the desktop URL? This problem has existed for ages. It's the user agent's problem to give a UI to share the canonical URL if that's what the user wants.

<comment><USER13> > If the AMP page doesn't have the content you want and the non-AMP page does, > that is the publisher's problem and the search engine's problem for > displaying an inferior page.

Actually it ends up being my problem. I don't want multiple versions of the same thing. AMP is _yet another_ format and it's one that is outside of normal web browsing workflow.

<comment><USER15> > Actually it ends up being my problem. I don't want multiple versions of the > same thing.

Then don't make AMP, mobile-optimized web pages, RSS, Apple News, Facebook Instant Articles, etc.

If you want wide distribution, you have to support multiple formats. At least AMP, like RSS and mobile-optimized pages, is open, meaning that anybody can (and many link aggregators do) consume it.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER16> I've harbored a counterargument for a while against breaking up Google or Facebook:

Both of these are effectively surveillance capitalist companies. Their primary business is spying on people and using that data to target them for ads and other forms of manipulation.

When big bloated "Soviet bureau" corporations are broken apart the result is generally an explosion of innovation and growth in a sector.

Do we really want an explosion of innovation and growth in that sector? Maybe it would be a good thing if the surveillance capitalist behemoths are allowed to continue to get stagnant and bloated. If and when an alternative paradigm for sustainable business on the Internet emerges it would make them easier to displace.

Breaking up these companies would also vastly increase the surface area exposed via surveillance. Instead of two or three companies spying on us we'd suddenly have dozens of former divisions of these companies.

Edit: lastly I must echo others in their lack of trust for this justice department. I think this is likely to be a political cudgel deployed to force these companies to stop filtering out or de-prioritizing extreme far right propaganda.

</comment><comment><USER17> The paper the FTC did back in 2012 around Google is an interesting read. [http://graphics.wsj.com/google-ftc-report/](http://graphics.wsj.com/google- ftc-report/)

</comment><comment><USER18> So what's the remedy, separate companies for Search, Ads, Youtube, Cloud/Firebase, GSuite, Android/Chrome, Pixel, Maps?

<comment><USER6> The best divide is actually far less aggressive: Platforms should be split from services. Android and Chrome are IMHO the primary things Google should be forced to divest.

I am not sure you could (or even should) split Search and Ads, but there may need to be some significant rules laid down on Google's ability to tie their other products and services to search. Strict rules should be laid down on allowing ads to sell placement above trademark holders for their own trademark, as that kind of shakedown is insane.

<comment><USER19> The best move would be to revert the Doubleclick acquisition and spin out the AdTech part as its own separate entity.

But also make Google Search an open auction system (like it sort of is on Display) where other players can integrate with and Google (search) takes a fixed % for each click. Pipe dream I suppose but best way to avoid Google from being able to be truly dominant.

<comment><USER20> How does bidding for search result position not make the results anything but an add auction?

If I'm Result Source X, why would I ever bid on answering an unprofitable search, even if I know the answer?

</comment></comment></comment></comment><comment><USER21> This blatant bias against the "coastal elite" (let's be real, there's definitely a political bias to this entire thing) scares me.

Then again, I'm working at Google this summer, so maybe I'm biased ...

</comment><comment><USER22> The leaders of Chinese companies like Alibaba, TenCent, and SenseTime must be following these stories with glee. I get the Western position that values will win in the long run, but someone should consider the possibility that some of these Western companies employ Western employees who represent those Western values and actually _are_ being responsible.

</comment><comment><USER23> One simple and effective policy change could be to forbid bidding on keywords which are names of a competitors company or brand. A lot of marketing expenses are wasted on these types of keywords and only benefit Google but neither the user nor the advertiser.

<comment><USER24> Why is that a waste? If you make Foo brand razors and I, making Bar brand razors, think I have a better product, why shouldn't I be able to bid on "Foo" do that I can educate the public about my product? Whence this idea that product or company names deserve special protection from competitors? Competition makes the world go round.

<comment><USER25> It's an anti-user practice. As a user, if I google for "x", I'm looking for "x", and it is annoying that someone gets to pay to "educate" me about some alternative that I never said I wanted.

<comment><USER24> The whole point of advertising is to show people things they wouldn't otherwise see. Yes, some people are against advertising generally. That's a naive perspective. But if you're okay with ads generally, you should be okay with brand keyword ads.

<comment><USER25> Hey, I'm OK with ads generally. But being OK with a thing generally doesn't mean being OK with every specific instance of that general class.

Google is a tool, the user is trying to do something specific with the tool, and Google is deciding to not honor the intention of the user. It's clearly not something good for the user (whereas other uses of ads arguable are). Google can get away with it because they are a monopoly and, shrug, what are you going to do?

Google is free to run their business as they please, but let's not pretend that this practice is somehow enriching the user's experience.

</comment></comment></comment></comment></comment><comment><USER26> Maybe we shall find out the fate of the Fitbit deal soon (from the North American side). FYI, the merger arb on that deal is pricing significant risk of failure: Pricing at 6.53 now vs 7.35 all cash offer from GOOG.

I like the trade, but it isnt for the faint hearted.

</comment><comment><USER27> What if there was some rule where any company over lets say 10 million users are treated differently (or a public utility)? I am not sure if this is the right solution or not but I think a lot of the monopolistic and anti-trust behavior comes because of the network effect of these products.

</comment><comment><USER28> Normally I would say that investigating Google for antitrust violations would be a good idea, but I do not trust this administration and it's Justice Department to do it without having nefarious ulterior motives. It isn't hard to imagine what they may be: using the threat of a DOJ investigation to extort either money or political favors from the enormously powerful multinational technology conglomerate that is Google. The people who run the current administration have demonstrated countless times that they are not afraid to use the powers of the federal government for personal benefit and enrichment, so it has become impossible to trust any legal action they may undertake.

<comment><USER29> Previous administrations have clearly abused their power with the DOJ, just look at how DACA was passed. Just because the large media outlets did PR for previous administrations or you agreed with their politics doesn't mean that abuses did not occur.

<comment><USER30> Other comments have explained why DACA isn't an example of DOJ overreach. I'd like to take a magnifying glass to the underlying reason to bringing up DACA in this context.

It's an Obama-era policy that has been shown to have wide, bi-partisan support across the country. Bringing it up here is a means to say "Look, Obama also did bad stuff. You can't call Trump out on _his_ bad stuff" which is an asinine way to frame anything.

It reminds me of an old conservative response to progressive/leftist ideas about American foreign policy.

Leftist: "... and that's why the current administration should be considered as war criminals" Conservative: "By that logic every administration since World War 2 were war criminals" Leftist: "Yes"

Whether or not the argument posed by the above comment is even valid is, for the purposes of this comment, irrelevant. What is more interesting is knowing why the supposed crimes/overreach of the Obama administration excuses the overreaches of the Trump administration.

<comment><USER31> But in your war criminals dialogue, the "Yes" from the leftist provides cover to compress all administrations on the dimension of war crimes, dismissing LBJ/Nixon/GWB by saying "Carter was a war criminal too."

</comment></comment></comment></comment><comment><USER7> Whatever problems I have with Google pales with what problems I'd have with whatever the US would want to carve Google into.

<comment><USER32> How would you even know that?

<comment><USER33> The USA's history on this hasn't been stellar. The breakup of AT&T is testament to that.

<comment><USER34> So, the Standard Oil and Bell breakups didn't work out? Do you still have to pay to rent your telephone handset hardware each month?

Also I don't think in this case that the determination that something requires action to mitigate anti-competitive behavior means that the government declares what happens. Not a lawyer, and have not read any precedent but I'd imagine a first step would be to ask these companies about a structure that would work best if business units were separated, with some guidance, rather than some declaratory thing.

<comment><USER35> It's common in the US to rent your DOCSIS modem.

<comment><USER36> But importantly, _not required_. Cable ISPs just make it easy to give them more money, which is the normal incentive for any business. You don't have to rent a modem to buy internet service.

<comment><USER37> > _You don 't have to rent a modem to buy internet service._

As required by law[1], though, definitely not by choice[2].

[1] [https://www.ecfr.gov/cgi- bin/retrieveECFR?gp=&SID=0083f0a8d5...](https://www.ecfr.gov/cgi- bin/retrieveECFR?gp=&SID=0083f0a8d5afabe6705a4b8738d84113&mc=true&r=SECTION&n=se47.4.76_11201)

[2] [https://arstechnica.com/information- technology/2016/05/chart...](https://arstechnica.com/information- technology/2016/05/charter-blocked-customer-owned-modems-for-two-years-must- pay-fine/)

</comment></comment></comment></comment></comment></comment></comment><comment> shadow-banned Google is a slight red herring here, they need to be going after Facebook.

</comment><comment><USER38> It is always a good time to shatter a megacorp.

The true innovation in this field was all defense spending in the first place. Not going to shed a tear over a setback to a bunch of grifters who cashed in on the public's investment.

</comment><comment><USER39> Of all the Big Tech antitrust scrutiny, this one seems like the most straightforward case.

<comment><USER40> Is it? Where would you make the cut, and which anti-customer behaviour (Which seems to drive anti-trust legislature in the US) would it combat?

</comment></comment><comment><USER41> Google has too much power and influence over what people see when they search for things.

That, combined with having a massive ad network and the most browser marketshare, Google has the ability to unduly influence the opinions of millions of people, if they so chose.

Too much power for a single corporation...

I trust them far less than I trust the Trump administration. Google is proven themselves to be pretty evil. They're so much worse than Facebook or Microsoft.

So, let them be broken up. I'll feel a little safer.

</comment><comment><USER42> HN, after years of blaming Google for everything that's wrong with the world: "WTF, I love Google now!"</comment>


Buffer gets $400K funding — and tells exactly how they did it - <AUTHOR> http://gigaom.com/2011/12/20/buffer-funding/

<comment><USER2> Buffer is a classic example of an app I didn't know I wanted. Now that I am a user I love it. The click-rates on my bitly links have gone up significantly. If I get the time I will try and prepare some data.

<comment><USER3> The main reason we love Buffer, that's surprising, is that it allows you to be more efficient on twitter. Rather than having to set aside 20 minute blocks throughout the day to find articles and tweet, you can do a week's worth in an hour's time and be good to go.

</comment></comment><comment><USER4> I was confused because I didn't see any "exactly how they did it" in the linked article.

Better link: [http://blog.bufferapp.com/the-17-awesome-investors-in- our-40...](http://blog.bufferapp.com/the-17-awesome-investors-in- our-400000-seed-round-and-how-we-met-them)

</comment><comment><USER5> I'm not sure how many investors is a lot, but 17 sounds like a lot for a seed round. In my experience (two rounds, two different start-ups) the seed stage was around 3-4 investors. What's a "normal" amount? I understand the number of investors is limited at some point and might even make acquisitions difficult down the road.

</comment><comment><USER6> Congrats Leo! I'm generally not an advocate for funding, but in this instance, I can see the advantages of a spurt of accelerated growth for you.

Hope to get you or Joel on for a follow up interview when you guys have a spare moment!

</comment><comment><USER7> I'm more interested in the why than the how... What will you be using the funding for?

</comment><comment><USER8> Moving to Hong Kong? How long are you there for Leo? Planning on going back to Silicon Valley?

If it is all so virtual, come enjoy some Cape Town lifestyle.

<comment><AUTHOR> Hi Simon, thanks a lot for stopping by! Yep, HongKong it is! We are planning to stay a couple of months and will be back in June to SF for sure though! :)

<comment><USER8> Enjoy! Sounds exciting!

</comment></comment></comment><comment><USER9> Congratulations guys, nice to see some Warwick Grads doing so well.</comment>


Eating too much is why you are fat, despite the jogging - <AUTHOR> http://www.fastcoexist.com/1682594/eating-too-much-is-still-why-youre-fat-despite-all-that-jogging

<comment><USER2> One more article that talks about obesity without naming the hunger problem: absolutely useless! What non-obese people, and among them many doctors as well, have a hard time to understand, is that eating too much is (usually) just the direct consequence of being too hungry. Hunger is not only the reason why obese people eat too much, it's also the reason why a diet is the most useless advise you can give to an obese. No diet will cure his hunger, and as such he will just suffer from a different reason: instead of feeling his body exploding, he will always feel an unnatural hunger that will suck the joy of living out of him. Don't talk of calories to an obese: he couldn't care less! Teach him how to get rid of his hunger without eating too much, and you will mark a point.</comment>