The Internet of creation disappeared. Now we have surveillance and control - <AUTHOR> http://lab.cccb.org/en/renata-avila-the-internet-of-creation-disappeared-now-we-have-the-internet-of-surveillance-and-control/ <comment><USER3> I skimmed the comments here. Then I skimmed the article.

Getting out there and developing the sites/apps you want to see will bring change. Be proactive. Be the change you want to see.

The article is about a lawyer arguing for 'justice' through highly politicized language. YMMV, but I don't think "The Internet of creation" was hindered for want of lawyers, lobbyists or regulations.

Similarly, sitting on the sidelines and impotently lamenting the state of the Internet today doesn't help. While this isn't detrimental in the direct sense, it is detrimental if the prevailing belief is that changing the current paradigm is impossible.

Creators are still active. New niches for content are still emerging. Entrenched sites/apps are not immortal. Nothing is impossible. It all starts with individual action, one developer at a time. Don't become hypnotized by the bigness of institutions. We've seen solo developers release sea changing software before. Be the change you want to see.

<comment><USER4> > Getting out there and developing the sites/apps you want to see will bring > change. Be proactive. Be the change you want to see.

I now have my own stupid blog again[0] trying to add some good old fun and weirdness to the web along with some hopefully useful or thought-provoking posts in between.

I wish we could have a thread (possibly even a monthly thread here, like who is hiring) where people could mention their blogs, web sites etc.

Back when Google+ arrived we did that and I followed a number of interesting people from HN based on that I think.

Maybe it could help us rebuild a mini web of interesting blogs, websites etc.

Me, I'd be particularly interested in linking to pages related to electronics, programming, outdoors (but not slick "travel" blogs) etc. A little politics OK, but not much.

[0]: link in profile should anyone be interested.

<comment><USER5> Occasionally there is a thread for this (about every 6 months) and it also happens in the comments spontaneously (such as on this post.) Here's another example: [https://news.ycombinator.com/item?id=20362319](https://news.ycombinator.com/item?id=20362319)

I try to compile the sites that people list here: [https://www.kickscondor.com/hrefhunt/](https://www.kickscondor.com/hrefhunt/) I will obviously be mining this thread. ;D

<comment><USER6> I have a quirky and sparse personal page, but people are welcome to look at it if they want to. I'm playing with a concept of presenting a personal site as interactive (non?)fiction as an alternative to the expectations we have of website UI. It may be counterproductive, but it's playful. And open source!

[https://maxsond.github.io/](https://maxsond.github.io/)

<comment><USER4> Nice!

</comment></comment></comment></comment></comment><comment><USER7> I think of this issue in a much more mundane way all the time. When looking for product reviews, for example, the top results are, in my experience, unusable. A search for espresso machine reviews returns SEO driven results, and even the more genuine-looking results (sorry BusinessInsider, but I don't need your input) seem to exclusively list products which the site manager can get a referral link for. I don't mind the idea of referral links in theory, but what happens to the entry that would be #1 except for not being available on Amazon?

I don't know that there was ever a golden age of espresso machine reviews online, but I do think that my trust in the quality of information I find through general searches has dramatically fallen in the last ten years. I imagine there is a Facebook group that might have better perspectives, or 'Coffee Twitter', but neither of those are easy to discover through Google, and multiplying my search area across them all (reddit too, I suppose) gets burdensome quickly.

So I'm not sure that the internet of creation has disappeared as much as it may have become hidden. Either within walled gardens or by the professionalization of page rank by SEO pros (against whom Joe's coffee corner cannot hope to compete).

Either way, search suggests a much less creative internet than might actually be there.

<comment><USER8> My default for those kinds of queries now is "<item> reddit". Google results are generally poor otherwise. I'm not sure if this is because their algorithms are gamed or if it's just because the internet outside of the main website hubs is just generally low quality (most high quality content has moved to hubs like reddit).

<comment><USER9> It's s sad state of affairs for product search. I do the same (site:reddit) and I'm almost certain most people do too.

Google search I guess is good for entertainment search or "buzzy" things like whatever is trending on the trendsetting social networks of the day, but regular search is too spammy and farmed stuff. Often it's junk.

<comment><USER10> I don't think most people do, because if they did, Reddit would also be gamed.

<comment><USER11> Not saying it is, but, how would you know it isn't?

I imagine that either "they" (the advertisers/companies) have either already figured this out and are learning how to leave grassroots-looking comments, or they will pretty soon.

<comment><USER12> I think it's more the bot upvoting comments that happen to be favorable to your product than actually leaving fake comments.

</comment></comment></comment></comment></comment></comment><comment><USER13> Normal people finally got on the internet and the average person can't create shit. All they can do is bitch and moan, be horrible to others, and be surveilled and controlled. And that's what we got.

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

<comment><USER14> A slightly different take on Eternal September:

In the old days, when you joined a community it could be very insular. That's okay, there were communities for everything and everyone. So you had to read the rules, learn the lingo, and shut up and lurk for a while so you didn't invoke the wrath of the mods. Or you were gone.

Anti-social, attention-seeking, spammy, obnoxious or controlling behavior was simply not tolerated. What right did you have to come into another's home and begin making demands as to how they live their lives?

All of that has changed. The above behaviors are the new norm, thanks to the simultaneous nature of the walled gardens of social media and the fact that the walls are low enough that everyone can see into your garden.

Suddenly you have nosy neighbors saying, "Hey, I'll be honest, that crabgrass in your lawn is making it harder to appreciate the beauty of my own lawn. Maybe you should clean it up, _everyone else is doing it, so you must be anti- social if you don 't_.

The entire meaning of the word "anti-social" has completely changed. I would consider most modern online communities to be extremely anti-social.

The only answer is a return to form, going back to individual communities where we can more freely express our opinions, just making sure to network our communities in such a way that compassion and sincerity flourish, and we don't just return to the echo chambers of the 90's (they did exist!).

<comment><USER15> The reason most the web has been neutered is why Hacker News is so great.[https://news.ycombinator.com/item?id=20032259](https://news.ycombinator.com/item?id=20032259)

<comment><USER16> /s?

There are strong opinions here on certain topics that are not to be crossed or you'll be punished by the upper class that is allowed to downvote. A class that has established itself by following those opinions.

Also "newb-style" talk is not welcome also.

This is just as elitist as your average "scene" board these days. Not great not terrible.

<comment><USER14> Parent misses the point. Hacker News is an example of what one specimen in a healthy ecosystem of forums would look like.

However, we do not have a healthy ecosystem, and as such Hacker News comes off as oppressive to those with outlier opinions, because another forum of equal quality (both content and diversity of users), similar size and a similar topic of discourse doesn't really exist. Being banished from HN means being banished from what some consider to be the upper echelons of discussion around the tech and startup scene.

<comment><USER15> That's the nature of large groups of people though.

If the outlier opinions have merit, shouldn't there be a forum for their expression?

<comment><USER14> I can only post 4 comments every two or so hours, effectively prohibiting me from most of the fast-paced front page discussion and overall prohibiting me from engaging.

Why? Because I likened whale poaching to genocide [0]. I didn't even believe I was sharing a controversial opinion, because apparently that is starting a flame war and I've been warned for it before after asking a relatively simple (and apparently naive) question about black holes and getting engaged by a vitriolic and hateful user who kept flagging me while simultaneously calling me names and hurling insults.

But here I am, because Reddit is garbage, 4chan has melted, and niche forums are dying and the bulk of communication is no longer taking place within them. And there are so many amazing and talented people to draw inspiration from on HN.

In my town's local subreddit, I am similarly severely limited to a few posts every couple of hours, because I voiced the opinion in what is apparently a majority conservative subreddit that someone was making racist, unempathetic comments regarding black people and pitbulls.

I'm considering going back to a bunch of email lists...

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

</comment></comment></comment></comment></comment></comment></comment><comment> n-exploit This is the first time I have heard of a "tech crisis" \- and I think it's appropriate. I think we, as industry leaders, need to accept and address our faults and shadows. The first step to progress is to admit that you need help.

<comment><USER17> Hi, my name is FAANG and I'm addicted to money

<comment><USER18> Hi I'm a short-term mentality shareholder and I'm also addicted to money

<comment><USER19> Hi, I'm an end user who refuses to pay for software.

Why should I when all the tools I need are online for free?

<comment><USER20> Hi, I'm a Alexa paying end user and I'm surveilled anyway. I've paid for my smatrtv and I'm being aurveilled. I've paid for cable and they told me there where be less ass and more quality shows. Well I'm maybe wrong but people not paying are looking smarter than me

<comment><USER21> "ass" -> ads, right?

</comment></comment></comment></comment></comment></comment><comment><USER22> The Internet of creation is still out there. There are plenty of places on the internet where people make cool stuff. Even YouTube is still a hotbed of creation, despite the platform growing more hostile to it.

It's just that next to the internet of creation, there's also a big corporate internet now, and it's pulling in a lot of people and trying to stake claims in parts of the internet of creation. But creation is still thriving.

</comment><comment><USER23> > the Internet promised to be a democratising place to be turned to in the > flight from the inequalities of the analogue world.

Okay, maybe that didn't work out so well

> It was presented to us a field in which to find freedoms, boundless creation

Mostly yes. People are instagraming, tiktoking, youtubing, blogging, open- sourcing, unity-unrealing, more people are creating more things than ever before.

> communication that transcended frontiers

Totally true. I talk to friends all over the world. Participate on HN, discourse, discord, slack, email, facebook, etc and it's all free. Some of it sponsored but much of it just plain free, run by volunteers.

> and free education for all.

Pretty much true. What can't I learn about for free online? Pick nearly any topic and there are youtube channels, blog posts, articles, etc all for free on how to do pretty much anything.

</comment><comment><USER24> The internet of creation? You literally cannot think of an idea that someone hasn't built a website for. And then someone see those websites and say, "well theirs sucks, mine will be better" and they build their own.

It has never been easier to create something online. I ride with random people on a shared ride and they give me a card with a website they created themselves. It's ugly, it's crappy, but it's exactly in the spirit of the internet of creation.

People who created in the 90s were a minority, a small percentage of the total connected. Today, this percentage continues to grow. Though it is still the minority.

<comment><USER25> There might have been a minority of creators, but there was far less to consume compared to today.

The creators in the 90s created because there was very little to consume compared to today. When the creators of the 90s were kids they didn't consume, because there was little to anything to consume. But creating software was limitless.

Creating content in someone's platform is different than creating your own HTML experience. Both are relevant... but the percentage of creation should be a default skill of all users beyond working for companies for free to create user generated content to sell.

</comment></comment><comment><USER26> The title says it all.

The Internet used to be about building and sharing things. Then it turned into a giant and mindless message feed where everyone exposes everything about their private lives, intentionally or not.

Now all of the hot new opportunities that exist are to spy on and exploit that data. The latest AI hype is a consequence of the pervasiveness of "big data".

I miss building and sharing cool things instead with the online community.

<comment><USER27> Part of that was a higher barrier to entry to push content online. It wasn't hard per se but it wasn't easy.

Now, my 5 year old nephew can do it. Before, it took dedication and creativity to put something together. It's now more difficult to find needles in the haystack.

<comment><USER26> Indeed.

Now all of the infrastructure is built. Oversaturated and consolidated.

At least the game dev scene is vibrant, even if overcrowded.

</comment></comment></comment><comment><USER28> I like to fantasise about invite-only internet 'shards' off the main internet. Each shard would have a maximum capacity, and that capacity would be small enough that someone could create an index of every page in the shard. You could only be a member of one shard at a time. Shards wouldn't be topic-based, they're just deliberately small communities. Like the "mosaic of subculture" and "community of 7000" in A Pattern Language.

Yeah we thought it was great that the internet could connect us to anyone, but it turns out that I only liked that as long as "anyone" was likely to be someone similar to me. Now that "anyone" is more likely to be a brand, an advertiser or an influencer tween... no thanks.

<comment><USER29> There's already a system for it: [https://www.scuttlebutt.nz/](https://www.scuttlebutt.nz/)

<comment><USER28> Interesting, I hadn't heard of that - sounds quite similar to Mastodon? I wish they weren't social networks based around identities, friends and sequences of posts, though. I would much prefer sites and pages to be the primary thing. I don't like the kind of content that social media encourages, even decentralised social media.

<comment><USER30> Have you considered/looked into Indieweb[0] concepts? While one could argue that it is a sorta type of decentralized "social media"...i would argue that it simply is "sites and pages"...But that can be somewhat be connected to other sites in a loose, decentralized manner - but only if you desire to be connected. Not sure that indieweb is exactly what you seek. But, have a look and see. Good luck!

[0] [https://indieweb.org](https://indieweb.org)

</comment></comment></comment></comment><comment><USER31> The way most people act on internet has changed dramatically. Web users are usually consumers, and web "creators" are often standard sellers. People got used to the fact the sites are there to attract them in a race for attention.

An anecdotal evidence: circa 2000, I published an old French dictionary. I received thousands of emails about it during the first years. Some people just asked about a word, or send their thanks, or noticed some kind of error. Nowadays, the number of visits hasn't changed, but almost nobody sends email. I probably wouldn't answer them anyway. I believe this is an side-effect of a larger change. Maybe writing email is now a harder task. Maybe people aren't used to non-promotion sites outside Wikipedia.

<comment><USER32> In the past it was much easier to attribute a website to a single person or a small group of people, and maybe they were able to publish contact details like email addresses without fear of them being harvested and spammed. Websites didn't really have comments sections so often so the reliable method for feedback was email.

Maybe email was also a lot less tedious back then - it strikes me that these days the main purposes of email accounts are to allow registration with other online services and to hold the huge amount of spam that usually happens as a result of registering for online services.

I don't know many people my age (Gen-Y) who would even dream of using their personal email accounts to actually communicate with actual people outside of places where it is strictly required (like applying for jobs), even less so their friends. They're too used to services run by corporate giants (like FAANG) and are being trained to interact in very specific ways, e.g. in direct messages in apps, in the comments sections or through "Like" and "reactions" buttons.

</comment></comment><comment><USER33> I am glad this is being generally realized and people are no longer pretending the status quo is fine. It's the first step toward changing things.

<comment><USER34> I don't know. Given that the free internet gave us the likes of 4chan, things are changing in the other direction for a reason. It's kind of unclear to me whether the pendulum is ready to swing back towards lack of oversight again.

<comment><USER35> I think there's an argument that the consolidated internet caused 4chan to morph from a benign imageboard to the relative monster it is today. 4chan didn't start as a cancer, it became that way when all the 'normies' left for reddit|facebook|twitter.

<comment><USER36> It's actually kinda the opposite, 4chan traffic more than doubled[0] (with a matching decrease in quality) after gamergate and the election, and there is a general consensus that it's going to get worse when the next election ramps up

[0][https://s2.desu- usergeneratedcontent.xyz/a/image/1543/01/154...](https://s2.desu- usergeneratedcontent.xyz/a/image/1543/01/1543019932974.png)

</comment></comment></comment></comment><comment><USER37> Thank goodness for GitHub, it's pure creative bliss and it's growing obscenely fast.

</comment><comment><USER38> The internet is awesome. It's those goddamn users that is the problem.

</comment><comment><USER39> Bit ironic that all of these articles about how the internet has lost its creativity is always on boring yet slick graphic-designer-cum-ux-designer-in- metropolis looking website.

</comment><comment><USER40> Today I tried to read a few links off HN and hit endless paywalls and ad infestations, all for a paragraph of fluff. I logged onto Facebook and my feed was crowded out with promoted posts and memes. I went on Reddit and the tiny bit of great content was crowded out with memes. I realized this is it. The web has fully lost it's early magic and it will never recover it in this iteration. There are ways you could fix it, but it's too late and all the players are too entrenched for anything to change. The monetization model is broken. This pony is all out of tricks.

We'll need to pioneer the next platform for tech to be exciting and fresh again. Probably VR, possibly AR. I'll see you guys there.

<comment><USER41> If everybody here would flag the paywall'd junk and not upvote it, it could be a nicer place.

Liberally using the 'hide' button also helps, but only yourself. You kind of need to cull out a third of it. One of these days I'm going to make a custom skin that filters out the worst of the hosts that clog up the front page.

<comment><USER37> Grateful for that hide feature, so useful. Thanks for adding that Hn team.

</comment></comment></comment><comment><USER42> Developers who work on adtech nonsense, GDPR popups, etc, should take a hard look in the mirror.

Yeah, you might make a bit of money, and yeah, maybe your colleagues, in your sick system, give you a bit of respect.

One day, I think you're going to wake up and realise that you wasted your talents. Like a war veteran who thought what they were doing was right, that the ends justified the means, until suddenly one day it all came crashing down around them.

You have the choice, here and now. You're sitting in front of a general purpose computer. You can make fun and interesting tools - you can make stuff to break down barriers - the pathways you can take your craft are unlimited.

Choose wisely.

<comment><USER32> I understand the cookie choice popups are maybe a legal necessity in some places with GDPR and so on, but the implementation of the entire thing is just awful. Each website having their own badly-coded popovers which are either slow, unusable or just outright deceptive, blocking page scrolling and causing unnecessary page reloads.

As for advertising taking over the place, it's just getting insane with them being inserted inline in article content and increasing the page load time significantly, appearing at the beginning of videos or, worse, half-way through them, making pages more resource-intensive and less responsive.

The web has never been so widely accessible and yet it has never been more inaccessible.

</comment></comment><comment><USER43> > three decades following the creation of the Internet

The internet turns 50 in a week.

<comment><USER44> People often conflate the web with internet, and given how predominant http has become, I don't blame them.

<comment><USER45> Yeah, heck, with DoH, you could almost say there is no internet, only the web. :)

</comment></comment></comment><comment><USER46> I can accept some of what is said on this article but from a technical perspective the internet (imho) offers much more opportunities to create and collaborate than any other time in the past.

I believe most of the shortcomings and abuse of the internet is a result of mass adoptation of the technology without correspnding legislature. Societies just haven't caught up with technology,even well seasoned technologists struggle to grasp the privacy implications and economic complexities at hand. There is also the psychological aspect where the mechanics of the internet are intangible and we have a hard time conceptualizing and grasping these complexities the same way we do tangible constructs. Imagine how complex a physical machine would be if it was as complex as a web browser,but we can see it and we can easily grasp the scale of the complexity and adjust our approach on how to use and secure it accordingly.

<comment><USER47> > offers much more opportunities to create and collaborate than any other time > in the past.

We had skype, games, ICQ, MSN, blogs, blog aggregators, rss readers, galleries, audiogalaxy, guestbooks, forums, hotline communications, IRC, video chats, joomla, wikis etc etc in the year 2003. Not much has been added. Video is perhaps the only thing that we didnt have. A big deal but it s not everything. The main change was the format - mobile. The internet today feels less vibrant, less mysterious, with less corners to explore, and it's not because we 've exhausted it all. Even the news have become extremely repetitive, with every site posting the same stories slightly rephrsed. People keep parroting the same obsessive ideas over and over and over in their comments. Everything is memes, and that everything is actually a small number of ideas being produced every day, possibly countable in one hand. You have to dig hard into social forums to find a unique perspective, as the self- congratulating, selfimportant crowds seem to have crowded out everyone else.

Anecdotally, how many sites do you find yourselves browsing daily?

<comment><USER46> You have to realize your experience is not everyone's experience. And nostalgia is a lie.

> We had skype, games, ICQ, MSN, blogs, blog aggregators, rss readers, > galleries, audiogalaxy, guestbooks, forums, hotline communications, IRC, > video chats, joomla, wikis

Signal,whatsapp,ipfs,discord,slack,github,confluence,twitter,twitch,stackoverflow and so much more from a "techie" perspective. But have you considerer how much more accesible the internet has become? Forums were nice but you had to find the right one and once that site shuts you might lose all content and all the people you know there but for most people social media is better. IRC,icq,etc.. Were not very secure,they were not multi media friendly either. You heard of Viber? Super popular in non-western countries on-par with whatsapp. Skype you say? Zoom,webex,logmein and the like make video chat and desktop sharing a breeze. Learning things is so much better too: pluralsight,udemy,cybrary and MOOCs were not a thing in 2003. Free webhosting ,document editing,job hunting anf so much more (excluding things like uber,doordash,instacart that provide IRL services). But more than all that,there are so many more options for just about everything now.

The past always looks shinyand guess what,the internet is even more mysterious now for those who get curious enough!

I think like most you're only looking at the popular sites and apps. E.g.: peertube vs youtube or HN vs Reddit.

Daily I frequent 5-10 sites on a regular basis but I visit a lot more than that when finding external content on those sites,certainly a lot more than 10+ years ago.

<comment><USER47> Half the services you mention either

\- require a phone and phone number to sign up

\- lock you in

\- will shut down next year unless someone buys them and bastardizes them to oblivion

\- are services that replace services that were bought and bastardized (skype). they re bound to repeat the cycle

\- arent as popular / dont work (ipfs vs torrents)

\- lock content away from search engines

\- are basically rehashes of the same idea with much heavier browser footprint for the sake of ... i dont know what really

\- Are all platforms - they dont specialize, they force you inside an eternally septembered community . I Liked having separate accounts in separate forums - having many identities is a virtue - and good for privacy

\- are Incremental updates. E2E encryption is the one thing that matters, for the rest, we had flash video converence in 2003, and it worked _better_ than webrtc solutions today

\- MOOCs are not a successful thing today either though. good that we have all that content, but it wasn't enabled by any of the aforementioned companies.

I m not sure i m convinced we have a fundamentally different - or better - internet today. Everythinig you mention is repackaging. (and we had job ads and lots of free webhosting too btw. You know neocities, they re even named out of nostalgia for geocities, craigslist is still a thing).

<comment><USER46> I don't think I can change your mind but functionally I have a much better expetience and in many cases a simpler experience than in the past. Lots of lessons were learned and continue to be learned. I mean,popularity aside forums,IRC,Skype (use it everyday!) and all the old tech is mostly still there. In many ways isn't less more? Would you prefer forums with millions of active users or IRC channels with 100K+ active users? I think the internet is big enough and diverse enough to satisfy most people. But the trendy and popular stuff isn't meant for people who like the older internet much like SMS wasn't meant for people who love pagers and email wasn't meant to satisfy people that like to write paper mail,so long as there are enough enthusiasts of a tech it will live on but the future will continue to look a lot less like the past. For me after not using IRC for quite a while I used Matrix and it looked so much and so little like IRC,I think it's a good example of how more internet users means more things that satisfy more groups. One size fits all doesn't scale.

<comment><USER47> > and all the old tech is mostly still there

Only as ghost towns

> ways isn't less more?

Err, no. Have you used facebook groups, the social groups that we are supposed to use today? Crippled intentionally, abysmally few options, impossible to discover. These are platforms for users who don't care about discourse, they want to come and shout, and shout often, to beat the algorithms. Yesterday's content is already lost. Compare that with even yahoo groups.

> prefer forums with millions

No! But that's what facebook is, what reddit is. Eternal september comes too soon

> for quite a while I used Matrix and

I wish matrix would catch on

> One size fits all doesn't scale.

Exactly . We have one size for everything today: platforms for billions. But it's a bad fit for niche, weird communities.

</comment></comment></comment></comment></comment></comment><comment><USER48> It's not colonialism if you can opt-out of it. Which, for most of the nations of the world, you can.

Don't get me wrong. We've been manipulated by advertising since the 1850s. _The Hidden Persuaders_ , written in 1957, detailed the ways advertising can manipulate our subconscious to make us do things beyond our control. 'Big Ad' has been a core component of American radio and television since its introduction to the US. When the internet arrived in the '90s, so did a raft of businesses floated solely by ad dollars. Google improved the game with more personalized ads, but this was really just a form of direct marketing, which had existed for a half century.

But most of the things we consume, we do because we are consumers, in a consumer society. We have _not_ been captured by a foreign power and forced to work for nearly nothing, with our lands pilfered for goods to power a foreign nation. We are not 'unsalaried slaves'. We are willfully accepting the trade of services for our attention and our dollars - the same way we did with newspapers, and radio and television programs. We have been selling our attention for cheap for a century and a half, buying whatever crap someone feels like printing.

In most nations today, we have the complete freedom to pay for and use the internet without advertising or restriction. You can pay for an internet connection, pay for e-mail, send and receive files, communicate, etc, all without ever being sold a diet pill, told to vote for a candidate, or having your data changed out to something more profitable. And you can do all of this with the security of a first-world military power.

The global internet is still the most powerful, affordable, _un-controlled_ communications tool in the world. You can talk about empire all you want, but really the only oppressive forces are governments against their own people. Yes, many governments have chilling effects on the rights of their people to have free speech - but those are limits imposed within their borders, and not to the internet as a whole. We still have an internet of creation, and we can still use it to change the world (evidenced by how many nations are rightly afraid of its power to allow people to freely communicate!) The only thing that has left is our imagination, but luckily, no one can take that away from us.

</comment><comment><USER49> Recently I switched from Google search to Bing search. Bing is years behind Google, and today, that's a feature. Microsoft just hasn't bothered to do the obnoxious things Google does now. Bing doesn't have much content of its own. The better search results seem to show up before the ads. It's not flashy, but it's OK.

<comment><USER50> I think they also supply results to DuckDuckGo.

<comment><USER51> DDG also has it's own crawler, but the bulk of the results are from Bing.

</comment></comment></comment><comment><USER52> Let's assume this trend continues for another couple decades. What happens next? Something has to rise from the ashes, right?

</comment><comment><USER53> It didn't merely disappear. It was murdered. Chances are you are complicit.

</comment><comment><USER54> Digital colonialism is a deeply ironic phrase that underlies hypocrisy - <USER2> has long been favored by communist circles, the fascists wearing communist's clothing types, especially third world nationalists. It is a favorite for attacking any outsidsers who interfere with "their" territory completely independent of coerciveness or actual sins of colonialism. If a doctor came in and brought real medicine into an epidemic they would deride it as colonialism.

And yet here they are Johhny come lates now coming in to colonize their daft ideas about colonalism and control when they were late adopters.

<comment><USER55> When you control the means of communication and are a foreign super power, it is colonialism.

</comment></comment><comment><USER56> "our battle is not lost, but that we can control the use of our data, [...] that the privacy laws that protect us are obeyed."

Privacy, privacy. We've actually developed a self-hosted private cloud solution as a substitute to Dropbox for exactly these reasons. Basically a private Dropbox at home (no complicated installation and no server needed)

We're currently in beta, could interest a few in this thread! [https://www.duple.io/en/](https://www.duple.io/en/)

The point is to have a product that works just like a Dropbox, as simple and straightforward, but that is actually private with no one interfering, playing, accessing or reading your data.

<comment><USER57> There's more to do than that. We need decentralized replacement for social media And our own email servers for starters. This should all come in one box like a wifi access point or modem.

<comment><USER47> We have always had email servers. You can set up one today. What we need is to to convince more technical people to use the internet the way it was designed for. And to find ways for these people to make money, because the monopolized internet of today makes that unattainable.

<comment><USER58> Maybe something to make would be an addition to mail servers that chat-ifies group emails.

<comment><USER59> Chatifies in what way?

<comment><USER58> Group iMessage = CC list, cc list becomes messaging group. I suppose one way this could play out would be simply to add an email submission API for text messaging app(s), but it's an incomplete idea so far. :)

<comment><USER59> I'm still not sure what you mean. Are you simply talking about an email client that looks like a text messaging program?

<comment><USER58> That's doable. The image in my mind was the reverse: a chat program that displays email threads. Interactions in chat become mailing list replies emailed out, and replies to the CC list are displayed in the chat channel.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER41> The normal people came to the internet, and crowded out the nerds. You can still find all the weird, wacky stuff that used to be out there; I daresay there is far more of it, by volume, than there ever was. It just requires more effort to sift out the dross.</comment>


How we make 5000 row tables fast in Streak - <AUTHOR> http://blog.streak.com/2012/07/butter-performance.html <comment><USER2> We do something similar to render large tables, but we use divs to layout our data. We establish the height of the scrollable area with a large div, and then absolutely position the rows within it. We have just enough real physical rows to fill the screen, plus a buffer of a few rows. The virtual rows are assigned to physical rows via modular arithmetic, so only a couple of rows change their data on scroll. (And are repositioned accordingly.)

This technique (particularly calculating the positions of the rows) requires fixed height rows. (There is a solution for variable height rows, but it's a bit more complicated.)

I originally got the idea by looking at google books years ago.

Here is a quick and dirty example as a self-contained HTML file:

      https://gist.github.com/3086578

(It constructs a list of 10,000 objects with title/description fields, and then displays that data in a table.)

<comment><USER3> Sadly--and _please_ correct me if I'm wrong on this--there is no way to use that same trick on Android/iOS without painfully-and-likely-poorly reimplementing the browser's scrolling mechanism (as you don't get events and cannot render while the user is manipulating the native viewport).

<comment><USER4> Qooxdoo, my favorite opensource RIA tool, has virtual lists and grids as core building blocks in both the desktop and mobile variants.

However, i would not be surprised to find out, that they emulate their own scroll containers. But it is indeed possible and works well.

See <http://qooxdoo.org>

<comment><USER3> Just checked that one out, and I'm somewhat floored that it isn't obvious to you that it reimplemented the scrolling behavior: the rubber-banding and acceleration curves are wrong, and it scrolls to logical pixel boundaries (the native scrolling can move one physical pixel, while this framework moves by two as the minimum step). It is much better than what I've seen previously, though; makes me wonder if the CPU on the 4S combined with the latest WebKit+Nitro really is now enough to emulate scrolling well (assuming someone attended better to the details). Thanks!

<comment><USER4> It was quite obvious it emulates the scrollbars on the desktop, but i have no iphone, and made no such assumption about what it actually does on mobile.

Ive been following Qooxdoo for quite some time, and the level of browser normalisation ( from keyboard events to how scrollbars render ) is insane.

And so is the performance, and the tricks they pull. For example: they recyle dom nodes. They have different array looping constructs based on the target platform. They emulate their own event bubbling system. There is a whole range of performance tests you can try on their website as well.

The real question is, can we get this kind of performance with more idiomatic html/css.

</comment></comment></comment></comment></comment><comment><USER5> FYI, the right-side menu makes the scrollbar impossible to grab at the top of the page. However, I can still scroll with the wheel or bottom of the scrollbar.

</comment><comment><USER6> That slow multisort doesn't do multisort at all, generally. If it did, it would be relying on (1) the sort algorithm being stable and (2) the properties being in the _reverse_ order from what you used in the second multisort algorithm.

Eg with properties a,b it sorts on a, then sorts the list again based on b. The list is now in b-order (not a-order) and b-equal blocks are only in a-order if the sort is stable. Meanwhile, the 'fast' algortithm is in a-order with b-ordered a-equal blocks.

</comment><comment><USER7> Ironically, when I move the scrollbar on this blog post (in Chrome), the scrolling is noticeably not "buttery", probably because of the JS-heavy interface...

<comment><USER8> Something is very strange with scrolling using a mouse wheel, too. It seems to scroll about a third to half of the distance it usual does for each "tick" of the mouse wheel (Ubuntu, Firefox). I guess it doesn't recognize the OS setting.

<comment><USER9> The whole page lags like a bitch on ipad3. Irony, for sure.

</comment></comment></comment><comment><USER10> I recently jumped through a lot of similar hoops in making an Activity Feed for my company. We use a few finesses to cut down on the number of repaints the browser likes to do when dealing with huge tables like these.

More on that here: [http://layervault.tumblr.com/post/26117253199/making-a- new-t...](http://layervault.tumblr.com/post/26117253199/making-a-new-type-of- activity-feed)

</comment><comment><USER11> Some other gotchas to beware of:

1\. position:relative; or absolute on the ccell or within a cell causes same slowdown as overflow:hidden.

2\. On iOS, overflow:hidden and position:relative on cells can cause serious slowdowns later when an absolute div later dynamically over document.

3\. Beware of tables in IE8 - changing className of div in cell or other changes can cause complete table reflow calc - found out using commercial profiler that gives information about reflow/redraw times.

</comment><comment><USER12> GWT had a PagingScrollTable - I used it 3-4 years ago. It has been a while since I built a GWT project, so I'm sure it has improved dramatically, but I was able to get lightning fast tables using PagingScrollTable. Here's a demo [http://zenoconsulting.biz/com.example.Application/Applicatio...](http://zenoconsulting.biz/com.example.Application/Application.html) \-- try 5,000 rows. It is pretty speedy.

<comment><USER13> One of their requirements was no paging - everything on one page.

</comment></comment><comment><USER14> It's great to read some of these advanced optimization techniques, especially for us web devs that aren't working on these larger projects.

I'm interested to know more about how and why you are using this "Levinshtein distance" (Fast Levinshtein) algorithm. I looked at the Wikipedia and the explanation makes sense; it's just not sinking in as to where I might think about making use of it in my own code.

</comment><comment><USER15> Is there a way to view one of these tables without having to log in?

<comment><AUTHOR> No, but I'll make a video right now.

edit: here's the video <http://www.youtube.com/watch?v=o1O7HkBj74c>

</comment></comment><comment><USER16> Open source it!

Please.

</comment><comment><USER17> 5000 rows or 5000 columns? 5000 rows isn't a lot.

Edit: the article says 5000 rows, 10 columns. Hm.

</comment><comment><USER18> I love articles about web design that are completely blank if you don't have JavaScript activated.

<comment><USER19> I love how there are people who have to point out that they have JavaScript disabled in 2012.

<comment><USER20> I use requestpolicy with fairly strict settings, and I have since grown to hate websites that have the content and styles loaded from two or more different domains. The vastly faster load times and vastly less junk on the page definitely makes it worth it.

<comment><USER21> Funny, because loading assets from different domain actually can help improve page performance: for one it allows to work around maximum-parallel-request- per-domain restriction, for other you may serve resources from cookie-less domain shaving a few more milliseconds.

<comment><USER20> It absolutely can. Unfortunately the stuff usually loaded is a crapload of antisocial share buttons and tracking crap that more that destroy any gain that the techniques you mention bring.</comment></comment></comment></comment></comment>


Ask HN: What Are You Thankful For? - <AUTHOR> <comment><USER2> As part of my positive psychology routing, I am asking myself this question every day and trying to come up with three answers. I feel like it has been helpful in establishing a more positive outlook on life. Usually my responses are nothing special: I'm grateful for receiving an invitation to a dinner, being healthy or loved by my partner / parents. Things like that.</comment>


Jeeves: A Programming Language for Automatically Enforcing Privacy [pdf] (2012) - <AUTHOR> https://projects.csail.mit.edu/jeeves/talks/popl2012_jeeves.pdf <comment><AUTHOR> The official page: [https://projects.csail.mit.edu/jeeves/about.php](https://projects.csail.mit.edu/jeeves/about.php)</comment>


Please, kill your darlings - <AUTHOR> http://blog.ikura.co/posts/please-kill-your-darlings.html <comment><USER2> I'd suggest an alternate approach: add enough commentary to your one-liners so that a reader can parse that instead of the statement. Bugs can hide in the expanded versions of code just as easily. By offering the reader of the code a clear summary of the next one-liner, they can quickly scan it if they are trying to find a bug nearby and decide if it is potentially the culprit.

On top of that, consider making every bit of clever code a reusable library snippet instead. If it becomes part of the vocabulary of your codebase it'll be easier for others to understand it by looking at call sites.

eg:

      # Capitalize the first letter of every word
      @sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1]}.join(' ')

<comment><USER3> I agree. Someone's "darling" code might be a truly innovative or unique way of solving a problem, and providing enough commentary should help avoid the problems the author warns about.

<comment><USER4> It's amazing, their whole complaint is solved by proper software development practices - Comment your code.

<comment><USER5> Code that's clear enough not to need a comment is better than code that has a comment. Comments can be outdated or mistaken and they consume screen real estate.

<comment><USER4> You still need to document intent. No code is self documenting.

<comment><USER6> In some cases, naming may be sufficient to communicate intent.

</comment></comment></comment></comment></comment></comment><comment><USER7> I like that type of code, so yes, maybe it's a darling.

It's easy to make it more readable by aligning the code with the dots, so that it becomes a pipeline:

      @sentence = @sentence.split(' ')
                           .map!{|x| x = x[0..0].upcase << x[1..-1]}
                           .join(' ')

I definitely prefer that to half a screen page of crappy imperative code, where people over time will add lots of side effects etc.

Besides, the middle part is clearly a strawman because

      @sentence = @sentence.split(' ')
                           .map!(&:capitalize)
                           .join(' ')

but yeah. ;)

<comment><USER8> `map!`, `<<`, and `0..0` are all unnecessary and distracting here. The availability of `capitalize` aside, `map`, `+`, and `0` would be better choices.

</comment></comment><comment><USER9> Maybe I'm still just showing off, but I don't even use Ruby that often and it's pretty clear what that code does. Split the sentence into words, capitalize the first letter of each word, and re-join the words into a single string.

<comment><USER10> I don't know Ruby and reached the same conclusion in about 15 seconds. Could be nice to make it a function [or name the results] "capitalizeWords(text)". Possibly adding indentation could help:

        @sentence = @sentence.
          split(' ').
          map!{ |x|
            x = x[0..0].upcase << x[1..-1]
          }.
          join(' ')

[Edit: Fixed code, thanks knodi123]

<comment><USER11> you want the . at the end of the line, so the interpreter knows to expect a continuation.

</comment></comment></comment><comment><USER12> The number of people here defending long 'darlings' (or over-generalizing 'long one-liners'), is both shocking and dimsaying to me. Beyond basic functionality one of any (serious) programmer's _top_ priorities is to maximize the readability of their code for the next (unkown) programmer that touches the source.

We all have large monitors -often rotated 90degrees to portrait. Extra lines are not a bad thing (especially if it helps visually break things into multiple smaller steps), and more work on a single line does not == elegance.

<comment><USER13> I consider the priority to be to help maximize the productivity of the next (competent) programmer that touches the source.

Optimizing my source for incompetent programmers isn't something I care about.

Additionally, optimizing the source to aid understanding for competent programmers is only something I care about to the extent that it doesn't otherwise impair their productivity.

Code spread over five lines instead of one _might_ be easier to read, but not necessarily easier to edit.

Code should be written to be easy to edit _first_ , and comments used to patch up where that conflicts with making it easy to understand.

</comment></comment><comment><USER14> The threshold for 'darling' depends upon the facility of the developer. Some of these are obvious to those with extensive experience.

So where does it end? Dumbing down code until its so wordy, so bland, that it takes minutes to digest every phrase? To rewrite it in your minds eye until its back to that 'darling' concise expression. I recall taking a contractors 2 pages of code, and reducing it to a line. Not even a very complex line. In my view that was all improvement.

<comment><USER15> It's about clarity, if you reduced all those lines to a single understandable line of code, that's great, if you obscured logic by using a one-liner, I'll say it was not an improvement, but it is indeed a thin line

</comment></comment><comment><USER16> In this thread are literally 300 comments saying "Huh, I don't even Ruby, and I understood it", thereby (in my opinion) _completely proving the point_.

It's exactly because people pull this sort of thing "Hey, it was _really_ easy to understand for me, how about you?" that I have seen developers feel compelled to put clever oneliners in codebases. Clever oneliners that later end up causing problems for whatever unluckly newbie has to troubleshoot their edge cases.

Just stop it, and unless you're on a word budget or this _drastically_ improves performance, do something sensible that looks like the pseudocode:

      for word in sentence.split(' '):
          word.capitalize_first_letter

(If you want to be all functional, by all means use a map instead.)

So I don't have to deal with the case where your clever function barfs on (hypothetical example, don't think this happens with the current code) the special case where there is a space between the last word and a period that ends the sentence; and you're trying to capitalize the period. [Edit: As expected, looks like this code fails with even common graphemes. Which is fine, but is an argument towards at least trying to make it more comprehensible.]

<comment><USER14> Oooooor, its not a 'clever one-liner'. Its just a piece of code. Which, in its native environment e.g. Ruby is what you're expected to understand to be a journeyman of the trade.

The code is not written for newbies. It never will be. That's why they're 'newbies' and not 'professionals'.

<comment><USER16> As I said, until it hits some kind of edge case. Again, I'm not trying very hard here, but this oneliner doesn't give the expected output if your sentence has a string like "æsir".

      irb> @sentence = "\u00e6sir are gods"
      => "æsir are gods"

      irb> @sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1]}.join(' ')
      => "æsir Are Gods"

(Expected output being "Æsir Are Gods")

If you want to understand why this is failing, the code I gave above will make it way simpler. Of course, viewpoints differ – you might claim that troubleshooting it is only a job for "professionals".

<comment><USER14> Its all a matter of what gets the algorithm into your head most clearly. If extra names and steps do it for you, then cool. But at some point extra names get in the way - they can suggest the wrong thing (what was intended but not what is actually happening). That's how troubleshooting goes astray.

</comment></comment></comment></comment><comment><USER17> I am sympathetic to the author's argument. Programmers should strive to write understandable code. However, I think you should also assume that people reading your code are fluent in the language and its idioms. You wouldn't expect a novelist to write books at a first grade reading level just to appease people that haven't put forth the effort to learn the language beyond just the basics.

<comment><USER18> Yes! I was scrolling down looking for this.

Long long ago when I encountered the string copy idiom in C 'while ( _s++ =_ t++)' for the first time, it left me scratching my head for a bit. Then it becomes a part of your vocabulary.

Native idioms make communication better.

People often misunderstand 'basic' for 'simple'.

</comment></comment><comment><USER19> I'm curious to see how more experienced Rubyists on HN would write this. My stab:

@sentence.split(' ').map(&:capitalize).join(' ')

More terse and more descriptive (imo)

<comment><USER20> Yes, that is almost exactly how I would rewrite it. The original doesn't communicate its intent at all. It makes one itching to rewrite it but, it takes some time to take all the "smartness" into account.

The original line raises surprisingly many questions:

\- The default for `split` is to split on whitespace. Is it the intent of the author to only split on spaces? (I guess so) What about tabs?

\- Why is the author using #map! (with exclamation mark)? I have to admit this put me on the wrong foot for a while. My best guess right now is that the reason is speed; Mutating the array that split produced is (slightly) faster than creating a new one.

\- Why is the capitalized string assigned to x again? I can think of no good reason at all. Am I missing something?

\- Why is the author using x[0..0] instead of x[0] or x.first? I know why: The difference is that the latter two return nil if x is the empty string; but it's far from obvious and one could easily break the code by trying to improve this.

\- Why are the parts of x concatenated with << instead of with +? For speed? Is the author not aware of String#capitalize ?

My variant would be this:

        @sentence = @sentence.split.map(&:capitalize).join(' ')

... and I would put it in a one-line method called titleize to better communicate my intent.

<comment><USER21> One-liners are fine if you know you'll never need to extend the logic later on. Problem is, how often does that stay true?

For instance your 'titleize' method, in order to properly title case any string, ought to support a second option of words to ignore, such as "a, an, the, ...". If you wrote it as a one-liner at first, then you've got to go into your mapper and add conditionals if an ignore list is passed, and you've got more work than if you left it as a more expanded piece of logic.

Again, this is somewhat of a trivial example, but building on the original post's point of "how easily can I understand this later on" can also include "how easily can I extend this later on". Avoiding one-liner cleverness can help as a general principle.

<comment><USER10> > One-liners are fine if you know you'll never need to extend the logic later > on. Problem is, how often does that stay true?

Write the simple version first, wait for the need to extend the logic arise naturally, factor out the function and extend.

</comment></comment></comment></comment><comment><USER22> Either comment your code or move darlings to a properly named function, which is even better.

@sentence = capitalizeEveryWordInThe(@sentence)

Then you can both unit test (if you're into that kind of thing) and refactor without breaking a lot of things.

<comment><USER23> I've found I often prefer reading and writing the actual guts of the inlined function, over naming it something semantically significant. It's often difficult to craft a good English name for the function. It can inhibit understanding to have to change context to learn what a function does by looking at its code (OtherModule.capitalizeEveryWordInThe). There can be small semantic variations (capitalizeEveryWordInThe, capitalizeEveryWordButFirstInThe) requiring an exploding util package.

Edit. I'm saying I find the one-liner form frequently more understandable than one embodied in a function.

<comment><USER22> Yeah, I guess it depends on how many instructions are in that one liner and how intelligible it is three years from now. The expressiveness of the language also helps a lot.

a.map { x in x * 3 } is probably intelligible enough (in Swift) so no need for util.multiplyEveryElementBy3(a)..

</comment></comment></comment><comment><USER24> There are examples of code which is unnecessarily complex, or difficult to read, but this is not a very good example. I'll join the chorus of those who say they don't even know Ruby and yet they could easily figure out what the example was doing.

The most you could could say about this example, IMHO, is that it could be made more readable by breaking it up into more than one line.

The last thing we need is more people writing C code in dynamic languages that have much better and more concise programming constructs. If a programmer does not wish to learn how to use these constructs, that's their business. But I intend to use all the power available to me in whatever language I am programming in -- when it is appropriate, of course.

Just because some programmers don't understand how a particular language construct works, that does not make its use the product of a self-absorbed hacker who thinks he has "superpowers".

Yes, we should all guard against writing code that is difficult to read, but I think such code is rarely caused by the language features we use (although some languages make that easier than others -- I'm looking at you, C++). In fact, you could argue that it is more commonly caused by the features we _don 't_ use. Unnecessary verbosity is often the product of someone who is new to a particular programming language, and I think most of us are happy to discover shorter, simpler, clearer ways of expressing things.

In fairness to the author of the article, I think there is a point when you can chain a few too many things together without any intertwined temporary variables, separate function calls, or at least comments, and the reader of your code can get lost. However, in my mind, the code example given hasn't quite reached that threshold yet.

</comment><comment><USER25> I'm all for clever code when playing around but there are limits to its usefulness. When its over the top, you're not doing yourself or anyone any favors. If something took you a while to come up with, and on top of that its not commented out, its going to annoy the next person, and maybe even yourself when you get back to it 6 months down the road. Well, either annoy or stroke your ego.. Neither contribute much to the quality of the end product.

Here's a quote from Brian Kernighan: "Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?"

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

I've come to appreciate simplicity especially when spending a lot of time dealing with other people's code. If you spend most of your time in other peoples code, simplicity will save you endless amounts of time.

</comment><comment><USER13>
        @sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1]}.join(' ')

Nobody sensible would write this code. The nearest sane version is:

        @sentence = @sentence.split(' ').map{|x| x[0].upcase + x[1..-1]}.join(' ')

But, although capitalize doesn't do the same thing, it's almost certainly what is _actually_ wanted, so it would be

        @sentence = @sentence.split(' ').map(&:capitalize).join(' ')

Having said that, it's much more likely that a "clever one-liner" would be

        @sentence.gsub!(/\b\w/){|x|x.upcase}

Code like the article's would generally not be the result of cleverness, but of code that has organically mutated into something silly you'd never have written from scratch that way.

<comment><USER26> Huh, I've been doing Ruby since 2008 and I've never seen a block passed to gsub/gsub!. Neat!

That said, a block isn't necessary here and the one-liner can be even shorter:

        @sentence.gsub!(/\b\w/, &:upcase)

&: call syntax is actually a little faster post 1.9, too.

</comment></comment><comment><USER27> I strongly agree with sentiment presented here.

In fact, I actually coined a code metric for this - Jones Complexity, which is the mean operations-per-line (My thesis is that "good" code has a Jones Complexity of less than 8.) For some reason, it looks like code density of this type wasn't ever really considered before. I value readability and maintainability of code even more than I value efficiency and speed (in most cases.)

flake8 extension PoC: [https://github.com/Miserlou/JonesComplexity](https://github.com/Miserlou/JonesComplexity)

</comment><comment><USER28> >So, why do we do it?

I do it because it reduces physical code size and helps me "chunk" code in my brain. Since I wrote it, I know what I intended it to do and how it does it, possibly with the aid of a small comment.

This helps me have a more compact complete representation of the surrounding code, both in my editor and in my brain.

Is it bad for verifying correctness and allowing others to understand the code? Sure. But there is absolutely a well-considered reason why I do it, and it's not to show off.

<comment><USER29> Any code whose readability depends on information stored only in your brain is bad code, sorry. Perhaps there are times when bad code is excusable, but there is no argument that such code is high-quality. The best code expresses an idea in the simplest way possible, which is not synonymous with the fewest number of lines possible.

</comment></comment><comment><USER30> Adding to this, I've found from profiling a lot of Python 2.7 code that a lot of those little cute one liner list comprehension expressions are slower than the expanded for loop forms. And also the expanded loops are a lot easier to change after the fact, for example if you want to do two operations on an item in your loop, you then have to expand it out anyway.

<comment><USER31> Did you try generator expressions as well? I'd hope that the interpreter would manage to make them as fast as the loop form, but...

</comment></comment><comment><USER32> As no less authority than Brian Kernighan wrote, in 1974, "Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?"

</comment><comment><USER33> These days I seem to like relating programming to music, so here I go again...

I think _virtuosic_ displays like this are important for the ego of the creators at times, and should be commended as it represents a deep understanding of the craft and leads to even deeper and more interesting and perhaps profitable explorations later on.

But as in music, virtuoso's often, as they mature, realize that they work in ensembles, and that requires a tempering of their prodigious abilities in order for the "whole" to be its best.

In other words, its good to show off, but in the end the true master knows how to temper it for the greater good.

</comment><comment><USER6> There are a lot of people asserting that, while you should be writing (in part) for readability, you should be able to assume some level of competence on the part of those who follow. I would say that is probably the case but really consideration should be given to who your audience is actually likely to be given the circumstances in which you write.

It is also the case that we often overestimate how understandable things are to others - I write above discussing goals before any compensation for this is applied.

</comment><comment><USER34> There was an HN discussion quite a while ago on a one-line Game of Life in APL. Much more difficult to understand than using any currently popular language.

Here's the discussion: [https://news.ycombinator.com/item?id=1041500](https://news.ycombinator.com/item?id=1041500)

Here's a (different) one-line Life implementation, linked to in that discussion: [http://catpad.net/michael/apl/](http://catpad.net/michael/apl/)

</comment><comment><USER35> If it takes more cleverness to debug code than to write it, and one writes code that is at the limits of one's own cleverness, then clearly one will not be able to debug it.

<comment><USER35> Didn't know the original source of this, assumed it was an aphorism. Thanks to a comment above for pointing out that it came from Brian Kernighan.

</comment></comment><comment><USER36> Yesterday, I was complaining that Rust encourages this sort of thing. In Rust, it comes from the error handling, though. You have to write lots of

        x().and_then(|foo| exp).and_then(|foo| exp)

to handle errors. The imperative form requires a match statement after every function call that can return an error. Or "try!()", which bails with a return. It looks like we just have to get used to this Haskell-like style.

</comment><comment><USER37> At the very least I'll agree that terseness is not always a virtue, and the time saved in keystrokes or formatting now may be easily lost later when someone tries to figure things out. That said, not all statements of this form are unreadable or incomprehensible, and in some cases there may actually be performance implications as well. As always it is a matter of judgement.

</comment><comment><USER38> I actually love such code, as long as the vars or funcs are named capitalizeWords. This type of code is the difference between long term investment/cure vs short term gain/steroid. I cannot imagine a boiler plate 'for loop' with assigning and re-assigning and doing all sorts of convoluted branching.

</comment><comment><USER39> I don't know Ruby, but it looks like a very clear implementation of a function to titlecase a sentence. I am right?

</comment><comment><USER29> Great post. This is one of my biggest pet peeves with Ruby and languages like it; they encourage developers to "show off" by using the most esoteric features they can find (even better if these features use weird symbols).

Compared to a language like Python that has few neuroses, the same developer writes much less readable code.

The post may have been better if the author included a Python sample that does the same thing:

        long_string = 'ajix mxozl xoap'
        new_string = []
        for word in long_string.split(' '):
            new_string.append("{}{}".format(word[0].upper(), word[1:]))
        new_string = ''.join(new_string)

Admittedly there are a few annoying symbols in here, mostly due to the non- intuitive operation of the join function and the well-meaning but less-than- ideal string formatting syntax (which could've been avoided if we used conventional strong concatenation, and which PEP 0498 attempts to improve). Also admittedly, coders who want to show how smart they are would try to use a list comprehension to do this, which is slightly less readable and imo shouldn't be used over this format without a good reason. But it's still much easier to parse than the Ruby version because everything is explicitly spelled out in the loop, and you generally shouldn't have to consult the language docs to look up 4 different rarely-seen operators.

Remember, debugging is twice as hard as authoring, so if you write the most clever code possible, you are by definition not intelligent enough to debug it. ;)

I understand that people can't be expected to stick to that on their own, so they need languages that promote function, uniformity, and ease of use over showmanship.

The _simplicity_ of the code is one of the main things I look for in interviews. If you could've done something with the conventional, simple language construct that doesn't require someone to go back and refer to the docs, even if it takes more lines, but instead you used the super-arcane construct to prove how well you know the language or to "get it all on one line", I'm going to look on that pretty dubiously. The last thing I want to deal with on my projects is the residue of someone's ego impacting our ability to read their code and get things done quickly and easily.

P.S., in Python, there are a couple of shortcut functions for capitalizing each word in a sentence: str.title() and str.capwords().

<comment><USER40> Something like the following:

       capitalize = lambda word: "{}{}".format(word[0].upper(), word[1:])
       new_string = ' '.join(map(capitalize, long_string.split(' ')))

or:

        new_string = ' '.join(["{}{}".format(word[0].upper(), word[1:]) for word in long_string.split(' ')])

is much clearer and simpler to me, because it explains the intention of the code: split the string into words, map each word to it's capitalized version, then join it again. With the loop, I have to mentally "run" the code to realize that the for loop and append are to go through the split version and add the converted words to a new list.

Obviously, this is a pretty subjective topic, and which version you prefer will depend what you're familiar with/the languages you use.

<comment><USER29> For me, readability is about how intuitive something is, how much can be understood with basic knowledge of programming in general and perhaps a quick primer on the specific language. I think this is the best measurement because it emphasizes a reliance on the most commonly used, general concepts, and encourages people to use those unless there's a good reason not to. A side benefit is that the more basic language primitives and flow controls tend to be more performant, better tested, and have fewer weird edge cases where they behave in an unexpected manner.

I dislike your first example because

a) imo, the lack of spacing makes it harder to see what's going on. it's more obvious that something is being iterated in a for loop with a new indentation level than in the map function.

b) it depends on the Python-specific implementation of lambda. The behavior of a lambda varies substantially from language to language and lambdas are used rarely enough that it's pretty likely someone who doesn't spend all day every day in Python is going to have to go back and look up the specific behavior. The syntax is much less clear than a full function definition.

In my opinion, it's much easier to read code like:

        def capitalize(str):
            return "{}{}".format(str[0].upper(), str[1:])

        for word in long_string.split(' '):
            captizalize(word)
        ...

This makes it much more obvious what's going on, and it should be readable to anyone with a passing knowledge of Python, and possibly anyone with a knowledge of programming languages in general. Invocation of map and lambda in this case only make the intent of the program more obscure.

I'm not saying that map or lambda are never appropriate to use; sometimes they are. But I don't think it's wise to use them when more basic, universal language constructs do an equally adequate job, especially if the only benefit is "fewer lines of code".

The second example is just a list comprehension form of my original example, which IMO is less readable for much the same reasons. If you're not super familiar, you'll need to go back and look up list comprehensions. There is no spacing to make it obvious that something particular is being iterated or branched.

I understand that ultimately, ease of reading comes down to what style one is most familiar with, which makes it subjective, as you said. But I think there is a stronger rational basis for always preferring the simplest construct that adequately performs the function, which is that in the general case, there is less need to refer back to docs, less possibility of unexpected behavior, and less possibility of strange performance issues.

<comment><USER8> Not having touched Python for many years, four things jump out at me:

1) .format, which isn't immediately familiar and doesn't resemble similar string formatters in other languages 2) [1:], which I believe is a string slicing syntax that doesn't resemble similar syntax in other languages 3) Bug: nothing is done with the capitalized words, since the return value is thrown away 4) Bug: the name of the function was misspelled when used.

