Ron Toland
About Canada Writing Updates Recently Read Photos Also on Micro.blog
  • 'Love Your Work' is a Trap

    I was raised to believe there was one true career for me, one thing i could do for work that would make me fulfilled and happy, as well as prosperous. All I had to do was find it.

    Every career-finding book I read, every counselor I talked to, gave me the same advice. I needed to answer three questions to find the right career for me: What was I good at? What would I do for free? What was fun?

    It’s a trap. Work isn’t fun. Work is hard. Work can be rewarding, and it can make us wealthy, or it can just get us by. But it usually doesn’t do all three at once. By trying to find that “one thing” that hit all my buttons, I’ve switched careers multiple times. I would have been better served by picking one and sticking with it.

    Much of the reward we get from work comes from achieving mastery. Mastery lets us feel the glow of success, of a job well done. Mastery of a skill that’s in demand gives us job security, and a steady income to keep us clothed and fed. As our mastery increases, we get more control over the jobs we take on, and over how we perform each job.

    It’s hard to achieve mastery, though, when you’re always just 1 or 2 years into a new field. I ended up chasing happiness from career to career, searching for something that i could only find by staying put.

    My last career jump was to programming, which turned out well for me. Programmers are in demand everywhere, so I’ve had a good choice of companies to work for and a great salary. But landing my current job, which lets me work from home in my favorite programming language with brilliant people, took five years. Putting in the work gave me the mastery I needed to get the autonomy i wanted.

    Don’t make my mistake. Don’t get trapped thinking that if you don’t love your job all day, every day, you’re in the wrong field. Find something you have an aptitude for - writing, plumbing, cooking - that other people will pay you to do, and then stay with it long enough to master it.

    It’s the only way out of the trap.

    → 2:00 PM, Jul 28
  • Batman's Beginning

    Last week I re-watched the Christopher Nolan Batman movies, one each night for three nights. Seeing them one after another for the first time, without a gap of years between to dull my memory, something struck me that I completely missed before: these movies are three chapters of a single story, and the story is Bruce Wayne’s, not Batman’s. And the reason it’s Bruce Wayne’s story, it has to be his story, is to finally separate the two characters. Batman is not Bruce Wayne, anymore than the League of Shadows is Ra’s Al Ghul.

    They’re both ideas, legends. Bruce set out to create something greater than one man, and he succeeded. That’s the point of the three movies: it’s the story of how Bruce Wayne created Batman (Batman Begins), nurtured his legend (The Dark Knight), and finally handed the cape and cowl off to the next Batman (The Dark Knight Rises). Bruce Wayne the man was always meant to bow out at the end of it, but Batman would continue: that was the point. Christopher Nolan was giving us something we don’t get to see in comics anymore: a way for the main character of the comic to die, but the comic to live on.

    The hints that this is what’s going on start in the first movie, where Ra’s Al Ghul tells Bruce to “become more than a man,” because “men can be killed, but legends are immortal.” When I first saw that scene, I thought he was just telling him to become Batman so he could inspire fear, but there’s another layer here: Ra’s is telling Bruce that in creating Batman, he’ll be creating a symbol that anyone can become. Kill Bruce, and Batman can live on, since no one knows it’s Bruce. Just as Bruce thinks he’s killed Ra’s Al Ghul in the fire, and thus destroyed the League of Shadows, when in fact the real Ra’s has been using the fake one as a “mask” to hide his identity. This theme is repeated in the third movie, when we learn that the League of Shadows has not been stopped by the killing of one man: that others have taken up its banner, because it’s a symbol, not a single person, making it unstoppable.

    In the second movie, we start getting hints that Bruce might not be the best person to be Batman. He’s vulnerable in the people he cares about, he’s pushing his body past its limits (Alfred gets on to him for that), and as Bruce Wayne he has access to wealth and power that can be abused as Batman (the cell phone sonar network he sets up, that Mr Fox condemns).

    We also see an echo of the idea that anyone can be Batman when Harvey Dent claims it’s him. People believe him, and the cops arrest him, because no one really knows who Batman is. That’s part of his power, and they use that power to capture the Joker.

    The third movie is the culmination of all these plot threads. We see that Bruce has gotten so bad at being Batman that he’s hung up his cowl. His fears and broken heart as Bruce Wayne have even caused him to become a recluse, letting his charity work and his company decline. He begins the movie ready to die, since he thinks it’s the only way to stop being Batman. By the end of the movie, after listening to Catwoman talk about wanting her “fresh start,” Alfred tell him his fantasy of seeing him away from Gotham, and working with Detective Blake - another orphan angry at his parent’s death that rebels against the shackles the system places on his fight against injustice - to save Gotham, he’s ready to retire, and let someone else take over as Batman.

    That’s what the final scene is. It’s not blake becoming Robin, or even Nightwing. It’s a hand-off from one Batman to the next, closing out Bruce Wayne’s story and making way for someone else to take over.

    Because Batman isn’t Bruce Wayne. He isn’t Blake, either. He’s a symbol, a legend, something that can’t be killed. He’s immortal.

    → 2:00 PM, Jul 23
  • Star Trek and Multiculturalism

    I’ve been re-watching Star Trek: TNG (yes, Picard is My Captain). Yesterday I came to the fourth season episode “Half a Life.” The basic premise is that Deanna’s mother falls in love with an alien scientist, an alien that comes from a culture that believes everyone should kill themselves on their 60th birthday. Naturally, the scientist is only days away from turning 60, and Lwaxana tries to convince him to defy his culture and live. The rest of the episode plays out this conflict: between the scientist’s desire to continue his work, his desire to stay with Lwaxana, and his desire to honor his upbringing and his home.

    It could easily have been a throwaway episode, but for me it showcases what I loved about Star Trek. The conflict here works on several levels: we have the romance angle, the fear of growing old and becoming a burden on others, and the conflict between saving a life (the scientist’s) and honoring the Prime Directive. All the main characters react to that conflict in keeping with their natures: Picard stays out of it, Lwaxana fights against what she sees as a barbaric custom, and the scientist is torn between custom and his desire to live.

    And the third conflict points directly to a problem American liberalism was facing in the 90s, and continues to face today: multiculturalism. The idea that people should be free to practice their own cultural traditions is an honorable one, but where do you draw the line? Where does honoring someone’s culture become dishonoring (or refusing to fight for) my own?

    In the 90s, these questions came up over the conflict in Bosnia, female genital mutilation in Africa, and our relationship with China. We knew genocide was happening in the Balkans, but did that give us the right to go in guns blazing? We believed female circumcision to be wrong, but did that mean we should pressure other governments to stamp it out? And we knew human rights were being stamped on in China, but did that mean we should stop trading with them?

    Domestically, it played out over civil rights - for women, for minorities, for gays and lesbians. With so many intolerant people in the world, using hateful language, discriminating against others, and claiming it was their right to do so, how much of it should we allow? How much intolerance should we be tolerant of?

    Star Trek’s answer, with the Prime Directive, seems to be: all of it. At least in terms of foreign policy, the Prime Directive would tell us to butt out.

    At one point in the “Half a Life” episode, one of the aliens from the euthanasia culture says “How dare you insult me and my beliefs?” When I first saw the episode, the line and its sentiment really resonated with me. Who was I to make fun of someone else’s culture?

    Re-watching it today, the line seems ridiculous. How could anyone expect to be free from criticism? What kind of culture would we have, if no one could poke fun at someone else’s beliefs? And in this particular case, what sort of liberals would we be, claiming to speak for human dignity and freedom, if we didn’t speak out against a culture that asked its members to commit suicide?

    → 2:00 PM, Jul 21
  • Wealth and Power by Orville Schell and John Delury

    Highly recommended. Takes the interesting approach of covering China’s rise over the last 200 years by profiling a selection of leaders (intellectual and political) from each period. It’s missing a map of China, so you may want to read with Google Maps handy so you can get a sense of where things in the book are happening. Also seems slanted toward the position that China’s path to wealth and power has been a successful one, instead of a crooked road paved with the bodies of the dead (see Tombstone).

    Three things I learned:

    1. Sun Yat-Sen was not the “father of democracy” I thought he was. Rather, he was one more reformer vying for power in the period at the end of the Qing dynasty, and not a very successful one, either.

    2. The feeling of humiliation for Chinese goes back to the nineteenth century. It’s not an invention of the communist party; the Chinese intellectuals of the time saw their treatment at the hands of the Western powers as humiliation, not simple defeat.

    3. The Tiananmen Square Massacre of 1989 was done at the orders of Deng Xiaoping, the same leader that started China on the path to a more market-based economic system.

    → 2:00 PM, Jul 16
  • Hobby Lobby Ruling Undermines Pluralism

    The Hobby Lobby ruling didn’t make sense to me for several reasons. One thing that really bothered me was the way they asserted they could apply the religious exemption law to the corporation: they started out asserting that corporations are persons, then shifted to saying the rights of persons are protected by protecting the rights of the people employed by corporations, then shifted to saying the shareholders would be burdened by the penalties if they didn’t comply with the healthcare law.

    It felt very slippery, and didn’t seem to hang together. Then it dawned on me: what they’re saying is that shareholders should be allowed to practice their religion through the corporation. Which sounds good at first glance, and is certainly not unconstitutional. But I don’t believe it’s a good principle for a liberal society.

    Think of a Muslim-held company that decides to force its employees to pray while facing toward Mecca five times a day, or a Rastafarian company that expects employees to smoke ganja. Or worse, a company owned by Jehovah’s Witnesses that refuses to pay for health coverage that includes my kid’s vaccines, or my blood transfusion during an emergency surgery, or my mother’s kidney transplant. According to the logic behind the Hobby Lobby ruling, this would just be the owners practicing their religion through the corporation. Never mind that they would be pushing their religion onto their employees.

    I don’t think anyone should have the power to force a religious practice on someone else - not my teachers, not my city council, and certainly not my boss.

    I shouldn’t need to worry about my employer’s religion when applying for a job, anymore than they should have to worry about mine. When you enter the public sphere, you check your religious baggage at the door. It may be uncomfortable, you may not like it, but it’s necessary in a multi-ethnic, multi-religious society like ours.

    If you don’t check your religion at the door, you can end up with Christian businesses and Muslim businesses and Atheist businesses, everything split along sectarian lines, like in Iraq. That’s not the kind of society I want to have.

    In the past, our laws have been used to avoid precisely that kind of sectarian society. When Amish employers sued to be exempt from taking their employees' Social Security payments out of their wages, they lost, because you can’t exercise your religion through a corporate body. When shop owners in the South sued to be exempt from Fair Hiring laws, they lost, because when you enter the public sphere, you agree to be bound by the laws of that sphere.

    By going against that precedent, the Hobby Lobby ruling undermines one of the core principles of our pluralistic society. I can only hope it gets overturned as soon as possible.

    → 2:00 PM, Jul 14
  • The Ruin of the Roman Empire by James J O'Donnell

    Worth the read, but takes a while to get going. The meat of his argument is in Part II, and you can basically stop reading there without missing much.

    He often seems more interested in creating a mood, a shift in perspective, rather than advancing an argument or telling a story.

    3 things I learned:

    • Both the Vandal conquest of Africa and the Gothic conquest of Italy were less "invasions" than power grabs by elites that had grown up on the borders of the Roman Empire and wanted to be a part of it. Those elites were elites, in part, because of intermarriage with the imperial family and having served as imperial troops in previous wars.
    • Justinian, the emperor who in most histories is a valiant hero trying to reclaim Roman glory, can be seen as the man who destroyed the new stability the empire was settling into, pushing it into dissolution.
    • The popularity of the monophysite variant of Christianity in the Eastern Roman lands (Egypt and Syria), and its suppression during the reign of Justinian, probably paved the way for the rapid adoption of Islam in the seventh century.
    → 2:00 PM, Jun 30
  • Debt: The First 5,000 Years by David Graeber

    Well worth the 400 pages. Graeber humanizes the history of debt, bringing anthropological insight to our understanding of the history of money.

    Unfortunately, his multiple objectives - to overturn the common story of the origins of money, to critique capitalism as a system, and to give a comprehensive history of debt, among others - pull the book in different directions. They’re all interesting, but prevent the book from gelling into a coherent whole.

    Three things I learned:

    1. The interest for credit cards in the US used to be capped at 7% (!).
    2. There were large periods of human history where things were bought on personal credit, not with coins. Only strangers used currency.
    3. We can distinguish between capitalism, or the belief that money should always make money (interest), and free markets, or the belief that people should be free to start and run their own businesses. Being in favor of free-markets does not automatically make you a capitalist.
     

     

    → 2:19 PM, Jun 3
  • 5 Signs You're Living in a Dystopia

    1. Everyone you know is happy

    Is there anything creepier than a society of happy people?

    2. No one is happy

    Conversely, if you're surrounded by miserable sacks wearing gray and shuffling through life, you're either a zombie in a horror flick or trapped in a dystopia.

    3. You can go anywhere, except to __.

    We all know why it's forbidden. The secret undermining the whole society is hidden there.

    4. No one wants change

    People always want to change things: they want more money, more power, more time to play video games. If no one around you wants anything to change, you're trapped in a dystopia.

    5. No one knows what a dystopia is

    People in dystopias don't read. They don't have any idea they're trapped in someone's nightmare future. If even one person has read 1984, you're not in a dystopia, just a gritty sci fi novel.
    → 5:39 PM, May 29
  • Superman II: Theatrical Release vs Donner Cut

    I recently discovered my wife had never seen the first two Superman movies all the way through. We decided to take advantage of the long weekend to remedy that.

    When it came time to watch Superman II, though, we had a dilemma: should we watch the original theatrical release, or the “Donner Cut” that came out in 2006?

    If you don’t know the history: Richard Donner was the director for the first Superman movie, and was supposed to direct the sequel as well. In fact, he started filming both movies at once, since they were intended to be two halves of the same story.

    He broke off filming Superman II to concentrate on wrapping up the first movie. Before he could come back to finish the sequel, the producers fired him and replaced him with Richard Lester. Lester re-shot most of the movie along with some new footage. The movie released into theaters was Lester’s.

    Donner’s footage was rediscovered in the early-2000s, and after a huge fan campaign, Donner’s team was allowed to go back through and do their own cut of the movie using Donner’s shots.

    So which one should we watch? We decided to do both: we watched the theatrical release first, then the Donner Cut.

    I worried that we’d be bored watching the Donner version; I assumed we’d be watching basically the same movie with some different scene edits.

    Boy, was I wrong. The Donner Cut is not only a completely different movie from the theatrical release, it’s a better one.

    So many things don’t make sense in the Superman II released in theaters: Why did Superman have to give up his powers? Why was it so easy for him to get them back? How the holy hell does a kiss from Superman make Lois Lane forget he’s Superman?

    All of those plot elements are better explained (or replaced with something more logical) in the Donner Cut.

    The theatrical Superman II is a hodge-podge of stories: there’s some Superman-Lois romance parts, some General Zod antics, some powerless Superman bits, and a little bit of Lex Luthor. They don’t really cohere into a single story, but some of them are entertaining.

    In contrast, the Donner Cut puts the focus squarely on the developing relationship between Kent/Superman and Lois Lane. Everything becomes part of their story, and in particular on the consequences of Lois figuring out that Kent is Superman. The result is a stronger, deeper movie.

    → 5:24 PM, May 27
  • Leave Amazon

    Amazon's recent treatment of books from the Hatchett book group is inexcusable. For me it's the last straw; Amazon has been bullying publishers for years now, and each time they push against the publishers, they're hurting the writers supported by those publishers.

    As of today, I'm switching over all book-related links on this site to point to Barnes and Noble.

    I'm also boycotting Amazon from this point forward: no more book orders, no Kindle, no ebook purchases. I'll be buying everything I need from either my local indie - Mysterious Galaxy - or Barnes and Noble.

    I encourage you to do the same.

    → 2:48 PM, May 26
  • Tinker Tailor Soldier Spy by John le Carré

    Picked it up because of the movie’s release and as my next John le Carré novel.

    Three observations on its style:

    1. Very slow start. I almost put it down several times before I pushed past the halfway mark, when things finally got moving.
    2. This is my third John Le Carre novel, and I realized I always spend the majority of the book confused. Can't yet tell if that's deliberate on the author's part - wanting to make the reader feel the confusion and stress of spy work - or if that's just me not understanding the late-60s early-70s British dialogue. Could be both. That said, I tore through the last half of the book, wanting to find out the answers to all the questions setup in the beginning. So while the technique is frustrating, it's also successful.
    3. Almost everything is done through dialogue. Even character actions are conveyed through the dialogue that accompanies them. Leads to very realistic dialogue for the characters, but also made me feel sort of detached from everything that was happening. Again, could have been a deliberate way of conveying the distance these characters are supposed to keep from the world.
    → 2:41 PM, May 21
  • Building a Bridge with Scrum

    If you built a river bridge with Scrum:

    The roadway would be built first, because that’s the Product Owner’s highest priority. Unfortunately, it would sink to the bottom of the river once deployed. This experience would be called “learning from failure.”

    Realizing they needed to get above the waterline using some supports, the team would build a short set of pillars on top of the sunken roadway. The pillars wouldn’t reach above the waterline, but they would be valuable for the experience in building support pillars for this particular river.

    Once the first set of pillars had been sunk, the team would use their new knowledge to build a second set of pillars that just breached the waterline, and construct a second roadway on top of that. This would make the Product Owner very happy, because “customers could use it” for the first time.

    After the first week, they’d realize they’d built a leaky dam, not a bridge, and that all boat traffic was being blocked.

    Working seven days a week, 14 hours a day, the team would scramble to fix the bridge. They’d cut channels in the roadway to let some boat traffic through, then build a third set of supports and a third roadway at the proper height.

    Burnt out and frazzled, the team would begin pointing fingers, each specialty blaming the other for the death march at the end. Half would quit, and join a different company, building high rises. The other half would struggle to support the many bugs still left in the bridge, despite not having any experience with the things built by the members who’d left (what was the special concrete mix Nancy used?).

    Meanwhile, the Product Owner would be praised for pulling off a miracle, and be put in charge of another bridge-building project.

    Three years later, the whole thing would be bulldozed to make room for a ferry.

    → 3:00 PM, May 19
  • The Passage of Power, by Robert A Caro

    Don’t be put off by this book’s size. Caro converts the story of Johnson’s run for the Democratic nomination in 1960, time in the Vice-Presidency, and ascension to the Presidency into a thrilling read.

    Three things I learned:

    1. Johnson passed the Civil Rights Act and the Voting Rights Act, not Kennedy. I always thought those were JFK triumphs; instead, they were JFK dreams that went nowhere until Johnson became President and pushed them through Congress.
    2. Johnson came into Congress as a New Dealer (!). I had no idea he served over two decades in Congress before becoming Vice-President
    3. Robert Kennedy and Johnson hated each other. I didn't know there was a feud between the Kennedys and Johnson, let alone that it was mostly focused between these two, or how deep their hatred of each other ran.
    → 7:54 PM, May 15
  • Small Words Big Differences

    The simple word ‘a’ can, when placed in some sentences, completely destroy their innocence.

    For example: “I’m getting furry.” Cute way of talking about growing a beard.

    “I’m getting a furry.” Creepy way of talking about the fetishist you’re picking up later.

    → 7:45 PM, Apr 10
  • Elementary vs Sherlock: Which is Better?

    Both Elementary and Sherlock offer modern takes on the characters of Sherlock Holmes and Watson. While I watch both shows, I think Elementary is the better one. Here’s why:

    Watson is more than just Holmes' biographer

    In most versions of Holmes and Watson, including Sherlock’s, Holmes is the primary mover of the relationship. Watson is there as the audience’s stand-in, someone Holmes can be brilliant next to. He’s there to make Holmes more relatable, but that’s it.

    Elementary’s Watson is a stronger, more complex character. She begins as Holmes' sober companion, becomes his mentee in deduction, and grows into an equal partner in solving crimes.

    Holmes is a more complex character

    Part of what makes Elementary’s Watson better is the fact that she manages to change Holmes. He starts the series as a recovering addict, oblivious to the feelings of others and convinced of his superiority. Unlike Sherlock’s version of the character, Elementary’s Holmes changes under Watson’s influence, becoming humbler and more sensitive to how his behavior is perceived.

    Elementary’s version of Holmes is vulnerable, and knows it, something we never see in Sherlock.

    Moriarty finally makes sense

    I think Elementary’s portrayal of Moriarty is brilliant. The writers of Elementary managed to finally give a good explanation for the two main problems with Sherlock’s Moriarty:

    1. Why doesn't Moriarty kill Holmes? I've never bought the "I admire him" argument. What criminal mastermind wouldn't eliminate a threat as great as Sherlock Holmes as early as possible?
    2. Why doesn't Holmes track down Moriarty earlier? Both Sherlock and Elementary have Holmes encounter Moriarty early on without recognizing him, but only Elementary has a good explanation for why such an observant man as Holmes would have a blind spot where Moriarty is concerned.
    Update: The Onion's AVClub agrees that Elementary is the better show.
    → 3:03 PM, Jan 17
  • Same-Sex Marriage is not a religious issue

    Same-sex marriage is not a religious issue. It’s a legal one.

    When you get married, you give your partner certain rights, and the two of you can act as one person. You can buy a house together and be treated as if you both owned it. If you have children together, you both get parental rights.

    You get these rights because the government says you have them. No religious leader can simply point to two people and give them the ability to make medical choices for each other. The two people have to be adults, they have to decide to get married, and the person that marries them has to have been given that power by the government.

    For the government to say that two people of the same sex can’t get married is like saying they can’t buy a car together. It’s an arbitrary refusal, a failure to fulfill one of the core functions of government: to enforce contracts.

    → 3:53 PM, Dec 31
  • How To: Fix Blank Screen on the new Nook Glowlight

    I bought a new Nook Glowlight soon after it came out. I’m happy with it for the most part, but it has an annoying habit of going to a blank screen when I put it into sleep mode.

    When I wake the Nook from this blank screen, it looks like it displays the book I was reading correctly, but each tap of the screen advances the text, even if I tap on the bottom to try to get to the Settings menu. Eventually the Nook freezes completely.

    To fix this problem, I reboot the Nook when the blank screen first comes up. To do that, I hold the power button down for 20-30 seconds, until the blank screen is replaced by the booting up screen. I know it’s rebooting when I see the word “nook” printed in the middle, then “E-ink”, and finally the spiral of dots that means “loading”.

    Hope this helps other Nook Glowlight owners!

    → 10:44 PM, Dec 28
  • Software Engineering Lessons from NASA: Part One

    Long before I became a programmer, I worked as an optical engineer at NASA's Goddard Space Flight Center. I was part of the Optical Alignment and Test group, which is responsible for the integration and testing of science instruments for spacecraft like the Hubble Space Telescope, Swift, and the upcoming James Webb Space Telescope.

    While most of the day-to-day engineering practices I learned didn't transfer over to software engineering, I've found certain principles still hold true. Here's the first one:

    The first version you build will be wrong.

    At NASA, it was taken as axiomatic that the first time you built an instrument, you'd screw it up. Engineers always pressed for the budget to build an Engineering Test Unit (ETU), which was a fully-working mock-up of the instrument you ultimately wanted to launch. Since the ETU was thrown away afterward, you could use it to practice the techniques you'd use to assemble the real instrument.

    And you needed the practice. The requirements were often so tight (to the thousandth of an inch) that no matter how well you'd planned it out, something always went wrong: a screw would prove too hard to reach, or a baffle would be too thin to block all the light.

    No amount of planning and peer review could find all the problems. The only way to know for sure if it would work was to build it. By building an ETU, you could shake out all the potential flaws in the design, so the final instrument would be solid.

    In software, I've found the same principle holds: the first time I solve I problem, it's never the optimal solution. Oddly enough, I often can't see the optimal solution until after I've solved the problem in some other way.

    Knowing this, I treat the first solution as a learning experience, to be returned to down the line and further optimized. I still shoot for the best first solution I can get, but I don't beat myself up when I look back at the finished product and see the flaws in my design.

    → 5:56 PM, Dec 26
  • How to Fail at Customer Service: UPS Edition

    I’ve been waiting on a delivery of books for about a week now. When I got my first notice from UPS about a failed delivery (they needed a signature), I deliberately worked from home the next day so I could sign for the package.

    Imagine my surprise when I went out to get the mail that afternoon and found another “failed delivery” notice on my door! I checked the UPS tracking site, and sure enough, it said the driver had “tried to deliver” the package 15 minutes earlier.

    Here begins a bizarre experience in customer service.

    I used UPS live chat to contact their customer service department, asking if they could have the driver swing back by, since I was home and he obviously didn’t try to deliver the package. They said they couldn’t do that, but they’d report my problem to the local branch, who would contact me by the end of the day.

    So, first questions: UPS can’t contact their drivers while they’re out? And the central office can’t handle customer complaints?

    The local branch called - at 7:30 at night, well after close of business. They left a rambling voicemail that insisted the driver had tried to get a signature, but would try to re-deliver the next day. Alternatively, I could have them hold it, and pick it up between 8:00-8:30 am. They repeatedly mentioned I should call “the 800 number” to tell them what I wanted, but failed to tell me what the actual 800 number was.

    So, second question: if complaints are handled locally, why was the local branch redirecting me to (I assume) the national office’s number?

    The next day, I tweeted about my bad experience, and got a reply from the UPS twitter bot asking for more info. I emailed them my tracking number, hoping for some actual customer service. Boy, was I wrong. They sent back the same “complaints are handled locally,” response, even saying “I see the local office has contacted you already,” as if the fact that they left a voicemail made everything better.

    Again, why the hell would the national office bother to find out more, if there’s nothing they can do?

    So, instead of getting my package delivered - the service I paid for - I’m heading out to the UPS package center in the morning to pick up my books.

    Let’s review all the mistakes here:

    1) When confronted with a customer that didn't get the service they paid for, UPS never admitted wrongdoing.

    This is an amateur customer service mistake.

    2) Rather than try to compensate the customer for the mistake, UPS bounced the customer between different departments.

    This is like watching the federal and state governments argue over who’s responsible for bad schools - they’re both involved, so why don’t they work together to fix it instead of passing blame?

    3) UPS is requiring the customer to complete the service on their own.

    This is like a waiter telling you to go fetch your re-fired steak from the kitchen yourself. You’d never go back to that restaurant.

    I’m amazed a company like UPS could fall on its face over something as simple as delivering a package to a house with a person inside. You’d think they’d treat their core mission a little more seriously.

    Instead, they’ve convinced this guy to ask for FedEx next time.

    → 10:33 AM, Mar 30
  • Five Reasons Your Company Should Allow Remote Developers

    If you don’t allow your software developers to work from home, you’re not just withholding a nice perk from your employees, you’re hurting your business.

    Here’s five reasons letting developers work remotely should be the default:

    1. Widen your talent pool

    Good software engineers are already hard to find. On top of that, you've got to hire someone skilled in your chosen tech stack, which narrows the pool even further. Why restrict yourself to those engineers within driving distance to your office? Can you really afford to wait for talent to move close to you?

    The CTO for my current gig lives an hour away from the office, and can’t move because of his wife’s job. We wouldn’t have been able to hire him if we didn’t let him work from home. Who are you missing out on because you won’t look at remote devs.

    2. Reclaim commute time

    The average commute time in the US is 30 minutes. That's an hour a day your in-office developers aren't working. If you let them work from home, they can start earlier and finish later.

    Don’t think they will? The evidence shows they do: people working from home work longer hours than people in the office.

    An extra hour of work a day is five more hours a week, or almost three more work days in the month. Why throw that time away?

    3. Reduce sick leave

    When I've got a cold or flu, I stay home. I usually spend the first day or two resting, but by the third day I'm usually able to work for a little, even though I'm too sick to go into the office.

    If my boss didn’t let me work from home, he wouldn’t get those “sick hours” from me. I’d be forced into taking more time off, getting less done.

    And when my wife’s sick, I don’t have to choose between taking care of her and getting my work done. By working from home, I can do both.

    4. Increase employee retention

    The only thing worse than not hiring a good dev is losing an engineer you've already got. When they leave, you're not only losing a resource, you're losing all the historical knowledge they have about the system: weird bugs that only show up once a quarter, why the team chose X db instead of another, etc.

    Since the competition for talent is fierce, you don’t want to lose out to another company. Letting developers work from home sends a clear signal to your employees that they’re valued and that you appreciate work-life balance. And with many companies sticking to the old “gotta be in the office” way of thinking, you’re ensuring that any offer your employees get from another company won’t be as attractive.

    5. Stay focused on work done

    Finally, letting developers work from home forces the entire team to focus on what's really important: getting work done. It doesn't matter how many hours a developer spends in the office; if that time isn't productive, it's wasted.

    What does matter is how much work a dev gets done: how many bugs squashed, how many new features completed, how many times they jump in to help another engineer. What you need from your developers is software for your business, not time spent in a cubicle. If they’re not producing, they should be let go. If they are producing, does it matter if they’re at a coffee shop downtown?

    And if you don’t have a way of measuring developer productivity beyond hours spent at their desk, get one. You can’t improve something you don’t measure, and team productivity should be high on your list of things to always be improving.

    → 8:00 PM, Mar 29
  • ClojureWest 2013: Day Three Notes

    Editing Clojure with Emacs: Ryan Neufeld

    • emacs live, emacs prelude, emacs-starting-kit: for getting up and running
    • bit.ly/vim-revisited - post about going back to basic editors
    • bit.ly/clj-ready: ryan's version of emacs starter kit
    • nREPL & nREPL.el instead of inferior-lisp
    • melpa for your package manager
    • have a look at the projectile minor mode for project management
    • use paredit to build up clojure code trees, not just characters
    • slurp and slice to add new structure: () then slurp to wrap

    Ritz: Missing Clojure Tooling: Hugo Duncan

    • clojure debugging tool
    • nREPL: lets you connect to remote clojure VM (transport + socket + protocol + REPL)
    • sits in-between your local nrepl and the remote nrepl process
    • available as marmalade package
    • also lein plugin: lein-ritz
    • turn on break on exceptions: gives you common-lisp like stacktrace + restart options (continue, ignore, etc)
    • can open up stacktrace to see local variables within the frame
    • can even evaluate expressions within the frame (!)
    • also pull up the source code for a frame (clojure or java)
    • can set breakpoints on lines of code in emacs; view list of all current breakpoints in a separate buffer
    • warning: lists appear in stacktrace frame fully-realized (will be fixed)

    Macros vs Monads: Chris Houser and Jonathan Claggett

    • synthread: library of macros that use Clojure's -> (threading macro) as the do
    • usually pulled in with -> as its alias
    • defines macros for most of clojure's control-flow code
    • also has updater macros
    • use for cases where pure functional code is too verbose and/or hard to read
    • replaces use of state monad
    • monads are infectious (end up passing them around everywhere)
    • clojure 1.5 has cond-> macro
    • rover example project up on github: lonocloud/synthread

    How to Sneak Clojure into Your Rails Shop: Joshua Bellanco

    • and improve your rails hosting along the way
    • chief scientist at burnside digital (based in portland)
    • if this was 2006, we'd be talking about sneaking rails into your java shop
    • learn from rails: better to ask forgiveness than permission, use clojure whenever it's the right tool for the job, don't be afraid to show off your successes
    • step 1: convince them to use jruby (better tooling, better performance, java ecosystem, plenty of hosting options)
    • step 2: torquebox for deployment (benefits of jboss)
    • step 3: go in with clojure and start using immutant overlay (gives jboss, torquebox, jruby); lein immutant run runs both ruby and clojure apps
    • step 4: openshift (open source heroku from redhat)
    • step 5: make clojure and ruby talk to each other (hornetq + torquebox/immutant messaging libraries)
    • step 6: show off!
    • example project: memolisa: sends alerts and confirmation when alert is read; rails for users + groups, clojure for the messaging

    clj-mook: Craig Brozefsky

    • library for testing web apps
    • persistent session, default request params, html parsing
    • motivated by shift from ring to immutant

    RxJava: Dave Ray

    • open-source implementation of M$ Reactive Extensions
    • operators for creating, composing, and manipulating Observable streams
    • sketch up at daveray/rx-clj
    • also: netflix/rxjava

    VMFest: Toni Batchelli

    • goal: make virtualbox behave like lightweight cloud provider
    • instantiate multiple vms from the same image
    • wrap the OOP api of virtualbox with a sane clojure one
    • has hardware dsl
    • one step further: little-fluffy-cloud -> RESTful interface for vmfest
    • visaje: build VMs from data

    shafty: Chris Meiklejohn

    • basho technologies: erlang and js, with some clojure
    • functional reactive programming library
    • based on flapjax, implemented in clojurescript
    • implementation of core API from flapjax
    • FRP: authoring reactive programs without callbacks
    • FRP: event streams and behaviors

    swearjure: gary fredericks

    • subset of clojure with no alphanumeric characters
    • exercise in extreme constraints
    • integers but no floats
    • true and false available

    Evolutionary Art with Clojure: Alan Shaw

    • clevolution: partial implementation of paper on genetic programming
    • converting s-expressions to images
    • using self as filtering function: delete the images he doesn't like
    • want to move to true evolutionary: use function to weed through the images, allow cross-breeding between s-expressions
    • clisk, clojinc, clevolution

    Simulation Testing with Simulant: Stuart Halloway

    • example-based tests: setup, inputs, outputs, validation
    • originally built as tool for testing datomic
    • no language indirection: it's about using clojure and datomic
    • write model for what will happen to the application, then writeup actions to take against the system
    • can speed up time in simulation, so don't have to wait for 6 mo for 6 months of results to go through
    • stores db with test results *and* the db tests ran against
    • can find and diagnose bugs by querying db after tests run
    • use clojure.data.generators to generate random test data (ints, vectors, maps)
    • github.com/stuarthalloway/presentations/wiki
    • contact at @stuarthalloway to have come out to speak at company or group
    • even working through the model of users and use is a good exercise; good way to validate the assumptions you're making about the system
    → 4:08 PM, Mar 21
  • ClojureWest 2013: Day Two Notes

    Winning the War on Javascript: Bodil Stokke

    • catnip: beginners clojure editor in browser
    • originally used coffeescript because cljs was immature and hard to work with js objects
    • currently working on converting catnip to cljs
    • error: another clojurescript testing framework, built around asynchronous testing

    PuppetDB: Sneaking Clojure into SysAdmins' Toolkits: Deepak Giridharaghopal

    • ops has a lot of entropy: spooky action at  distance: devs or admins logging in to one of many servers and mucking around without telling you
    • lack of predictability ruins automation and abstraction
    • problems with previous software in Ruby: not fast, only one core, mutable state everywhere, runtime compatibility a problem
    • solution: puppetdb in clojure for storing and querying data about systems
    • used CQRS: command query responsibility separation -> use different model to update then to read info
    • send commands to a /command endpoint, which queues the command for parsing and processing
    • build command processing functions as multi-methods switching off of the command and version sent
    • can also turn on live repl, to connect to running code and hack
    • queries have their own AST-based syntax; sent as json, built as vector tree
    • can ship the whole thing as a single uberjar, with built-in db, etc

    Securing Clojure Web Services & Apps with Friend: Chas Emerick

    • authentication & authorization (who are you? what are you allowed to do?)
    • options: spring-security (java, not recommended), sandbar, ring-basic-authentication, clj-oauth2
    • most common: roll your own
    • wrote friend to have a common auth framework
    • uses ad-hoc hierarchies for roles
    • add workflows to specify how to authenticate a request that doesn't have authentication yet
    • friend-demo.herokuapp.com for multiple demos with source code
    • recommend using b-crypt over sha

    FRP in ClojureScript with Javelin: Alan Dipert

    • event stream: sequence of values over time
    • behavior: function that updates according to changing values from event stream
    • reactive evaluation: holds off on evaluating until all values are available
    • similar to spreadsheet formula evaluation (!)
    • FRP maintains evaluation order despite lack of all values at once
    • current FRP in clojurescript: FlapJax
    • javelin: abstract spreadsheet library for reactive programming with values
    • everything contained in the "cell" macro
    • web app has single state at any point in time, contained in the "stem cell"
    • everything in app either in stem cell or derived from it

    SQL and core.logic Killed my ORM: Craig Brozefsky

    • uses clojure for analysis engine looking for possible malware actions
    • core.logic engine takes observations and creates IOCs (indications of compromise) + html
    • observations: wrapper around core.logic's defrel
    • IOCs: severity + confidence, explanation, suggested remediation
    • the reasoned schemer: handed out to all their analysts to explain logic programming to them so they can use the system

    Macros: Why, When and How: Gary Fredericks

    • macro: special function that takes form as argument and returns a form
    • run at compile time
    • can always be replaced by its expansion
    • when writing macros, helps to know what you want it to expand to
    • use macroexpand-1 to find out when it's going to return
    • cannot pass macro to higher-order function (not composable at runtime)
    • macros can make code harder to read; person reading code has to be familiar with macro expansion to really know what your code is doing
    • tolerated usage: defining things, wrapping code execution, delaying execution, capturing code, DSLs, compile-time optimizations (hiccup produces as much html as possible at compile time)
    • avoiding macros: get more familiar with higher-order function usage and paradigms
    • writing tolerable macros: use helper functions, naming conventions, no side effects
    • syntax-quote (backtick): like quote on steroids, gives you multiple benefits when used in a macro
    → 4:45 PM, Mar 20
  • ClojureWest 2013: Day One Notes

    Domain Driven Design in Clojure: Amit Rathore

    • read the book from eric evans
    • Lot of oop design principles carry over
    • shoot for 3-4 lines of clojure code per function
    • validateur, bouncer, clj-schema (validation)
    • if code confusing, demand simplification
    • make temp namespaces explicit: zolo.homeless
    • domain: business-important logic, not the API, not services, not validation, not talking to the db, just the stuff business people care about; should be pure
    • if you don't need it now, don't build it

    RESTful Clojure: Siva Jagadeesan

    • liberator, bishop: libraries to help build proper REST APIs in clojure
    • use the status codes: 1xx - Metadata, 2xx - success, 3xx - redirect, 4xx - client error, 5xx - server error
    • 405: method not allowed
    • 409: conflict
    • 404: resource not present
    • create returns Location header with location of new resource, in addition to the 201 (created) status code
    • even better: also return a set of links to related resource (rel = self) and transitions (rel = cancel)
    • allows client to be loosely coupled from API
    • client doesn't need to know how resources move through the system (transition logic)
    • REST means using multiple URIs, HTTP status codes, and Hypermedia

    Clojure in the Large: Stuart Sierra

    • def'ing refs and atoms at the top level is basically global mutable state via singletons, please avoid
    • recommend using constructor functions to *return* the state variables you want to use, then pass that state along to each function
    • easier to test
    • explicit dependencies
    • safe to reload when working at the repl
    • thread-bound state also bad: assumes no lazy sequence returned in function bodies, hides dependencies, and limits caller to using one resource at a time
    • prefer passing context around to functions
    • can pull resources out of it
    • use namespace-qualified keys for isolation
    • isn't confined to a single thread
    • still need to cleanup at the end
    • more bookkeeping
    • true constants are fine as global vars (^:const)

    Pedestal: Architecture and Services: Tim Ewald

    • alpha release from relevance of open-source libs
    • use clojure end-to-end to build RIAs
    • demo: hammock cafe: clojurescript apps communicating to same back-end using datomic store
    • 2 halves: pedestal-service, pedestal-app
    • ring limits: bound to a single thread's stack
    • interceptors: map of functions, has enter and leave for processing requests and responses
    • can pause and resume along any thread
    • pushed to be as ring-compatible as possible
    • use of long polling and server-side events (requests that come in slow and last a long time, get updated as more data comes in)

    Design, Composition, and Performance: Rich Hickey

    • take things apart
    • design like bartok (embrace constraints, use harmonic sense)
    • code like coltrane (constant practice, keep harmonic sense)
    • build libraries like instruments (design for players, able to be combined with other things)
    • pursue harmony
    → 4:16 PM, Mar 19
  • Rewryte.com is live!

    For about 8 months now, I’ve been working every Sunday morning with a good friend of mine building rewryte.com. It’s our own little web app, a tool for giving writers automatic feedback on their writing.

    We’re trying to go beyond grammar checks and spellcheckers, to answer questions like:

    • Are my sentences too long?
    • Are the words I'm using too specialized for my audience?
    • Should I submit this story as horror or science fiction?
    Today we went into public beta. Please check us out if you can, and leave feedback so we can improve.
    → 3:39 AM, Jan 28
  • Why the Perfectible Job Beats the Perfect Job

    I’ve changed jobs a lot over the past few years. I knew it would raise eyebrows each time I applied for a new position - they’d ask themselves how long I’d stay with them - but I told myself it was because I was looking for the perfect job, so it was ok.

    I’ve realized the perfect job just isn’t out there.

    There’s something wrong with every job. The dress code is too formal. The boss won’t let me work from home. They’re not using my favorite language. They’re not promoting me. They don’t give enough vacation hours. The codebase is old and crufty. Etc.

    The trick is to find a perfectible job, not a perfect one. A job with a boss and a team that’s flexible enough so that you can improve the job over time.

    After all, my interests will shift over time. Even if I found the perfect job for what I want to do now, I’ll grow out of it in a few years. And then where would I be? Leaving the perfect job, and torturing myself over it.

    Better to find a job with a few rough edges that I can smooth out over time. As long as I go in with my eyes open, I won’t be disappointed.

    Because perfecting your job is just a different type of engineering.

    → 3:04 PM, Jul 20
← Newer Posts Page 30 of 34 Older Posts →
  • RSS
  • JSON Feed