Alison Macrina: I'm one of the people Jake Appelbaum sexually assaulted - <AUTHOR> https://medium.com/@flexlibris/theres-really-no-such-thing-as-the-voiceless-92b3fa45134d#.7aaunxgr9 <comment><USER2> (The following is not specific to this case or the Applebaum situation. It is more of a general observation based on many current and past cases)

It's disturbing how many stories of alleged or actual sexual harassment/assault involve alcohol. We've figured out that we cannot handle mixing alcohol and driving, and so make an effort to have a "designated driver" so that those drinking won't have to drive.

Is it perhaps time to extend this beyond driving? When interacting with people you might be sexually attracted to in situations where you are going to be drinking, have some designating non-drinkers around to watch over those who imbibe and stop them from making alcohol induced mistakes?

Alcohol is problematic in sexual situations for a couple reasons:

• It impairs the ability to give informed consent, so people who have been drinking often agree to do things that they would not have agreed to had they not been drinking.

• It impairs the ability to recognize that someone else is too impaired to give consent.

This can lead to truly bizarre situations, such as two people each thinking that they are willingly having sex with the other but legally they are actually each raping the other.

I suspect that most people also greatly underestimate how much alcohol it takes to impair their judgement sufficiently for them to get into problematic situations that they would normally easily avoid.

So what can be done about this? No way are people going to give up alcohol, or even give up getting smashed at social events. Can something be done to help those people at least not abuse people while smashed or become easy victims while smashed?

</comment><comment><USER3> Tor developer Isis Agora Lovecruft has just come forward as well, as one of Jake's victims - [https://blog.patternsinthevoid.net/the-forest-for-the- trees....](https://blog.patternsinthevoid.net/the-forest-for-the-trees.html)