The last one may seem like a nitpick, but it is true that when you add a name to your code for the sake of clarity, you also take on the additional burden of ensuring the name is used consistently and accurately everywhere. This can be a particular pain in cases where you are generating a lot of uninteresting temporary values -- which is precisely why people end up writing chained function or method calls.

<comment><USER29> Point 1 is conceded in my earlier response. You're right that someone who is unfamiliar with Python is going to be stopped by the format syntax. However, it's simple to acclimate and learn the basics of it and is something that is very pervasive in Python code and is one of the safest ways to interpolate string data, so its use is justified.

Point 2, this type of string slicing syntax is pretty common in languages similar to Python. A very similar syntax exists in Ruby and Perl. See [https://en.wikipedia.org/wiki/Array_slicing](https://en.wikipedia.org/wiki/Array_slicing) for more examples of slice shorthand in the wild.

Point 3. I didn't intend to rewrite the whole thing again, just enough to demonstrate my problems with the reply's lambda-based approach. This is indicated by the ellipsis. If I were to create a full version instead of the quick demonstration of the more-clear full function definition here, then yes, I would've assigned the output of the function to something.

4\. Conceded.

<comment><USER8> OK, but that doesn't seem much different from "code written in Python should be written in a style familiar to Python developers", which is a good principle regardless of the language. In Ruby, the use of Enumerable methods is generally preferred; it would be as "surprising" to use a for loop in this case as it would be to use map in Python.

I also don't see a good argument that string slicing, `for ... in` and Python- style string formatters are more "universal" than lambdas and map/filter/reduce. All of them exist in large subsets of commonly used programming languages; all of them are used heavily in some languages and rarely in others; only one of them (in the form of sprintf) exists in C.

<comment><USER29> > OK, but that doesn't seem much different from "code written in Python should > be written in a style familiar to Python developers", which is a good > principle regardless of the language. In Ruby, the use of Enumerable methods > is generally preferred; it would be as "surprising" to use a for loop in > this case as it would be to use map in Python.

Yes, ultimately, it's a judgment call about the degree to which language- specific caveats and conventions are considered substantially beneficial to justify their introduction.

I will, however, state that I hate that Ruby uses .each instead of for. I do use .each when I write Ruby because as you stated, most Ruby devs will look at you sideways if you used a real for loop, but I really dislike that it's become that way. That's an example of something that's different just for differences sake; any benefit derived from it is marginal and corner-case (something like wanting to override the standard Enumerable behavior), and it makes the whole thing more insular (meaning the behavior is difficult to generalize or extrapolate beyond Ruby, you have to look up the specific behavior), less friendly (meaning it draws attention to itself and takes away productive time; when your code style does this, it needs good justification), and harder to read (because of the two preceding points). IMO, that's a tradeoff that wasn't worthwhile.

>I also don't see a good argument that string slicing, `for ... in` and Python-style string formatters are more "universal" than lambdas and map/filter/reduce. All of them exist in large subsets of commonly used programming languages; all of them are used heavily in some languages and rarely in others; only one of them (in the form of sprintf) exists in C.

Again, it's about being as minimally disruptive to the typical programmer that would be reading the code as possible. While map/filter/reduce may exist in some form in most languages, they're not very commonly used by programmers with an imperative background. Languages like Python have formatting rules that make them harder to read than their language-construct counterparts like for, and while most other imperative languages won't enforce specific formatting rules and preclude the programmer from formatting his code such that map's iteration is equally visually obvious as a for loop's typical indentation and/or bracing, it'd be difficult and unusual to maintain them.

String slicing is a very common need and most languages provide a simple way to perform it, whether it's the slicing shorthand or substr() calls. You're right that C doesn't provide tools for this, but C doesn't even recognize the string as a thing; you just work with groups of chars. The programming community has clearly repudiated that philosophy and demonstrated that it expects its languages to do most of the string dirty work directly. Same goes for string formatters, even though, as I've stated 3 times now, Python's is unfortunately a bit anomalous for not much benefit. This is improved with PEP 498.

"for in" is a nearly self-evident and easy to remember. While this may or may not differ slightly from the specific syntax used in other Python-style languages, it's fairly obvious to someone who is familiar with that language class, and easy enough for someone who has only been exposed to C to hook up and remember once they've read about it once. There also isn't really a more or equally obvious way to express this in Python.

I accept that there are some classes of languages where this is not the case, primarily functional languages. In those cases, the most simple, universally- applicable approach for that language family should be used.

</comment></comment></comment></comment></comment></comment></comment><comment><USER41> I don't even know Ruby (well I did play with it briefly years ago for a week) and I didn't have any trouble parsing what @sentence was doing. There is undoubtedly much tightly packed cleverness in code but I don't think this is it.

</comment><comment><USER42> I don't mind the implementation of this code, but 99% likely, it's in a method called `capitalize_sentence` or similar. If that is strewn through the middle of your code, it's probably breaking single-responsibility-principle.

</comment><comment><USER43> Every discussion of code style eventually devolves to a discussion about readability, which eventually devolves to a knife fight in a conference room because one man's readable expression is another man's opaque one-liner.

<comment><USER29> I think there's an objective way to resolve a good chunk of this, which is language exclusivity. If the code expresses an idea in a way that a programmer familiar with a similar language can understand without having to refer to the docs, it's great. If the code uses language-specific operators or functions, there needs to be a reasonable justification for it.

This basically means that these keywords and operations are always OK:

      * function definitions

      * if conditionals

      * full for loops

      * full while loops

      * return statements

and these things should only be used when it would be unreasonably intrusive or problematic to perform the same operation using only the above flow control mechanisms:

      * classes

      * lambdas/closures

      * language-specific shorthands like list comprehensions

      * language-specific operator aliases, like << for .append in Ruby

      * built-in functions that are likely to behave substantially differently from the intuitive expectation

The goal is to keep the program as simple and straightforward as possible. Of course you're going to need some of the things in the second category to do that sometimes. But my opinion is that one should start with the basic building blocks, and if one finds that it will save a lot of effort and time in both reading and writing the code to use one of the secondary things, only then should those things be deployed.

For example, if you're using a lambda, you should have a good explanation for why a function definition wouldn't have worked. "Lambdas take one line and defs take two" isn't a good reason.

<comment><USER8> What about languages like Haskell that don't have for loops, while loops, or return statements? And anonymous functions exist in most languages and cannot be avoided in many of them.

</comment></comment></comment><comment><USER44> Well, when you kill them, try not to make new darlings in the process.</comment>


Static single assignment for functional programmers (2011) - <AUTHOR> https://wingolog.org/archives/2011/07/12/static-single-assignment-for-functional-programmers

<comment><USER2> This is very well written. I want to mention two other IL that takes SSA even closer to a functional representation: thinned gated single-assignment (TGSA) form and the Value Dependence Graph.

I've used the former with pleasure as a lot of traditional passes become trivially done by construction: global common subexpression elimination, copy propagation, dead code elimination, and constant propagation. With very little extra work you also get strength reduction, expression hoisting, and a host of other things that I'm forgetting.

I never understood why this wasn't more popular as old-school SSA, as used by even LLVM, is so terribly clunky and inefficient.

</comment><comment><USER3> I always love reading his blog posts. I honestly don't know how one finds the time to write that well at that length and still turn out guile et al., plus whatever his "day job" is.</comment>


Show HN: A global database of mental associations to spark ideas - <AUTHOR> http://seenapse.it

<comment><USER2> While the idea seems cool, as far as the home page is concerned, I found the colors jarring, the illustrations unsettling (especially that first one), and the text mostly empty of meaning.

There are 4 paragraphs spread out over something like 1600 vertical pixels.

When I saw that the video was not only in that same "clown on acid" visual style, but 2:45 long, I bailed hard.

Pairing mental associations seems like the kind of thing that should be demo'd on the home page, not buried behind a signup wall.

In other words, you need to provide value upfront. By upfront, I mean within the first 500 pixels of page height.

edit: I'm not affiliated with these guys, but they showed up on HN recently and I found their site compelling. [http://www.timeful.com/](http://www.timeful.com/)

<comment><AUTHOR> Thank you, good point.

</comment></comment><comment><USER3> Awesome thing. I really liked the idea when I read it.

But when I looked at, it wasn't so great. I don't know what is missing or what is wrong, maybe the ideas I saw weren't mine. Or maybe the transition between "anything you think about" and the paper is not that easy.

<comment><USER4> I agree--I am very impressed by your splash page (both design and copy) but I feel like it wasn't consistent with what you get once you sign up. For me, I was expecting something similar to Brian Eno's "Oblique Strategies" from the description (i.e. more vague, abstract suggestions), but it turned out to be more like Random Wikipedia.

<comment><AUTHOR> Thanks for your comment. Did you search for something specific? Your comment on randomness totally applies to the home page, but not to the connections, we think.

Fun fact: Brian Eno played with an early prototype of Seenapse and gave us some feedback too :)

