Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 4-23-2012
- When I turned twenty I had reached a point where my earthly possessions could be summarized as the clothes I was wearing, an old bag containing some more clothes, a few science-fiction books, and my guitar. No money, no place to live, just a bunch of friends who helped me out of the streets and put me back on my feet.
- Ending up in such a pit you first feel anger, then sorrow, then you make fun of it because that is the only way to make it bearable, and then you can go forward. It took me three more years to be able to shop for food without having to count change in my pockets.
- Twenty years later I gave the books away but I still keep the old bag as a memory and my guitar is now standing in the living-room where I occasionally use it to sing for my kids.
- Life has been a tough ride so far, but at least I know how to live without being bothered by simple objects. I know the only things you can count on are:
- - What is inside you: your skills, your knowledge
- - Good friends, and other people you love
- Be generous and help somebody today get out of poverty. We all deserve a future.
- nicolas314
- On the way from Germany to France
- ----------------------------------
- 4-22-2012
- I want to use my fifteen minutes of fame on The Listserve to rant about
- something that's close to my heart: the stability of the software I use.
- NOTE: This is written for people who create software. If you don't do that you
- probably won't find this very interesting. Sorry! Maybe you could read Text
- from Dog if you haven't seen it already? Either way, have a nice
- morning/afternoon/evening!
- The Situation
- -------------
- Every time I get a new computer, I go through the same song and dance:
- 1. Look at what programs and packages I have installed on the old computer.
- 2. Install these programs on the new computer.
- 3. Copy over my configuration files from the old computer to the new one.
- 4. Spend the rest of my day fixing all the things that broke because I'm using
- a newer version of program X.
- Step 4 is always the most painful part of getting a new machine. Always.
- Without fail I spend several hours tweaking configuration files, adjusting my
- workflow, and so on because I've upgraded to a new version of foo which doesn't
- support option X any more or requires library Y version N+1 now.
- Getting a new computer should be a *pleasant* experience! The unboxing from the
- sleek packaging, that "new laptop" smell, the nostalgia of the default desktop
- image. Why does this horrible step 4 have to exist and how can we get rid of
- it?
- The Divide
- ----------
- I've noticed something interesting lately: I can categorize almost *all* of the
- software I use into two distinct groups:
- * Software that breaks pretty much *every* time I update it (e.g. weechat,
- offlineimap, Clojure, many Python packages, Skype).
- * Software that almost *never* breaks when I update it (e.g. Mercurial, git,
- tmux, Python, ack, zsh, Vim, Dropbox).
- Software that falls in between these two extremes is surprisingly rare. There
- seems to be a pretty clean divide between the two groups.
- This makes me think that there's some special attribute or quality of the
- second group (or its authors) which the first one lacks.
- Brokenness
- ----------
- I think it's important that I nail down what I mean by "breaks" or "is broken".
- I don't necessarily just mean the introduction of "new bugs".
- When I say that a program "breaks", I mean:
- * When I update from version X to version Y of a program, library, or language...
- * Without changing my configuration files, source code, etc...
- * The resulting combination doesn't work properly
- In effect, I'm saying that "breaking backwards compatibility" means "the program
- is broken"!
- This may be a strong statement, but I stand by it in most cases.
- Backwards compatibility matters! Every time someone makes a backwards
- incompatible change in a program or library, they cost the world the following
- amount of time:
- Number of people Time it takes each person
- using that part of X to figure out what changed
- the program and how to fix it
- Often this can be a significant amount of time!
- The Process of Updating
- -----------------------
- When pointing out a backwards incompatible change to someone, you'll often get
- a response similar to this:
- "Well, I mentioned that backwards incompatibility in the changelog, so what
- the hell, man!"
- This is not a satisfactory answer.
- When I'm updating a piece of software there's a good chance it's not because I'm
- specifically updating *that program*. I might be:
- * Moving to a new computer.
- * Running a "$PACKAGE_MANAGER update" command.
- * Moving a website to a bigger VPS and reinstalling all the libraries.
- In those cases (and many others) I'm not reading the release notes for
- a specific program or library. I'm not going to find out about the brokenness
- until I try to use the program the next time.
- If I'm lucky the program will have a "this feature is now deprecated, read the
- docs" error message. That's still a pain, but at least it's less confusing than
- just getting a traceback, or worst of all: silently changing the behavior of
- a feature.
- Progress
- --------
- I completely understand that when moving *backwards* to an older version
- I should expect problems. The older version hasn't had the benefit of the extra
- work done on the new version, so of course it should be less stable.
- But when I'm *updating* to a higher version number the software should be
- *better* and *more stable*! It has had more work done on it, and I assume no
- one is actively trying to make software worse, so why does something that
- previously worked no longer work?
- We're supposed to be making *progress* as we move forward. The software has had
- *more* work done on it, why does it not function correctly *now* when it
- functioned correctly *before*?
- Yes, this means developers will need to add extra code to handle old
- input/configuration. Yes, this is a pain in the ass, but *the entire point of
- most software is to save people time by automating things*. Again, every
- backwards-incompatible change costs the world an amount of time:
- Number of people Time it takes each person
- using that part of X to figure out what changed
- the program and how to fix it
- If our goal is to *save time* then we should not make changes that *cost time*.
- Or at least we should not make such changes lightly.
- A Culture of Sadness
- --------------------
- Proof that this is a real issue can be found in the tools we use every day. As
- programmers we've invented elaborate dependency systems to deal with it.
- We say "pip install django==1.3" or put "[clojure "1.2"]" in our Leiningen
- project.clj files to avoid using the newest versions because they'll break.
- Step back and look at this for a second.
- What the hell?
- What the *hell*?
- We have invented software with features designed to help us use *old* versions
- of other software!
- We have *written code* to *avoid* using the "latest and greatest" software!
- Obviously this is not entirely bad, but the fact that manually specifying
- version numbers to avoid running *newer* code is commonplace, expected, and
- a "best practice" horrifies me.
- I would *love* to be able to say something like this in my requirements.txt and
- project.clj files:
- Of *course* I want the latest version of library X! I want *all* the
- newest bug fixes and improvements!
- Unfortunately I can't do that right now because so many projects make backwards
- incompatible changes all the time.
- The moment I try to build the project at some point in the future I'll be sent
- on a wild goose chase to figure out what function moved into what other
- namespace and what other function was split into its own library and dammit the
- documentation on the project's website is autogenerated from the tip of its git
- repo and so it doesn't apply to the latest actual version and jesus christ
- I think I'll just quit programming and teach dance full time instead even though
- I'll go hungry.
- The Tradeoff
- ------------
- One could argue that sometimes backwards incompatible changes cost time up front
- but save time in the long run by making the software more "elegant" and "lean".
- While I'm sure there are cases where this is true, I feel like it's a cop out
- most of the time. Allow me to illustrate this with a helpful Venn diagram:
- -------
- /3333333\
- |333333333|
- \3333333/
- -------
- 11 -> People who give a shit what a program's codebase
- 11 looks like.
- 22 -> The authors of said program.
- 22
- For libraries where the author is the only user, none of this rant applies.
- You're free! Break as much as you like!
- For the majority of libraries, however, there are probably vastly more "users"
- than "authors". Saving a few hours of the authors' own time has to be weighed
- against the 10 minutes each that the hundreds of users will have to spend
- figuring out what happened and working around it.
- I want to be clear: being backwards compatible *doesn't* mean sacrificing new
- features! New features can still be added! Refactoring can still happen!
- In most cases keeping backwards compatibility simply means maintaining a bit of
- wrapper code to support people using the previous version.
- For example: in Python, if we moved the public foo() function to a new module,
- we'd put the following line in the original module:
- from newmodule import new_foo as foo
- Is it pretty? Hell no! But this single line of code will probably save more
- people more time than most of the other lines in the project!
- This may just be an artifact of how my brain is wired, but I actually get
- a sense of satisfaction from writing code that bridges the gap between older
- versions and new.
- I can almost hear a little voice in my head saying:
- "Mwahaha, I'll slip this refactoring past them and they'll never even know
- it happened!"
- Maybe it's just me, but I think that "glue" code can be clever and beautiful in
- its own right.
- It may not bring a smile to anyone's face like a shiny new feature, but it
- prevents many frowns instead, and preventing a frown makes the world a happier
- place just as much as creating a smile!
- Exceptions
- ----------
- One case where I feel the backwards incompatibility tradeoff *is* worth it is
- security.
- A good example of this is Django's change which made AJAX requests no longer be
- exempt from CSRF checks. It was backwards incompatible and I'm sure it broke
- some people's projects, but I think it was the right thing to do because it
- improved security.
- I also think it's unreasonable to expect all software to be perfectly ready from
- its first day.
- Sometimes software needs to get poked and prodded in the real world before it's
- fully baked, and until then requiring strict backwards compatibility will do
- more harm than good.
- By all means, backwards compatibility should be thrown to the wind in the first
- stage of a project's life. At the beginning it needs to find its legs, like
- a baby gazelle on the Serengeti. But at some point the project needs to get its
- balance, grow up, and start concerning itself with backwards compatibility.
- But when should that happen?
- A Solution
- ----------
- I think there's a simple, intuitive way to mark the transition of a piece of
- software from "volatile" to "stable":
- Version 1.0
- Before version 1, software can change and evolve rapidly with no regards for
- breaking, but once that first number becomes "greater than or equal to 1" it's
- time to be a responsible member of the software community and start thinking
- about the real humans whose time gets wasted for every breaking change.
- This is the approach semantic versioning takes, and I think it's the right one.
- I know a lot of people dislike semantic versioning. They hate how requires
- incrementing the major version number every time a breaking change is made.
- I consider it to be a *good* thing.
- You *should* pause and carefully consider making a change that will break
- people's current code.
- You *should* be ashamed if your project is at version 43.0.0 because you've made
- 42 breaking changes. That's 43 times you've disregarded your users' time!
- That's a bad thing!
- As programmers we need to start caring about the people we write software for.
- Before making a change that's going to cause other people pain, we should ask
- ourselves if it's really worth the cost. Sometimes it is, but many times it's
- not, and we can wrap the change up so it doesn't hurt anyone.
- So please, before you make that backwards incompatible change, think of the
- other human beings who are going to smack their monitors when your software
- breaks.
- Further Reading
- ---------------
- I'm certainly not the only person to notice this problem. Many smarter people
- than me have talked about it. If you want to read more you might want to look
- up some or all of the following (Google is your friend):
- * The Semantic Versioning spec (the specific numbering details don't matter as
- much as the philosophy).
- * Anything Matt Mackall has written on the Mercurial mailing list (especially
- the mails where he sounds especially grouchy).
- * Anything about "software rot" or "code rot".
- Steve Losh
- steve@stevelosh.com
- ----------------------------------------
- 4-21-2012
- She was sick of it all. Sick of the contradictions, sick of the distance, and most of all, sick of the silence that ricocheted back and forth across her ear drums, more deafening than a collapsing building. Polite conversation, with its one-worded banter laced in falsity, could be tolerated. But the silence between them was painful. She wondered what had happened to their relationship. At one point they had been much more than just roommates; they had been best friends. They knew things about each other that no one else knew, and they shared secrets that ranged from romance to regrets, from insecurities to ideologies. Their close friendship had helped make the transition from small towns to college life easier for the both of them. Although they had differing personalities, they seemed to complement each other. But, most importantly, they had trusted each other. Recently, all of that had disappeared without warning.
- When it was time to leave, she didn’t say that she was heading to class. She didn’t want to interrupt the silence, an invisible yet unforgivable barrier that had formed between them. She didn’t owe an explanation for her departure, and she knew she wouldn’t have received a response anyway. Besides, she was sick of trying. She forced her work into a tattered backpack, stuffing notebooks filled with messy, looping handwriting and elaborate margin doodles in between a handful of novels and a laptop. Hoisting the bag over her shoulder, she pulled a battered iPod out of her pocket, inserted the small headphones into her ears, and pressed play. She breathed a sigh of relief. Though it was temporary, her music allowed her to escape from the silence that smothered her.
- Her class started at 2 o’clock, but her dorm was a good distance away from the English building, so she left at exactly 1:30. She decided to take a bus halfway and then walk the remainder, allowing her to be one of the first to class but still giving her the opportunity to enjoy the beautiful sunny day. The afternoon temperature was unusually warm, and the day seemed to belong in May instead of February. This unexpected heat wave baffled the local weathermen, but it thrilled the students. As she stood at the bus stop, she noticed a few tan, bikini-clad girls were lounging on beach towels outside of her dorm. Several drivers stared at them as they drove by. The bus pulled up next to her, and she felt a familiar rush of warm air graze her cheek. She realized she was sweating. She greeted the bus driver, courteously taking her headphones out of her ears and making eye-contact. An old man with a beard smiled at her, and she smiled back and sat next to him. She fiddled with her iPod, which she had put on Shuffle mode, listening to each song for about five seconds until she changed it, briefly moving from soft jazz to classic rock to hip hop in a rhythmic pace. Her musical taste was eclectic, to say the least, much like her personality. She refused to associate with one particular stereotype. Instead, she dabbled in each one with no notions of stylistic identity, wearing what she liked and listening to what she wanted. Each song, no matter its genre, represented something to her. Sometimes it reminded her of an old friend or a past memory, while other times the bass line just seemed to reflect her mood. She let her emotions choose the song, letting her thumb repeatedly press the “next” button while she stared out the window. Finally, she settled on a fast-paced, top-40 track that reminded her of high school, a track that she used to listen to with her friends while they drove around town with the stereo turned up and the windows rolled down. It was a track of innocent love, something she had once experienced. She had forgotten how it felt, but after the first few lines she could feel her heart beating along to the familiar melody of the chords. She thought back to that time and briefly admired how much simpler life had been then.
- The song abruptly changed to one with repetitious bass pounding and loud, heavy guitar riffs. She quickly forgot of her past, as the nostalgia of blissful immaturity faded away, immediately replaced with the new track’s rapid lyrics. She silently tapped her foot to the pulsating beat.
- The driver lurched to a stop just as a guitar screeched in her ears, and she held on to the pole next to her to prevent herself from being thrown forward. She grabbed her bag, squeezed out from the area that encased her tiny seat, and carefully stepped off the bus onto the pavement and headed toward class. She walked slowly, admiring the way the bright sun shone through the naked trees, trees that weren’t ready to bloom and probably wouldn’t be ready for a few months, if that. The winter had been abnormally harsh that year, and it was predicted that the trees would probably bloom later than normal as a result. The vivid, recent image of the trees covered in snow sprang into her mind, and she realized a week ago, she had to wear a winter coat and gloves while walking to class. Now, it was forty degrees warmer and anyone wearing a coat would be scalding.
- She briefly glanced at the people she passed by. Class had just gotten out, so the pathways were crowded. Several groups of rowdy boys walked past, describing their drunken hook-ups from the previous weekend and rambunctiously slapping each other on the back. They were all dressed similarly, wearing khaki shorts and pastel-colored polo shirts, their dark hair sticking out from underneath backward baseball caps. They were tall and handsome, and they all seemed to have similar features. Their collective good-looks repulsed her. There was no variety; they were all the same. Next to them walked large packs of girls, most of them blond and tan with thin, dainty physiques. Some of them wore brightly colored sundresses. Others wore tennis shoes and running shorts, though their neatly combed back hair and flawlessly applied make-up gave no indication of exercise. They were all beautiful, but they blended together, no one face standing out amongst the others. In the beginning of the school year, she had envied their apparent mass perfection. She began dressing up to go to class and started wearing makeup. Though she rarely wore earrings, she began to stick pearls into her ears every day, regardless of her outfit. She even abandoned her tomboyish wardrobe and occasionally wore dresses or skirts. But, soon enough, she got sick of it. She grew sick of waking up early every morning to straighten her hair, to put together a perfectly matching outfit. She grew sick of pretending to be someone she was not just to fit into a crowd of people that she did not resemble in the slightest. Instead, she forced herself apart from her classmates. She gradually got used to the fraternity boys looking right through her, as if she didn’t exist, and to the girls in class talking to each other but not to her. She watched them converse as they walked past, but her music pounded in her ears, preventing her from hearing them. As she walked, she noticed that she was the only one wearing jeans.
- She looked down at her iPod as she approached the building, checking the time. About ten minutes early. Not too bad. She systematically entered the building, walked down three flights of stairs, took a left, then a right, then a left again. Before entering, she turned off her music, wrapped up the headphones carefully, and put the iPod into her pocket. Then she entered, just like always. The only difference was that, this time, she was standing in a room of emptiness. The light was off, and the lack of windows made her feel as if she were standing in a cave instead of a classroom. It was completely silent, apart from the humming of a computer that sat in the corner, its screensaver a series of random twists and turns that filled the screen with color. This computer was the only source of light, and the screensaver’s colors faintly shined across the room onto the wall. A technological rainbow. She was mildly surprised at the unexpected abyss she was standing in. Even though she was ten minutes early, she was never the first one to class. She felt as if she were trespassing, even though she was in the right place. She watched as the computer went into sleep mode, the screen blackening like the room around her.
- She considered waiting outside in the hallway for someone else to arrive, but she decided to turn on the light switch next to the door instead. She went and sat down in her usual seat. The song she had just been listening to was repeating itself inside of her head; she quietly hummed and tapped her foot to the rhythm. Out of boredom, she pulled out one of her worn notebooks, its pages nearly filled up even though the semester had only started a month or two ago, and finished a doodle she had drawn of a man that had popped into her head but probably didn’t actually exist. She shaded his cheekbones with a stubby pencil, drew then erased then redrew his thick eyebrows, and lightly added eyelashes to his bright, wide eyes that seemed to be staring directly at her. His lips were turned slightly upward in a mischievous half grin, as if he knew something about her that no one else did. Once she was satisfied with her finished sketch, she awoke from her artistic trance and realized that she was still alone. She turned on her iPod and glanced at the clock. 3:02.
- Confused and suddenly worried that she was in the wrong room, she opened the door and looked at the room number. It was then that she noticed the blue post-it on the door. “No class today. Office hours will be held as usual tomorrow. Sorry for any inconvenience.” While most students would probably celebrate this cancelation, she felt empty, as empty as the room she was standing in. Instead of the interaction she longed for, even if it was forced, she was once again thrust into an abnormal solitude.
- She walked down the hallway and joined the throng of people walking home. Although she was submersed by the crowd, she still seemed to be set apart from them somehow. She turned on her iPod and inserted her headphones to escape from the nothingness that surrounded her. Here, she was the queen of her own world, a world with only one citizen. Her world made sense; it was one of sound and song. The bass drum of her heartbeat set the 4/4 rhythm and her footsteps pounded along in harmonized reverberation. This beat was steady and calming, unlike the confusion that she felt as she glanced at the people that passed her by. She watched the crowd around her as their lips moved, almost synchronized, but no sound came out. Concentrating intently on the rhythm that surrounded her, she looked ahead at the trees in the distance. The sun brightened their bare, crooked limbs, and though it was still early in the year, she saw what looked to be a single white blossom slowly emerging to greet the unfamiliar sun. Her smile bloomed.
- Emily
- Virginia
- -----------------------------------
- 4-20-2012
- As my friends (and acquaintances) will attest, one thing that I’m an expert at is preaching about Diva Cups. Male readers and squeamish ladies, this might get a little rough, but stick with me for a moment because this is important.
- Most ladies have grown up knowing that there are two ways to deal with periods: pads and tampons. The “feminine hygiene” aisle at most stores reinforces this, and each month we drop up to $30 on an assortment of items with wings and strings to be strategically packed into hidden pockets of purses. There is a better way...Diva Cups (my brand of choice, but there’s also The Keeper, Moon Cup, and other brands) are a complete game changer. Buy it once for about $35, and use it for 10 years. You can leave it in for up to 12 hours, and it will hold quite a lot (even for those of us who are blessed with ‘extra super plus’ volumes of fun each month). Rinse it out in the sink, pop it back in, and you are good to go.
- Think it’s too gross? Nope. You can handle it. And if you can’t, just do it while squinting and saying, “Ew, ew, ew, ew.” The actual amount of liquid involved in all of this turns out to be less than you might expect, once you see it in a little cup.
- Ever have one of those times where you choose a tampon that’s a little too intense for your particular situation that day and it doesn’t feel quite right? Never happens with the Diva Cup. One size fits all of your flows, and you don’t have to worry about packing up your bag with five different products just in case. Diva Cups have also never been tied to toxic shock syndrome.
- I recently read that we each throw away 7 pounds of trash per day, so this is one small way to decrease your waste.
- The package comes with a flower pin that says “Diva” in pink on it, too, which you can wear to flaunt your menstrual strategy anywhere from business meetings to school dances. Or you can leave it at home, like I do.
- Since people only need to buy this product once every 10 years, the manufacturers don’t have the same marketing budgets as the tampon companies, and many people have never heard of menstrual cups before. So in short, please spread the word. Buy it for yourself, buy it for your sister, buy it for your wife. It works better, it’s cheaper, and it’s better for the environment--It’s really so awesome, and available at Whole Foods and other fine crunchy stores.
- Thanks and good luck!
- Sincerely,
- Adrienne Stortz
- Brooklyn, NY
- addelilah@yahoo.com
- Diva Cup enthusiast since 2009
- ------------------------------------------------
- 4-19-2012
- The softest sound of worship;
- The things we can't possess
- Are without plan or purpose,
- Yet do sometimes suggest
- The reason in our figures,
- The meaning of our call,
- And though we cannot calculate
- We know the sum of all.
- stressfordpoet67@netscape.net
- -----------------------------------
- 4-18-2012
- I'm sorry to break this to you, in an e-mail from a random stranger like this, but it needs to be said: Most of your life won't be fantastic. I'm not joking. The adventures you'll tell your children about will be a minuscule part of it. So if you want to avoid the feeling of utter disappointment as you grow older, you need to accept that fact. Sorry.
- This leads us to the insight: You should focus more on the non-fantastic parts. The parts where you eat breakfast, walk to the bus, have a boring day at work, eat your ordinary lunch, shop groceries, and brush your teeth. After all, this is the major part of your life, and neglecting it is a wasted opportunity.
- Here's the thing: Most of the boring stuff in your life is so dull, that even the tiniest thing can make it seem fun. The tiniest thing. This means the you could make it better with extremely simple means.
- What exactly am I talking about here? Little things. Like these:
- * Challenges: When brushing your teeth tonight, use your left hand.
- * Mind games: When you enter work (or school!), imagine the sound "Kabaaaam!" as you enter, as if your presence changed the whole room.
- * Action: Jump down from the side-walk, instead of just stepping down.
- * Changes: Buy some fancy tomato sauce tonight, instead of your usual brand.
- * More action: Count the number of pink things on your way to work, as if your life depended on it.
- See? Easy stuff. I really try to live by this "Everyday Action" idea, and I think it works for making the boring parts of life more fun. Because that's the thing: just because the fantastic moments are few, there's no reason to just sit there, waiting for the next big thing to swipe you off your feet. Have some fun meanwhile, it's easy...
- /Emil
- Emil Stenström
- em@kth.se
- Stockholm, Sweden
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement