He Calls Google A Vampire, But Mark Cuban's Mahalo Is Doing The Sucking - <AUTHOR> http://searchengineland.com/google-vampire-mark-cuban-mahalo-35039 <comment><USER2> Seems a bit of a stretch to criticise Mark Cubans comments based on an investment he made. Seems unlikely he's aware of their SEO tactics.

<comment><USER3> I think your completely right. I was once talking with an angel about one of the companies they had invested in and got the reply "I don't know what their doing I'm just an investor." Whether this is a good thing or not is up to discussion.

<comment><USER4> I don't see that as much of an excuse. Investing in a company isn't like paying taxes; you voluntarily decide who to invest in, and ethically (if not legally) you have some responsibility for their actions.

</comment></comment></comment><comment><USER5> What's with Danny Sullivan's and searchenginelands's crusade against Mahalo? Is it just blogsphere link-bait or is there a reason for all this attention on their questionable business model?

<comment><USER6> It's kind of a combined attack from anyone in the SEO space.

Mahalo was built up going by Google's search guidelines and has made itself an authority online. They're at a level where almost anything they publish gets picked up immediately and ranks fairly well in the SERPs. What they're doing currently are practicing grey/black hat tactics of which almost all are frowned upon by Google (ie. acting as a content scraper with no original content). Because of this authority they've built before, they currently get away with it.

Small sites would be banned or punished for some of the things they're doing, but they haven't even received a slap on the wrist.

Another reason this gets a lot of us SEOs fired up is because Mahalo is doing the same thing Jason preached against. He called everyone in the SEO industry a scumbag and preached about how Mahalo would put SEOs out of business with their 'human powered search'. Mahalo as a destination site failed so they switched to become (essentially) an article directory who get most of their traffic organically through search. The problem is they're creating low value pages with nothing but ads and scraped content. Those pages are what Jason claimed he wanted to get rid of in the first place, one of the reasons he started Mahalo.

The SEO community is pissed about this because it gives us a bad name, building on the bad PR we got when Jason went on this gigantic anti-SEO campaign a couple years back. We're just trying to point out the hypocrisy here and the only way to do that is to present our argument and hope that Google hears us.

</comment></comment><comment><USER7> Portfolio theory, anyone?

Investing isn't 'gotcha' politics or rhetoric. There's no reason why all a person's investments have to advance some unified self-consistent theory of the world. In fact, it's almost certainly better if they don't.

If an investor is choosing well, their investments altogether can be like a roulette wheel where red, black, and green all have positive expectations. No, they can't each come up at the same time, but that exclusivity doesn't make it irrational to bet them all simultaneously.

<comment><USER8> It's not just about diversifying, but about allowing the companies you invest in to make their own decisions.

I don't think anybody here would be happy about once of their investors trying to force them to delist themselves from google.

</comment></comment><comment><USER9> This was a pretty good advertisement for Mahalo. I didn't even need Google to find it.

Cuban may simply be voicing that finding something in a search index doesn't compare to the value of finding something through the social graph or something hand-picked by humans.

But I didn't get to see his whole presentation. Just the two sentences this author ripped from it. (tongue in cheek)

</comment><comment><USER10> i believe that when mahalo launched it was meant to be a competitor (alternative to google). However, they have now revised their model and leverage google to drive traffic. So when cuban invested he may have seen it as a different play than it now is

</comment><comment><USER11> Maybe Cuban meant: "Hey pitiful newspapers, find a way to make money, like I did."

</comment><comment><USER12> Really good article, imo</comment>


Advice? - <AUTHOR>

I am a woman teaching myself how to code- does anyone have any recommendations or resources for me? I'm currently using Codeacademy. <comment><USER2> My best advice for anyone like myself is to create real projects, try to create something that scratches an itch, something that can be sold etc.

For me this is my motivation: if I was doing it only for the sake of learning it I'd give up in a day.

Of course most of my inventions had fairly short shelf life if aby but I learned to program, well enough to get a well paid job. (And: one of these projects went ahead to save hours at a small company and another simplified procedures significantly at a local non-profit : )

<comment><AUTHOR> thanks for the advice, reitanqild! I've been working on a project for a while now and wanted to be able to have more control over it and build it myself... so in that sense I'm super motivated...

Glad to know it's possible to teach yourself to code enough to get a job coding! Gives me hope!

</comment></comment><comment><USER3> I'd pick an area you want to learn (web dev, cs fundamentals, ...) and start a small project to practice on. Codeacademy and other online resources are great for learning the how of specific topics; working on a program will reinforce that knowledge while giving you a higher level view on how those topics apply or interact.