<comment><USER4> I didn't--I just went with the default recommendations based on my designated interests.

I just tried searching for "dating websites" and it returned: Modern reliquaries & New Commodore 64, Sexy beast & Ben Kingsley, Pretty Mouth And Green My Eyes & Raymond Carver

While I do like Raymond Carver, I'm not sure if I find these connections intuitive...do you suggest search terms that are more abstract?

Also out of curiosity, what did Brian Eno say? :)

<comment><AUTHOR> No, concrete searches should work, and will work better once more people contribute their mental associations. Since this is fairly new, there aren't many yet. But it should become more useful over time.

Eno said "So, does this exist? Is this live? Yeah, I'd like to use it."

He also shared an interesting idea/need which I mention here: [https://medium.com/@rafael_j/the-cultural- ouroboros-e7917388...](https://medium.com/@rafael_j/the-cultural- ouroboros-e79173882fda)

Thanks again,

R</comment></comment></comment></comment></comment>


Ask HN: Developing the developers - <AUTHOR>

I've recently become the leader of a group of 3 junior developers. I'm looking for resources to develop their skills and motivate them to become better at what they do. Any ideas where to start? Practical is better. <comment><USER2> Without more specifics it's hard to give practical advice. Daniel Pink's book 'Drive' and the video that has been doing the rounds in response <http://www.youtube.com/watch?v=u6XAPnuFjJc> make an awful lot of sense.

Essentially to get the best from people you need to give them * Autonomy * Mastery * Purpose

I suspect from your question that you are most interested in focusing on Mastery, specifically how to help them make progress towards it.

I found Pragmatic Programer to be a pretty good general resource. <http://www.pragprog.com/the-pragmatic-programmer>

Outside of that I'd second the other comment here taking about Design Patterns - I think that the Head First book <http://oreilly.com/catalog/9780596007126> is a great introduction

Day to day, finding ways to give to really quick feedback is important, code review and general collaboration with the others will really help.

</comment><comment><USER3> I had a stack of books that I felt were relevant on the new developer's desk the first day they showed up. The exact stack depends on what you are doing specifically, I started from the Joel List: <http://www.joelonsoftware.com/navLinks/fog0000000262.html>

Each week during our 1-on-1 I would review various concepts from each of the books and suggest reading for the following week. It was the best way I found to 1) get them up to speed on best practices and my expectations 2) help them see that my suggestions were (generally) founded on data.

