Please don't denigrate what a beginner is currently learning - <AUTHOR> http://pgbovine.net/programmers-talking-to-beginners.htm <comment><USER2> Most programmers my age (I'm 37) started with BASIC. We should all be terrible if the language you start with would be so fundamental. The only thing that matters is actually _to start_ with something, and _to improve_ over time.

<comment><USER3> I'm 50, and started with BASIC on a mainframe timeshare system. The following Dijkstra quote is proudly displayed on my cube wall:

"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."

I would actually go a step further with the thread title: Please don't try to teach if you can't.

When I talk to junior (or senior) folks who are learning to program, it will become evident that I've chosen different tools than what they're learning. So the discussion of tool choice is inevitable, especially if I have to admit that I don't know the language they're learning. My typical advice is to choose something that is presented with good learning tools, and maybe one that has tutorials related to a subject matter that they're interested in.

<comment><USER4> After 14 years of java programming which was really the language I started with, I can say that quote applies to java and perhaps any language that's not assembly, C, C++. I think every beginner should be strongly encouraged to start with C.

<comment><USER5> To start with assembly is great if one wants to learn programming instead of building websites.

</comment></comment></comment></comment><comment><USER6> What made, say, PHP or Visual Basic good for beginners was that they _just worked._ You wrote a PHP program (in the language, not a framework), saved it as index.php and suddenly you had a working web app. With VB6, you created a project, dragged stuff onto a window, typed things, and suddenly you had a program that looked just like the other programs you were running on your OS. You didn't spend hours configuring things or typing boilerplate code.

The experienced programmer's goal is to make good stuff; the beginner's is to get his feet wet. These are radically different goals with mostly randomly different tools.

<comment><USER7> > What makes, say, PHP or Visual Basic good for beginners is that they just > work.

And what makes them bad is they permit, induce or even explicitly teach bad habits.

I agree to not discourage someone if they're doing it, but if you have a chance to steer them in a position where they'll be better programmers, you should do that.

The reality is almost any language allows you to create a single file and run it and see a web page these days. That's not something unique to PHP at all.

<comment><USER8> > The reality is almost any language allows you to create a single file and > run it and see a web page these days. That's not something unique to PHP at > all.

This is not what the parent means. In PHP you get a crappy shared hosting account, and copy a file up to the server via FTP and it works. This is not possible with Python, Ruby, etc... you need to do more server setup in most cases. Sure this is due to historical reasons and maybe not specific to "PHP the language", but that is the situation that most beginners face. It's a very simple mental model as well. Services like Heroku kinda/sorta make it simpler for Ruby/Rails/etc., but understanding how those work and getting the command line tools set up is mentally more complex to a beginner.

<comment><USER7> > This is not what the parent means.

Well let's be fair, it's what the parent says. Even so, that's a largely outdated piece of "common knowledge" in 2014.

Five years ago? Sure. Today? Not as much.

<comment><USER8> Genuinely curious... can you explain to me how to get a single-file ruby or python app up and running on a normal shared host (basically anything that uses "CPanel" or "Plesk")?