Project Euler ([https://projecteuler.net/](https://projecteuler.net/)) is a great resource for learning the basics of a language. Just do some of the top 100 each time you pick a new one up. Also, if you're into math the harder ones are quite interesting.

If you're interested in web development, I'd be happy to talk on Skype and point you in the right direction. I could also do some code reviews every now and then to give you feedback on a project. Hit me up: jtfairbank+hn/at/gmail/dot/com

<comment><AUTHOR> jtfairbank- I will definitely be hitting you up! Thank you for the suggestions and offer to connect.

</comment></comment><comment><USER4> Why are you learning to code? To find a job as a programmer? Because you think it will help you at your current job? Because you are looking for a new challenge? Do you have something in mind that requires coding?

If you don't know anything about programming, I would recommend you "learn python the hard way" ( [http://learnpythonthehardway.org/](http://learnpythonthehardway.org/) ) to get yourself familiar with Python, a programming language popular and easy to learn, and then start whatever you are interested in.

One more thing, why are you mentioning that you're a woman? I believe tech is a field where it shouldn't matter (I would matter more that you are a woman if you were asking, say, how to use a body building machine).

<comment><AUTHOR> S4M - Learning how to code because I'm a non-technical cofounder and would like to become fluent. This won't be my first company/product so I know it will serve as an asset for the future. Thanks for the python site recommendation! Could I trouble you to explain to me a little more about Python? Is it a starter platform?

Also, I mentioned I was a woman because I always read about agencies which help women learn how to code and provide various resources for women- I'm just not entirely sure what they do.

<comment><USER4> > Could I trouble you to explain to me a little more about Python? Is it a > starter platform?

Python is a programming language, that is used to do lots of things - it is used in production at Google, and you can do pretty much anything with it, from data analysis/machine learning to web development, from game development to shell scripting. It is also quite easy to pick up, so it's a good choice for beginners - although lots of experienced programmers use Python. That's why I recommended you python.

Since you want to help for your startup, I'd recommend to try to pick up whatever they are already using, since there are probably programmers with some experience working with you.

EDIT: by the way, my email is in my profile, so feel free to contact me if you need something, and I'll see what I can do.

</comment></comment></comment><comment><USER5> First what platform have you chosen? What sort of programs do you want to make or are interested in developing?

Computer languages have their strong and weak points. Doing Windows, Apple, Linux, desktop, mobile or web, data, games, audio or art? There are lots of different ways to get things done and selecting the right tool that works for the task and that you like is a good start.

<comment><AUTHOR> Hey LarryMade2 - I'm the non-technical cofounder of a company and I'd like to build a simple sales site. Our tech isn't too complicated, it's basically a sales site with Stripe/Payfirma (haven't decided) thrown in. Our company sells a physical product so it should be well integrated across all platforms.

What would you recommend as the best way to go?

</comment></comment><comment><USER6> Not sure what level you are at, but for HTML, CSS basics, this is an ideal resource. Little more than the basics, and not too extensive either.

[http://learn.shayhowe.com/](http://learn.shayhowe.com/)

<comment><AUTHOR> vishalchandra- I'm super basic for now, thanks so much for the link!</comment></comment>


Moving from Ubuntu to Debian - <AUTHOR> http://magnatecha.com/moving-from-ubuntu-to-debian/ <comment><USER2> So, is the Linux distribution market now ripe for disruption?

I wonder who out of today's major players could be the next big thing. OpenSUSE seems the closest to Ubuntu in terms of user friendliness (Linus' comments notwithstanding) due to tools like YaST [1] and a PPA-like mechanism called the openSUSE Build Server for extra prebuilt software [2]. People certainly have speculated about it online for a while but we're yet to see an exodus of Ubuntu users to openSUSE.

On a related note, a major thing Ubuntu and its derivatives have going for them is the great font rendering out of the box. I wonder why other distributions haven't yet adopted it, or the Infinality patches [3], as defaults.

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

[2] That said, although I've been following their releases lately I haven't used a SUSE distribution as a daily driver since SUSE 9.3, so I don't know how the quality compares; any openSUSE users here that can chime in with a comment?

[3] See [http://www.infinality.net/blog/](http://www.infinality.net/blog/).

<comment><USER3> > On a related note, a major thing Ubuntu and its derivatives have going for > them is the great font rendering out of the box.

This. The default freetype rendering is horrible to my eyes, even worse than Microsoft's SmearType(TM).

> I wonder why other distributions haven't yet adopted it, or the Infinality > patches, by default.

Patents, I guess. Quoting Wikipedia:

> Microsoft has several patents in the United States on subpixel rendering > technology for text rendering on RGB Stripe layouts. This had caused > FreeType, the library used by most current software on the X Window System, > to disable this functionality by default. Apple was able to use it in Mac OS > X due to a patent cross-licensing agreement.

I do not know if Canonical has reached a similar agreement with Microsoft like Apple. Perhaps someone from the Ubuntu camp can enlighten us.

<comment><USER4> Pretty sure the Microsoft subpixel rendering patents are only applicable in the United States.

</comment></comment></comment><comment><USER5> I also moved away from Unity after about a year or so of using it (some good ideas, but too unstable for my taste), and instead of going Debian, which was my initial impulse, I decided to give Ubuntu Gnome a try. This is a Ubuntu variant that isn't talked about much, and it's still early days for them, but it shows some promise.

You basically get the same Ubuntu base you're used to with all the repositories and PPAs intact, which if we're being honest are probably second to none in the whole Linux landscape, with a pretty vanilla GNOME 3 stack.

The devs just put out a call for more contributors today ([http://ubuntugnome.org/urgent-need-for-more- contributors](http://ubuntugnome.org/urgent-need-for-more-contributors)), and I'd love to see this distro take off. I'm also interested in seeing how they'll handle the whole Mir situation.

<comment><USER6> The Ubuntu Gnome spin looks very promising with the combination of the Ubuntu ecosystem and the Gnome desktop environment.

the only fly in the ointment (for me at least) is the distros uncertain future as Canonical developers are not keen on moving to the latest version of Gnome ([http://www.webupd8.org/2013/10/ubuntu-1404-lts-to-stay-on- gt...](http://www.webupd8.org/2013/10/ubuntu-1404-lts-to-stay-on- gtkgnome-38.html)) and longer term the focus will be on QT and other technologies as Unity and Mir mature.

</comment></comment><comment><USER7> I left Ubuntu just because I don't trust them (issues 2 and 3), but I don't understand why people make a big deal about the default DE. I switched to Mint because I know everything "just works" with my laptop on it, and just changed the DE to i3. I previously used i3 on Ubuntu with no problem, I can't imagine it'd be too hard to use xfce or whatever else you wanted on Ubuntu.

</comment><comment><USER8> I consider myself a power-user, I have used a myriad of operating systems, from Slackware to Gentoo, OpenBSD or Plan9.

Yet I like Ubuntu, the desktop works just fine (Believe it or not, I find Unity a nice DE) I can find practically any application in it's repositories (Or by PPA/Deb) and I can install an LTS and forget about upgrading for years.

Is there anything wrong with this? I find the new Dash Amazon search stupid but it's one click away of being disabled, and I'm not happy with Mark's opinions but that doesn't affect directly my experience with the OS.

So I don't see what the big fuss is about, many people say Ubuntu is not Linux anymore, and I agree in some sense; but I like what Canonical is doing with Ubuntu.

So until I find another distro that suits me, I will stay with Ubuntu, that doesn't mean I don't love Gentoo or Arch anymore, but lately I need to get work done, and my parents are using this PC therefore it needs to be available 24/7 without any kind of breakage.

</comment><comment><USER9> I've also switched to Debian, back in August. I don't like Unity, but the deciding factor was the rolling update characteristic of Debian Testing. Ubuntu just plain breaks in every semi-annual update, and I missed the rolling aspect of Gentoo (which I used before Ubuntu).

Debian testing is reasonably up to date, updates continuously and requires much less maintenance than Gentoo. It's about as hassle-free as Ubuntu. Ubuntu does have some useful PPAs, but if you pick the right version, you can just add an Ubuntu PPA to Debian and it will work.

I could live without some of the political aspects of Debian (there's no Firefox in the default repos???), but they are really just minor hassles. Import a couple PPAs, and you are rolling.

For those of you looking for an alternate distro, my shortlist was Debian Testing and Arch Linux. Arch does look like it has a killer community: techie and helpful, lots of available documentation, much like what I remember from Gentoo. Debian won because I'm less inclined to workstation tweaking and more inclined to real work nowadays.

<comment><USER10> The problem with Debian Testing is the relatively long freeze periods before a release. Wheezy was frozen for over 10 months.

</comment></comment><comment><USER11> It would be much more informative to hear from people who use Debian for things that require 3D acceleration -- Minecraft, running Windows games under Wine, Blender.

I have a laptop with nVidia Optimus, so I use Bumblebee. Ah, I see this is in the Debian repos [1] -- maybe I should give Debian a try!

[1] [https://wiki.debian.org/Bumblebee](https://wiki.debian.org/Bumblebee)

</comment><comment><USER12> CrunchBang is a very nice OS too: [http://crunchbang.net/](http://crunchbang.net/) (based on Debian)

<comment><USER13> OpenBox + tint2 (the default in CrunchBang) with pytyle2 (tiling support for non-tiling window managers) make for a very nice combination.

</comment></comment><comment><USER14> There are actually many good Linux distributions not named Ubuntu.

<comment><USER15> Would anyone recommend some?

Also, would anyone talk about FreeBSD vs Linux? What are some reasons to choose each?

<comment><USER16> Arch Linux is great if you like 'hacking'.

<comment><USER17> I recently changed a machine to Arch after a failed Ubuntu 13.10 upgrade. Its very strange. I was able to build a cross compiler following clear instructions:

[http://archlinuxarm.org/developers/distcc-cross- compiling](http://archlinuxarm.org/developers/distcc-cross-compiling)

But I cannot turn off the screensaver...

<comment><USER18> Arch is great, but you can get yourself into a world of hurt if you do not remember to do a system update every couple of days. I've b0rked a couple of Arch installs this way and fixing them is an hour or two of frustration usually.

</comment></comment></comment></comment></comment><comment><USER19> I have both installed for a few years now (Debian on Desktop and Server, Ubuntu on Laptop). First of all every article mentioning something like "I switched recently and everything is fine" just gives me a little sad smile. Yes - every Distro after a fresh install will usually work pretty well by now. Problems tend to show after using it daily for a few months.

My experience is that new Ubuntu versions tend to mess up things often, but I also notice that stuff gets fixed rather often within days. And otherwise one can find lots of workarounds and help thanks to a large and active community. That includes a workaround to disable the internet search for everything in the dash for example.

Debian is fantastic on the server and updates just worked there for me so far. On the Desktop on the other hand the situation is a lot more problematic. Old desktop software is generally just worse than newer one. And software on Debian tends to be outdated so much that I run constantly into old bugs which are solved often for months or even years in current application versions, but not yet in Debian. Pretty much every Desktop application where you want newer versions is simply not available. And applications generally won't get updated between release cycles because that's just not what stable does (except for security fixes). Even finding a browser which simply runs on all websites tends to be a constant pain. So you start trying to work with backports, custom compiled versions, installing packages build for Ubuntu and whatever you can do to get applications you need running - which can cause more and more problems in your system and you will get less and less help from the Debian community because those are (understandably) not "their" packages.

When you bring up those problems the community often recommends using "testing" or "unstable" and while those generally have newer apps they are still mostly outdated. Also while most updates on testing and unstable work most of the time they did mess up my system once in a while on updates so badly that I tended to only update on weekends after a while to have enough time to fix my system before I had to work with it again for the week (which is why I switched to only using stable now for the last 3 versions, maybe unstable/testing have gotten better since then, I can't tell about that).

I still love Debian for it's policy and community. And because I can fix problems often myself (or with the help of the community) and hope that my feedback is useful once in a while and will improve it in the long term I still continue to use it despite the pain. But unfortunately I can't recommend any Debian version right now for the Desktop for people without good Unix knowledge unless they work only with a very restricted set of desktop applications (so might be fine for company desktops where users are not allowed to install anything anyway).

<comment><USER20>
      > Pretty much every Desktop application where you want
      > newer versions is simply not available.

I'll never understand why this argument is made so frequently. The only explanation I can think of is that I use entirely different apps than most people do.

I use Debian Stable on my desktop computer, and I have the latest, or nearly the latest, versions of the apps that I use most. I use backports, third-party repos, and binaries that I download directly from upstream. For example, I get the following apps from the sources listed below:

Firefox - [http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/late...](http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/)

Google Chome - [https://www.google.com/intl/en/chrome/browser/?platform=linu...](https://www.google.com/intl/en/chrome/browser/?platform=linux)

Thunderbird - [http://ftp.mozilla.org/pub/mozilla.org/thunderbird/releases/...](http://ftp.mozilla.org/pub/mozilla.org/thunderbird/releases/latest/)

Emacs - [http://emacs.naquadah.org/](http://emacs.naquadah.org/)

LibreOffice - [http://packages.debian.org/wheezy-backports/libreoffice- kde](http://packages.debian.org/wheezy-backports/libreoffice-kde)

VirtualBox - [https://www.virtualbox.org/wiki/Linux_Downloads](https://www.virtualbox.org/wiki/Linux_Downloads)

PostgreSQL - [http://www.postgresql.org/download/linux/debian/](http://www.postgresql.org/download/linux/debian/)

      > Even finding a browser which simply runs on all websites tends
      > to be a constant pain.

Huh?

[http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/late...](http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/)

[http://mozilla.debian.net/](http://mozilla.debian.net/)

[https://www.google.com/intl/en/chrome/browser/?platform=linu...](https://www.google.com/intl/en/chrome/browser/?platform=linux)

[http://packages.debian.org/chromium](http://packages.debian.org/chromium)

<comment><USER19> Things change all the time. Last time I searched (shortly after wheezy release when I first needed a newer Firefox and Iceweasel was not yet in backports) I couldn't find a current Firefox version build which worked on 64-bit Linux. So yeah - your link is one I haven't seen back then (not checking every week...) so I installed the nightly build instead which was recommended to me. Which worked for a while - until I think maybe 2 weeks ago when it first had some troubles on screen-updates, which got fixed one release later, but that fix- release broke flash (I stopped counting how often flash broke after an update by now, yeah, we all hate it, but still...). But thanks for the link, I will give that release you posted a shot next weekend - maybe I get a working browser back then for a while. Note - you can get stuff working again always in some way, but over the years I had to do that for a working browser over and over and over again every few months!

And well, I mentioned backports and binaries and compiling stuff yourself etc. But that has it's own share of troubles. Problems I had with backports for example had been package conflicts and missing source dependencies, which means hunting problems in there sometimes already fails in the "get shit compiling" stage. Then certainly not all apps are in there. A quick check for the apps I use often showed: Pidgin and xchat are in there (but both 1 version behind, which means several months...) while clang, Filezilla, MyPaint, Pencil and Audacity for example are not. A quick comparison on my Laptop showed that for all of those except Pencil (which seems outdated on both systems) newer versions are available at the moment in Ubuntu - in around half the time even the most current version. Also one gets a simple installer with the newest version for each of those (except clang) on Windows (just somewhat sad to see how it is often easier to run free software tools on Windows).

And this is still pretty much at start of this release cycle, experience tells me that it tends to get worse until the end.

</comment></comment></comment><comment><USER21> For me there is a more mundane reason why I think about switching my servers over from Ubuntu to Debian.

"Graphics"

That's right. It seems that Ubutu even on servers starts some high-res console or does other stuff that causes a black screen during boot. It requires fiddling with alt-fx keys to get a console. I never had such issues with Debian. I switched away from Debian because so many software was out-dated and an installation has max 3 years of support (Love the Ubuntu LTS versions), which I care about because I don't have a fully-automated server/service deployment environment using Ansible or something and manual reinstalling a server is a chore, especially if it's not really necessary.

<comment><USER2> >It seems that Ubutu even on servers starts some high-res console or does other stuff that causes a black screen during boot. It requires fiddling with alt-fx keys to get a console.

That sounds like it might be a side effect of kernel mode setting and/or splash screens. You can try to disable both by changing

        GRUB_CMDLINE_LINUX_DEFAULT="quiet splash <possibly some other things>"

to

        GRUB_CMDLINE_LINUX_DEFAULT="nomodeset <possibly some other things>"

in /etc/default/grub and see if it still happens.

Edit: I'm assuming you're using Ubuntu Server or Minimal CD.

<comment><USER21> Yes thanks, I recall this works, but I don't like the mindset of having this stuff on a server-edition of your OS to begin with.

</comment></comment></comment><comment><USER22> I recently switched to Ubuntu from FreeBSD because of driver support problems (i.e. not willingly) and here's my take:

* Unity: I don't see what the big deal is. Granted, it's a subjective thing. As someone who generally dislikes DEs and would normally use just a tiling window manager maybe I don't appreciate the finer points in DE wars. I've been reluctant to install Xmonad because of the fear of what might break, and I have to say I've had no particular annoyances with Unity which I wouldn't have with any other desktop environment. Indeed, all the annoying stuff actually comes from GNOME components that they left. I find the Dash and HUD quite nice.

* Online scopes and advertising. In recent years I've come to the conclusion that a free (as in beer) general population friendly OS just isn't going to happen. The work needed to polish things to compete with Windows and OS X in this aspect is extremely boring. No hacker (or even average programmer) is going to spend his free time doing that. You have to be paid to do it. The money has to come from somewhere, thus advertising. I'm not a big fan this, but what Canonical is doing is at the moment our best shot of having a viable desktop OS which just works and lets you get on with your life (and even Ubuntu isn't there yet). And you can disable it with a single switch. Big deal.

* Shuttleworth trolling people... Well, it's certainly legitimate to not want to use an OS developed by a company owned by a person who says controversial stuff, but I don't see the technical angle. For example, is OS X better of worse because Jobs was a strange type? And as for Mir (that's what the issue revolves around), if Mir is a bad idea Wayland is also a bad idea. You just can't think Wayland is all peachy and Mir a horrible thing because they both basically do _the same_ thing. All the talk about splitting the community (what community would that be?) makes no sense -- if Canonical decided they need complete control of their graphics stack it's a legitimate decision, and no one has any moral ground to attack that decision. In developing Mir they are not interfering with Wayland in any way, they are simply not participating. (BTW, I don't think either Wayland or Mir are good ideas, we'll end up with the situation we have in OS X, where X can be tacked on when necessary, and it is often necessary, with who knows what kind of crappy support.)

I'm no fan of Shuttleworth or Ubuntu, I really just don't care about either on any emotional level, but I'd like a FOSS OS which is also free as in beer AND just works on the desktop and lets me get on with my work and life. After you get to a certain age in life, fiddling with the OS gets old real fast.

</comment><comment><USER23> I'd like to see CentOS, but with the desktop environment stuff kept more up to date.. Would give you solid underpinnings that lasts for years, then a modern UI on top (Gnome 3, KDE what have you, Chrome, Firefox).. I know its mostly doable, and did use a CentOS 6 desktop until a while ago, but ran into some issues with modern desktop apps.

</comment><comment><USER24> But what if I'm tired of Debian's bad decisions like libav, wodim or trying to replace OpenSSL with gnutls?

<comment><USER25> Usually update-alternatives takes care of it.

[https://wiki.debian.org/DebianAlternatives](https://wiki.debian.org/DebianAlternatives)

</comment></comment><comment><USER26> I also had an experience of installing debian recently, and finding it 'just work' extremely well.

Especially if you have a set up (window-manager, etc) that you like and aren't searching for a new cool updated-by-other-people UI (like windows, OSX, KDE, Gnome and Unity), then debian is really quite easy to set up.

</comment><comment><USER27> Any elementaryOS love around here?

<comment><USER28> +1 I love ElementaryOS, specially the Gala Window Manager. It is so fast and full-featured compared to Unity or Gnome3 Shell [http://www.youtube.com/watch?v=shXSV-9PJaU](http://www.youtube.com/watch?v=shXSV-9PJaU)

<comment><USER29> I tried opening multiple terminals/tabs, holding the shortcut... was disappointed. To me it seems like Linux graphics never feel "good" like Windows'.

</comment></comment></comment><comment><USER30> I have hopes for the Tanglu project delivering on the promise of rolling releases based on Debian Testing for desktop use. But they aren't quite there yet unfortunately.

[http://www.tanglu.org/](http://www.tanglu.org/)

</comment><comment><USER31> I tried Fedora (Korora spin) for a few months. However, battery life was bad and Chrome got buggy. Back to Ubuntu LTS (with Gnome 2) for now.

Will probably try Debian stable + lots of backports next.

</comment><comment><USER32> [https://help.ubuntu.com/community/Installation/MinimalCD](https://help.ubuntu.com/community/Installation/MinimalCD)

and the points 1 and 2 are out

</comment><comment><USER33> Ubuntu provides LTS versions. Does any other distro do this? I'm mainly using it for my server OS and I'm always interested in alternatives.

<comment><USER34> Debian stable releases come out roughly every two years, and are supported for an extra year (or so) after the following release.

Otherwise RHEL/CentOS have longer support periods (ten years).

</comment></comment><comment><USER35> Choose Arch. Pick any desktop environment and learn how easy it is to switch if you don't like Unity/Gnome/etc

</comment><comment><USER36> I have been pretty happy with Xubuntu, I get all the Ubuntu benefits without the Unity or GNOME 3 mess.

<comment><USER29> But you don't get all the benefits :( For example, Xubuntu (IIRC) won't even have a Wifi widget for setting up your network. If you mount a pendrive, how do you access? You have to open a a file explorer or you won't see it... etc.

</comment></comment><comment><USER37> I never clicked with Unity so I tried Linux Mint with Cinnamon. Don't regret it one bit.

</comment><comment><USER38> Linux Mint LMDE with MATE.

</comment><comment><USER39> There's always Fedora, CentOS and OpenSuSE...

</comment><comment><USER40> I recommend mint.

I think its a good idea to try out alternatives.

<comment><USER41> But if the idea is to get away from Canonical's decisions, moving to a distro based directly on Ubuntu seems a bit backwards.

Check the repos. Mint is Ubuntu + some extras.

<comment><USER42> They also have a Debian version now:

[http://www.linuxmint.com/download_lmde.php](http://www.linuxmint.com/download_lmde.php)

</comment></comment></comment><comment><USER43> I will try Opensuse instead Debian.

</comment><comment><USER28> is possible to install Gala WM / ElementaryOS on top of Debian?</comment>


Does OO really match the way we think (1997) [pdf] - <AUTHOR> http://www.leshatton.org/Documents/OO_IS698.pdf <comment><USER2> I think the big problem with OOP is that it's designed to simulate the real world but has the real world backwards.

Real world objects are a composition of parts. The taxonomy of those objects, and its constituent parts, is am artificial construct independent of how those objects are composed. A frog is a frog because it fits some definition that experts agree on. The taxonomy comes afterwards - the composition just is.

What we have is a model where the taxonomy comes first. We say a frog inherits from an amphibian. What makes an amphibian an amphibian doesn't matter in OOP. Further, the language rarely provides the same means for composition as it does for inheritance and taxonomy. That's a problem.

In fact, the only reason why a frog is an amphibian is because it has parts all amphibians share. The label comes afterwards, after looking at the constituent parts.

In this way, OOP would benefit from composition-first, taxonomy after. An object is a thing because of what it has (and this includes behaviour too), not because of what it is or descended from.

It should be entirely possible for me to construct an object that fits the definition of a frog without specifying I'm creating a frog.

<comment><USER3> I think you'd benefit from taking a look at Entity Component Systems. Generally used for games, this programming pattern assigns behaviour to entities based on the components that they have. Moreover, neither entities nor components on their own actually own any behaviour. Behaviour occurs by systems that operate on entities with the associated component "signature".

For example, an entity with a position and a velocity component (position could hold x,y,z values and velocity vx,vy,vz values) could be operated on by a movementSystem (which adds behaviour to any entities that have both a position and velocity component, and updates position values based on velocity values.)

The nice thing about such a system is that the taxonomy as you call it gets defined when you instantiate the systems of your program. If you have entities with position and velocity components but dont want to use a movementsystem to operate on them, you simply dont instantiate the movementsystem. Pretty flexible, but not used excessively outside of video games.

<comment><USER4> The problem with this approach is that systems will need info from multiple components, so at some point you are forced to make the coupling that the ECS was brought in to avoid. For example, the rendering system needs to know entity position. So to which system does the "position component" belong? Not all entities that have a position needs to be rendered, and neither do all renderable entities require movement, and this same issue permeates all aspects of the architecture.

<comment><USER5> Components do not belong to a system. Any system can access any component. Think of RDBMS stored procedures that operate on all rows matching certain criteria; don't think OO style encapsulated "methods".

The system only operates on entities that have all the components they need. So there won't be one rendering system but several: one for entities that require movement, one for those which do not, etc.

<comment><USER3> Almost right. You wouldn't necessarily have a separate rendering system for entities that require movement and those that do not.

Instead you would likely have an additional system that operates on entities that have both position and render components and propagates updates from position to render data. The render system for all entities with just a render component would then remain the same.

This can be imagined as systems that work on signatures (a component set or aspect that specifies whether an entity's components match the system's criteria).

A render system would have an aspect of say [RenderComp] and a positionRender system would have an aspect of say [RenderComp, PositionComp]. Note that the positionRender system would not actually render anything, only serving as a propagater of data.

</comment></comment></comment></comment></comment><comment><USER6> OO solves some problems and creates others.

One must remember that the competing paradigm isn't functional programming but imperative procedural programming. Very large code bases in C, Fortran, Cobol aren't all that nice either.

It's unfortunate that ML and Lisp didn't gain greater traction but that's likely due to Unix.

Many of OO's flaws are being addressed and are even missing from new languages. Rust "feels" OO but isn't. If you write C#7 or Swift and avoid inheritance and prefer immutable types as long as possible - how OO is your code then?

The problem that OO solved is that it allows mediocre coders to iterate on large scale code bases until a problem is solved. This is no small benefit in industry. The drawback that the code is hard to maintain and prone to bugs is an acceptable one.

Modern multi paradigm languages such as F# or Rust are really the way forward I think. The Java/C++ way of OO was a good but expensive lesson.

<comment><USER7> > It's unfortunate that ML and Lisp didn't gain greater traction but that's > likely due to Unix.

Lisp and ML are competing by nature(MLs are famous from their typesystems) and their "failure" is not because of unix, but because of their inability to deliver 'fast' & readable apps. Also, the learning curve...

<comment><USER8> Wait, learning curve? Relative to C++ or Java?

<comment><USER9> You can write something that passes acceptance tests in C++ without a lot of effort. It's things like removing all the bugs, memory leaks, and undefined behaviors that requires enormous expertise. There is certainly a _lot_ of ground to cover before C++ mastery can be had, but simple OOP and procedural programs aren't that bad.

<comment><USER5> > You can write something that passes acceptance tests in C++ without a lot of > effort.

True for freshman-year

        std::cout << "Hello, world!" << std::endl

programs maybe. People's heads asplode when they get into C++ with any sophistication because they need to grasp several things at once: classes, inheritance and polymorphism, pointers (smart or not), value vs. reference types, etc. Java, JavaScript, and even Lisp go a long way toward hiding those details from the programmer.

</comment></comment></comment></comment></comment><comment><USER10> In reaction to some of the comments popping up re. OOP and functional programming: I've come across quite a bit anti-OO sentiment in my career now, and not nearly as much anti-functional sentiment. I suspect that the prevalence of OOP has something to do with it - you're more likely to have been exposed to bad OO code than any other type simply because there's more of it. People often seem to draw an artificial distinction between OO and functional styles - but they're both just techniques that can be applied to solving problems and work well in combination. E.g. purely functional immutable objects seem to yield very readable and maintainable code. You can write bad code in any paradigm; but the more open you are to combining a variety of techniques, the more options you have for creating a good solution to the problem at hand.

<comment><USER11> > you're more likely to have been exposed to bad OO code than any other type > simply because there's more of it

That's certainly true, but as someone who routinely has to go in and bugfix/maintain classes contaning thousands of lines of code (sometimes in themselves, more often collectively in their inheritance hierarchies), the simple presence of extensively used member variables often is a massive cognitive load. I'm not claiming that I'm some rockstar programmer who knows better, but from my experience working with other programmers, member variables might as well be called global variables.

tl;dr: Mutation, mutation everywhere.

</comment></comment><comment><USER12> Commenting more on this thread than the article: in my opinion, the idea that OO and functional are somehow at odds with each other is misguided. There is little about OO that doesn't mesh well with functional ideas, and vice versa.

The core concept of most OO designs is that data is coupled with the methods that operate on that data. There is absolutely no reason why that can't work with immutable data and pure functions. In fact, the String class in eg Java and C# works just like that: each method returns a new instance.

Scala, for all its warts and complexities, has a fantastic feature called case classes which _encourage_ combining the best of OO with the best of functional. A case classes is both a class in the classical OO sense and an ADT. Most case classes are immutable.

This is easy enough to simulate in many other languages, even if they don't have case classes. For example, did you know Immutable.JS allows you to add methods to Record prototypes?

<comment><USER13> > The core concept of most OO designs is that data is coupled with the methods > that operate on that data.

I've read this a lot, in this discussion and elsewhere, for years. But what does it mean? Does it mean data is _syntactically_ coupled with state? Otherwise I don't get why pretty much any C program is an OO design by this definition.

<comment><USER12> Many C programs _are_ OO by this particular definition :) I take the least ambitious definition of OO on purpose, because that definition is often the one that matters the most. I mean message passing yada yada, if you look at most OO software out in the wild, the key feature is the syntactical coupling between nouns and the verbs that operate on those nouns.

Extra bonus though, compared to eg C, is that in OO languages you don't need to spell out the type (plus polymorphism ofc). So String_trim(&myString) becomes myString->trim() and that's shorter and, most of the time, equally clear and less noisy.

I miss this most when coding Elixir.

</comment></comment></comment><comment><USER14> No comment about OO in general, but I think Java/C# is a damn fine language design, avoiding many problems of newer paradigms. Here's an example:

1) Java: starts out with one opaque string type, because that's what OO methodology says. Changes the internals when needed. All clients continue to work forever.

2) Haskell: starts out with strings as exposed linked lists of characters, because functional methodology says exposed algebraic types are OK. Sticks with this mistake for many years, then recognizes that opaque would be better and introduces a new type Text. Can't change the old one or make them compatible. Moreover the new type exists in strict and lazy variants, because Haskell methodology says people want that.

3) Rust: starts out with two string types, because the language design suggests both should exist (String and &str).

It's not just about strings. The same happens with compilation speed, binary compatibility, etc. "Modern" languages get it wrong and can't fix it, Java 1.0 gets it right and it stays right.

<comment><USER15> The String and &str thing is a common criticism of Rust, but I feel it's a bit shallow when said without context. Maybe it's just me, but it makes sense when you consider Rust's ownership semantics (which are a new idea in language design, so you can't really look at how other languages solved issues arising from them).

Basically, when you have the notion of ownership/lifetime in a language, you have to make a distinction between an _owned_ and a _borrowed_ thing. When you pass an owned thing to a function, you give up your ownership of it, and can't use it anymore. When you pass a borrowed thing, you keep the ownership, and the compiler tries to prove that, based on ownership info it has, it lives long enough for the operation to be safe. Just as String and &str are owned- borrowed counterparts, you also have e.g. Vector<u8> and &[u8] (the former is an owned vector, the latter is a read-only, borrowed view into that vector) and many more examples of this dichotomy.

I don't see how this could have been solved in Rust without having those two types.

</comment></comment><comment><USER16> OOP did more to set back program design than anything else I can think of. It was incredibly wrong, has sent so many smart minds down a poor path. If for example functional has taken prominence in the 90s we'd be in a much better place now.

<comment><USER17> I have the polar opposite view. I love OOP because it provides a way to elegantly solve so many problems.

To take a concrete example, consider the undo-redo mechanism in a text editor. It seems natural to create a list of objects with each object representing the action that can be undone or redone, and a pointer to the most recent action object. Undoing executes the 'undo' method and moves the pointer to the previous action. Redoing moves the pointer to the next action and calls it's 'redo' method.

You would have a 'delete text' type of action which knows how to remove a particular chunk of text and put it back. You would have a 'change text colour' action which knows how to change text to a particular colour and revert back. You might have an 'insert jpeg' action which knows how to add a picture and remove it from the document.

Crucially, each action object in the list should encapsulate it's data and behaviour. It makes the undo-redo framework so much simpler if the framework knows nothing about each type of action, besides the fact that each action object has some kind of undo and redo behaviour.

I cannot see how you could get a simpler design without OO principles such as coupling the data and methods of each type of action, or without hiding the implementation details of each action from the undo-redo framework.

<comment><USER18> Heh, check out time-travel debugging and be amazed at how simple a _much_ more powerful "undo" can be made when purity is involved (in FP langs, e.g. Elm or Haskell).

Seriously though, design wise there was not much you said that was specific to OO. Take for example:

\- all actions are a data type

\- the history is a list of actions (in LIFO style for the purpose of simplicity here)

\- undo pops the list and puts undo in another list

\- redo replays the undo list onto the history list

A bit more outlined, but nothing OO there, it was in fact entirely functional.

<comment><USER19> Already present in Smalltalk, Lisp and Mesa/Cedar development environments at Xerox PARC, no need for FP advocating for it.

<comment><USER18> I guess immutability is the actual thing that makes it easy, and arguably Lisp is also an FP lang. m Main point though was the ease of doing it in a pure language, almost trivial.

</comment></comment></comment></comment></comment><comment><USER20> I love work like this - a real attempt to understand what was happening. Genuine scholarship.

But it illustrates the issues with this sort of work. This is really about C++ vs C/Pascal and not OO vs Proc. Also this is 1997 C++ which I earned a living from for a brief moment, and I can attest, it was horrible, and very different from 2017 C++.

From my perspective today : we need to separate parametric and polymorphic oo in our thinking and the big problem is that programmers use these tools to the limit (creating objects with 3+ parameters or deep inheritance hierarchies) and weave silly complexity into the code base .

In a commercial setting the biggest impact I have seen is a project that became impossible to staff because as soon as the developers saw the code base they started looking for other work. It was really good code developed by a two brilliant people initially and then three or four more smart ones as the project grew, but when the lead left it was just too complex - due to prolific use of generics and a obsession with ORM.

<comment><USER21> > This is really about C++ vs C/Pascal and not OO vs Proc. Also this is 1997 > C++...

I can imagine the Smalltalk community rolling its collective eyes and saying "that's not OO..."

My issue with the primary study is that the two programs are not really comparable: a think a C++ parser was a harder problem than a C parser (even given that it is 1997's C++), and this is backed up in the study:

"The C++ parser by further contrast is a recursive descent parser owing to the intractability of parsing C++ using 1 token-lookahead grammars. In other words, they are very different products..."

In mitigation, it says that the C++ parser, as used in the comparison, did not parse the full language, thereby presumably reducing the difference in the complexity of the requirements, but I think the difference in architecture alone is enough to raise doubts over the significance of the results.

</comment></comment><comment><USER22> C++'s implementation of OO isn't that good to begin with, mainly due to compatibility concerns. Perhaps we should look for a better OO language for comparison, say Smalltalk.

<comment><USER23> Indeed! And not every language that claims to be OO actually follows the basic ideas [1,2]. So, Smalltalk, as e.g Squeak [3] or Pharo [4] is a good place to start looking and learning but also Erlang [5] and Clojure [6]. State is necessary not "evil" but needs to be managed well. And most OO-languages have, apart from the assignment operation, no abstractions for.

[1] [http://wiki.c2.com/?AlanKayOnMessaging](http://wiki.c2.com/?AlanKayOnMessaging) [2] [http://worrydream.com/EarlyHistoryOfSmalltalk/](http://worrydream.com/EarlyHistoryOfSmalltalk/) [3] [http://squeak.org/](http://squeak.org/) [4] [https://pharo.org/](https://pharo.org/) [5] [http://www.infoq.com/interviews/johnson-armstrong- oop](http://www.infoq.com/interviews/johnson-armstrong-oop) [6] [http://thinkrelevance.com/blog/2013/11/07/when-should-you- us...](http://thinkrelevance.com/blog/2013/11/07/when-should-you-use-clojures- object-oriented-features)

<comment><USER24> OOP does not offer true state encapsulation, it just hides it. Objects are always potentially stateful when reasoned about externally. This means that all objects in your system could potentially contribute to the global state space, resulting in a combinatorial explosion of state. This makes programs difficult to reason about and is not a good general approach.

In contrast, functional programming makes state explicit. This makes it easier to manage and control state.

<comment><USER25> It's cute how people thing that functional will fix everything.

In what way does functional make state explicit? If I look at a structure (if you have one in your language) and ask who changes this part of it across a large code base - it's much worse when you've just got a bunch of functions (with bad names) which can be hiding anywhere.

And the "reasoned about" shibboleth. What "reasoning" do you actually do.

Don't get me wrong - I have a long history in Lisp and ML and they're good languages in which good people can write good software. But no magic bullets.

In another part of the development world I've seen React programmers jumping on the functional bandwagon and deciding that all components have to be stateless. Taking the state outside the components means that we have lots of bugs with mistaken state sharing. So external state doesn't equal well- managed.

<comment><USER26> In functional programming n Haskell functions are pure so there is no state just an input and an output.

The exception is the IO entry point.

There is a lot of opportunity to sandbox things so that if you know the type of the function you know what it can or can't do to the programs state.

</comment></comment></comment></comment></comment><comment><USER27> I've noticed most HN comments transformed from being discussions about the _content_ of the article to comments discussing the _topic_ of the article being posted, not sure if this is healthy, but the risk is HN becoming an echo chamber where people discuss opinions, and the posts becoming just topic triggers. We'll see how it evolves.

<comment><USER28> Actually reading the whole article takes time, while reading the title and posting a knee-jerk reaction takes only a moment. One of the curses of a hotness-oriented system like HN is that earlier comments receive the bulk of the upvotes and responses, so it becomes less interesting to comment as time goes on.

There are lots of little rules in place to minimize the damage of this (like no memes, jokes, pics, etc.; HN actively discourages clickbait), but it can't force people to actually read the articles before responding. And, one doesn't have to read the articles to vote, either (again, HN mitigates that problem somewhat by requiring a minimum level of upvotes before being able to vote, etc.).

It's hard to have a substantive conversation online when so many of the incentives are for responding quickly (and probably without going too far against popular opinion within whatever community you're in).

<comment><USER29> > but it can't force people to actually read the articles before responding

They could hash the title for a minimum time, or until at least three comments are posted.

That would at least force people to click the link to find out what's there, and filter out commenters too lazy to do even that.

<comment><USER30> Or just force the user to click the link before the comment box is enabled for that posting.

<comment><USER31> then waiting X minutes before enabling the comment box too, to avoid just clicking and posting?

</comment></comment></comment></comment></comment><comment><USER32> I found this anti-oop video very persuasive. [https://youtu.be/QM1iUe6IofM](https://youtu.be/QM1iUe6IofM)

He also had a couple of follow up ones.

Basically he blames java for oop's popularity. He maintains that oop's combining of methods and data is actually a fault and not a benefit. That every good oop promises apart from inheritance (which is bad anyway) is more easily achieved in procedural programming. OOP promotes endless meaningless abstractions because the problems programmers deal with are not amenable to neat abstractions. So while oop looks great when dealing with animals, cats and dogs, in real programming you end up with an explosion of difficult to name classes, the so-called 'kingdom of nouns'.

<comment><USER13> I'm sad you've been downvoted. I loved this video.

<comment><USER32> Thanks! I've always found it unnatural to design solutions in an oop way. And any time I have done it the code always seems a lot harder to debug afterwards. At the same time I kinda always felt that my preference for procedural code reflected badly on my programming skills. To hear someone who is clearly skilled and knowledgeable argue so well in support of the way i like to program was a bit like having a weight lifted off my shoulders.

</comment></comment></comment><comment><USER33> Should be said in defence of C++, whether its own OO model is good enough for you or not, but object scoping and destructors _alone_ had brought a significant paradigm shift in programming in the 1990s. Although these concepts never really made it to other mainstream languages in such a direct form, but they certainly inspired all kinds of memory management models (ARC, GC). The result is that C++ style destructors and scope management exist implicitly in pretty much every language today.

As for the OO itself, I think the problem is that any poorly written non-OO code typically goes unnoticed or just labelled "bad code", whereas poorly written OO code is labelled as such: poorly written OO code. They both are equally bad. We need to accept that if something is wrapped into a class or even some hierarchy, it is by itself not a guarantee at all that it can be useful or functional.

</comment><comment><USER34> All these guys bashing OO and in the meantime every software stack that ended up in their comment leaving their home connection is object-oriented (even if not necessarily written in an OO-friendly language): web browser, linux, windows or mac kernel, router firmware... Seriously guys, if you think OO has failed you are oblivious to the amount of successful OO software that everyone uses every day.

<comment><USER35> > Seriously guys, if you think OO has failed you are _obnoxious_ to the amount > of successful OO software that everyone uses every day.

Not sure what you mean. Do you mean _oblivious_?

<comment><USER6> Amphibious pitcher debuts in MLB.

<comment><USER35> What?

<comment><USER6> Sorry, that was a viral image this week :)

[https://twitter.com/johnmclarkejr/status/74106144399966617](https://twitter.com/johnmclarkejr/status/74106144399966617)

</comment></comment></comment></comment></comment><comment><USER36> My strategy for personal coding recently has shifted towards a sincere exploitation of automatic programming(in a manner similar to model-driven development or language-oriented programming, or the research of VPRI). The overall feedback loop looks like this:

* Write an initial mockup that exercises APIs and data paths in an imperative, mostly-straightline coding style

* Write a source code generator that reproduces part of the mockup by starting with the original code as a string and gradually reworking it into a smaller specification.

* Now maintain and extend the code generator, and write new mockup elements to develop features.

The mockup doesn't have to be 100% correct or clean, nor does the code generator have to be 100% clean itself, nor does 100% of the code have to be automated(as long as clear separation between hand-written modules and automatic ones exists), but the mockup is necessary as a skeleton to guide the initial development, and similar, comprehensible output one layer down is a design goal. Language-level macro systems are not typically sufficient for this task since they tend to obscure their resulting output, and thus become harder to debug. Languages that can deal well with strings and sum types, on the other hand, are golden as generator sources since they'll add another layer of checks.

I'm still only using this for personal code, but it's gradually becoming more "real" in my head as I pursue it: the thing that stopped me before was developing the right feedback loop, and I'm convinced that the way to go is with a pretty lean base implementation(Go is an example of how much language power I'd want to be using in the target output) and an assumption that you're building a bespoke generator for the application, that won't be used anywhere else.

Source code generation gets a bad rap because the immediate payoffs are rare, and it's easy to take an undisciplined approach that just emits unreadable boilerplate without gaining anything, but the potential benefits are huge and make me not really care about design patterns or frameworks or traditional "paradigms" anymore. Those don't achieve anywhere near the same amount of empowerment.

<comment><USER37> This is an approach I've been exploring myself. Do you have any suggestions or recommendations as to languages that lend them selves well to this approach?

</comment></comment><comment><USER38> > Studying the copious literature of OO, the central features which define an > OO system seem a little ill-defined.

I didn't know opinion pieces could be disguised as academia. Of course the article has some interesting points about human memory, but that's why we have things like single responsibilities.

<comment><USER39> But it is not an opinion. There is no universally accepted definition of OO let alone a formal, axiomatic definition, and that makes it ill-defined.

If you disagree, point to a definition of OO that you think is "correct".

<comment><USER40> I suggest to look at Alan Kay's definition, since he's the one who invented the term "object oriented".

[http://www.purl.org/stefan_ram/pub/doc_kay_oop_en](http://www.purl.org/stefan_ram/pub/doc_kay_oop_en)

<comment><USER39> Well, Alan Kay's definition is just one definition and as evidenced by the rest of this thread, it's far from being universally accepted and definitely not the definition used in the mainstream "OO" languages.

Further, that email thread is far from being a formal definition. In that email there's a pointer to a ISO standard doc, but that's hardly authoritative either.

It seems like every language (and every programmer) has their own idea of OO, which is why I consider it quite apt to call it "ill-defined". That's not to say that OO programming itself is bad, more that the term "OO" is bad.

</comment></comment></comment></comment><comment><USER41> OO is just a tool, a powerful one at that. Like any tool, it can be abused, overused and incorrectly used - the classic comment that comes to mind is:

"When the tool you have in your hand is a hammer, every problem looks like a nail..."

</comment><comment><USER42> The paper specifically calls out inheritance and polymorphism as problematic, especially in the context of maintaining existing code. Which makes me think that code visibility is at least part of the issue. We've always had functions, libraries, and "includes", but their re-use was infamously course grained, static, or not well leveraged outside their initial scope.

Things like inheritance, polymorphism, dependency injection, and "abstracting things away" in general have made it practical and common for implementation details to evaporate in such a way that we don't (and maybe _can 't_) keep them in our heads when we are maintaining existing code.

This is great if all those class hierarchies and abstracted implementations are bug-free and work the way you anticipate them working (i.e. if they fit your mental model). As soon as they don't, or they get too complex and too deep, you're in for a world of hurt and confusion.

</comment><comment><USER43> How to model a door.

        class Door {
          void open() {...}
          void close() {...}
        }

        door.open().

But can a door open itself? Maybe

        Man petya = ...
        petya.open(door);

But can a door be opened if it's not installed? So walls should also come into play when we think about door and its methods.

It's difficult to model the world with OOP (at least in its current state).

<comment><USER44> A `Door` is not an agent, so no, it can't open itself (unless it's a game and your doors have agency).

When you say a door can be opened, you are making the assumption that the door is installed in some sort of building. But then, the door is a component of that building, not just a stand-alone door. It can only be opened in that context.

So I would suggest something like this:

        class Door(Material, Size)
        class Room(List<RoomConnection>, Size)
        enum DoorState { Closed, Open, Locked }
        class RoomConnection(Room, Room, Optional<(Door, DoorState)>, Size)

To open the door, you don't need a method in any of these "data" classes, you just need to update the door state given there's a door in a room connection you're interested in.

The room connection may or may not have a door, and that could change over time. If it does have a door, then the door must have a state (but not all doors have a state, only the ones that are in a Room Connection, possibly others).

Notice that to update the room connection, you don't need mutable state locally... you just need a way to provide a new RoomConnection to code where opening a door may be possible (normally, you're given a RoomConnection as an input, and you might give a new one, basic FP style but OOP can also operate in that way).

So, I don't think it's that hard if you know what you're doing.

I don't want to even comment on the suggestion to have a `Man.open(Door)` method :) that's really not good.

<comment><USER43> You still follow the naive OOP thinking and it remains ridiculous.

For example, why Room?

</comment></comment></comment><comment><USER45> A common sentiment expressed in threads like this is that people can write bad code in any language, therefore language doesn't matter. While that may be true, I don't think judging a language by the worse parts is a useful exercise. I'd rather judge a language by its best parts.

To that end, can someone point to me an example of object-oriented code that they feel is elegant?

<comment><USER46> At work, I am currently working a program that needs to read XML messages from a message queue, and depending on the type of message extract several pieces of data from it and write them to a specific list in a SharePoint server.

I wrote an abstract base class that contains all of the boiler plate code for dealing with SharePoint, and then one subclass for each type of message I need to deal with; those subclasses only need to override a few methods to deal with the fields from the XML message and with the specific SharePoint list they need to write to.

It is not great (the task is just too dull for that), but I am happy with the approach I have chosen because I can add support for new message types fairly easily.

That being said, I do not think OOP is the answer to all (programming) questions, nor is it the worst idea ever. Some programs can be expressed in terms of objects and inheritance very easily, just as some can be expressed in functional terms very easily.

</comment></comment><comment><USER47> I think this latest resurgence of OOP skepticism could be a good thing, but I can see it easily turn into folks just using OOP as a scapegoat for bad design.

I worry as well about the push for FP to somehow 'replace' OO, when really they address different concerns, and can actually complement eachother.

<comment><USER48> You're absolutely right, just look at #select:, #collect: and #reduce: in Smalltalk for example! It's totally amazing.

</comment></comment><comment><USER49> But then if OO is a dud then why do we have some of its implementations C#, C++ and Java drive most of the enterprise. If they would not have existed would we have same amount to faith of enterprises to move to adopt software applications to run daily business.

<comment><USER50> OO was a fad for how many years? All these languages were strongly influenced by this, and this greatly colours the worldview programmers have who work with these languages.

If you work in Java, everything is contained within a class. You can't easily think outside the OO box because the language insists that everything you do is done in terms of OO, and this has great implications from the standard library, to primitive type boxing. It's very much constrained by the prevalent trends of the mid-90s. C++ is a more OO agnostic, it being something you can opt into as and when it makes sense.

I certainly don't think OO is a "dud", and it's provided a conceptual framework for programmers of wildly varying abilities to create and maintain vastly complicated codebases. But... it's only one way of many to structure and reason about program logic and data, and to constrain oneself to only using OO is greatly limiting. Now the hype has died down, I hope we can use OO where it fits, and avoid it where it does not, rather than as a blunt instrument for every problem?

The main problem I see in my day to day work (imaging related) is that OO is too costly. Arrays of object instances are too cache unfriendly. And code doesn't always need to be directly tied to data. I see Java code using collections of primitive arrays in place of objects because most OO languages don't provide a means of laying out objects in column stores, even though it wouldn't be technically difficult (just different offsets to members rather than packed structures). Treating objects as individual private collections of state leads to only being able to work with an object-centric rather than data-centric view, which can be quite detrimental. It's this view that leads to abominations like database object mappers, treating tabular data as object collections when they are not. While such things are possible and even popular, they often come with significant tradeoffs. I've encountered developers who are completely constrained within an OO worldview and can't take the blinkers off and see what's possible outside the box.

</comment></comment><comment><USER51> Prototype based inheritance (e.g. JavaScript, Lua) is a much better concept. (It's much more powerful and allows you even to implement class based inheritance.)

Also functional programming has its benefits.

The 1990s/2000s with the OO hype around C++/Java/C# was a set back.

</comment><comment><USER52> Think of the program, not as a program, but as a family. A Family has multiple persons(threads), who can do diffrent jobs(functions). A family has a home (system) ...

</comment><comment><USER53> 2017 still debating about OO sounds like a bad idea.

</comment><comment><USER54> Does the way we naturally think is the way to solve problems ? no. OO isn't useful.

</comment><comment><USER55> famed Youtube programmer Brian Will also dislikes OO [https://www.youtube.com/watch?v=QM1iUe6IofM&t=2096s](https://www.youtube.com/watch?v=QM1iUe6IofM&t=2096s)</comment>


The Number of Americans Living in Their Vehicles Explodes - <AUTHOR> https://www.zerohedge.com/news/2018-08-01/number-americans-living-their-vehicles-explodes-middle-class-collapses <comment><USER2> The most depressing part of this is, we could have infrastructure in place to accommodate people living in their cars like KOAs and public shower and laundry facilities. Living in your car could be pretty doable. Many do so voluntarily on a temporary basis.

However instead we use zoning restrictions to stop such infrastructure and then punish those who are forced to live in their cars. We then use draconian parking and registrations laws to try and take away the only home these people have. Why?

</comment><comment><USER3> This is insane. I heard that 50% of people can't come up with 500 bucks in case of emergency.</comment>


Why Living a Life of Gratitude Can Make You Happy - <AUTHOR> http://zenhabits.net/2007/09/why-living-a-life-of-gratitude-can-make-you-happy/

<comment><USER2> Spiritual truths can be so saccharin.

</comment><comment><USER3> If I thanked you for posting this article, does that mean the advice works?</comment>


Offer HN: Let me build your iOS app for $200 - <AUTHOR>

You can catch me at c.k.howell (at) warwick.ac.uk
Why? I want to add to my iOS portfolio whilst getting a chance to practice and experience building something for somebody else
Why $200? Given that this will be my first time building for somebody else, I want to make it costly enough that I work on interesting ideas but also affordable enough so that the price will accommodate for any beginner freelancer kinks
About me: I have a game on the App Store (https://itunes.apple.com/us/app/firework-flare/id513766705?mt=8), a game ready for release for iOS 7 in October (http://www.chrishowell.me/unibus or http://howell.herokuapp.com/unibus), and have interned at an app development agency (http://www.theappbusiness.com).
How it works:
1. Email me to talk more about your app. Once I'm ready to commit to working on it, we can have a Skype call where we can scope out the requirements.
2. Design: If you have a design ready, I'll use that. Otherwise I'll use the native iOS 7 components. If you don't have a design, some simple diagram of the application flow and views will be necessary. I'll need from you the App Store icon and loading screens.
3. Back-end: If you have one, I'll use that. If you need one, you'll have to build it some other way.
4. Payment: $100 upfront, $100 on completion
5. You will own all the code, but I reserve the right to talk about and put images of the application up on my portfolio website.
6. Given that this app should end up in my portfolio, it's in my best interests to make sure you're happy with your application. To achieve this, I will expect you to be able to respond promptly to emails throughout the development.
Thanks to natasham25 for the inspiration.
If you have any questions feel free to email me or reply to this post. <comment><USER2> I started this "trend" [http://toutouastro.tumblr.com/post/56050201093/stolen- idea](http://toutouastro.tumblr.com/post/56050201093/stolen-idea) and I am happy because it was a good idea :D

<comment><USER2> as an idea : you can create like odesk but for beginner freelancers with prices that are less than 200$ or 100$.Freelancer will use it to start their career and clients will use it to get cheap fees.If you ever did it : you can give 5% or 10% equity as a donation :p

</comment></comment><comment><USER3> prepare for mailapocalypse

</comment><comment><USER4> Just curious, why don't you create an open source app for your portfolio instead? Sometimes (certain kinds of) clients like to see code you've written.

<comment><AUTHOR> It's possible to see code for the unibus app at www.github.com/ceeK/unibus, via www.chrishowell.me, for any clients that may want to view some code.

If you mean full on open source software that I can contribute to, I haven't found a project that excites me enough yet.

</comment></comment><comment><USER5> It's quite quiet in here.

Did anything happen?

$200 seems a nice price...

<comment><AUTHOR> Yep, got 10-20 offers (haven't counted). Working on my first project now and have another client hopefully queued up for afterwards.

I'm thinking of doing a blog post on the whole thing after this project =)

</comment></comment><comment><USER6> excellent marketing strategy.</comment>


Storing information forever in drops of water [video] - <AUTHOR> http://www.bbc.com/future/story/20151122-this-is-how-to-store-human-knowledge-for-eternity <comment><USER2> Homoeopathic data storage?

<comment><USER3> That was my initial thought as well, but the article is referring to holding the DNA that has the information encoded in it, in water.

Title was a tiny bit sensationalist.</comment></comment>


Newborn sleep patterns: A survival guide for the science-minded parent - <AUTHOR> http://www.parentingscience.com/newborn-sleep.html <comment><USER4> For friends and family of newborns:

Hold the advice unless it is asked for (and don't be offended if it is then ignored)

Looking after the baby may not be what the new parents would prefer you to do. Offer to do chores - laundry, shopping, bins, cleaning etc. Don't be offended if they also take the opportunity to sleep.

If you are giving presents - include something that is purely for the mum that is not related to motherhood - great book, fave. magazines, skin care makeup etc. as appropriate.

</comment><comment><USER5> We co-slept with each of our 3 kids when they were newborns (which is not recommended by American doctors but is very common throughout the world) and from talking with friends and family I think we got quite a bit more sleep than the average parent of a newborn, and a couple of our kids have not been particularly good sleepers.

I would also add that I agree 100% with the comments about most advice not being particularly useful and also that sleep/nighttime strategy is dictated a lot by work schedule, breastfeeding/bottle feeding, and whether you co-sleep in addition to the differences in each baby.

<comment><USER6> "We co-slept with each of our 3 kids when they were newborns (which is not recommended by American doctors but is very common throughout the world)"

Remember: all of the statistics and scare stories about co-sleeping are related to alcohol or obesity.

If you are neither drunk nor obese[1], you shouldn't think twice about co- sleeping.

[1] Granted, this does rule out a significant portion of the US population ...

<comment><USER7> I am almost certain that a both non-drunk and non-obese person has somewhere in the history of the world smashed their baby and slept through it.

On the other hand, if you live your life out of 1 in a million fears, your life is not very awesome.

</comment></comment></comment><comment><USER8> My wife is pregnant with our first. I am receiving advice constantly, but will have to wait to see what will be effective. The most interesting advice for me is the Baby-led potty training [1]. If it will work it should probably make nights easier, because change of diapers would go away earlier.

[1] [https://en.wikipedia.org/wiki/Baby- led_potty_training](https://en.wikipedia.org/wiki/Baby-led_potty_training)

<comment><USER6> Here are two unrelated (and unsolicited!) pieces of advice that I think are worthwhile:

First, parents should give serious consideration to sleeping in shifts or sleeping in different rooms. Don't sacrifice your health and sanity on the altar of "healthy couples always sleep together every single night no matter what".

Second, take note of the fact that kids do not generally throw fits about being put in their carseat. That's because they quickly realize that no matter what they do, no matter what happens, no matter what the situation - <USER2> _always_ have to go in the carseat. That's interesting because it demonstrates that you _absolutely can successfully introduce any arbitrary behavior in your child_ ... provided that you enforce 100% compliance. 99% compliance ? Expect WW3. Expect pain. But 100% compliance - you can make that work.

<comment><USER9> This is by far the #1 thing. Humans are adaptable. If you (and partner) stay 100% committed to something kids will accept it as reality and move on. Waver for a moment and they see an opening. Just last night there was a stream of whining and fussing over dinner. After 5-10 minutes of us calmly saying no, sit down at the table, no you can't have something else, no you can't get up and go play they both just gave up and ate dinner with no complaints.

At times it can be a delicate balance between enforcing the rules that are truly important, being sensitive to their needs/capabilities, and letting go of things that don't really matter.

#2 thing is offer perceived choice, or give them a "win". Don't ask if they want to get dressed, offer them a choice between two outfits. Being stubborn about dinner: Do you want a fork instead of a spoon? Put it in a bowl? Some ketchup? Soooooo many times just giving them something to feel in-control about works wonders.

<comment><USER6> Yes - it really teaches you to choose your battles. We have to constantly examine what we're about to say because once we say it, it's law - we have to take it all the way to the (sometimes absurd) conclusion. Sometimes it's better to say nothing at all.

Great advice about "false" choices - those are great. We always give choices like "do you want to get ready for bed now, or in five minutes ?" You can avoid lots of angst with those.

<comment><USER10> How do you guys deal with grandparents / family members / other 'grown-ups' that don't know and or don't follow your 'laws?'

<comment><USER11> That's a different game.

"Grandma lets me do X" is not necessarily the same as "I can now do X all the time", as they will find out the next time they try X at home ...

</comment></comment></comment></comment></comment></comment><comment><USER12> As a new parent myself (my son is two months old), what strikes me is how pretty much everyone has their opinion on how we should feed or make our baby sleep. Some say we should help him sleep in our arms, others say we shouldn't touch him when he's in his bed...

Lately we've decided to put him in his bed and come reassure him if he wakes up, but each time we have to go comfort him we wait longer than the previous time. So we do 5 minutes, 10 min, 20 min, and so on... Usually he sleeps after the 20 minutes mark.

<comment><USER13> For what it's worth: sleep is a learned habit. So if the infant learns to sleep in your arms it's harder for him/her to learn to sleep by themselves in a cot or bed.

But, obviously, what works for you is what's important.

<comment><USER14> As a father of 7, I agree. You have to train your children how and when to sleep or someone is going to be up once or twice every night for years to come.

<comment><USER15> When do you think this starts to matter? I mean, I assume you didn't start "training" newborns by leaving them alone all night, right?

<comment><USER14> Training starts right away but it takes a while to reach the point they're sleeping through the night as defined as '8 hours of uninterrupted sleep three nights in a row'. A wake-sleep-eat cycle will help your infant get there by 12 weeks. This book will save the sanity of new parents - recommended. "On Becoming Baby Wise: Giving Your Infant the Gift of Nighttime Sleep"

</comment></comment></comment></comment></comment><comment><USER16> Nine children here. We were lucky and figured out our kids pretty early. If they act up at night it generally means they're over tired from not sleeping during the day. Worked with every kid for us. One bad night and the next day we doubled down on protecting the daytime nap. Solved it every time.

</comment><comment><USER11> "Hey, remember undergrad? Yeah, it's that, but no thanksgiving break and there's always a problem set due in 3 hours. Have fun!"

<comment><USER17> I don't know how y'all's undergrad experience was, but the worst, hardest day of college is at least ten times easier than an average day of having a baby.

<comment><USER18> I'm taking a year out to stay at home with my new kid. I'm terrified -- my wife did most of the heavy lifting during the day while I worked last time 'round. She didn't have too many complimentary things to say about the experience.

<comment><USER19> The terrified feeling... yes. We have three under two (twins and a singleton), and I felt that way both times. Especially right before the birth. Both times I was relieved to realize that things became more predictable and manageable than the worst-case scenario I had in my head. Every situation is different, but I sincerely hope yours is similarly manageable.

If you struggle, keep your mind open to looking for and experimenting with small tweaks. I've discovered that details such as how tightly a nipple is on a bottle (keep it somewhat loose so air can exchange), or looking for signals like thrashing legs (gas? need to poop?) can make a huge difference. Treat it like debugging code, if that's a domain you are comfortable in.

And may you feel no shame in reaching out for help. I've never understood humility in the way I do now, and I'm grateful that I do.

I wish you the best!

<comment><USER18> The one thing we learned with the first one is that it takes a tribe to deal with a newborn: I simply don't understand America's desire to go it alone with newborns. I've got a list of grandparents, siblings and other assorted people coming through and staying with us for the first six months after her arrival.

After that, we're seriously considering splurging on a nanny... I like to think of it as an investment in my sanity.

<comment><USER20> My first child is three weeks old and I have a very similar support group in place. Yet even with all the help, I too, am strongly considering a nanny - <USER3> feel the thought alone is an indication that I've already lost my sanity haha

<comment><USER21> We did not have support or family close by, I deeply regretted this, doing it all our selves has been really hard, and our kids don't know their grandparents, aunts uncles cousins. It's sad really.

<comment><USER22> Yeah,

Our first is due in April, and this thought bums me out a bit. But we live in different countries, and moving home just isn't an option, so, shrug.

<comment><USER18> I hear you man. We're in Qatar, and one set of grandparents is in LA, and the other is in Bangladesh.

I am fortunate in that I can take time off to meet our grandparent obligations, but damn it would be easier (and CHEAPER) if everyone was in one place!

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER23> We got so much advice on how we should handle the sleep of our baby daughter and we didn't follow any. The first weeks, she was sleeping close to 20 hours a day, which gradually became less. But she showed no real day-night pattern. Also when she was a few months old, we didn't put her to sleep at a fixed time, as it was advised, as we still had a socially active life and just took her everywhere we went. When she got about 9 months old, she suddenly began to want to sleep at 8:30pm and woke up at 7. We didn't pressure her, she just showed us that this is how she likes it and she still wants to sleep now that she is 13months old. So our opinion is: you can try many things, maybe you change something. But in the end, the kid regulates itself if you let it.

</comment><comment><USER4> Best advice we had was 'keep a diary/log' \- started seeing the larger patterns that our fried brains were missing day to day.</comment>


Your Server is not a Pet - <AUTHOR> https://www.madetech.com/news/your-server-is-not-a-pet

<comment><USER2> Well, thank you for your technical contribution, but your lead strikes me as an anti-metaphor that should be avoided:

I give names like Starburst and Stork to my cattle and form bonds with them.

Cattle can actually have as much personality as dogs or cats.

You can't just "put down" cattle if they are sick; they are far too expensive for that and I have spent well over $1000 saving one steer. I just finished getting foot surgery for a bull. Branding is mostly resigned to history although I suppose there are people on BLM land somewhere that still do it. "Put down" usually means euthanasia and that cannot be done or the meat is inedible; instead cattle around here are shot in the head with a rifle at point blank range by the butcher.</comment>


5 Sensible Reasons Why You Should Not Outsource Your Social Media - <AUTHOR> http://blog.outsourcing-partners.com/2011/03/5-sensible-reasons-why-you-should-not-outsource-your-social-media/

<comment><USER2> Looks like someone doesn't get the point of the whole PR branch, and #1 actually describes the biggest mistake of companies who decide not to hire PR professionals.</comment>


Ask HN: Am I too poor for Y Combinator? - <AUTHOR> Since I'm not a citizen of US and have no money even for 3-month rent in sfba, but my startup prototype is a real market need and have solid technology inside of it. <comment><USER2> From: [http://www.ycombinator.com/deal/](http://www.ycombinator.com/deal/)

> _We have a standard deal at YC: we'll invest $120k in return for 7% of the > company,_ [...]

> _We think that $120k is the right amount for founders to be able to run > their company and to live in the Bay Area for around 5-6 months, and > sometimes even longer._ [...]

To get an official reply, you can try the contact form [http://www.ycombinator.com/contact/](http://www.ycombinator.com/contact/) but read first the FAQ, in particular the part about "international founders".

<comment><AUTHOR> But as international founder i wont be able to use those money, since i will have no work permit, so i cant be employed by company as CEO, and by Delawere law i believe using company money for personal spending is a good way to jail

<comment><USER2> IANAL, IANATE, ... I'm just a mathematician ...

It's better to ask them using the form, because they had previous similar cases and have legal counseling. (They have an email address, but I can't find it just now in the webpage.)</comment></comment></comment>


Let's Encrypt and Nginx – State of the art secure web deployment - <AUTHOR> https://letsecure.me/secure-web-deployment-with-lets-encrypt-and-nginx/ <comment><USER2> Very useful and actionable information. Particularly the bits about secure HTTP response headers. Thanks for sharing!</comment>


Ask HN: Are you in Miami, FL? - <AUTHOR>

I'd like to get in touch with other like-minded HN/YCers in the area to discuss ideas, projects and maybe help make Miami another hub for startups. <comment><USER2> The wufoo.com guys are here in Tampa, but I don't know of anyone else in the state.</comment>


Hg and Git : Can't we all just get along? (PyCon Presentation) - <AUTHOR> http://pycon.blip.tv/file/3359640/

<comment><USER2> I view any sort of advocacy of git over hg or hg over git as borderline ridiculous. Any differentiation between the two is so far out in the margins as to be irrelevant.

<comment><USER3> Why? They have substantial differences. Beyond the fundamental data model (DAG for git vs change-sets for hg) they have significant usability differences.

The most obvious of those is the git concept of manually staging commits. That's a core design decision which you interact with on virtually every git operation (and no, DirState does not compare).

Think of it by analogy to python vs ruby. They both _do_ the same thing and are used in the very similar problem spaces, but that does not make them similar technologies nor does it mean proficiency in one is transferable to the other.

<comment><USER4> I agree with you that the two projects have different philosophies on version control, but I'd like to offer some corrections:

1\. Both Mercurial and Git use the same history model; both have DAGs and changesets.

2\. The dirstate is an internal format, and it's analogous to Git's index. You are right though, that Git allows you to manage it manually is a big difference from Mercurial.

I think Mercurial tends to be more conservative in what it allows; it discourages history editing, and it tries to be similar to Subversion and CVS in terms of UI. Git, on the other hand, provides all the power user features - like commit amendment, rebasing, and index management - up front.

<comment><USER5> While I agree Mercurial generally is more conservative I also believe they do this because they have a well used extension system. So you can't really say they don't support power user features when many of them are only a configuration option away.

The real difference I thing is the way they manage branches, because this is part of the repository itself, thus changing it through extensions requires everybody that pulls the repository also install this extension. And if you do this then you aren't really using Mercurial or Git, you have instead created your own DVCS.

</comment></comment></comment></comment><comment><USER6> "Salt Lake City merges."

Merges with more than one parent.

<comment><USER7> To be pedantically accurate, it's merges with more than two parents.</comment></comment>