</comment><comment><USER4> The first thing you do is buy each of them a design patterns book and start forcing them to both read, and use eachother's code. When bugs appear, don't make the author fix the bug, make one of the other guys fix it. That'll probably motivate them faster than anything that they need to 1) write common library of code with interfaces they all agree on, 2) have a version control system they all like, 3) have unit tests to make sure there's no bugs.

</comment><comment><USER5> Agile methodology is applicable to almost any context, it gets my vote. Particularly test-driven development.

Most of my programming is web apps which are a major PITA to use TDD on since so much of it is UI based, but nevertheless I'm struggling through and have found it to be the most useful addition to my repertoire in the last couple of years.

</comment><comment><AUTHOR> Thanks for your comments. Most development is web-based in PHP, and we also do light customization of OSS solutions. The company is a contact center, we mostly work on automating business processes

</comment><comment><USER6> What is your background? Technical or non-technical?

</comment><comment><USER7> It really depends on what they do on a daily basis. Care to elaborate? (language, target app style, complexity, environment, ...)

</comment><comment><AUTHOR> Thanks for the input, we began a reading plan with The Pragmatic Programmer ans then we will move on to Don't Make Me think</comment>


The Way to Go: JetBrains GoLand IDE Hits the Market - <AUTHOR> https://blog.jetbrains.com/go/2017/11/30/the-way-to-go-jetbrains-goland-ide-hits-the-market/ <comment><USER2> I'm glad they changed the name from gogland which sounded like an organ for coding.