With PHP: 1\. log in to server via FTP or CPanel "File Manager" 2\. find the publicly-accessible document root (htdocs, public_html, etc) 3\. upload an "index.php" file to that directory with "<?php echo 'hello world';" in it 4\. visit [http://yoursite.com/](http://yoursite.com/)

How would I achieve this most-basic web page on a common shared host in ruby or python?

<comment><USER9> Hi Jordan, I'd recommend the following. The Plesk hoster or VPS owner can prepare the environment by himself. See: [http://devblog.plesk.com/2014/09/plesk-and-ruby-on- rails/](http://devblog.plesk.com/2014/09/plesk-and-ruby-on-rails/) [http://devblog.plesk.com/2014/10/plesk-and- django/](http://devblog.plesk.com/2014/10/plesk-and-django/) (full disclosure, I work for Parallels & had our dev team take a look at this question.)

</comment></comment></comment></comment></comment></comment><comment><USER10> This 100x. I am sick and tired of developers in the industry trying to push their own preferences onto junior developers. I think many of us who have been in the industry for a while have witnessed this scenario happen in the workplace a few times in our careers.

Programming languages are like opinions, everyone has them and everyone is always wrong. We all have to start somewhere, it shouldn't matter if you decide to choose PHP or the new flavour of the week trend language on the HN homepage. All that matters is getting your foot in the door, seeing the possibilities of a programming language and then moving up.

I recall programming Visual Basic in high school, my first ever exposure to programming. Not many would consider Visual Basic great, but it was enough for me to get a taste of what is possible in programming and from there, I consumed tonnes of books on different aspects of programming. Through my own growing knowledge, I could see the limitations and downsides of various languages the more I kept learning.

My first foray into web development was PHP and HTML. There is no other language in existence that can rile up a crowd of elitist programmers faster than PHP. But PHP was my gateway into languages like Python and Javascript (especially Javascript). The more I learned, the more I could see similarities between PHP and Javascript, and other languages like C++. It didn't matter I chose what is considered a bad language for web development, it taught me concepts that carried over to other languages, it taught me the basics of things like if statements, for loops and more.

Fast forward to now, I have a firm grasp on HTML, CSS & Javascript, I know Ruby, I know Python, I know Objective C and have a skillset that allows me to pickup a new programming language non-objectively and play around with it, without passing judgement or casting an opinion. Because I was able to make my own decisions along the way and learn what I wanted to learn, not what someone else thought was best to learn, I have a varied toolset and I am better off for it.

We will start somewhere, I think some of us more than others lose sight of that. We get clouded by our own judgement, everyone thinks their favourite language and framework is better than the competition.

</comment><comment><USER11> Hm. While good advice, this seems like just general life advice not specific to programming.

If you're the kind of person who says things like "TextMate is for n00bs" (or some variation of such) you're probably just a super annoying person in general.

</comment><comment><USER12> I started coding in the 80's and many people would deride my expertise in BASIC, whether it was on an IBM PC or on a DEC PDP-11 or DEC VAX. If you weren't coding in C and later C++, you just weren't a "real" programmer.

So all I have to say is...one of my clients in 1991 is still running the payroll reporting system I wrote....in Microsoft Professional Development System...which was BASIC.

I've since learned OO, C, C#, scripting, and all the new stuff, but BASIC is where I started.

<comment><USER13> My first internship (circa 1995) had me writing an email support system for IBM in...Lotus Notes Script. It was still alive and kicking in 2000 when I checked back on it (given that OS/2 is no longer alive, I doubt it is now).

<comment><USER14> No OS-related reason why it shouldn't be; Notes will run happily on Windows, OS X and Linux. It may even have been webbified (not particularly difficult from R5 onward, and really quite easy since Domino 8.x).

<comment><USER13> The project was done for OS/2 device driver developer support, so I'm guessing it is not around for that reason.

</comment></comment></comment></comment><comment><USER7> And let's be honest, there are two ways to go about steering someone to another language that might put them in a better place as a programmer long- term.

The first is the condescending, snooty version espoused in this blog. The problem is, I don't think it actually happens that much. It may be perceived that way, but people who are learning new things are sensitive to instruction from people who know more.

The second is to be very supportive and maybe even a small sales pitch about where you would start if you were beginning programming now in 2014, knowing what you know as an experienced programmer.

If you truly believe that learning PHP as a first language is bad for a new programmer, then you shouldn't bite your tongue. But you should be prepared to explain why and present a good alternative and maybe even offer some hands-on instruction.

<comment><USER15> > If you truly believe that learning PHP as a first language is bad for a new > programmer, then you shouldn't bite your tongue. But you should be prepared > to explain why and present a good alternative and maybe even offer some > hands-on instruction.

I routinely recommend python for this, and somewhat more aggressively to people who are making php noises. Not because I'm a massive fan of python, but because it has relatively little syntax and tends to fail in very obvious ways, which is exactly what you want here. On rare occasions I'll offer some direct tuition, but usually I just point people to [http://learnpythonthehardway.org/book/](http://learnpythonthehardway.org/book/) because it really works.

For the most part, it's not all that important where you start - I recommend against people starting out with java or C++, but it's not a tragedy if they do. However, PHP is an exception. I have seen too many new programmers latch on to PHP because "it's easy", and it breaks them. They never manage to learn any other language because "it's too hard to get going, and I can do everything in PHP anyway"; they leave a trail of half-finished projects that hit the 20,000-line wall and couldn't figure out how to get past it. Whenever you try to introduce them to something else they just say "but it's hard, and I don't see why it's useful". You can't teach them how to do software engineering because PHP is too broken and the internet is full of terrible advice about writing PHP code.

Learning PHP first makes it harder to learn your second language, not easier, because of all the bad things you have to unlearn.

Yes, Facebook has a lot of PHP code. That's because they've made a business decision that rewriting it all would cost more than developing highly customised tools to make PHP somewhat manageable and then burning engineering costs on managing it. That cost analysis is very unlikely to apply to anybody else.

</comment></comment><comment><USER16> Praise three times as much as you criticize. This is something I learnt when I was a teacher. Being a teacher often involves telling people they are wrong, and if you don't praise praise praise, they _will_ lose motivation.

Your buddy/child/partner is trying out some basic web design? "Hey cool color choice! Show me how you change it from brilliant pink to light grey." Adjust as appropriate.

The value of praise is undervalued in the hacker community. If you are really searching for something to praise, praise effort and getting this far.

<comment><USER17> I think the reason the hacker community doesn't bother with it is based on a culture of efficiency. It isn't entirely out of order to assume that folks have some other support system in their lives (family, social groups, etc) to offer the praise they need to motivate them (or maybe even intrinsic motivation is there in some).

</comment></comment><comment><USER18> Yep. The first language I worked with for a good amount of time was VBA - making Access forms more complex. Despite the language itself being terrible, it was great - I could start with something I understood (forms) and slowly build on that, making useful things all along the way. Then came VB.NET, then C#, then, well, about everything else.

Where you start doesn't really matter at all.

</comment><comment><USER19> That's the thing about teaching, it depends on the student.

For example, I wish someone told me to stay away from php when I began learning. My motivation was to become as effective as quickly as possible not just a casual learner or hobbyist. I wanted to hear the harsh criticisms and realities as quickly as possible because that's where the growth is. Of course feedback should not "denigrate" the beginner as the title says but giving the complicated, multifaceted truth early on may be desired rather than compartmentalizing and simplifying the reality.

See work on "expertise" by Ericsson and Hoffman (and others) for support of my argument.

</comment><comment><USER20> I really like this comment from an AskHN from jlcfly two weeks ago. I hope most of us embrace this philosophy as the reality is programming as an art is much more important than programming as a rote skill.

"Teach them to be better than you. That may seem counterproductive. I have a type A personality, and I have decent coding skills. I've been in your situation a number of times. I also know there's these mythical expert developers out there that I can't seem to find (or afford). So, what to do? A few years ago I realized that if I continue down this path, I'll end up with some serious health issues due to the stresses that come along with having a reputation for being a really good developer.

So, I decided that instead of searching for developers better than me, I would teach developers I work with how to BE better. It's taken a lot of patience. And it's taken me quite a bit to LET GO of my way of doing things. I had to take my ego out of the picture. (VERY hard to do.)

Nowadays, I realize that developers don't have to BE better than me. I simply have to ALLOW them to do what they do without being so obsessive about it. Turns out, even junior developers really CAN do good work. They just need a little guidance that only comes with experience, and then they need me to get out of their way."

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

</comment><comment><USER21> I can't tell you how many times I've heard this, its demoralizing to be basically treated like I'm using tinker toys, moreover I'll be trying to build something in the shell, and told you should do that in perl/python/whatever, because its better/faster/easier - then when I ask for help, as I dont know those languages, I get told to go buy a book.

</comment><comment><USER22> I find, that when talking to beginners, it's more common for the beginner to already be heading off in a direction that will ultimately frustrate their attempts to learn. Usually, this is due to their desire to skip right over the whole beginners phase of learning to program. It's as if they say, well I going to skip Driver's Ed and start with driving a Formula 1 car because it's a faster car.

One friend said to me "Well, Python feels like such a grab bag of features, it's too perplexing. I'm just going to start with C++ instead."

A Ph.D. student in Mechanical engineering was going to start developing a simulation for his dissertation and was going to use C++. He had very little programming background.

A friends bright 13 year old wanted to learn programming and told me that he wanted to learn C++ because it was fast.

<comment><USER23> Regarding the 13 year old when I was young I learned BBC Basic.

If I had to try and learn Assembler or C++ at 8 I would have been put off programming for a few decades!

I could learn basic by copying and modifying listings in magazines.

<comment><USER24> To add a contrasting opinion I started off with C++ because I heard that's what games were written in and I wanted to learn games. I picked up C++ Primer in Junior year of high school, got some text printing to command line and was fucking ecstatic. I eventually got stuck and had no one to really give me guidance, but it did make me decide to pursue a degree in Computer Science instead of English. Despite loving to write at the time, the brief exposure to programming made to so damn curious that I felt completed to break out of my comfort for writing and try something different.

</comment></comment></comment><comment><USER25> My supervisor at my last job, an old-school Unix guru, taught me one...well, actually a bunch of very important things, but one of the most important was: There is no shame in showing ignorance by asking questions. If someone is trying to teach you something and you don't understand, tell them so. Don't just nod quietly along. You'll never learn that way, and a good teacher will respect your efforts to improve yourself.

The equally important corollary, which I didn't realize I'd learned until I started my _current_ job, is: If someone _does_ try to shame you for asking questions, it's they who should be ashamed, not you. That has helped me immensely in the past few weeks. The current contract runs 'til the New Year, and I don't think I will be coming back.

<comment><USER26> This chimes fairly well with my professional motto.

We learn from our mistakes. Mostly we learn how to make _different_ kinds of mistakes. When the mistakes get truly esoteric, we are finally becoming good.

</comment></comment><comment><USER27> Agreed. you have to start somewhere. I started with GW Basic. I didn't have access to a better compiler at the time, but I was able to do stuff. Later, a friend gave me a Pascal compiler, then I learnt C/C++.

It's a lot easier nowaday, with internet and interpreted language in your browser.

<comment><USER28> Oh man, this is the first time I've ever heard someone else reference GW basic.

When I was 10 or so I convinced my parents to let me put the ibm 286, which previously was sitting in their closet, in my bedroom. (At the time we had a newer computer with windows 98, this would have been just before XP would be released iirc)

GW basic on that 286 was where I taught myself the basics of programming. That takes me back.

<comment><USER27> Nice :)

I had an even older computer, a Tandy 1000. I had to boot MS Dos 6.2 with a 5"1/4 floppy disk. GW Basic was kinda the only thing I could do. Later, my father got me QBasic, which was nice since I didn't have to input each line numbers :p

</comment></comment></comment><comment><USER29> Reminds me of Cunningham's Law: "The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer."

</comment><comment><USER30> Funny, the other day I was talking to someone about a project I was doing for my Intro to Software Engineering class. We had to make a web application with any tools we want, with the suggestion that we used Django or Rails. I chose Rails. Anyways, when I mentioned "Rails" this guy gave me this incredulous look and said "Rails? Use PHP."

I consider myself at an intermediate level (I guess by my own standards). I've dabbled in PHP. But honestly, I like Rails. Obviously the appeal to it is ease of use, and I'd definitely consider using it in my future projects. Though he never explained why PHP is objectively better. I just thought of it as just another tool to use, like Rails.

<comment><USER31> If you like rails, I'd stick with it. That means that you're already familiar with the MVC model, and once you grasp that, Ruby and the Rails helpers are easier to implement than PHP.

~ I've worked in Symfony 1.x, Laravel, and Ruby on Rails.

</comment></comment><comment><USER32> I'm a PHP developer (reasonably experienced, in my opinion anyway). The only practical downside of PHP is the standard library is a bit iffy, because breaking BC that much is a big deal. Many experienced developers prefer PHP, it's not just a language for newbie web developers to get their feet wet in.

I think the reason you see a lot of terrible PHP code is because it has low barriers to entry, a lot of inexperienced people who really aren't programmers can jump in and build crap really easily. But there is _a lot_ of good PHP code out there too.

</comment><comment><USER33> PHP is fine but it has problems:

[http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad- design/](http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/)

I'd say the same thing about C++. And I think newbies should be warned about both of these languages.

That said I agree that the language doesn't really matter. I don't think frameworks or libraries should matter for novices either. My only advice is to do the problems at: [http://projecteuler.net/](http://projecteuler.net/)

</comment><comment><USER34> Glad to see this being said.

This last year I got fed up with mindlessly completing homework and studying for Math and CS in school and started doing what I really want to do in my spare time; building. I decided web development seemed cool and I used to enjoy making silly little web pages a couple decades ago. It seemed natural to me to familiarize myself with html first, so I wrote a page with just html. The next thing for my spare time was a little site using just html and css so I practice and familiarize myself with some css. Then I started playing with js.

I did encounter the types of situations the article is describing constantly, but I was sure of what I was doing and what I wanted to do so I did not let them affect me. I was going to go whatever slow, awkward route toward web development I wanted to take. I knew I could pick up a framework to code an app, but for my own sake, I wanted to write the whole thing in php, including coding basic CRUD functions for my mysql server and basically reinventing MVC for my own project.

Nowadays I am playing with backbone consuming api calls from my restful django server, and it is wonderful and very exciting, but I had to get there on my own terms, and I am glad I did.

My advice to noobs like me is to play with what you understand, and enjoy the journey, without worry about 'doing things right'.

<comment><USER35> It is far easier for the right way to "stick" if you can reference something you did the wrong way beforehand while learning it. Learning Haskell recently has helped me really understand this; finding the right way is difficult and often not entirely intuitive at first, but once you try it out and work through things the hard way, you gain the ability to appreciate what you were missing.

</comment></comment><comment><USER36> "Experience is the best master, but it always comes a little too late." \- Cervantes

After loads of time hearing about proper CSS, RoR, etc. I ended up putting up my first webpage by copy-pasting my structure from one page to the next. I used grep, perl, sed, awk to change stuff across all my pages. It was pretty obvious that it was inefficient to me, but I began to have a real appreciation for the tools I eventually learned. I ended up learning why I needed to learn RoR, Jekyll and what I for webpages now: Middleman.

Today, I actually end up use PHP on a day to day basis when before I used RoR, Node, C#. I end up being just as effective in it, if not more. I actually intend to write about functional PHP someday. PHP is also awesome because it ends up being a history lesson: part of the reason RoR is so good is because it had the time to learn from PHP's mistakes (mistakes which happened because it was busy building the internet). My first app, btw, was constructed in Excel.

We need to get dirty with our tools to learn how to use them or why they are important. Let people make mistakes. Personally, I like to call it 'learn-by- annealing'.

<comment><USER37> The Clark Terry quote "Imitate, assimilate, innovate" might have been intended for jazz musicians, but it's appropriate for any creative endeavour including programming. Nobody gets to 'innovate' without spending a hell of a lot of time in the other two stages first.

</comment></comment><comment><USER38> I've done this inadvertently. Ironically, my intent was precisely to _avoid_ discouraging a beginner, but this article makes me realise I was, at best, sending mixed messages.

I was helping somebody who was taking a Java course without a prior programming background. Her course required her to submit assignments as Java applets, and she was running into a lot of trouble getting applets to even run on her laptop, due to Java version conflicts and browsers being much stricter about applet security than they used to be.

I hated to see her getting discouraged by this pure incidental complexity - this wasn't even a problem with the code! So I said something like "I'm not sure why they're even teaching you applets, nobody uses them any more".

Of course what I meant was "they're making it harder than it needs to be and programming is actually easier and more fun than this". But she may have heard "you're spending all this effort learning something that's already out of date" :(

</comment><comment><USER39> ... or you can skip talking about your favorite framework and point to theory like logic, computational complexity, data structures, lambda calculus, relational algebra, and other stuff that actually matters. He already took the first step, which is playing around with some programming.

I have a friend and previous co-worker who hoped that by learning Python he could work on a legacy system I built while we worked together. He's able to make some tweaks and get a general idea of it, but translating intention to algorithm is still mostly mystic to him. He was shocked after I showed how to simplify some 30 lines of if clauses with a dict, he learned the syntax for a dict but didn't really understood how it works, or to what it's good for. This kind of illumination, I believe, only comes after learning some theory, not syntax, or your favorite framework.

<comment><USER40> Coming from a background of not much computer science and having dropped out of college, I found learning theory to be too lengthy and dull for my novice mindset at the time I started programming (in, quite fittingly, HTML+CSS+JS+PHP on LAMP). I was in the same shoes as your friend, as whenever I would see an open-source project or library, I would be quick to modify it to suit my needs, but would end up with massive if clauses and without much modularization. Of course, after about a year or so of doing this same bad practice, I came to ask "Truly there must be a better way than this, right?" It was at that point, after already becoming completely addicted to programming (yes, in the ugly, somehow-working kind of way) that I gained enough patience and interest to learn more theoretical concepts about computer science and its applications to programming (lambda calculus and functional programming in particular). I agree with you, being that this ultimately ended up helping me greatly, but I disagree that CS theory should be the very first thing a novice programmer approaches.

</comment></comment><comment><USER41> Most of the people I know who are starting out are starting on TI-BASIC. I have to say, Beginner is already ahead by starting out with "some PHP and HTML using TextMate on my Mac." It's at least better than starting out with some Visual Basic using Notepad on my Windows.

</comment><comment><USER42> I still prefer visual basic 6 as a tool for learning programming. It is simply easier to Get Stuff Done(TM) on that language than any other. You don't have to worry about things like OOB etc. when you are just learning to program. I always fail to understand why people would gladly accept non-oob languages such as Go but yet condemn vb6 for being a terrible language because it is event-driven, too simple, no OOB etc. GUI creation is so easy, you don't have to worry about gtk bindings etc. No need to bother to print out a single line as a first program when you can skip directly to building a calculator app with a few seconds of drag and dropping. Can't afford VS? Just fire up a Microsoft office's macro editor and you are good to go.

</comment><comment><USER43> I met up with somebody from the startup world last year for a coffee to chat about things as I wanted to get some advice from somebody with a lot of experience as a developer. It was a total waste of time though pretty much because of what the author wrote about.

He was a nice enough guy but he knew I was new to development yet when I didn't know about something he made me feel like I was an idiot and when I asked questions about good places to start he shot down everything I suggested as if only a moron would start there. It was very demoralising and it knocked me back for a few months as it really made me think "I am not good enough to do this". Very annoying how some people in the industry act like they are some kind of demigod to programming.

<comment><USER44> That's very unfortunate. I hope you can find someone more welcoming (and hopefully who's also in a mentoring mood) to ask whatever you're curious about. Off the top of my head I can't think of any conline communities which would be particularly welcoming (though the general community around Ruby is quite fond of saying how nice they are); do you have any friends or relatives who write any code?

<comment><USER43> Unfortunately I do not have any close friends or family who know much about computers at all however there are a lot of good people over on some of the subreddits that are always happy to help out. The C and C++ subreddits are particularly good.

</comment></comment></comment><comment><USER45> The re-surfacing behaviour of making others feel excluded for not sharing a belief can't help but make me wonder if it's all that different from religious zealotry in one's interpretations, preferences and opinions of how to solve a problem being superior to others.

Users are usually far removed from the end solution enough that the choice in framework or language rarely impacts their ability to use a web browser or mobile interface without having to imagine what's under the hood.

It's not until we remember what we feel is current and appropriate today will be just as outdated in a short time. Our work is to solve problems, not to bash others into doing it one particular way.

</comment><comment><USER46> Started off with AutoIt, then VB6, then PHP. Not the smartest route but today I'm using Ruby, C#, SQL, F# and JS/frontend. All through the first few languages I heard people bashing each and every one for various reasons.. However I built a range of tools at a young age including a file encrypter, a website complete with authentication and user management, an online shop and a game "bot".

If I hadn't mucked around the way I did, I don't think I'd have the breadth of knowledge on networking, protocols, assembly, file formats and authentication I do today. I probably wouldn't have gotten into security either.

</comment><comment><USER47> Even this advice is aside from the point and a bad way to influence a beginner.

If you're talking to someone 'learning programming' you should talk to them and figure out a project that they can work on that would benefit them, and is within their grasp.

Yes, the tools are a side concern. But what is going to help them is automating a task they're interested in, or hooking some data sources together, or creating a programmatic animation.

To teach someone english word by word and rule by rule fails. You want them to read something interesting, to watch the subtitles on a movie. It's the same with programming.

</comment><comment><USER48> I agree. I am by no means a seasoned programmer, but I do remember first starting out as a novice. It does get discouraging as a noobie when you hear people in forums throwing around the latest tech jargon and some esoteric C library just to show-off how much they know more than you. The more you program (the older you get), however, you begin to learn it is all just posturing. It's the occasional bad apples that perpetuate that "winner-loser" MIT A.I. lab stereotype.

Trolls do serve their purpose though. It teaches you how to preserver despite the negativity.

<comment><USER49> > you begin to learn it is all just posturing

Yeah, I think that's probably the most common motivation behind the interaction spotlighted in the article.

> Here's a sample interaction between an experienced programmer and a beginner > who is just learning programming

I think the interaction happens between programmers of all levels of experience, but it might be most harmful when it's an experienced programmer talking to a beginner.

> It does get discouraging as a noobie when you hear people in forums throwing > around the latest tech jargon and some esoteric C library just to show-off > how much they know more than you.

If that's really their intent and if you (the noobie) are the one they're talking to, then sure. If I'm a noob walking deep into a HN thread on an esoteric C library, I'm probably not going to be discouraged that people are using jargon, unless I've identified myself as a beginner and the comments are replies to mine.

</comment></comment><comment><USER50> That's exactly what I heard from my first programming professor in college, around 2001.

I told him I managed to get an internship at the university 6 months before becoming an actual student and I was working with PHP. He said straight up to me and everyone in the class that PHP was crap.

I didn't listen to him, since my bills were all getting paid regardless of his opinion. I still got an A+ in his class, which was all on SmallTalk. This was just the beginning of the number of conflicts I had between "real life" and academic life.

</comment><comment><USER51> Honestly, I don't think any language is detrimental to a persons development as a programmer. Even straight Python and C have their quirks. Heck I'd argue that PHP is a great base to start learning web development. Ruby, Python, and .NET all have great frameworks that give you MVC, an ORM, and even templating for free now days, but I feel like understanding the benefit and appreciating those sorts of things comes with the experience of writing an application at a level a bit lower than a full framework.

</comment><comment><USER52> I have a friend who is using Java for some chemistry related programming that could be modeled particularly nicely with lazy evaluation and ADT's.

I told him to keep sticking with Java and get something working, and then I might be able to show him an easier way of doing it in Haskell.

He's actually a Math major as well, and seemed to understand Functors and (at least) the Maybe monad very quickly.

It'll be interesting to see what happens after he finishes and we attempt to replicate what he did in Haskell.

<comment><USER53> Second design/attempt is always the better version. Once he has struggled with the first version, with whatever language, the second version will be easier, with whatever other language.

<comment><USER52> Good point. Not sure how to avoid bias or if it's even possible in this case. All I can do is let him know that the second design/attempt would have been easier in just about any language.

<comment><USER44> > "All I can do is let him know that the second design/attempt would have been > easier in just about any language."

And then shrug and say it's okay, because this is how it works with everyone!

Personally I find the second attempt more fun too, since I've already learned the painful lessons...

</comment></comment></comment></comment><comment><USER54> I think that one of the other reasons that people are discouraged from continuing their programming is the information overload that you go through when learning something new (Especially something so large and complicated). I know that many of my friends have shied away because they felt like they where good enough enough to understand the information they where finding online. Hearing discouraging comments from others just helps reinforce that sense of inadequacy.

</comment><comment><USER55> Sadly this sounds exactly like many of the PC based programmers across the hall. What is it with them? Its like water cooler hell with some of them, and share code - hell they all can implement X better than someone else.

Is there just so much language bravado amongst this class of programmers or did it bleed through from school? I have listened in arguments between Java programmers, C#, and the like, and never understood the animosity some have.

</comment><comment><USER56> Personally, I believe the hardest language for a beginner to learn is their first language. Two things people are learning on that first language; programming concepts and syntax. The concepts like variables and looping are (mostly) universal and as long as someone is learning the concepts well enough I think they're doing well enough no matter which language they start off with.

</comment><comment><USER57> I started off on the Amstrad CPC-464, which meant I had access to this fine publication...

[https://archive.org/stream/amstrad- action-016/Amstrad_Action...](https://archive.org/stream/amstrad- action-016/Amstrad_Action_016#page/n27/mode/2up)

I spent many hours typing in code, only to spend a few more trying to work out where the errors were coming from.

</comment><comment><USER58> Data structures and algorithms are still the fundamental part. The rest is just API and a way of communicating those ideas. Rarely the problem is learning the language/editor/environment but learning how to think. The discomfort with language/editor/environment... is just your brain learning something new.

I guess it comes back to not blaming the tools.

</comment><comment><USER59> I've been 'learning' perl for about 6 years now. I get crapped on for that all the time. I also go to church. And I get crapped on for that too. Sometimes it seems like everything of mine is just getting crapped on. But I do these thinks because I like them and they make me happy.

So I don't really care what the others think :)

</comment><comment><USER60> Facebook.

Initially developed in: PHP

Why: It was what Zuckerberg knew!

Todays Value: $200+ Billion

<comment><USER7> This (tired) argument successfully says you can build something with anything. But that's not really the topic at hand.

<comment><USER61> I think it's a great point in this context.

Freaking out on beginners because they're using the "wrong" language is often nominally based upon the notion that what tools you use matter a lot to the results you get. But there are a zillion examples of successful products made with terrible tools. And plenty of examples of very well-engineered failures.

<comment><USER7> If you believe the end goal is being a billionaire CEO, sure.

If you, however, believe the end goal is being a well-rounded programmer, it's irrelevant.

In the context of "I'm learning to program," I think one should look more to objective B than objective A.

<comment><USER61> Saying the end goal of being a programmer is being a programmer is ridiculous. The end goal of being a programmer is to make useful things. And you can do that in PHP. Zuckerberg's a billionaire only because he made something that a lot of people get value out of every single day.

Further, if being a well-rounded programmer _were_ the goal, then people starting with whatever is fine, because becoming well-rounded means they'll get around to better languages by and by. An I'd add that any programmer who wants to consider themself well-rounded should definitely have used PHP or some equivalently beginner-focused language.

<comment><USER7> > Saying the end goal of being a programmer is being a programmer is > ridiculous.

Well I didn't say that. Note the not-so-subtle distinction.

<comment><USER61> It's a distinction without a difference. The goal of being a programmer is also not being a well-rounded programmer. It's still tautological.

<comment><USER7> The "goal" of learning to program can be a myriad things, from simple hobby to being a CEO. If one presumes that the goal in some way hinges on being "good" at programming, then learning good habits is certainly a step on any of the possible paths.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER62> Completely agreed. I'm very vocal about PHP's flaws, but I try to keep my hate away from beginners. When you're starting, the important part is getting shit done. The language doesn't matter.

(However, as soon as the chance presents itself, I'd try to get said beginner away from PHP. That shit melts your brain.)

<comment><USER63> One problem I can see with that is, it is very hard for a beginner to see the real flaws of PHP. So after he/she starts to get shit done in PHP, they will have their head so far up their asses that it will take a large amount of _your time and effort_ to convince them to move away to a better language.

For eg, take the case of PHP arrays. If you are a beginner, you will probably have fallen in love with this thing. And when you show them a better language, and they finds out that it doesn't have arrays like PHP, they might feel very unsure about your claims that what ever you are introducing is the better language. If they have found /r/php, then it becomes almost impossible to convince them. You will have to counter the vague bullshit fed by 50 guys from /r/php to make any progress with the matter.

So while the author point about getting your feet wet is important, it is also important that you are not doing that be entering into a swamp that can suck you all the way down.

</comment></comment><comment><USER64> It's 2014. Don't be a dick about it obviously but it would be cruel to let a beginner learn PHP.

</comment><comment><USER65> If they're making something public-facing, and the language and/or framework they're using is known to be more difficult to use in a secure manner, then it's probably fair to warn a newcomer away. Otherwise, completely agreed.

</comment><comment><USER66> The problem with the defense of PHP as a harmless beginner's tool is that often once people become familiar with it _they go on using it_! And so we find ourselves grinding away countless hours dealing with large codebases in a language pretty much everybody admits is fundamentally badly designed. I suppose I don't mind that much because I would never take a job working in PHP myself but we certainly don't tolerate this kind of professional laziness in medicine or science or proper engineering. Maybe that's why people don't accord programmers the same respect?

<comment><USER67> "Real programmers don't use PHP" is reminiscent of "Real programmers don't use Pascal". Or [http://xkcd.com/378/](http://xkcd.com/378/)

<comment><USER66> Listening to PHP apologists defend PHP is like listening to real estate developers boast about all the houses they've built and sold despite using cut rate materials and labor. Bully for you if you're getting away with it but I certainly wouldn't boast about it.

<comment><USER67> Remind me again which percentage of websites runs PHP. (Hint: it's the majority.)

But beyond popularity, there have been a lot of nice improvements over the past few versions (PHP 5.6 is definitely better than PHP 5.2) with even more to come in PHP 7.

To boot:

        * register_globals is finally dead
        * magic_quotes, as well
        * PDO does a lot of the work cleaning up SQLi (I wrote
          a class that does even more)
        * hash_equals() makes securing OAuth implementations
          against HMAC comparison timing attacks a trivial
          undertaking
        * session_id() uses /dev/urandom
        * opcache (5.5+) helps to make PHP app more performant
        * [ $array, $syntax, $that, $doesnt, $suck ]
        * You can now use \Proper\Namespaces; and autoload class
          dependencies!

Not to mention some of the community innovations:

        * Composer, while still trapped in curl | php hell (I'm
          working to fix this), makes dependency management
          simple so you can get on with your day.
        * Twig brings Django-esque templates to PHP-land, which
          is _awesome_ if you need to work with a designer who
          is only used to working with Django and its derivatives.
        * HTMLPurifier is probably the sexiest thing the PHP
          community offers that I have not seen produced in
          another language (the HTMLPurifier port to Obj-C
          notwithstanding)

If one were to judge PHP 5.6 by a PHP 4.3 understanding, they would almost certainly be wrong.

PHP 7 allows us the opportunity to break BC. If you dislike something about PHP 5.6, let it be known so it can be fixed in 7.

        http://news.php.net/php.internals

        email@example.com

Also, the irony of a thread whose title is to not denigrate what beginners are learning has turned into "let's bash PHP". Y'know, because no developers are currently learning PHP and might one day read this discussion.

</comment></comment></comment></comment><comment><USER68> True words...though I also think that not giving a shit to demoralizers is also something that every programmer should learn on the way.

<comment><USER48> Ahmen. Toughens you up.

</comment></comment><comment><USER69> At least the professional programmer recommended RoR instead of Haskell or F#!

</comment><comment><USER70> Amen brother!

</comment><comment><USER71> now you've gotten our attention. :) feels like it sucks!

</comment><comment><USER72> I used to live in a college town and I heard this a lot. Especially from the RoR fanboys. The RoR fad is done, so I don't hear it as much anymore.

It is quite ironic, seeing as I didn't even consider the people saying it as advanced developers. They had enough knowledge to mash a few frameworks together.

</comment><comment><USER73> We changed the title to a sentence from the article that expresses its substance more informatively.

</comment><comment><USER74> Oh you're learning to be a chef? That's awesome! What are you cooking?

Rat poison a la bleach? That's awesome! Let me know if I can help you with that at all!

If only there was a middle way between denigrating and patronising n00bs...

<comment><USER75> The difference between a good cook and a crappy cook is that the good cook powered through all the crappy not-quite-there meals and learned everything they could about what makes a meal good by tasting all of their own cooking, and striving for improvement. Learning how to cook to taste is about persistent trial and error, just like learning how to develop software is about persistent trial and error.

There's no right or wrong way to cook. It's all about what you personally have a taste for. For example, Natto is something I personally find distasteful. However, people have put effort into learning how to make Natto and they personally find it delicious. It meets their needs. Who am I to devalue their experiences?

By the same token, PHP meets needs and there are plenty of people who develop effective software with it. If it's working, and you don't find its warts to outweigh the value you get, then you should continue using it.

<comment><USER76> >There's no right or wrong way to cook. It's all about what you personally have a taste for.

Only if you're cooking for yourself.

Additionally, I've developed a near vomitous reflex whenever I read "there is no right or wrong way to..." If there is no wrong way to cook, there is no reason to have cooking schools or to pay people to do it.

Of course there is a wrong way to cook. Pretending that you can't fail at something is pretty much guaranteed to ensure failure.

</comment></comment></comment><comment><USER77> I've heard this anecdote told for years, over a decade, but I've never heard it occur in real life. Has anybody, really?

<comment><USER67> Yep. In various iterations.

[https://twitter.com/MalwareJake/status/506488937096183808](https://twitter.com/MalwareJake/status/506488937096183808)

</comment></comment><comment><USER78> Everything you say is good but the PHP part. It's just like telling your own kid to not touch poop, you have to say it.

<comment><USER79> I'd be very surprised if you really knew much about PHP.

<comment><USER67> [https://github.com/coinkite/coinkite- php/blob/master/sign.ph...](https://github.com/coinkite/coinkite- php/blob/master/sign.php)

You can be the judge of their PHP skillz :P

<comment><USER78> We don't do PHP. If you are so great, why don't you do a Pull Request.

<comment><USER67> > We don't do PHP. If you are so great, why don't you do a Pull Request.

Your post seems rather hostile and I don't think it's warranted.

First, you call PHP poop.

Then someone expresses doubt that you use PHP at all.

I then linked this person to a repository in your github that is written in PHP.

Thus, my actions were disproving the implied statement in "I'd be very surprised if you really knew much about PHP."

At no point did I say I am "so great".

Calm your jimmies. They are rustled thoroughly and for no good reason.

</comment></comment></comment></comment></comment><comment><USER80> Don't want to sound like the PC police but personally I would have chosen another verb for the title. The origins of the word "denigrate" are not particularly great:

1520s, from Latin denigratus, past participle of denigrare "to blacken, defame," from de- "completely" (see de-) + nigr-, stem of niger "black" (see Negro).

(source: [http://www.etymonline.com/index.php?allowed_in_frame=0&searc...](http://www.etymonline.com/index.php?allowed_in_frame=0&search=denigrate))

<comment><USER81> It's not an explicitly racist term. Just like "blacklist" or the "pot calling the kettle black". Black has a negative connotation that is separate from race.

[http://english.stackexchange.com/questions/209021/is- denigra...](http://english.stackexchange.com/questions/209021/is-denigrate-a- racist-word)</comment></comment>


Awesome is soo lame - <AUTHOR> http://www.anton-pirker.at/awesome-is-soo-lame/

<comment><USER2> Google has a sweet tool that shows mentions of a word overtime. Look at awesome:[https://books.google.com/ngrams/graph?year_start=1800&year_e...](https://books.google.com/ngrams/graph?year_start=1800&year_end=2008&corpus=15&smoothing=7&case_insensitive=on&content=awesome&direct_url=t4%3B%2Cawesome%3B%2Cc0%3B%2Cs0%3B%3Bawesome%3B%2Cc0%3B%3BAwesome%3B%2Cc0)

<comment><AUTHOR> Very cool! Thank's! So the eighties where not that awesome, but since about 1993 the world is getting more and more awesome :)

</comment></comment><comment><USER3> Is this really an important issue?

<comment><AUTHOR> Of course ;) I know there are way more important issues. But I thought I should point it out, maybe others think like me. And maybe one person uses the list to write better descriptions.

</comment></comment><comment><USER4> i agree the word is over-used.

at the same time, things _are_ getting more awesome lately, at least in my humble opinion.

i had been waiting for a machine similar to an ipad for _decades_. and i mean that quite literally. (and i know what "literally" means.)

and now something relatively close (still not quite good enough, but happily close) is _finally_ here.

perhaps you youngsters can take it for granted. for me, it's awesome.

-bowerbird

<comment><AUTHOR> You are right. The world is getting more awesome. And the language changes and gets simpler.

Maybe that's just the normal run of things and should stop complaining about it :)</comment></comment>


Show HN: Simulacra.js – one-way data binding for web applications - <AUTHOR> https://0x8890.github.io/simulacra/ <comment><USER2> This is fine for scalar binding of simple values - a property mapping to a value - but what about vector binding, where you have a list of items, and need the UI to reflect insertions, deletions and sorts?

And what about enabled state, display state, or more complicated binding that changes the structure of a DOM node - e.g. converting the icon on a button to fa-cirle-o-notch while an asynchronous operation is occurring?

It might be fine for extremely simple needs, but if you're going with a UI which dynamically reflects your model and application state, you should IMO go all the way. When done right (which usually means as functional, in the programming sense, as possible), a binding setup greatly reduces the amount of thinking you need to do to keep the UI in sync.

(I'm probably missing something and the library is more capable than it looks; on a closer examination, I do see it doing some kind of vector binding, but I don't think it can do e.g. heterogeneous elements, where the HTML per element differs depending on the model.)

<comment><AUTHOR> author here - getting iteration and nesting to work was the hardest part, and I don't think the basic example on the homepage illustrates this too well.

the way it works is that _every value_ gets cast into an array for rendering purposes if it isn't already. so in case of an array of objects, you don't need to explicitly define that you expect an array, it'll just render `n` objects with nested bindings.

to give an example, on the homepage there's an array that is rendered, `["Tall", "Grande", "Venti"]`. if a new array is set, for example, `["Tall", "Grande"]` (without "Venti"), it will re-render based on if the values at the indices changed, so in this case it would just remove the dom node for "Venti".

another cool thing is that with the mount function, you can either return nothing so that the node that was specified will be appended, or return a completely different node based on the value, which enables heterogeneous elements in a list. the mount function also gives you an opportunity to mutate a node in other ways than just setting the text/value/checked/whatever, such as setting a classname i.e. `node.className = "fa fa-hourglass"`. then there's the unmount function but 99% of the time won't be needed because dom nodes that aren't in the live tree and don't have a reference will just get GC'd.

it should be entirely possible to build a web app with Simulacra.js using a single bound object, a single template, and describing all possible bindings in one go. it's up to the developer to add whatever convoluted architectures are hip at the moment (stores, reducers, actions, what have you).

</comment></comment><comment><USER3> These benchmarks are tough to reproduce (for all libs). Mithril's instructions say, "To run an execution time test on this page, run the profiler from your browser's developer tools and measure the running time of a page refresh. (Lower is better)"

There are a lot of variables that affect a full page refresh...caching, etc. I could not get those ms numbers in any scenario, not sure what I should be looking at.

Would be more useful to stress-test the lib by implementing dbmonster [1] and speedtest* [2]. These perf tests have the benefit of being good visual comparisons and also stressing the browser's GC to evaluate how efficient a lib is at minimizing overall mem usage and reducing jank.

I've been working on a DOM view layer lib [3] that does exceptionally well in both of those. (more demos and docs coming soon).

EDIT: added domvm dbmonster demo [4]

*speedtest is ultra-slow in FF for all libs, the winner is surprisingly innerHTML. still need to narrow down the cause to open an FF bug.

[1] [http://joelrich.github.io/fastest- dbmonster/](http://joelrich.github.io/fastest-dbmonster/)

[2] [http://rawgit.com/crysalead-js/dom- layer/master/examples/spe...](http://rawgit.com/crysalead-js/dom- layer/master/examples/speedtest/speedtest.html)

[3] [https://github.com/leeoniya/domvm](https://github.com/leeoniya/domvm)

[4] [http://leeoniya.github.io/domvm/test/bench/dbmonster/](http://leeoniya.github.io/domvm/test/bench/dbmonster/)

<comment><AUTHOR> I agree that it would be more informative to stress-test using a more real- world use case, I was just in a hurry and used the render benchmark from Mithril.js.

however I think that any benchmark may be skewed to favor a particular implementation. for example, Simulacra.js doesn't batch updates and render asynchronously, it's purely synchronous, so one could set up an artificial benchmark to thrash the DOM by setting different values over and over again in the same tick.

also I haven't yet committed the benchmark I used in git, will do later so that people can reproduce it.

<comment><USER3> this is correct, and Mithril's docs also point this out. domvm uses rAF internally to debounce changes but it can be toggled off (and IS toggled off [1]) for perf tests to make it 100% synchronous as well (via domvm.useRaf = false).

would be very interested to see Simulacra's perf in those, when ready. thanks!

[1] [https://github.com/leeoniya/domvm/blob/master/test/bench/dbm...](https://github.com/leeoniya/domvm/blob/master/test/bench/dbmonster/index.html#L21)

<comment><AUTHOR> I added a benchmark folder: [https://github.com/0x8890/simulacra/tree/master/benchmark](https://github.com/0x8890/simulacra/tree/master/benchmark)

cheers!

</comment></comment></comment></comment><comment><USER4> Interesting project and it's nice to see work done on something compact and minimalist.

But I don't like that CSS classes are used to bind data. I know other libraries do this too but I don't think it's a good idea.

CSS classes exist for styling purposes. It's hard enough as it is to keep track of classes, where they're used, how they're used etc... on anything but the most trivial project. Using CSS classes for both style and data binding would result in a maintenance nightmare, IMO.

Why not use something like: <div class="some-style" data-binding="product- name">

It's perfectly legit HTML and maintains separation of concerns.

<comment><USER5> I've gone back and forth on this with a previous coworker before.

My opinion on it now is: there's two common general ways to use css. One way is as a style class, which is something you'd apply in multiple places around your project (like `.error` setting font colors to red, for example). The other way is to markup specific content so that you can apply specific styles to it - for instance, pixel pushing a header to fit exactly where you think it should in this one instance (perhaps to align an upvote button with a username, or something).

The latter way really seems to just markup dom nodes purely for the sake of identifying them within their structure (I might use BEM or rscss especially for these).

The way I structure my css in projects follows from this - I extract common styles and pepper them throughout my app where needed (but they are never referenced in any js/$ selectors). These are intended to cascade.

And then I will scope my more specific css under a selector (using sass, or cssnext or whatever) to avoid polluting the global scope:

      .some-view {
        .header { ... }
        .note { ... }
        .icon { ... }
     }

In the case of these nested selectors, they are more identifying tags for the content of the node, than they are declarations of a specific style. These are not intended to cascade.

So even though css classes "exist for styling purposes" I think they have two paradigms for use. One for marking up content for a general application of a style and another for marking a node to be given special treatment.

And taking that approach, I argue it's fair to use the same selectors for js as well as css.

Besides, in practice, you're going to realize you're just adding the same class name appended with `js-` everywhere `<div class='error error-box js- error-box'></div>` when you're using that `error-box` really only to mark the node for use.

Though I'd be curious to hear more about why you think this:

>Using CSS classes for both style and data binding would result in a maintenance nightmare, IMO.

<comment><USER6> If you always use something like 'data-bind' for binding and keep classes solely for CSS it's easier to maintain simply because you know 'what classes you can delete' without having to look in two places (CSS and JS) to see what will be affected as a result.

</comment></comment></comment><comment><USER7> I've been looking for something like this. This cleanly solves the basic (majority) case and doesn't try to boil the ocean. It looks like it would be easy to build a higher-level API with more features on top of this, which is great. Nice work. Also kudos for documenting the shims in lieu of bundling them.

</comment><comment><USER8> I've been doing database-backed web apps using MVC frameworks for so many years, that it's hard for me to wrap my head around the front-end javascript frameworks. This one seems simple enough that I might be able to understand it though...

Can you clarify for me, though, how exactly to utilize this in my code? I see the `require` statements, which I'm guessing means you assume the use of browserify or some module loader (or ES6)... but would it be possible to use this just as a plain old javascript file via a `<script src="whatever"></script>` tag?

Also, are there any more fleshed-out examples of how to use this for a realistic app?

Thanks!

<comment><AUTHOR> when installing modules from npm, it's customary to use commonjs and `require` them. or you could simply download the built version, include it as a script tag and use the global `window.simulacra`. I have yet to build a complex app using my own lib, but it's one of the main reasons why I wrote it.

<comment><USER8> Ah, gotcha. I didn't notice the download button on your website at first. (You might want to remove the faded style from it -- it looks disabled to me and I think that's why I glossed over it.)

Thank you!

</comment></comment></comment><comment><USER9> I love it! This is going to be my goto library for lightweight ui from now on. [https://github.com/marksteve/todo- simulacra](https://github.com/marksteve/todo-simulacra)

</comment><comment><USER10> This looks pretty interesting. It does require the structure of the HTML to be very similar to the object, though. And I'm not thrilled that is uses the class name for a DOM node in the key/value pair. Why not define some "data-" attribute to read from?

EDIT: Looks like I posted without reading all of the comments in regards to the class name thing. I see some other people have mentioned it as well. It also looks like the author states that this isn't a hard requirement. I guess that would solve that problem at least.

<comment><AUTHOR> >It does require the structure of the HTML to be very similar to the object

that's true, the basic nesting of objects has to be preserved in the html but i don't know how it could be possible otherwise. it just wouldn't make sense to bind a nested key to a dom node contained in an ancestor object but not itself.

</comment></comment><comment><USER3> reminds me of

[http://beebole.com/pure/](http://beebole.com/pure/)</comment>


Facebook's Onavo Gives Social-Media Firm Inside Peek at Rivals' Users - <AUTHOR> https://www.wsj.com/articles/facebooks-onavo-gives-social-media-firm-inside-peek-at-rivals-users-1502622003 <comment><USER2> It's ethically dubious that the advertised function of the app is a VPN to "keep you and your data safe", while the reason it exists is so that all phone traffic goes to Facebook.

This is not clear from the app description -- there is only a generic message about monitored app use, to which users are so used as to not pay any attention.

> "The app's privacy policy says it may share information with "affiliates" > that include its owner, Facebook. "As part of this process, Onavo receives > and analyzes information about your mobile data and app use"

> A Facebook spokesman said it is clear when people download Onavo what > information it collects and how it is used. "Websites and apps have used > market-research services for years," the spokesman said, noting that the > company also uses outside services to help it understand the market and > improve services.

Then Facebook can attack the competition by seeing in real time how usage of competitive apps varies in response to new features and inform acquisition decisions.

> Onavo's data paved the way for the purchase of WhatsApp for $22 billion. > Onavo showed the messaging app was installed on 99% of all Android phones in > Spain -- showing WhatsApp was changing how an entire country communicated, > the people said.

<comment><USER3> I once sat in on a pitch from an antivirus software company who was selling the ability to look at the full browsing history of people who had visited your website. You could see all of their searches, if they visited competitors, and more. Most of the time I get annoyed of the FUD of "they're selling my data!" but this was different. It was true and it was scary.

<comment><USER4> Why not name them?

<comment><USER5> That would identify the GP to within a small group (the meeting). They probably worked under an NDA.

It would be great if an unrelated leak were to happen, though.

<comment><USER3> I'm not anonymous. You can identify me by going to my profile if you'd like.

To be completely honest, I don't remember. It was 2 years ago and I sit on lots of these pitches. I remember pushing back on them about the methodology, hearing how the sausage was made, and noping right out.

I want my team to be able to spend marketing dollars efficiently but I would never compromise my ethics to do so. Luckily I work somewhere that I can give a justified 'no' and keep my job.

<comment><USER6> _> Luckily I work somewhere that I can give a justified 'no' and keep my job._

That is lucky! Where do you work?

<comment><USER7> > You can identify me by going to my profile if you'd like.

<comment><USER6> Actually, I can't identify you from your HN profile. I guess I could google your username or something, but I'm a little unclear why you wouldn't just, you know, say where you work.

<comment><USER8> [https://news.ycombinator.com/user?id=teej](https://news.ycombinator.com/user?id=teej)

Currently - head of data engineering at Minted

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> A comment on the WSJ brings up an interesting point—if Zuckerberg were to run for president, would he have access to this information? What else could he have access to?

Given the amount of data Facebook has about everybody, I find that possibility worrisome. It seems obvious that a campaign strategist could segment individual states, regions and cities. They could target people based on likes and interests. They could get very granular with messaging—advertisers can do this through Facebook right now.

But what other information could be used that advertisers don't have access to? Application usage, website visits, WhatsApp message keywords?

<comment><USER10> Well, as I've read on this, there is good news and bad news. The good news is that the best predictors of how you're going to vote are already public. Wait, maybe that's the bad news. Either way, as you say one can already do very granular advertising through FB already, but having more data is not necessarily equivalent to having better information, and you're not necessarily trying to market optimally to every potentially identifiable segment. If you knew that peanut-related political ads played really well with left-handed leftist lecturers in LA, you might still not consider that worth taking action on. For most people things like age, income, education, party registration, and parent's party registration are sufficiently predictive.

<comment> Method-X This is about influencing peoples _current_ bias. Preaching to the choir won't win an election; changing the opinion of the opposition will.

</comment></comment></comment><comment><USER11> This was a bad idea when the app was standalone—a no-name Israeli startup snooping into all your traffic—and now it's spyware. This is one major (if not THE) reason not to trust small startups with unclear privacy policies—they are often bought in order to (ab)use the data they have collected and continue abusing it from unsuspecting users. Terrible.

<comment><USER5> So, as the first tech hire/partner, what can we do to protect our users?

\- Expire non-critical data after 30 - 90 days, e.g. activity data, not account data.

\- When feasible, have the client encrypt the really private user data, only store encrypted blobs on the server (Protonmail does this).

\- Send out a positively worded, subtle email notice to warn the more savvy users of a pending acquisition, as soon as that news is no longer private. Let them disseminate the real sitrep on social media and in the news. We did build a community, after all.

\- Propose a data architecture update for great efficiency, in which redundant and superfluous data is cleaned and aggregated, before the big handover.

Are there any other suggestions? I am particularly curious if the laws of any one user's country could be used to complicate or thwart a bulk handover of private user data to a new owner. Europeans, I'm looking at you for advice.

<comment><USER12> By far the most important protection you can provide is to bind your future abilities with a "Ulysses pact"[1]. Cory Doctorow ave a great talk[2] last year about how important it is to create these limitations when you _don 't_ need them, because there is a good chance you won't be strong enough to resist temptation when problems start accumulating. In some situations, it may not even be your choice.

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

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

</comment></comment></comment><comment><USER13> I'm glad WSJ followed up on their previous Onavo-Facebook story[1], but they didn't go far enough. They still didn't investigate the claims in many app store reviews of deceptive marketing that gets people to install this in the first place, i.e. "Your phone is infected by a virus, install this now!!" And yes, probably those ads can't be directly traced to Onavo/Facebook, but it's a free app with no affiliate commissions so they're only one with an incentive.

 _> A Facebook spokesman said it is clear when people download Onavo what information it collects and how it is used. "Websites and apps have used market-research services for years," the spokesman said..._

This is such a bullshit, disingenuous statement. It is not at all clear how Onavo uses your information. They have just one line in their description: "Onavo receives and analyzes information about your mobile data and app use." Here's why this is deceptive:

1\. It is buried. It is the last line, below the "more..." fold so most users don't see it. Something this privacy-invasive should have a prominent, clear disclaimer at the top.

2\. It is misleading. Even for the users that see it, they make no mention of using your data for market research. They prominently advertise a feature that reports on your overall data usage -- to _you_ , the user. So this statement is _just vague enough_ to imply that's what they're doing, without setting off alarm that they're spying on your every move for their own purposes.

And then they have the nerve to equate it with "market-research services" that everyone uses.. no big deal.. move along, nothing to see here.. What baloney. Typical market-research services do not involve spyware that you trick people into installing. Participants are supposed to know exactly what they're participating in. That is clearly not the case with this deceptive, exploitive app.

[1] Some previous discussion: [https://news.ycombinator.com/item?id=14970877](https://news.ycombinator.com/item?id=14970877)

</comment><comment><USER14> Having Xposed and XPrivacy on my old phone, it's really interesting what permissions apps request. For example FB Messenger requests the permission to enumerate installed packages: [https://wroot.org/posts/enumerating-android- installed-applic...](https://wroot.org/posts/enumerating-android-installed- applications-without-special-permissions/)

and IIRC also enumerates running tasks. So it's probably simple to do analytics for the whole phone...

<comment><USER15> >"Having Xposed and XPrivacy on my old phone,"

I would be curious to hear your feed back on Xposed oand Xprivacy. Also it sounds like you stopped using them, maybe you could say why? Cheers.

<comment><USER14> I now have a phone with Nougat, according to the Xposed developers, Xposed doesn't yet work reliably with it. On Marshmallow it worked very well, Xprivacy would show pop-ups when an app tries to do something, you can either allow this, refuse this or allow/refuse for a period of time.

Otherwise, Xprivacy's UI is a bit of a pain, but it's usable...

<comment><USER16> Do you remember what the performance impact of xprivacy was? I'm currently doing something similar with cyanogenmod's privacy guard + xposed app ops which allows statically revoking permissions, but Xprivacy seems to have a better little-snitch like ui

<comment><USER14> I never really compared it with and without Xprivacy.

</comment></comment></comment></comment></comment><comment><USER17> This is obviously unethical. That it might not be illegal is our failing. They provide false solutions to a fear that they themselves create.

What's next? Giving every child a free phone on their 13th birthday? They already "gifted" the world's poorest with free internet. It's easiest to abuse those who have the least power to fight back.

"By accepting this gift, you agree to our Terms and Conditions and Privacy Policy."

</comment><comment><USER18> The same article from alternative source [https://outline.com/WnGGRk](https://outline.com/WnGGRk)

<comment><USER19> If you prepend "facebook.com/l.php?u=" to a wsj link, it will let you read the full article. Like so:

[https://facebook.com/l.php?u=https://www.wsj.com/articles/fa...](https://facebook.com/l.php?u=https://www.wsj.com/articles/facebooks- onavo-gives-social-media-firm-inside-peek-at-rivals-users-1502622003)

<comment><USER20> How meta: a solution to let FB know that you're very motivated to read an article about FB going to great lengths to snoop on user data!

Maybe that's the kind of data they need to reconsider their approach to privacy.

</comment></comment></comment><comment><USER21> How is Onavo a "data-security app" if it lets Facebook track everything you do, including encrypted traffic?

<comment><USER22> They forgot to mention that the one being secured is Facebook, not the user.

<comment><USER23> If you aren't paying for it, you aren't the user. You are the product.

</comment></comment></comment><comment><USER24> Now THIS is a glimpse of what could happen if internet service providers such as AT&T or Comcast are allowed to snoop on traffic. This could happen in large-scale if we don't keep an eye on internet data privacy. Let's stay vigilant. Upvote to spread the words

</comment><comment><USER25> App Annie purchased Mobidia in 2015 which has an app called "My Data Manager" that is similar to Onavo. I think it is used in a similar way. [https://techcrunch.com/2015/05/06/app-annie-acquires- mobile-...](https://techcrunch.com/2015/05/06/app-annie-acquires-mobile- measurement-service-mobidia/)

[http://www.mydatamanagerapp.com/privacy- policy/](http://www.mydatamanagerapp.com/privacy-policy/)

I wonder how many apps like this are out there?

</comment><comment><USER26> "Alphabet Inc., through its Google Android operating system for smartphones, and Apple Inc. also have the ability to monitor how rivals' apps perform on their mobile platforms, but it isn't clear whether they use that information to shape their product road maps."

Does anyone have any other sources that can confirm or deny whether Google/Apple use their mobile OSes like Facebook uses Onavo?

<comment><USER27> I'd imagine that platform companies have greater obligations towards their developers.

</comment></comment><comment><USER28> Sounds a lot like Amazon owning Alexa (the website service), Google owning double click, etc.

<comment><USER29> I don't think that's a reasonable comparison. Alexa data is public, most of it can be accessed for free, and the rest at a reasonable price. Doubleclick is an advertising platform, it doesn't give insight into competitors metrics unless those competitors choose to share that information.

<comment><USER30> Does Google not monitor/monetize Google Fi, Google Fiber, Google Play Services, Google DNS, Google Chrome, Google Safe Browing, and on and on and on... (Google Maps, Google Location Services)

<comment><USER29> None of those are marketed as a VPN or data security apps.

<comment><USER30> Sorry, which goalpost am I aiming for? This one seems to be moving...

Although not quoting until now (my mistake), my reply was specifically in response to your previous point:

 _I don 't think that's a reasonable comparison [...] it doesn't give insight into competitors metrics unless those competitors choose to share that information_

The lines begin to blur especially when discussing means of accessing the internet (especially most efficiently/safely) and/or core (semi-artificially- required) mobile phone operating system components!

If nothing else they offer the path of least resistance. Any best-of-breed solution (GMail, Google Docs, Chrome - all somehwat a matter of opinion) or de facto monopoly-ish position (search, free analytics, Google Play Services?) by Google offers the potential for them to gain info on competitors in much the same way Amazon can take over succesful verticals originally occupied by a third party.

</comment></comment></comment></comment></comment><comment><USER31> Facebook is very very evil, much more so than Google. SEC/DOJ/whoever needs to step in and stop Zuckerberg.

<comment> 52-6F-62 I recently tried to log into their mobile, javascript-less site, and in order to let me continue to log in they required a photo of my face and my phone number.

I've had to submit photos for online financial services/compliance, but not a social network that is tied into all kinds of other data.

And that's what they asked because I wasn't running javascript. It raised my concerns about what they do when I do have javascript enabled on their services. And I work in a company that collects data from its clients -- but nowhere near their scale.

<comment><USER20> Is this satire? Holy shit if not. Did you try fooling it?

Wonder what their TOS allows them to do with just that data.

<comment> 52-6F-62 Quite real. Yeah I tried skirting the SMS/phone number feature but I didn't test the photo bit. I was too creeped out.

If you can't replicate it through a standard browser, try through a VPN or TOR browser.

</comment></comment></comment></comment><comment><USER32> I was considering using this app about 2 years ago, since I wanted to try out a VPN and this was near the top of the list in the Apple App Store. However, one glance at the fact that it was owned by Facebook made me "nope" out immediately. I'm glad to have made the right decision.

</comment><comment><USER33> It's brilliant in a way. But makes me cringe in a way as well.

</comment><comment><USER34> From a pure strategy perspective, it's also quite brilliant. Without a real app store of its own, they don't have the directional data that the App Store or Google Play have.

It's also incredibly shady.

</comment><comment><USER35> I really need to get my family to abandon whatsapp. I'm willing to bet facecrook is using that to spy on everything my phone does.

</comment><comment><USER36> This type of "spying" has been going on for a long long time [1]. It's just that people have conveniently ignored it, and the companies that use this data have not been outed. See SimilarWeb, Jumpshot and other clickstream companies that buy Google extensions and keep track of every single URL you visit.

[1] [https://www.howtogeek.com/180175/warning-your-browser- extens...](https://www.howtogeek.com/180175/warning-your-browser-extensions- are-spying-on-you/)

<comment><USER37> I think the reason you see the objection more here is the consolidation of information Facebook is going for.

</comment></comment><comment><USER38> If you can't get by the paywall, Onavo isn't the only thing Facebook will let you get an inside peek at...

[https://www.facebook.com/l.php?u=https://www.wsj.com/article...](https://www.facebook.com/l.php?u=https://www.wsj.com/articles/facebooks- onavo-gives-social-media-firm-inside-peek-at-rivals-users-1502622003)

<comment><USER39> Interesting find, by using that link, I gave FB some metrics about me and in return they sponsored my visit to the wsj article.

</comment></comment><comment><AUTHOR> Here's the archive.is link if you hit the WSJ paywall: [http://archive.is/r7GhC](http://archive.is/r7GhC)

</comment><comment><USER40> Whenever I see stuff like this I wonder if Mark Zuckerberg is even aware of such things.

I work in a small company of less than 50 people and different teams/depts. barely know what each other is working on.

</comment><comment><USER41> there is a reason why there are so many battery cleaner & anti virus apps with almost-god permissions.

</comment><comment><USER42> It's really scary the amount of power we free give companies like Facebook and Google.

</comment><comment><USER43> Onavo is similar, but more comprehensive than the now "fixed" css history leak.

[https://blog.mozilla.org/security/2010/03/31/plugging-the- cs...](https://blog.mozilla.org/security/2010/03/31/plugging-the-css-history- leak/)</comment>


Apple Watch Bitcoin Complications - <AUTHOR> http://applewatchbitcoin.com/complication.html <comment><USER2> How often can Apple Watch face refresh with new data?

<comment><AUTHOR> from the docs it seems similar to ios background refresh, which has ~10 minute minimum interval [https://developer.apple.com/library/prerelease/ios/documenta...](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/ComplicationEssentials.html#//apple_ref/doc/uid/TP40014969-CH27-SW1)</comment></comment>


The power of Focus | Change your thoughts - <AUTHOR> http://www.stevenaitchison.co.uk/blog/2009/07/28/the-power-of-focus/ <comment><USER2> I feel great encouragement upon seeing that his blog brings in $1500 a month. The writing is mediocre. "Now grab your balls and jump." But apparently it provides enough value for enough of an audience to get the University of Phoenix, Dianetics, and the author of an ebook on how to pick up women in parks, bookstores, and clubs to pay him some decent money.

Rereading that, it looks sarcastic, but I don't mean it that way. Something that holds a lot of us back from getting into business, including me, is that we don't tolerate mediocrity _anywhere_ in our lives. We don't eat at the Olive Garden, we don't listen to Britney Spears, we don't settle for junky cameras or poorly exposed pictures, and most of us won't even use Windows. For us, it's either minimalist or excellent—either ramen noodles or home-cooked Indian food (and even when we make ramen noodles, they come out surprisingly good). But the majority of actual b2c transactions consist of exchanging money for mediocrity, between people who don't know and don't care.

</comment><comment><USER3> Every time I read about scheduling, prioritization, and focusing on your top tasks, I think of the movie "The Exorcist" when father Karras briefs father Merrin:

KARRAS - I think it would be helpful if I gave you some background on the different personalities Regan has manifested. So far, there seems to be three. She's convinced-

MERRIN - There's only one.

If you're a programmer, forget about scheduling, prioritizing, and focusing on multiple things. Work exclusively on the #1 thing. Nothing else has made me more productive. See how simple.

pg even talks about it in his essay "Good and Bad Procrastination"

<http://www.paulgraham.com/procrastination.html>

"What's the best thing you could be working on, and why aren't you?"

</comment><comment><USER2> Declaring a date and numerical measure for a goal so much beyond your control strikes me a little weird. Sure, it leads to productive and joyful action, so that's good. But large-scale market acceptance depends on finding an opportunity for fast growth and capitalizing on it, not (merely) on hard work or even focused work. If you are barking up the wrong tree, you will get nothing no matter how loud and long you bark.

</comment><comment><USER4> I'll give him a chance. He might be shooting too far, too soon with the one post a day stuff, but I'll subscribe and give him the chance.

<comment><USER5> Well, it's presumably something he's figured out he can do. Not having time to dig into his previous posting patterns, it could be a bit of a jump, but ultimately if he wants the 10,000 subscribers he'll need to be offering up more than one post a day - so it's a good start.

I love to see people who boldly declare their goals, and then visibly start working on them; much better than looking back and saying "I did it" when nobody knew you were trying to do it in the first place! But then I'm a productivity voyeur, so..

</comment></comment><comment><USER6> The _real_ power of Focus: [http://www.amazon.com/Deepness-Sky-Zones- Thought/dp/08125363...](http://www.amazon.com/Deepness-Sky-Zones- Thought/dp/0812536355)</comment>


Ask HN: What makes great real-time, turn-by-turn navigation software? - <AUTHOR> There are a handful of examples of open source, real-time, turn-by-turn navigation software out there. For example, https://github.com/valhalla/valhalla gives great turn-by-turn directions. I'm looking for best practices around navigation that will tell you to turn right in 300 feet as you're driving.
I'm curious about the high level, non-obvious gotchas in making them really useful to match current best offerings. Things like smoothing of gps (specific to the use case), better estimation techniques for current position/speed between gps updates, best practices around time estimation to next turn given current (estimated) position/speed, how best to determine when to reroute (how far is too far off route, how long to wait until rerouting), cheats people use to paper over bad data, etc.
Thanks! <comment><USER2> Let me control the zoom.

Sometimes I want to see my whole route. Sometimes I want to see city streets. Sometimes I want to see as far as the next big city. Only I know which of these I want to do.

But you know what I never want to see? A beige screen with a blue line across it representing the 50 feet either side of my car.

That, however, is what every modern satnav insists that I see for the entirety of my trip. If I dare zoom out, it'll either zoom me right back in after five seconds, or stop tracking along with me so that the little car icon drives off the side of the map and I see a little "recenter" button that will zoom me back into that "1m = 1m" view that it loves so much.

It's maddening.

</comment><comment><USER3> I can only comment from a user's perspective but the issues I face with google maps directions:

\- The warning to turn a few hundred meters out works, but I find in dense urban areas is that the "turn now" message is delivered too early sometimes. Where there isn't much of a gap between turns It can occasionally lead you to make a turn down the wrong (earlier) road. Low speed, heavy traffic situations are worst.

\- It frequently leads you through backroads here (Jakarta, Indonesia), which often dont have much space for a single car. Allowances for developing cities need to be made given the width of roads. Gmaps has improved considerably in this area over the past few years but its still problematic.

\- Heavy traffic estimations (eg where the traffic is a dark red on gmaps) are far too conservative for this and other similar asian cities. It's like it hits a theoretical max-time that a car can be queuing without taking into account cities with insanely bad traffic :P

\- It may be annoying for some, but id appreciate a "last rest stop for xx km" message when on the highway if its above a certain distance (say 40km) :)

\- Gmap specific: It's very unclear whether the navigation is on mute or not

</comment><comment><USER4> 1\. Eliminate chattiness. I've had the Google navigation system talk for 30 seconds straight as I'm trying to figure out which lane to be in, so that it can recite every single word on a sign i passed.

2\. Say which way I'll be turning later on so that I'm not stuck waiting for the last minute turn left, crossing 3 Lanes of traffic.

3\. Only the essentials on the screen, with more important stuff bigger. Don't keep everything proportional if it makes it harder for a busy driver to see what he needs to see.

</comment><comment><USER5> Be "locale" aware. All the navigation software insist on using street names. In the UK that doesn't help as street name signs are generally located in the street. By the time you can see the sign, it's too late to make a turn.

</comment><comment><USER6> I'm a fan of including landmark based directions such as "turn left in 300m after the church".

I also like knowing the next directions after the current directions.

I also like clear display of which lanes to be in for a turn.</comment>