<comment><USER4> Call me old fashioned (I'm old) but in my day a man and a woman who were each attracted to the opposite sex and were not related were advised not to sleep in the same bed. I am not defending Jake and believe the victims, but just wanted to make the point that some of the older conventions were there for a reason.

<comment><USER5> I promise you, men and women can sleep in the same bed without either one of them committing sexual assault. Saying that this is inherently dangerous implies that men can't control themselves, which is ridiculous and absolves rapists of responsibility.

<comment><USER6> They _can_ , but experience suggests that it's a high-risk situation: risk of one or both people misunderstanding or poorly communicating their intentions, risk of one party "trying something" and crossing the line with the other, and so forth.

It's better for straight, platonic friends of the opposite sex to sleep in different beds to avoid misunderstandings (or predatory "misunderstandings", for that matter).

<comment><USER5> She unequivocally told him that she didn't want any romantic or sexual involvement.

>As politely as I could, I explained, "You can have the floor, and I'll take my bed, or the other way around. If you're comfortable with it, we can share my bed, as friends. Meaning no physical contact."

True misunderstandings are easily cleared up. Predatory "misunderstandings" are not.

<comment><USER7> Not coming in on any side here, but to clarify this "unequivocal" statement was made years before the incident, it sounds like.

</comment></comment></comment></comment></comment></comment><comment><USER8> I think it's immensely positive that she came forward, although all of this too late, it would have taken a vastly better environment for the people involved to be open from the beginning. Abuse shouldn't fester like this.

<comment><USER9> The outright denials in this thread are one of the many reasons why people don't come forward immediately.

</comment></comment><comment><USER10> > Jake's behavior is representative of a systemic problem, grounded in a star > culture that has allowed individual fame to overpower the ability of the > community to recognize its collective needs.

This is basically personal power in group dynamics. It's found in many in- groups where a person has the power to do whatever they want, yet still remain a vital part of the group.

There's also a fallacy here that a "community" is what people think it is: a group of people who work together in each others' best interests. More often, communities are groups of individuals who sometimes cooperate, but whose priority is still their own position in the group. This is partly why a critical mass of community members coming forward at once is needed to challenge power.

(The other aspect is that a challenge to a person in power is also implicitly a challenge to the other group members who have given them power, which is why you see people either ignore or react personally when a person with power is attacked)

> Calls for police intervention are particularly alarming to hear from a > community in which so many advocate for a stateless society.

We do not live in a stateless society. We live in a society that makes people feel shame, fear and indecision for reporting certain crimes. If you believe in transformative justice, design your education to help people feel comfortable going to the police immediately. No lovey-dovey non-violent community action is going to substitute the fear of repercussions for crimes, such as jail time.

> 1\. We must believe victims, and continue to foster an environment where > they feel safe to report their stories of abuse.

I agree with the second part. The first part implies that anyone who claims to be a victim is a victim, and completely defeats points 2.1 and 2.3. If Jake decried being a victim first, we would be forced to believe him (unless you're going with either gender stereotype or bandwagon fallacy as the determining factor, the latter of which could also end in Jake's favor).

Communities are not impartial and can not police themselves impartially. There's a reason that there are police that police the police.

</comment><comment><USER11> I flagged this because, aside from the connection to the Tor community, there's really nothing relevant here to the Hacker News community. This seems to be a developing issue with no hard facts and lots of he-said-she-said. No positive comments will come from this post.

<comment><AUTHOR> I submitted this because it's intensely relevant to the HN community. This type of dynamic is pervasive, particularly in self-organizing groups (such as many open source initiatives) and understanding and addressing these issues is key to the tech community growing more inclusive and productive.

 _No positive comments will come from this post._

Well it's a good thing that HN isn't just a place for happy, fun joy that you get to experience while people elsewhere are being abused and exploited.

<comment><USER11> Positive doesn't necessarily mean happy fun joy, in the context of HN, I think it means "value was added". Look at the comments this post is generating... Is any value being added?

If this was some kind of article about these people's experiences, then I can understand the value it adds. But this is just he-said-she-said, there's no value here. The guy they purport to be an offender hasn't even been charged!

<comment><USER5> >The guy they purport to be an offender hasn't even been charged!

Courts are not the arbiters of truth, and they may claim to deal in justice, but really what courts can judge is tightly bounded by law and doesn't get into the full moral complexity of day-to-day life.

<comment><USER11> Do you think that random posts on the internet get into the full moral complexity of day-to-day life, then? A couple hundred words is worth more than a criminal investigation?

<comment><USER5> That's a straw man and I assume you know it. Conversations on the internet can be just as nuanced as IRL conversations.

</comment></comment></comment></comment></comment></comment><comment><USER12> As a contrast see [https://mobile.twitter.com/cfarivar/status/74163457267311001...](https://mobile.twitter.com/cfarivar/status/741634572673110016).

If the allegations true, they should prosecute, and should have prosecuted immediately. As well as all the other people who knew of it. And we should continue to work towards a world where that is a no brainer.

Most people are nice. It's only a few people, mostly with unfortunate backgrounds or fates that are not. Let's work towards institutions which handle this efficiently, without the need for mobs

<comment><USER13> "As contrast see" someone who wasn't abused state that they know he's a nice guy? That's not convincing to anyone who doesn't disbelieve victims by default.

The idea that people who suffer abuse are in the wrong by not going to authorities who typically also disbelieve them is poisonous.

<comment><USER12> Contrast as in "here is a different opinion by people who also know him better than most of us". Truth will be found (hopefully) by a criminal investigation, not by by the court of public opinion.

You are right, victim blaming is horrible. That's why I didn't say "they should have said something immediately, now they have lost credibility"

I understand why they might not go immediately and don't blame them for it. I still think the right thing is immediate prosecution. If they don't feel like they will be helped by the authorities _that_ is a problem, which needs to be addressed both on the sides of the authorities (with proper training and procedures) and education (teaching people to prosecute immediately instead of shutting up)

<comment><USER13> The whole point of this type of abuse stemming from authority is to make the abused discredited, typically by recruiting people into one's defense (and, in fact, Alison cites a specific instance where she was recruited into defending). What would be unusual in a case of systemic abuse would be to find no one who stepped up to defend the abuser _who had no direct knowledge of the abuse_.

Their opinion is clearly irrelevant to the question of whether abuse occurred, and that they would offer such an irrelevant opinion is neutral evidence at best.

Also re authorities, you're talking about people on the Tor project, and most systemic abusers are pretty careful to not provide a clear chain of evidence. So you're asking someone to go to an authority they likely specifically distrust to blow up their relationship with their community likely for no gain, since there will almost certainly not be a successful prosecution. I'm sure you can see how this might not be an appealing option.

<comment><USER12> Ok, I see your points there.

I just really dislike this situation where it boils down to "(s)he said/(s)he said" and the idea of "innocent until proven guilty" flies out the window

Another thing I don't get is why they wouldn't prosecute _now_ that the community is already fractured.

<comment><USER13> Thank you for listening! I wouldn't be surprised if there were some sort of legal action eventually, but I also wouldn't be surprised if there weren't -- as mentioned, it's unlikely he left any hard evidence of wrongdoing. Though of course a lot of people who thought they were alone in their abuse are now learning that this was systemic, so they may be able to piece something together.

</comment></comment></comment></comment></comment></comment><comment><USER14> Regardless of what you think about the events that transpired, this thread is a perfect example of censorship and self-censorship.

There's a clear trend here among the posts that get downvoted, and while it is within the rules and spirit of the site to do so, it is at the very least ironic that supposed anarchists and libertarians, who so vehemently oppose centrally mandated censorship are perfectly fine when that happens to advance a narrative they agree with, through an echo-chamber which essentially works as the central authority.

That certainly takes away what little credence there was left to their idea about a stateless society and doesn't paint a pretty picture to the magnitude of a delusion required to somehow, in one's mind, to convince themselves that mob justice is better than the rule of law.

How many people are afraid to speak out here, despite disagreement?

<comment><USER13> _How many people are afraid to speak out here, despite disagreement?_

What, with the horrible consequence of _being downvoted_ looming over them? Probably a lot fewer than are afraid to speak out about charismatic abusers who have threatened to ruin their personal and professional lives if they speak out.

This is a pretty classic example of a common phenomenon -- to paraphrase Alana Massey, people often mistake the discomfort of being confronted with their own violence for the suffering they caused by it. Appelbaum's "victimization" isn't remotely close to the suffering of the his victims.

<comment><USER15> _> What, with the horrible consequence of being downvoted looming over them? Probably a lot fewer than are afraid to speak out about charismatic abusers who have threatened to ruin their personal and professional lives if they speak out._

Downvoted? How about losing your job. Speak out and if your account has your Twitter handle, email, employer, etc. that many HN'ers share (or indirectly share by using the same handle on other sites) - risk having an ideological hate mob targeting you and lighting a metaphorical fire under your employer's ass until you get laid off because they disagree with your beliefs? Shit that has been happening in increasing amounts in the past decade. Plenty of people with the "wrong thoughts" self-censor or remain psuedonymous or anonymous to share their "real" thoughts.

The defense for attacking these people is almost always "They are a bigot/sexist/racist/transphobe/Islamiphobe/___ist/___phobe", often without actual evidence or relying on a he-said/she-said. Which is just a "morally correct" version of attacking someone for their beliefs and opinions. With very few lines and exceptions - I do not think anyone should lose their jobs for having their own beliefs and opinions. It's a very dangerous line to walk.

 _> Appelbaum's "victimization" isn't remotely close to the suffering of the his victims._

Innocent until proven guilty has been tossed to the side I see.

</comment></comment></comment><comment><USER16> Why don't people report/blog about these things immediately? It's hard to tell what can be true or what is just piling on someone who their ingroup decided to hate.

> They included first-person accounts of Jake deliberately intimidating and > shaming people, not taking no for an answer, undressing and sexually > touching a person who was sleeping, and having sex in front of a group with > a person who had repeatedly said no.

So...we're supposed to believe that this guy decided to have sex in front of a group of people with a person who repeatedly said no and gave no consent, and the group just sits there and watches it, and then blogs about it months/years later? What kind of people are these that just stand around and watch an obvious rape go on? Are they accomplices? Liars? People suffering from bystander effect?

<comment><USER5> Why would you not believe that? Bystanders allow heinous things to happen all the time. [https://en.wikipedia.org/wiki/2009_Richmond_High_School_gang...](https://en.wikipedia.org/wiki/2009_Richmond_High_School_gang_rape)

<comment><USER16> The question is whether the bystander effect really happened or not.

I'd like to ask all the people that claim that he raped a random person in front of a group of people: How do you feel about your own involvement in it? Do you feel any guilt at all for letting this guy just rape someone right in front of you?

Also, with your example, the power differential is drastically different. If you have 7-8 people, you can easily coerce a slightly larger crowd to not do anything under threat of violence.

If you have one guy raping someone and 20 people standing around, that is completely different from 1 guy raping, 6-7 threatening people, and 20 watching.</comment></comment></comment>


Minimega – A distributed VM management tool - <AUTHOR> http://minimega.org/ <comment><USER2> I'm one of the minimega authors. A friend pointed out that we made it on the HN front page, so I thought I'd come in and offer to answer any questions people may have.

<comment><USER3> Hello! This looks like a very slick project, but before going down this particular rabbit hole, I'm wondering if you can tell me if I'm set up for success or frustration: I'm running a Debian based hand-rolled 3 node kvm cluster with sheepdog/corosync for my vm image store/cluster management and a fully-connected p2p infiniband network for replication. Would it be possible to use minimega for management of this environment? What features rely on a regular openstack environment?

<comment><USER2> To address the last question first, there's no dependency on openstack at all. If you want to run VMs across the three nodes, it should be fine, and in fact I _think_ the "sheepdog:windows7" disk format might just work in minimega. You should be able to use the Infiniband network for inter-VM communication provided you've got IP-over-IB set up.

Now, to address the unspoken question: _should_ you use minimega for this environment? It depends what you use it for. If you're hosting your mail server on the VM, I'd probably go with something else--we haven't focused on long-running unique/essential VMs, although stability is quite good (I've run experiments for weeks at a time). If you're playing around with network topologies, or developing distributed software, or any other situation where you're running lots of VMs that you may want to tear down and re-launch frequently, it's a great option.

</comment></comment></comment><comment><USER4> Does this use libvirt? It doesn't look like it. Why not? libvirt already provides almost all the functionality you need, you just need to layer a distribution mechanism for configuration across multiple hosts on top.

<comment><USER2> Nope, no libvirt. One big reason for that is, unless I misremember, libvirt needs a daemon of its own. That adds yet another step to deploying minimega on a cluster; as it is, you just copy the minimega binary to every node and run it. If you're netbooting a cluster, adding libvirt is going to make that initrd fatter and make bootup slower. If you're running on a "borrowed" cluster, you may have to convince the owner to install libvirt for you. Basically, we try to avoid external dependencies when possible, to the point where we've even eliminated the two C libs we used to link in.

Additional reasons:

* We already had a lot of experience driving QEMU/KVM manually (before minimega, we'd write shell and python scripts to launch our big virtual environments)

* If we want to do something QEMU supports but libvirt does not, we have to work around that. Since libvirt just wraps QEMU anyway, we avoid the middle-man.

* There's XML in libvirt, and we don't like XML :)

<comment><USER4> But according to a sibling comment, you support containers too (like libvirt)... you must already have an abstraction layer between you and QEMU. libvirt exposes pretty much every QEMU feature in existence, anyway, and allows passing through raw command line arguments to QEMU if you need it.

How does minimega run, if not with a daemon? You can certainly copy a libvirt binary + deps to a bunch of hosts and run it, nothing stopping that...

My guess is that minimega just grew out of your bespoke internal tools, and you never seriously tried to get rid of those tools and replace them with a more standard tool, like libvirt. It's disappointing. We're never going to get a viable alternative to Openstack if people keep writing things from scratch instead of reusing existing tools.

<comment><USER5> _My guess is that minimega just grew out of your bespoke internal tools, and you never seriously tried to get rid of those tools and replace them with a more standard tool, like libvirt. It 's disappointing_

I must have missed the toolchain-police memo that you can only work on one toolchain. This stuff works for them, has a few cool features, and sounds interesting - I will be trying it out. Nothing wrong with growing out of your internal tools, and open sourcing them. By your reckoning, we'd all still be messing around with 386BSD or MINIX

<comment><USER4> There's also nothing wrong with wanting tools to reuse existing platforms rather than reinvent the wheel. minimega looks neat, but I don't want to sacrifice all the other libvirt-based tooling that's out there.

If minimega's virtualization abstraction for a single host was somehow superior to libvirt's, then I would be happy to see them forging ahead. But it's not.

<comment><USER5> _minimega looks neat, but I don 't want to sacrifice all the other libvirt- based tooling that's out there_

Great! So libvirt is a good fit for you, awesome. Maybe other people have other needs or wants, and now they have an alternative that might suit them better. Isn't Open Source neat?

TBH, your argument is starting to sound very much like "libvirt is my tool of choice and I'm pissed that not every available person is working on the betterment of my preferred tool, instead choosing to work on something that is of no interest to me"

</comment></comment></comment></comment></comment></comment><comment><USER6> Seems like a rough equivalent to LXD, but using VM instances instead of containers, and more actual cluster functionality versus just remote commands.

<comment><USER2> It does containers too; we're especially proud of how it uses common configuration when possible. For instance:

      # configure the disk image used to boot KVM VMs
      mm$ vm config disk /home/floren/debian.qcow2
      # give it 4 gigs of RAM instead of the default 2
      mm$ vm config mem 4096
      # configure the virtual network, in this case we call it "foo"
      mm$ vm config net foo
      # launch three KVM VMs
      mm$ vm launch kvm my-vm[1-3]

      # now configure the container filesystem
      mm$ vm config filesystem /home/floren/containerfs/
      # launch 10 containers; they will also get 4GB of RAM and be connected to the "foo" network
      mm$ vm launch container my-container[1-10]

      # start all the VMs that we've launched so far
      mm$ vm start all

<comment><USER6> Ahh, that's great, and helps explain what makes it different.

With containers in addition to VM, it now looks more like a stripped down proxmox that's much more scriptable.

Looks like it would be a good underpinning to implement your own VPS service with "resource pools", where end users get some amount of cores, memory, disk, but can slice them however they want.

<comment><USER2> Yeah, there's a lot of fun things to do with it. Namespaces are especially cool. First you set up your minimega cluster (the nodes can auto-discover each other), then you run e.g. `namespace foo`. This creates a namespace containing all other nodes in the cluster (your machine is considered the defacto 'head' node but you could also add it to the namespace if desired). Now if you launch VMs, they'll actually get distributed among the nodes of the cluster based on available memory & current load. This makes it super easy to go from prototyping on your desktop to running the whole thing across a cluster--add a 'namespace' call at the top of your script and it'll Just Work.

</comment></comment></comment></comment><comment><USER7> Sounds cool.

I am currently managing hundreds of KVM VMs with libvirt, what would convince me to change to Minimega? Is this production ready?</comment>


Tools For Protecting Your Privacy Online - <AUTHOR> http://www.compylr.com/post/tools-for-protecting-your-privacy-online

<comment><USER2> Half of these services are run or maintained by private companies... This is fundamentally something that we can't trust.. trusting our security and privacy to an opaque organization. Any tool needs to be open source and transparent

<comment><USER3> The unfortunate reality seems to be that quality open source versions don't exist for a lot of these. I'd love to hear about alternatives that you know of though.

<comment><USER4> It doesn't matter privacy-wise if service without end-to-end encryption (like Burner, Pastebin or DuckDuckGo) uses FLOSS or not.

</comment></comment></comment><comment><USER5> > Internet Relay Chat (IRC) can be set up to encrypt all messages

Wouldn't SILC[1] be more appropriate than IRC? IRC can be made secure with OTR or FiSH but it's very much insecure by default.

Also, you're probably much safer with Tails[2] than with a manually configured Tor instance.

[1] [http://en.wikipedia.org/wiki/SILC_%28protocol%29](http://en.wikipedia.org/wiki/SILC_%28protocol%29)

[2] [https://tails.boum.org/](https://tails.boum.org/)

<comment><USER3> These are both very good points.

The main reason I mentioned encrypting IRC instead of something like SILC is that many people already include irc in their daily workflow. Adding settings to a client you already use may be less intrusive than picking up a new protocol altogether.

</comment></comment><comment><USER6> surespot is a free and open source mobile messenger encrypting all messages end-to-end with 256 bit AES symmetric-key encryption using keys created with 521 bit ECDH shared secret derivation. www.surespot.me was built from the ground up to provide this exceptional security in an unobtrusive way, this is not a layer over something existing. surespot is like whatsapp but actually encrypted! group chat on the way.

</comment><comment><USER7> And Bitmessage. It's a good substitute for email, Twitter and chan boards. It's a fork of the Bitcoin code.

[https://bitmessage.org](https://bitmessage.org)

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

</comment><comment><USER8> Please consider Forward-Phone-Number as a complimentary to Burner App service with phone numbers in 40+ countries and Bitcoin acceptance.

Here is a direct link: [https://forward-phone-number.com](https://forward- phone-number.com)

Disclosure: I work for them

</comment><comment><USER9> I don't understand how setting up a VPN on my local network would secure the information. It seems like you'd need to sign up for one of these vpn services so the exit node was elsewhere. Am I missing something here?

</comment><comment><USER10> I appreciate that he wrote this up for the general population, but I don't feel this is really worthy of getting on the front page of hacker news.

I mean, is there anything on there you honestly didn't know?

<comment><USER11> I can say I've _heard_ of all of the items but have I used them so I could say I _know_ them? No. I would expect this to be the case for majority of HN readers, quite frankly.

And I'd consider myself rather paranoid even, at least among the social circles I'm part of.</comment></comment>


Quarter of Media Temple users suffering 18+ hrs downtime - <AUTHOR> http://weblog.mediatemple.net/weblog/category/system-incidents/2009-02-28-cluster-2-unavailable/

<comment><USER2> The problem that I have with mt is that they sell themselves as the "don't worry, put your site with us and nothing can go wrong" company. And that can never be true. No one can make promises like that, but those promises mean that they don't tell you things like backup strategies, replication, data centers, etc. And so you're just left with a promise that they've taken care of everything.

While I don't expect a company to tell me everything, I much prefer Amazon's take on the issue. For example, they specifically quote an annual failure rate that they expect and offer S3 snapshots (which are replicated across multiple boxes in multiple locations) as a backup. No hype or promises; just the knowledge I need to make sure I don't loose data.

With companies like Slicehost, Linode, or Amazon I know what I'm getting: a Xen instance with a certain amount of RAM. I can then replicate data, take backups, etc. to make sure that my site stays up and running. With Media Temple, I just get the promise of "hundreds of servers working in tandem to power [my] websites". Clearly it isn't 500 servers just working on my site or anything like that. So, what is it? It's a mystery and I find that when companies try to be mysterious, it's not because they're giving you more; it's because they're giving you less.

</comment><comment><USER3> Glad I switched from them. Such an overhyped company. I've been on Slicehost since February 23rd of last year and have absolutely no complains. On (mt) I got shoddy support and a lazy staff (how the hell can you promise svn without ssh support for that long), for an incredibly overpriced hosting service.

<comment><USER4> Me too, +1 slicehost

</comment></comment><comment><USER5> (mt)'s gs offering has been absolutely terrible for us. Since the summer uptime and support have both been equally awful. The only redeeming quality of the gs service is the insanely large storage (100gb).

</comment><comment><USER6> We have about 30 sites hosted with them and I have been none too pleased. The service is shoddy and disapointing. Currently, they are running Subversion 1.4.2 on the gridservers packages, which is nearly 3 years old. I've asked if they can upgrade to 1.5.x with no avail.

Our customers constantly complain that their sites are down, even if only for minutes at a time. I know we're only paying $20 a month for about 10 separate accounts, but I get better service from Dreamhost.

I think they're overpriced. I've dealt with tons of shared hosts for much less with better service. It seems like people get suckered in with their pretty website and the fact that a lot of big sites us them without doing much research.

</comment><comment><USER7> Ouch, that's terrible. I'm glad I switched a couple of months ago -- if I didn't this would've affected me. :/

Anyone else notice how all of the sites on (mt)'s (gs) client page happen to be online every time there's a major outage?

</comment><comment><AUTHOR> It gets worse for those affected: [http://weblog.mediatemple.net/weblog/2009/03/01/cluster-2-im...](http://weblog.mediatemple.net/weblog/2009/03/01/cluster-2-important- update/)

Sounds like there's gonna be some financial compensation according to some messages from MT on Twitter to customers voicing their disapproval at the now 24+ hours downtime.

</comment><comment><USER8> People pay only $20 per month and then complain like they're paying for hosting at rackspace. The service is a great value for what it provides. If what you're doing is that vital, you shouldnt be hosting it on a grid server at media temple

<comment><USER4> Alternatively just pay $20 to Slicehost or Linode and get better service, oh, and skip the 18 hours downtime; but sure you're right, when you pay $20 you shouldn't complain when you receive a crap service--whatever.

</comment></comment><comment><AUTHOR> 20 hrs now. It's not looking good... So glad I'm on cluster 4. Twitter is full of unhappy campers.

This has been compounded by the outage earlier this week too on the same cluster!

<comment><USER9> > So glad I'm on cluster 4.

So glad I lease real servers.

<comment><USER10> I'll second that. Rackspace ain't no $20/month, but as with most things, you get what you pay for.

The only recent downtime was an instance a few months back where I fat- fingered an iptables config. A tech was on the pulling up the console and cleaning up my mess while I was still typing out a support ticket.

<comment><USER9> Rackspace is on the very high end of the cost spectrum, and the service really isn't that great. But at least their servers are fast and real, if you/your organization doesn't care about the budget, they're probably as good a choice as any as far as quality of infrastructure goes.

Just make sure the person signing the hosting contract actually reads it, also. You might be surprised to find what they try to bury in there.

It's worth noting that they bought out their lower-priced competition at ServerBeach.

<comment><USER11> >> _"and the service really isn't that great."_

Not sure what/who you consider "great" then. Rackspace has been stellar for us–always available on the phone; answering tickets fast; alerting me when there are problems.

I've never had a bad cs experience with Rackspace. (I've got 6 servers with them)

<comment><USER9> Their technicians once left 2 active network interfaces down for 45 minutes on one of our servers when upgrading something and didn't fix it until we called them.

They're just overworked like most NOC guys.

</comment></comment></comment></comment></comment></comment><comment><USER12> My non-essential sites are down (I didn't notice until I read it on HN). Good thing I'm hosting my emails on Gmail or I'd be getting calls from friends I host for free.

</comment><comment><USER13> I just cross my fingers hoping this ain't gonna happen to our customer's site (Cluster #: 1 Storage #: 4). Maybe they will become a better hosting after all.

</comment><comment><USER14> I'd never heard of Bluearc before. Anyone else played with Bluearc storage gear?

<comment><USER15> I have. If you need a really high performance NAS it's a reasonable choice. Better price:performance than NetApp, but still not priced as low as it should be IMHO.

FPGA powered: <http://www.spec.org/sfs97r1/results/sfs97r1.html>

</comment></comment><comment><USER9> We just transitioned a customer off of MT onto some cheap dedicated servers with Amazon S3 storage and not only did their hosting costs go down, the performance went up dramatically.

In the business parlance of today, my stakeholder expectations were not aligned with their soup to nuts value proposition.

<comment><USER16> The 'grid' has TERRIBLE database performance and always has.

<comment><USER9> They better think of an interim solution, because databases with schemas are not going away for quite a while, even if they are eventually going to be replaced by giant single key hash tables like everyone is clamoring about these days.</comment></comment></comment>


Amazon will cut prices at Whole Foods - <AUTHOR> https://www.theverge.com/2017/8/24/16198736/amazon-completes-whole-foods-acquisition-lower-prices-avocados <comment><USER2> Further discussion [https://news.ycombinator.com/item?id=15094529](https://news.ycombinator.com/item?id=15094529)</comment>


Pirate Bay Releases 'Pirate Browser' to Thwart Censorship - <AUTHOR> http://torrentfreak.com/pirate-bay-releases-pirate-browser-to-thwart-censorship-130810/ <comment><USER2> > They are also working on a special BitTorrent-powered browser, which lets > users store and distribute The Pirate Bay and other websites on their own.

Great idea.

If this came as a plugin, it would probably spread faster.

(This is btw how I think any next-gen social network should work - no more central servers, everything distributed.)

<comment><USER3> We could call it Diaspora!

</comment></comment><comment><USER4> The link shown in the screenshot is [http://uj3wazyk5u4hnvtk.onion/](http://uj3wazyk5u4hnvtk.onion/) but I thought TPB's "TOR hidden service" link was [http://jntlesnev5o7zysa.onion/](http://jntlesnev5o7zysa.onion/) . I wonder what's going on.

<comment><USER5> You can use tor2web to (slowly) browse .onion sites. [https://uj3wazyk5u4hnvtk.tor2web.org/](https://uj3wazyk5u4hnvtk.tor2web.org/) looks like TPB to me.

<comment><USER4> But that was my point; _both_ sites look like TPB. Which is the real one and which is a potentially logging proxy?

<comment><USER6> What guarantees do you have that the real one doesn't log?

<comment><USER4> OK, none. But at least the real one has a proven history of not injecting malware. Or something, I don't know. Logging was just an example of what a malicious middleman might do.

<comment><USER7> The real one that peddles trashy spyware, scamware and toolbars for revenue?

<comment><USER8> Here I was wondering if your statement was FUD from someone who revenue comes directly from the game industry, or if the statement was based on facts.

To that, I went to the old hidden service url, and looked at what kind of ads was presented[1]. Did I see any spyware? No. Did I see any scamware? No. Any toolbars? No.

What I did find was sex ads of plenty. That makes sense. What other businesses would risk being accessory to copyright infringement, but an industry that often need to hide themselve (unjustly, but that's an other story)? An obvious observation from the trial is that any kind of trading with the TPB, be that bandwidth, hosting environment, electricity or anything whatsoever can be enough to land you in jail for accessory charges.

Conclusion. benologist comment was FUD, likely influenced by his own revenue source. However, if he provide a source for his statement, I am fully willing to change my opinion.

[1]: (first time I ever went and looked for ads)

<comment><USER7> [http://imgur.com/Bma34Ml](http://imgur.com/Bma34Ml) [http://imgur.com/eDcgGKJ](http://imgur.com/eDcgGKJ)

1) Those big green buttons everywhere are some adware-slash-spyware-slash- shitware-hard-to-remove installer for iLivid which hijacks browsers, installs toolbars, etc: [http://community.norton.com/t5/Norton-Internet-Security- Nort...](http://community.norton.com/t5/Norton-Internet-Security- Norton/ilivid/td-p/841500)

2) The banking thing is a get rich quick scam: [http://www.banker- secrets.com/](http://www.banker-secrets.com/)

3) "Anonymous download" is another random installer.

4) The "play now" / "watch now" images are ads for some scabby online streaming video site that doesn't even have the advertised video, just a Google Adsense block over a different video.

5) Unseen, below the fold they recommend a torrent client that is "No Spyware, 100% Free 100% safe and Trusted", and pays for every install that kindly bundles even more shitware: "Nortan Security Scan", "Babylon Toolbar", "IWantThis", "DealPly", "BrowseForChange", a Firefox addon and a Chrome addon: [http://www.bitlordapp.com/uninstall](http://www.bitlordapp.com/uninstall)

6) Also unseen is a popup peddling some shitware called MacKeeper: [http://www.cultofmac.com/170522/is-mackeeper-really-a- scam/](http://www.cultofmac.com/170522/is-mackeeper-really-a-scam/)

It doesn't take billions of pageviews a month riddled with this garbage to pay for servers or bandwidth unless they got locked into a multi-decade contract a decade ago and now operate on an enormous fleet of decade-old servers at decade-ago prices.

Conclusion: It's really easy to believe these guys are "fighting for you" because that's the image their PR machine has very carefully cultivated while exploiting _everyone_.

<comment><USER8> I guess you must be visiting their regular un-tor site, and not the two tor addresses above. The ads there wouldn't even load, and only showed "Your ads here" text fields, except for the pop with porn/gambling. The green bars to iLivid is still there through, a fact they share with download.com

Disliking the download manager is indeed a fair point, but I don't see how its connected to which tor site is the official one. Both links to it.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> They should have named it after a real pirate ship : [http://www.noblesandcourtiers.org/famous-pirate- ships.htm](http://www.noblesandcourtiers.org/famous-pirate-ships.htm)

Delivery sounds fine.

</comment><comment><USER10> I've frequently heard complaints that bittorrent folks using Tor put unhelpful strain on the network--is the distribution of this browser going to be a problem in that way?

<comment><USER11> This has nothing to do with routing Bittorent traffic.

<comment><USER12> Yes, the package as is will not route the bittorent traffic over tor, but since this is for people who don't even know how to use proxies, some of them will probably start configuring their torrent clients to use the same proxies.

<comment><USER13> If they don't even know how to use proxies, I somehow doubt they'd even consider fiddling about in their BitTorrent client's proxy settings. How would they even know what to put in there?

<comment><USER14> Checked out YouTube lately? Some content isn't bad, but there seems to be just as much noise that gives horrible advice and no one should waste their time watching.

</comment></comment></comment></comment></comment><comment><USER15> Potentially stupid question – how is this different from the Tor browser bundle?

<comment><USER11> It appears that this is designed to prevent censorship, as opposed to Tor's broader goal of anonymization.

</comment></comment><comment><USER16> Cool, but why not Opera in off-road mode?

<comment><USER17> Because opera is just reskinned chrome.

<comment><USER18> How so? There's more to a browser than a rendering engine you know.</comment></comment></comment>


Eyewitnesses describe brutal beatings by HK police - <AUTHOR> https://www.latimes.com/world-nation/story/2019-09-02/hong-kong-police-violence-protesters-eyewitnesses <comment><USER2> What can you do about this? Pretty much nothing. China is the second largest economy in the world, and has the second most powerful military. In addition, what they view as the integrity of China is one of their biggest priorities. In addition, they have always viewed British control of Hong Kong as a national humiliation and are bent on erasing all traces of that memory.

The way it stands right now, China can inflict a lot more pain, and is likely willing to endure more pain that the rest of the world is likely willing to inflict on China because of their behavior in Hong Kong.

Basically, the fate of Hong Kong was decided in 1985 with the Sino-British Joint Declaration which ceded Hong Kong back to China in 1997. If Great Britain, and the rest of the world did not have the will to resist China taking control of Hong Kong in 1985 and 1997 when China was a lot less powerful, a lot less developed, and a lot more susceptible to pressure from the rest of the world, there is no hope for now.

<comment><USER3> Well even though my minority position on this issue will downvote my comment I will still write it. As most on this thread are not willing to talk the real culprit behind this protest which is economic inequality and no hope for future development.

As I mentioned in my earlier posts, these protests are manifestation of inherent economic inequality in Hong Kong society.

The youth in Hong Kong cannot afford a house. The whole economy is standing on a giant real estate bubble under the control of 14 rich billionaires.

This protests can already be foreseen when property was becoming unaffordable without an increase in salary, it was just a matter of time.

Britain is as much to blame for this situation, they never had intention to grant autonomy to Hong Kong and didn't do it for 150 years, they were very clever, as they did in every colony, to let the subsequent administration take the blame in this case Chinese which indeed granted more autonomy than British to Hong Kong.

Britain can cry crocodile tears now as much as they like trying to align with protestors. But they are the one to blame. Hopefully they can correct the mistake by granting full citizenship to Hong Kong permanent residents who wants it, otherwise whatever they say is a farce. Same goes for USA, if they want solidarity with Hong Kong protestors grant them unconditional asylum or permanent residence, rest all talks are worthless.

<comment><USER4> So why haven't the protesters said this is one of their main issues?

<comment><USER5> Universal suffrage is a great way to get a lot of this changed. If your only choices for CEO are billionaires or their friends, there isn't much you can do (if you can vote at all).

<comment><USER3> Economic issue should have been raised in protest and could have converted to mass movement to reject a house of car park size or make it illegal for developer to build such home. Force government through peaceful protest to take measures like Singapore for house, health and education.

Universal suffrage is not a panacea, indeed in many democracies money decides who become the head of state. In two largest democracy USA and India its not possible to win elections without the support of billionaire or being a billionaire.

Funny part in Hong Kong Uber is illegal and Taxi license is traded at astronomical prices and govt can't do anything due to powerful taxi union lobby (consisting mostly of taxi owners), they also involve in HK CEO election. In universal suffrage it will still be similar large number of bodies with vested interests.

So a structural change won't happen unless it's really part of the protest.

Recently read one another view on democracy quite interesting, although do not agree with it. [1]

[1] [https://www.politico.com/magazine/story/2019/09/08/shawn- ros...](https://www.politico.com/magazine/story/2019/09/08/shawn-rosenberg- democracy-228045)

<comment><USER6> Are you familiar with Hong Kong's public housing system? [1]

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

<comment><USER3> I am pretty familiar with it and how it failed the Hong Kong people, when government worked in the interest of billionaire real estate developers. The house ownership ratio will itself reveal the reality.

Singapore learned from Hong Kong but did it much better and today one of the best example of public housing (they call it Housing Development Board - HDB). I will not go into details but its a topic of its own to discuss issues of Hong Kong real estate and get rich quick ideas based on it.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> Why don't they include some videos from the scene? People today don't read and they only include one photo of a guy with his head in his hands...

I'm glad they talk about it but I wonder how much impact this article actually has...

</comment><comment><USER8> During yellow vest protests, we've seen thing as violent, and France is not China...

<comment><USER8> I realized my post was not clear. I 100% support HK protester! I 100% condemn HK police and authorities.

Just wanted to point that despite the fact most of us live in democracy, police can act super violently against protestors, and we don't necessarily realize it before it happens. We need to support HK protestor, and also keep fighting for democracy where we live

<comment><USER9> In a democracy you have recourse when abused by the police. In a dictatorship, police is just a tool of the ruler to control the population.

<comment><USER8> In France you officially have recourse, but there are many ways to make it ineffective most of the time... Very few policemen end up in a court, and they (quite) never goes to jail even if they had a protestor eye out. And decision makers are never bothered...

</comment></comment></comment></comment><comment><USER10> Once the CCP (Chinese Communist Party) consolidates control, this is what HK protesters have to look forward to:

[https://chinatribunal.com/final-judgement- report/](https://chinatribunal.com/final-judgement-report/)

</comment><comment><USER11> How can people in Europe and US help?

<comment><USER12> By staying out of it. Hongkong belongs to China just as Catalonia belongs to Spain, or California to the US. Imagine China interfering with that.

<comment><USER13> I'm probably a bigger fan of self-determination than you: if the people of HK, Catalonia or California wish to follow their own road, I support them, but they need to work that out on their own. When those movements are even partly the product of foreign intervention and are given uncritical coverage in the western press, that is a giant warning sign. We've been there before many times yet we never learn.

<comment><USER14> >When those movements are even partly the product of foreign intervention

Do you think that is the case in HK?

<comment><USER13> Yes, I think that that is the case, based on the following elements.

1\. Contacts between US consular staff and HK opposition leaders.

2\. Funding by the US 'National Endowment for Democracy' of several Hong Kong groups.

3\. My observations of the western media coverage of the events in the province of Xianjiang.

4\. My observations of the similarities between the events in Hong Kong and other 'colour revolutions' that have the fingerprints of Washington all over them.

<comment><USER14> Would any contact with locals or funding of any organization of any kind that might be sympathetic to the protesters cause be "foreign intervention"?

It seems like this is such a low bar that it would mean that nobody else could associate with people in HK without it declared "foreign intervention".

Let alone that you could declare just about anything "foreign intervention".

<comment><USER13> I agree partially. The limits of 'acceptable' foreign intervention are not black and white. My feeling, based on what I observe, is that western intelligence services are all over this. Foreign intervention in Syria and Lybia started quietly enough alright through unofficial meetings with opposition groups. It's obvious that many Hongkongese are legitimately concerned about their political and economic future. Foreign money and promises at just the right moment can be wielded to manipulate people that are more or less well intentioned initially.

<comment><USER14> It's strange the differences in perspective here as with Syria and Libya ... IIRC there was little in the way of any mystery as far as who sided with who and their involvement, yet some folks portray those events as some sort of semi secret war.

Those events have also become the poster child for some regimes to use to warn people about opposing them.

<comment><USER13> A semi-secret war? Surely a very mysterious war, at least to me because conventional reasoning does not allow me to understand why western governments encouraged putches that destroyed stable governments (imperfect but far, far superior to the alternative) and subsequently armed 'moderate' groups whose morbid ideology differed little from the ideology that we're all supposed to combat ('...right?').

Unfortunately, our press doesn't ask the hard questions. No one is held accountable for the death and destruction that these policies have created. So western governments go on and try to apply the magic formula again. I believe that they are doing the same in HK.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER15> More brutal than in France?

Funny how everyone just moved on about French protests.

<comment><USER16> Because you were rioting over a fuel price increase and destroyed a city. That's embarrassing. I wouldn't hijacked a thread to compare yourself to HK people fighting the CCP for the right to vote.

</comment></comment><comment><USER17> World has no balls

</comment><comment><USER18> Why did this story get flagged? I found it interesting and learned a bit more about the topic.

<comment><USER19> I flagged it. It is political news and has no place on HN. It's a slippery slope to even more stories about politics and current events, that have nothing to do with the site's raison d'être.

(BTW I'm just a regular user, not an admin or speaking for any admin)

<comment><USER20> HN is not only technical news. It is all news which is of interest to the community at large including economics, politics, philosophy and so on. HN is not slashdot.

<comment><USER21> Slashdot still exists?

Anyway, yes, HN isn't just tech news, but it does seem to have a strong aversion to highly political topics because they always, always devolve into angry arguments and HN values "civility" over all else. So the parent is right IMO: this really doesn't seem to be a good place to discuss this.

<comment><USER20> It doesn't seem to usually devolve into arguments (heated exchanges), but it does tend to include debates. Just because not everyone agrees with you (or even each other) doesn't mean the topic isn't worth discussing, or that the comments are uncivil.

<comment><USER21> >Just because not everyone agrees with you (or even each other) doesn't mean the topic isn't worth discussing, or that the comments are uncivil.

Maybe you haven't been paying attention, but these discussions usually do tend to devolve to incivility. Whether the topic is worth discussing is another matter; this site doesn't like uncivil discussion and tends to quickly ban people when this happens, so it makes sense that it would simply avoid these discussions altogether. These days, if you want civil political discussion, you either need to keep out people with very different opinions (so more like- minded people can discuss finer policy points instead of constantly arguing over extremely fundamental differences of worldview), or you need to have an extremely involved and active full-time moderation team to keep things civil.

<comment><USER20> > These days, if you want civil political discussion, you either need to keep > out people with very different opinions

That's called an echo chamber. That isn't discussion, it's just playing with yourself.

> these discussions usually do tend to devolve to incivility

This the internet, anyone is free to comment, and some amount of those comments will be in-civil. Don't reply to them, flag/report/downvote as appropriate. However - if a comment is one you disagree with, and you think it's uncivil, it's probably best to just take a step back because human bias (whether it's me, or you, or any other random HNer) is strong.

> you need to have an extremely involved and active full-time moderation team > to keep things civil

In my experience, while a moderation team can do a lot of good, they can also simply turn a given community into an echo chamber of the moderation staff's views. See /r/politics on reddit for an example of this.

Next time you find yourself headed down the path of what seems like a disagreement turning into a real argument, take a moment to restate the points of your opponent you agree with. I usually use something like "So here are the points I think we agree on..."

Then, I usually like to highlight what seems to be the fundamental difference between the two statements, "It seems like we're in disagreement over X".

Don't assign value statements or qualifiers here. Your goal isn't to help or hinder any side of the argument when you do this, it's just to re-align the participants.

Often when people get upset in a discussion, it's because they feel like they're not being heard. They're making a case, and you're arguing something else, which causes frustration and anger. Taking a moment to re-align indicates you are listening to your discussion partner (or if you aren't being a good listener, will help find where you went off track).

<comment><USER21> It's not an "echo chamber" if you just don't want to talk to people with polar-opposite views. You're not going to have a productive discussion between, for instance, anyone on the left and a group of neo-Nazis. Excluding neo-Nazis from a discussion doesn't make it an "echo chamber".

As for being heard, maybe the problem is no one wants to waste their time and breath dealing with people with such different views. When literal decades have gone by and those people still cling to same views, there really isn't much point in trying to change their minds now.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER22> China is too big and needs to be broken up!</comment>


There's no shame in code that is simply "good enough" - <AUTHOR> http://blog.phiz.net/theres-no-shame-in-good-enough <comment><USER2> This actually causes "coder's block" in me when I start a new project. If I have this cool app or site idea, it often never gets off the ground because I spend too much time trying to create some architectural framework that I assume I need.

This is REALLY bad for me in Cocoa/Cocoa Touch apps. Objective-C is so verbose and writing classes is so "mechanically cumbersome" (having to write .h and .m files and duplicate stuff, for example) that I sometimes lose interest before I ever really get off the ground.

The trick I use to beat this tendency is to totally eschew good software engineering principles at first. Typically all of my code lives in main.m (and I usually start out in CodeRunner rather than XCode). Interfaces are done sloppily in Interface Builder or entirely in code. This really helps me get started.

Before long, of course, I have this unwieldy spaghettified mess of a single source file. By that time, though, I have some stuff WORKING, so doing some refactoring into a good architecture for the code I have while keeping the working stuff working is kind of fun.

<comment><USER3> I find that the limited free time (wife, kids, etc.) I have available for side projects forces me to prioritize. If I gold-plate everything, nothing will ever get done, so I simply don't write code that's not absolutely necessary.

I will code _very_ thin "frameworks" if it becomes obvious that it will save time over the long haul, but there is no "this might be useful someday" code. If it doesn't move the project forward, it doesn't get done.

If your most precious resource -- time -- is limited, it forces ruthless prioritization.

<comment><USER4> Yeah, this is basically my approach too; my first priority when "banging out an idea" is /get it working/ and make a "minimum viable product" (or tool, utility, script...whatever). If it's awesome, I might consider re-writing it, learning from the mistakes or architectural flaws of my first design. Note that the very first revision can usually be dropped in favor of a paper design of the thing, where you can visualize the flaws before writing the first line, and correct them before you start typing.

There are also things that I have that technically work, but are ugly, but are never getting fixed. I learned from them and it's fun to look back at how much better I got over time. I could probably go back and turn everything into nice classes and remove big blocks of commented-out code, but...it'd be pointless. I'd rather work on something new and do it better the next time. Tackling exciting new problems is what makes coding interesting for me, and I'd hate to lose that "just" to be proper.

I like to think of my lang dirs in my homedir (ruby, c, python, js, php, etc) as language-specific "coding sketchbooks" where I'm developing recipes that I might borrow from later. It's kind of similar to being a chef, I suppose -- you finely craft and refine dishes for your day job ("staging/production"), maybe you're lucky enough to get some paid time to work on your ideas ("dev"), and you dedicate one night a week to culinary experiments on your own time, maybe with friends or family ("passion").

I feel like a good programmer is like a good chef, and if you lose the passion, you mostly stop getting better.

<comment><USER5> It's important to get your hands dirty and do a bottom-up approach, but it is equally as important to think top-down as well. What I mean is don't be ignorant of the "gold plate" while you are creating the minimal viable product, but be flexible enough so that it doesn't get in your way.

</comment></comment></comment></comment><comment><USER6> Joel Schindall, an EE at MIT, tells a good story about this:

The ship date for a chip he was managing was just a few weeks away when he got a call from a supplier informing him that a key component would be delayed. Worried, he went to one of the engineers who designed the chip and told him of the problem.

The engineer was not concerned; "I thought they might not deliver that component, so I left extra space around it where we can add these additional parts that do the same thing."

Joel was happy, but surprised, and he took a closer look at the chip. "But you didn't leave extra space for other components on the chip."

"Yeah," the engineer replied, "I just didn't think those would be a problem."

One of the harder jobs in engineering and design is anticipating problems. That engineer took the time to think carefully about the problems that might arise with each of the components on the chip, prioritized the risk, and only spent the time to really carefully architect the parts of the circuit that were most likely to be trouble.

It seems that software is the same way; the best coders will assess the risk of all the code they write, and only spend their time and energy to protect against the problems that are most likely to arise. That leads to code that is better than "good enough" but is not over-architected. Of course, that intuition is really hard to develop and impossible to perfect.

</comment><comment><USER7> "Would an engineer design a small, single lane bridge for a rural Northumberland village so that it could support the weight of a thousand double decker buses? No. So why do we, as software engineers try to do exactly this? That day will never come."

It comes every time a boss or client says "oh, and now we need it to do XYZ. And you can't rewrite or start over. We need it tomorrow. Build on what you have - reusable software is our goal." and so on.

No one is going to go to a bridge engineer _after_ a two lane bridge is up and running, and that took 2 years to build, and say "ok, add 4 more lanes by next week. Oh, and you have no budget". No one in their right mind would ever dream of doing that. But with software we face it all the tim.

Basically, many of us are conditioned to have to extend on top of whatever our first iteration is, so we try to make the first iteration extendable. I'm not saying it's _right_ or _good_ , but I've fallen in to this trap too many times in my career and seen it happen to too many other people to think it's not a contributing factor.

<comment><USER8> I can tell you from first-hand experience, though, that if you cannot scale immediately when the time comes, your business can drastically suffer for it.

<comment><USER7> I don't disagree, but a few points spring to mind. And in my earlier post, I wasn't really thinking about 'scaling', but new functionality/features.

Occasionally "immediately" really does mean "in the next 5 minutes". Oftentimes it actually means more on the order of days or a couple weeks. "Scaling" can mean different things, and anything beyond "scaling" web requests alone will likely mean a shift in business operations that can't/won't happen overnight either.

In _most_ situations where I've been in where people request something, but the rest of the business unit really isn't ready to handle the change. "We need the new data reports _now_ " but when you make the change you realize the other company who pulls the data to process it is on vacation and won't be back for two weeks, and if you make the change now, then it'll break everything.

<comment><USER8> Yeah. I was only referring to scaling in the sense that the number of users increases. Often, it is easier to implement an application by ignoring scalability, and you can get it out the door quicker.

However, this can be a terrible mistake if your users are not resilient to downtime or lost data (e.g. in the case of Facebook games). Even just a few hours of downtime or slowdown can cause a significant, permanent drop in users.

</comment></comment></comment></comment><comment><USER9> Always keep in mind the great Larry Wall quote:

"Always write code as though it will be maintained by a homicidal, axe- wielding maniac who knows where you live ..."

There are two ways to write poorly maintainable code. One is poorly organized spaghetti code and the other is overly architected code.

Larry Wall also once said, "a programmer can write in assembly using any language."

<comment><USER10> Never realised Larry Wall was a Young Ones fan.

</comment></comment><comment><USER11> The key I've found is not worrying about how beautiful or clever the code is, but how _maintainable_ it is.

If the code is designed properly, the only requirement I have is that I can go back into my code and change it easily to what I now need it to do. It should be malleable like silly putty. If I can do that easily, without requiring massive rewrites, then this means that the code can change as my requirements change, and that to me is a good design, and "good enough" code. So don't worry about optimizing too early, but make sure the code can be optimized easily when you need it to be.

If I want to make code changes that requires massive rewrites when my requirements change a little, then it means I've coded myself into a corner, and I've done a poor job designing the code.

<comment><USER12> This has to be tempered, though, with some consideration of how likely it is that the requirements will change. Of course we might say "requirements always change" but there are definitely situations where to know with a high degree of certainty that you are writing something that will be used once or a few times and never again, or something small enough and well defined enough that the requirements _can't_ change much. If you worry too much about maintainability on code that will never be maintained, you're wasting time.

</comment></comment><comment><USER13> Agreed with much of this!

However I disagree with "that's the nature of software engineering. You never stop learning and evolving."

The reason: burnout. My guess is that at least 10% of developers begin to lose enthusiasm for coding after a few years and then at some point either change jobs, become managers, or just have very little motivation to learn having seen the futility of it all. They may be forced to continue to learn, but may do so at a slow pace.

Why? You write code and after years or less, it can be thrown away or unused without much of a thought. You see that many of those driving projects really don't have some sort of higher purpose, and other than some perceived business need, must of it is just "wouldn't it be nice".

I feel that it is sick for a person to continue blindly learning new technology just for the sake of it. You need to have a reason. Jobs was not my favorite person in the world, but one thing he did right was to believe in what he was doing and why he was doing it. Without this, any evolution is worthless.

<comment><USER14> I agree with this for the most part, this is one reason I have fallen in love a bit recently with RAD frameworks, personally I have been using Spring Roo, which is somewhat similar to Ruby on Rails, but for Java, from what I understand. Basically, when working on a project, I want to take the shortest route to accomplishing the end need, maybe it won't be immediately scalable to thousands of users or fully optimized but as long as you don't paint yourself into a corner that can come later. I have noticed a lot of other developers are so caught up in the minutia that they can't see the forest for the trees, they care more about endless iterations, writing test cases, etc than just delivering something that works.

<comment><USER15> Agreement; the more I code the more I want to find "quick iteration" solutions and minimize deliberate engineering of complexity.

I know a few coders who have spun their wheels for a decade or possibly longer because they're still idealizing wheel reinvention. The reinvention is the _easy_ part - after all, someone already did it, so you're just learning what they did, "the hard way." What's hard is learning to leverage the ecosystem as much as possible while bringing in original ideas; as in entrepreneurship, there are no tutorials for that.

<comment><USER14> yep, I just found myself saying something like this the other day when talking with another engineer about the issues at the current company I work for. Its my belief that modern web application development is primarily about leveraging existing frameworks and libraries to deliver the results, failure to take advantage of an existing resource can cause the project to be much more complex to maintain and waste tons of efforts programming aspects of the project that aren't concentrating on the actual domain problem that is trying to be solved.

</comment></comment></comment></comment><comment><USER16> A college teacher of mine quipped to his students that if the software is inefficient, upgrade the hardware. I have flip-flopped on this mentality over the years. Part of me longs to write code the way Charles Lindbergh knocked together the Spirit of St. Louis.

<http://www.charleslindbergh.com/history/sec/>

Throughout the design of his aircraft, Charles knew that his life hung on the details. For example, rather than use an all-metal design, much of the exterior was cotton fabric (to reduce weight). His design was pragmatic, practical, and brilliant.

For the most part, software developers do not create systems where the modularity, efficiency, and stability are paramount to the success of a business or the safety of the people who use the programs. Developers often create systems for data entry and data analysis. It is the data that allows a business to take flight, as it were.

You can replace system front-ends in a fortnight. Dirty data, however, can skew results and impart inflexibility in the system. Bad data can ground a business. These days I care about the software, as my mind reminisces about the minimalism and beautiful design imparted upon the Spirit of St. Louis. Yet I care much more about the quality of the database and the cleanliness of data.

</comment><comment><USER17> I've often noticed how software is similar to hardware in one way.

Software and hardware are both destined to hit a limit, in any current configuration, no matter how it's built or put together.

Whatever computer we buy, it has a limit. The day will come that the capability we originally had will not be able to power what we need. We decide how much (and how far) to invest into the future to stay on a machine. This can be a benefit sometimes, other times, not. Sometimes we need a computer to be good enough to do a certain task, other times not.

Building software has a similar shelf life. All software, no matter how it is, or isn't architected, will have it's limits because of it. This can be a benefit sometimes, other times, not. When those limits are hit, you'll have to deal with it. Throw more horsepower at it, or refactor.

If there's code that isn't updated often, and doesn't need to be super performant, good will be the same as great code.

When starting a new project, I find myself more and more asking the questions:

\- How long will I need this codebase to do what it does? \- Will the codebase grow? \- How soon/often will it grow? \- Will additions be trivial / non- trivial?

Most often I now just start with an ultra lightweight MVC framework to keep my coding semi-organized and primed to re-factor, but not much more. I have a set of scripts that will initialize an entire project how I like and I can quickly start hacking on a new project/idea in a few minutes.

The less I obsess over every small architectural detail and let my decent habits of being reasonably kind to my future developer self, I find myself having fun while being responsible.

<comment><USER18> Would you mind expanding on the MVC framework and scripts that you use to initialize an entire project?

It sounds like that setup would really cut down on the mental overhead need to start a new project, and also cut down on obvious errors (typos, forgetting to add something, etc).

<comment><USER17> Sure, what language do you like to work in?

<comment><USER18> Any of these:

      * Python
      * Java (Android)
      * HTML/CSS/JS

If a different language works better, feel free to use that instead. Thanks.

</comment></comment></comment></comment><comment><USER19> Write code, expecting to iterate. Organize it with large strokes and plenty of wiggle room.

Then if its 'good enough', leave it at that.

If it needs work later, anybody can do it - you didn't make it too dense or compact or concise to easily reinterpret or diagnose.

Its not just a good idea, its pretty much an obligation if you are paid to create it. Keep personality out of it, complete it on time and under budget, move on.

</comment><comment><USER20> I still experience the drive to "over-architect" a solution every so often, especially when starting a new project. For me, it tends to be a result of thinking, "oh, I can add that additional feature with little impact to the timeline of the project." I have to force myself to remember the mantra: You're Not Gonna Need It. More often than not it ends up being right.

<http://c2.com/cgi/wiki?YouArentGonnaNeedIt>

</comment><comment><USER21> Nice read. I really appreciate his comments about over-engineering to the point that nothing useful actually gets accomplished. I've seen a lot of that.

And really the over-abstraction is wasted time. I've seen things added because "we might need them some day". These things take days or weeks to add and then never are used by customers even after many years have passed.

The over-abstraction seems to be a drug to some developers. They can't stop doing it.

<comment><USER22> Not to mention that code that is only there to provide future-proofiness can be a huge hurdle to understanding an existing codebase for any developer new to a project. The hours spent on trying to understand code that doesn't seem to make sense, only to be told that "we put that in just in case we needed xyz, but it's actually not used anywhere", can be incredibly unproductive and frustrating.

</comment></comment><comment><USER23> Good article. I experienced this transition myself. Small, easy projects unfold to super-huge constructs in your head and you lose passion and productivity.

</comment><comment><USER24> "Perfect is the enemy of good enough; good enough is the enemy of all." [1]

There's no shame in code that's 'good enough' but I think there's a danger in this article of missing an important point: you can't classify your output if you don't know its context and goals. If you're coding something that definitely won't be used again then make it 'good enough' for this use case, if you need it to be extended by others over the next few months then make it 'good enough' for that use case, if you have a contractual obligation to get it out to the client 'now' then stop thinking and start doing!

But paralysis is costly. If you lack the required knowledge to take a sensible decision, then take a gamble: never hold up making a low-risk choice because you don't know enough. The opportune time to learn what the right choice was is once you've made it and can evaluate the outcome with data.

The other thing to note is that complexity on its own isn't bad, complicatedness is [2]. The knowledge you've gained shouldn't be making your code more complicated. You should spend your time on creating an arsenal of simple solutions to complex problems. That is perfection (and you will never reach it.)

Optimize your time by evaluating after instead of planning before; over time create simple solutions to complex problems and use these as shortcuts to act decisively.

[1] [http://paulbuchheit.blogspot.com/2007/04/perfect-is-enemy- of...](http://paulbuchheit.blogspot.com/2007/04/perfect-is-enemy-of-good- enough-and.html)

[2] [http://usabilityworks.org/2006/12/13/simplicity- complexity-a...](http://usabilityworks.org/2006/12/13/simplicity-complexity- and-complicatedness/)

<comment><USER25> I was confused about your point until I clicked the first reference. You made a slight misquote that change the whole quote.

Good enough is the enemy of _at_ all.

<comment><USER24> Oh, oops. Thanks for that! I actually miswrote it ages ago when I first read it. When I went to riff off it today I knew that I had liked the quote but I couldn't quite understand why. I told myself, "Ah Seb, this makes sense, you're just too tired to understand it!" ;)

Cheers.

</comment></comment></comment><comment><USER26> Herein lies the art of programming - writing clean, elegant code that isn't overwrought. It's hard, but the key is to keep in mind that complexity is the enemy and simplicity is the aim.

Easier said than done :)

</comment><comment><USER27> I was working on a project with another more senior developer and I remember saying we should refactor some part of the code or design it differently somehow and he said "Why, it already works?"

The only argument I could really come up with involved too many coding buzzwords to be taken seriously and we moved on to the next task.

That's kind of stuck with me. Whenever I'm thinking about a code change or "clever" design I just try and see if there's a justification beyond something involving words like "abstract" or "cohesion".

</comment><comment><USER28> Trade-off between building quick functionality vs a flexible, maintainable code is a business decision. Engineers at a startup cannot sit down and design a system for months that will work for 10 million users. However, they also cannot patch their code and have it create problems within a month and then having to redesign it again.

Once your product vision is clear, you can try to see as much into the future as you can. You know where your product can/will go based on what problem you are trying to solve. Once you get into "what-if" territory, you know you have ventured too far.

Therefore, I truly believe that engineers should be aware of the business needs and the product roadmap/vision to make such decisions. Engineers can then decide where(and how much) flexibility should be added. Most of the future-proofing is done for scenarios that may not exist out of the imagination of the engineers. They should know what _can_ be possible and what cannot. No system can be designed to handle all scenarios without adding untold complexity.

</comment><comment><USER29> There is absolutely shame in "good enough". Mainly that created by weaselly coworkers trying to get ahead and establish technical superiority in the eyes of the non-techie management. These people never write any code themselves but are the first to start WTF'ing really loudly when someone else completes something. Usually the volume and banality of things programmers complain about identify their technical competence, with the bottom of the barrel being complaints about whitespace and formatting. "WTF! Bob put TWO spaces instead of ONE all after method names all over the ENTIRE file! whaaah!" Yes, it becomes this petty with some people.

So a smart programmer will strive for 'quick perfection', establish respect in some other way to counter this, or if they really want to sink that low, fight back with similar tactics. Smart programmers can also create review traps if they can guess what colleagues will attack them on.

Its also good if you beat up another programmer on the first day so the others know not to mess with you ;).

<comment><USER30> enjoyed reading your comment, but if one is drawing too many similarities between their work environment and prison, it could be time to find/create a new work environment.

</comment></comment><comment><USER31> This is the experienced developers dilemma: "To engineer or to not engineer"; engineering usually turning out to be over engineering. A more experienced developer friend of mine would always tell me: "build for today's requirements". I try hard to fight the design/architect voices in my head that always want to imagine this made up future where we will need X or else we cannot go live. These voices usually only stall real actual work, instill fear, and serve very little to no purpose.

I once had an argument with a Wall Street Java developer who was made the "lead" of one of our team projects. He decreed that every single class have an interface so that we can be generic and not tightly couple any of the components to concrete classes. I agreed that in some instances where functionality, i.e. methods that can be represented by different classes with the same method signatures made sense but not every single class needs an interface (if that is the case just go with a beautiful dynamically typed language like Python and avoid the code bloat). He got management on his side and we went off and built an overly engineered Straight Through Processing solution. It was a sheer nightmare to debug and the code bloat made me scream one day when we had a serious production issue. Even our manager (who finally had to look at the code when most of us were out on vacation once to answer some user questions) was flabbergasted at the amount of code he had to read through in order to answer the most trivial of questions. One extreme example was an interface for trade references. Our trade references were always strings with a date and some numeric value concatenated to it. The "engineer" decided that we needed an interface for this and added one interface and concrete class for our trade references. I told him that all classes needing trade references instance variables could just have a String instance variable named tradeReference or something like that and he went on to give me a design pattern lecture. We argued for nearly 20 minutes about this silly thing as he kept insisting that the future was unknown so we have to future proof the code from unforeseeable changes. When he said this I asked him to remove the Crystal ball plugin he had in Eclipse for predicting the future and get real. He got angry and we had a team call to waste yet another hour of developer time to discuss this. In the call I mentioned that our trade references scheme had not changed in 8 years and was unlikely to change... I lost the debate anyway. The ratio for most of the code base from interface to concrete class was largely 1-1 thus not justifying this code bloat approach.

Experienced developers (at least I think) seem to have these crystal balls in their heads or IDEs and usually try to be clairvoyant when it comes down to building a product. We need to get out of the business of overly engineering and just do as my friend said: "build for today's requirements". It is called software for a reason: it is soft. It can change (most likely will), can be refactored, redesigned, and/or incrementally made better or more abstract to accommodate changes. I am in no way saying no design, just limit it and get to work. A successfully built product is more satisfying then the imaginations of your head and the "perfect" engineering/scaling solution that never materializes. Users will like you, you will like you, and the team will get an andrenaline boost with each and every release keeping the spirits high. Remove the Crystal ball plugin from your head/IDE and stop trying to be clairvoyant and be a developer.

<comment><USER32> There's a reason why this happens more often in languages like Java. Because of the verbosity of the language, it's just painful to rewrite anything, even if the current solution isn't that much over engineered. So there might be a greater tendency to over engineer at the beginning, just to avoid any rewriting, which at the end isn't possible.

I'm a full time C++ developer, which might be a bit better in this regard than Java, but not that much, and a hobby Haskell programmer, and one of the greatest things about Haskell is it's brevity. It makes rewriting a lot less painful, so you're not avoiding it that much.

<comment><USER33> I disagree with your point that the verbosity of Java is the reason for over- engineering. The refactoring capabilities of modern-day IDEs help immensely with reducing the amount of work one has to do to make syntactic changes over the whole codebase. So the argument that developers tend to over-engineer when coding in Java to avoid any pains that may arise because of its verbosity doesn't hold, IMO.

I think that the over-engineering happens simply because it's a pain to do serious refactoring when working on large enterprise software in general, never mind what language it's written in. The sad truth of our profession is that the customer requirements may change quickly and drastically, requiring us to rewrite large portions of our code, and very often we find ourselves thinking "If I only engineered it that way instead of this way, I wouldn't have so much trouble right now". This is why we strive to create the most robust, flexible solution that will be able to handle any future customer requirement. So we basically turn our code into a framework that, we hope, will allow us to respond to change quickly. Unfortunately, we can never predict _everything_ that the users might want, so this whole approach falls down like a house of cards when a user requirement comes in and we need to change a large portion of the code. I believe this is true for a sufficiently large app written in any language, Haskell included.

<comment><USER32> "The refactoring capabilities of modern-day IDEs help immensely with reducing the amount of work one has to do to make syntactic changes over the whole codebase. So the argument that developers tend to over-engineer when coding in Java to avoid any pains that may arise because of its verbosity doesn't hold, IMO."

Refactoring tools might be nice and will help you here and there, but there's a difference in the abstraction abilites of a language like Java compared to language like Haskell.

It's not only about the amount of code, but also about the complexity of the code, when building abstractions.

Yes, a refactoring tool might help you dealing with the complexity, but it's still there and makes it more difficult.

I never understood the point of using a less capable language and then using a tool to compensate it, e.g automatically generate code for it.

<comment><USER33> _I never understood the point of using a less capable language and then using a tool to compensate it, e.g automatically generate code for it._

I definitely agree with you on this one :). Sure, it's better to use a language that lets you have less complexity even as your codebase grows quite large. You mentioned Haskell. Since I don't have any experience with it, what do you think is the reason that it's not used very often for building large enterprise applications (or maybe it is, and I just don't know about them)?

<comment><USER32> "Since I don't have any experience with it, what do you think is the reason that it's not used very often for building large enterprise applications (or maybe it is, and I just don't know about them)?"

Well, I don't know if it's even clear why other languages are used for enterprise software?

I don't think that their technical or whatever superiority was the main reason. Sometimes it seems that everything that is needed is to push it with a lot of marketing into the mainstream and then just let it go.

At some point there're more libaries for a language, most people use that language, universities are teaching it, so that's then the main reason to use a language.

Java might been there, pushed into mainstream, at the right time, with the right features, which made it less complex and less error prone (garbage collection, no memory pointers) to use, compared to C/C++.

But perhaps there's something about "object orientation", how it's implemented in Java, which makes it for people easier to grasp, if I read all the hate about these strange scheme/lisp courses in universities, but perhaps they're just already used to much to other languages.

On Haskell, at the beginning it looks very strange, especially compared to languages like C/C++, Java or C#, but I think that most of the felt strangness is a matter of habit, because most of the mainstream langugages aren't that different.

I don't think that learning Haskell was that much harder for me than learning to program in C++ or Java. Sometimes people seem to forget the challenges they had, when they learned programming for the first time.

</comment></comment></comment></comment></comment></comment><comment><USER34> I think it all boils down to solving well-defined tasks with minimum possible effort and time spent, and keeping in mind that the end goal is the product, not the code.

For me, the understanding happened in similar order:

\- First, as a beginner, I solve all problems with minimum effort possible. The goal is the product.

(It's not real programming, but working with CMS that involves writing code sometimes.)

\- Then I see the way to make much cooler and more "custom" products—with a web framework. In order to be able to do that, however, I need to start doing real programming.

\- Learning programming, I find that what I was writing before was pure crap. I also forget that the product is the end goal, and care instead about writing code.

\- Lots of LOC but few finished projects after I discover that code actually doesn't matter much. Instead, other stuff does—like speed, communication, measurement.

\- Learning to make and deliver products with minimum possible effort—that's where I am now.

</comment><comment><USER35> I think what this article is referring to is the importance of retaining perspective of the goals of the project. An experienced programmer might have the ability to program to a very high standard but he should reserve that for times when it is justified—not forgetting that practice or curiosity alone is occasionally adequate justification.

You can go further with this thinking and suggest maybe it isn't even useful to ask "is this good enough?" and instead ask "is this sensible given xyz?" or "will this be worth doing?" and forget about what is means to be good enough or assess the quality of your work in absolute terms.

</comment><comment><USER36> I would rather do "forgettable" development. It means that I don't have to worry about it afterward and can forget about it. I don't have to go back to fix tons of bugs. The software should run by itself as much as possible. It takes much less time to develop over the entire life cycle of the software, not just the initial sprint.

One corollary is to use simple and proven technology and libraries.

Another corollary is to have crash-friendly design, i.e. software that can crash in any time and recover at the next restart.

Third is to make software self configured and no configuration. It makes operation and scaling very simple.

</comment><comment><USER37> For the longest time I felt guilty for using short INLINE CSS on certain elements because of the whole "markup and styling must be kept separate".

My reasoning for this was that maintainability was SOOO much easier. Usually I use it on tiny simple elements that have only a tiny amount of unique css (maybe a unique background for each) and repeat a lot on one page (but no other pages). So I really don't want to create 20+ unique IDs in the css, triple the code size, and all for what?

</comment><comment><USER38> It's a nonstandard definition of optimization in many of these case but I still feel like this all falls under "Premature optimization is the root of all evil"

Also importantly apparently the full(er) quote is "say about 97% of the time, premature..." Because even Knuth knew that sometimes you should design for that herd of buses.

</comment><comment><USER39> Please forgive this comment which is totally unrelated to the article, but does anyone else have trouble scrolling this page in Chrome on OSX? I often encounter pages that give Chrome fits, but I can't quite figure out what's causing it.

<comment><USER40> It must be the comments, they are lazy loaded a la disqus, so you start scrolling and it stutters as you scroll.

</comment></comment><comment><USER41> In fact be proud of code that is good enough.

</comment><comment><USER42> my guideline is to make things happen with as few lines as possible.

<comment><USER43> You must love Perl.

</comment></comment><comment><USER44> one way to think about this is code as a "consumable" instead of as a "durable" good.

There is an essential difference between a paper cup and a glass.

Say you are throwing two outdoor parties a year, but otherwise will not serve more than 8 people. The best solution, if you start with nothing, is to buy a set of dishware for 8, and then throwaway plastic cups and plastic knives twice a year ad hoc.

Code could be seen as similar. There is one-off bad solutions, that are no better than a paper cup. You can't iterate on them (like washing a plastic cup) because it starts to fall apart.

Then there is glassware. It's more expensive, but durable.

So, one approach is to look at your resources and your immediate and expected future needs, realize that better code is more durable but more expensive, but that there is nothing wrong with "consumable" code that you can't wash more than once or twice before it starts being "a mess".

Just because "code is forever" we tend to think of it as not being consumed after being used for its purpose, but due to the nature of engineering, in fact thinking of it in terms of just that is quite appropriate, in my humble opinion.

Once you realize this difference, you can make strategic investments into durable and consumable code. You usually can't fortify a paper cup, nor turn a plastic cup into a glass one, though, so often this is a decision to make several times over the lifetime of your "household"! :)

For personal use, if you have very little money (time/resources) there is nothing wrong with starting with paper, buying plastic and then glass or ceramic, spending, overall, three or four times as much money as if you had just bought a beautiful antique set of dishware for yourself to begin with. Often, though, that is not the real situation: realistically, you could "do without" for a while, and then buy a durable good you won't replace.

These are difficult investment decisions for households, individuals, and companies.

Don't discount renting, either! In this case, that could be analogous to licensing someone else's software.

<comment><USER45> > _Say you are throwing two outdoor parties a year, but otherwise will not > serve more than 8 people. The best solution, if you start with nothing, is > to buy a set of dishware for 8, and then throwaway plastic cups and plastic > knives twice a year ad hoc._

Not really. Only if you've no time to look for good dishware (surprise party?), can't afford it this instant (or fall in the common pit of not doing the math for the long term) or you absolutely do not have space for the "extras", which is fairly rare.

To extend the metaphor, this "disposable" code tends to end up in unexpected places and stick around polluting the ecosystem forever.

Or, like some people, using disposable stuff every day and probably having trash all over the house to show for it.

…

That said, disposable code is fine. The metaphor isn't exact, but does point to some things to be cautious of.

<comment><USER46> Plastic cups and plastic knives don't break like your fine china though. At parties, this is a good thing.

<comment><USER44> right, but forget fine china: some people would prefer to give their guests real plates, and do so when they have 10 guests, but don't have 100 plates, so when 100 guests show up on their lawn they use disposable plates. The reason doesn't matter. See my comment above about why it's hard to think of code as being a consumable good AT ALL (for any reason).

My point wasn't really about tableware, it was about disposable versus durable goods.

<comment><USER47> That then points to a reasonable solution: use disposable stuff for rare events but have a good set for everyday use.

<comment><USER44> i guess i was being incredibly unclear then because that was my whole point. :/

a lot of code is for rare disposable events and doesn't need to be built like a ship; more like a paper airplane.</comment></comment></comment></comment></comment></comment>