<comment><USER3> At least it wasn't GagGland.</comment></comment>


Trader admits fraud in $1 billion Apple stock scheme - Anil-Shrestha http://finance.yahoo.com/news/trader-admits-fraud-1-billion-195510715.html <comment><AUTHOR> > When the bet backfired, Rochdale was on the hook for $5.3 million of losses > on the extra 1,623,375 shares, leaving the Stamford, Connecticut-based > company undercapitalized, the SEC said in court papers.

That actually sounds like an incredibly small loss, overall.

<comment><USER2> This is the main thing I got out of this story when it first broke.

The firm was able to buy over a billion dollars worth of stock but was undercapitalized after incuring a loss ~5MM? Just doesn't make sense.

<comment><USER3> Its the difference between the purchase price and the settlement date. I've got no idea what really happened but can speculate that what happened was that an order to purchases 1.625M shares goes in, (that will cost $1B), the trades are recorded people who've sold get notified they sold @ $xx etc. Now the trader was hoping the price goes up by a few $, then sells again. Now if everything "works as planned" when the trades are settled at the end of the day the people who bought put their money in the people who sold get their money out and the left over is in the bank.

But if you buy the shares in the morning and the price goes down, if you want to 'hold' and wait, you need $1B to cover the purchase of the stock, but if you want to 'cut your losses' you just sell the stock again for what ever you can get before the markets close.

I'm guessing this was what happened, and at the end of the day the difference was $5.3M which the company had to come up with to balance their accounts. That left them with not enough money for day to day operations, poof they are dead.

</comment></comment></comment><comment><USER4> This man really did not pay attention. I've rarely seen Apple stock rise the day of a press or investor briefing no matter how good the news. In fact it has often been the opposite. In fact, now that I've looked over just the last year, most of the times Apple issues a press release its shares close the same day or the next below the level they were at the day before the announcement.

Out of 40 times Apple put out a press release in the last year, more than three-fourths of those times the stock declined that day or the day following (31 times). And only once did a positive trading day coincide with a new product announcement. The exceptions were:

       Dec. 17, 2012 (iPhone 5 First Weekend Sales in China Top Two Million)
       Nov. 19, 2012 (AC/DC Now on iTunes)
       Nov. 5, 2012 (Apple Sells Three Million iPads in Three Days)
       Sept. 17, 2012 (iPhone 5 Pre-Orders Top Two Million in First 24 Hours)
       Sept. 12, 2012 (Apple Introduces iPhone 5, Apple Introduces New iPod touch & iPod nano, Apple Unveils New iTunes)
       Aug. 27, 2012 (Craig Federighi, Apple's Vice President of Mac Software Engineering & Dan Riccio, Apple's Vice President of Hardware Engineering Join Apple's Executive Team as Senior Vice Presidents)
       July 30, 2012 (Mountain Lion Downloads Top Three Million)
       June 26, 2012 (Apple Launches iTunes Store in Hong Kong, Singapore, Taiwan & Nine Additional Countries in Asia Today)
       April 25, 2012 (Apple Worldwide Developers Conference to Kick Off June 11 at Moscone West in San Francisco)

I'm pretty sure this has been the trend throughout Apple's history. The worst stock days seem to come when Apple has great news to report. At any rate, Wall Street surely does not care about Apple's new product announcements, at least not when it comes to shelling out for stock. Product sales or downloads, sometimes. New products, very rarely.

It's something I noticed in the early 2000s when I was a Mac reporter and very in tune with Apple's PR/IR efforts, but it's not something I actually consciously tracked, and I've already wasted enough time on something that doesn't affect me except as a curiosity.

Anyway, it never made sense to me the way good news from Apple translated into declining stock prices. But there you go. A little casual observation could have saved this man a lot of hassle.

<comment><USER5> "Buy on the rumour, sell on the news"

</comment></comment><comment><USER6> Where are the "unit" tests, the asserts, the catch/throw exceptions for brokers? What we have here is not just crash dump, but blue screen without option to reboot....

</comment><comment><USER7> Now everytime I see cases like this I wonder to myself how much of the plea is because of over-reaching prosecutors and how much of it is really guilt. Anyone know more details about this case?

<comment><USER8> Using unauthorized millions of dollars of your company's and, ultimately, putting a bullet in the company's head, leading to many people losing their jobs, seems to land in the middle, IMO. Twenty-five years is probably too many, but a plea of five seems generous,

</comment></comment><comment><USER9> So buying stock is a "scheme"?

<comment><USER10> As much as replying without reading TFA is a "comment".

<comment><USER9> I read tfa. He bought some stock (unauthorized) and lost money with that. What did I miss?

</comment></comment></comment><comment><USER11> Nothing but addicts and gamblers.</comment>