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.
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.
Picked it up because of the movie’s release and as my next John le Carré novel.
Three observations on its style:
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.
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:
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.
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:
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.
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!
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:
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.
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:
This is an amateur customer service mistake.
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?
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.
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:
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.
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?
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.
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.
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.
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:
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.
I’m a little obsessive about the tools I and my co-workers use. If I come into a company and they’re still on svn, I push to get us switched to git. If people have to login to a remote server to develop on via a slow internet connection, I figure out how to get a local VM install to do everything we need, and share it with everyone.
So when my current company started experiencing pains with PHP, and the other devs talked about switching languages, I immediately thought of persuading them to switch to Clojure.
Why Clojure? It’s fast. It’s code is compact but still readable. And it’s got the power of Lisp.
I got permission to build some internal tools in Clojure, and set to work. I thought it was just a matter of time before the other devs would “see the light” and start switching over to Clojure.
Nine months later, we’re still building everything in PHP. No one’s even looked at my Clojure code. Beyond some jokes about Python, there’s been no further movement toward switching languages.
I’ve failed.
But why? In order to document my mistakes, so I and others can learn from them, here’s what I did wrong:
As a result, those internal tools I built were full of bugs when they launched. When I got pulled off of working on those tools and back to working on the core company applications, those bugs stayed - for months - without being fixed.
My co-workers' first experience with Clojure was of a buggy, slow application that didn’t do too much. That first impression was hard to shake, even after I went back and fixed bugs and improved the apps.
I documented everything they told me, capturing it in Jira tickets, and then sat on them for months.
Why? I’d been pulled off of internal tools to doing other application development. So instead of being able to iterate with my users, constantly improving the application, they had to wait a long time before they saw any changes. I lost what goodwill I’d had to start with, because I didn’t respond to their needs.
I was certain that some of them would peek at the Clojure code, just to see what it was like, and then start asking questions. I told myself this was the natural, organic way to start spreading Clojure knowledge around the organization.
I was dead wrong. The other developers had a hard enough time deciphering PHP code from 2 years ago; they weren’t going to spend time trying to read my stuff too. Especially since it was buggy. And slow. And hard to use.
Your first 30 days with a company can be nerve-wracking. Your boss is watching your performance, trying to decide if he made the right choice. Your co-workers are trying to learn if you’re going to be a helpful member of the team or just dead weight.
All that scrutiny gives you a golden opportunity to make a great impression.
Here’s four ways to make sure they’ll be glad to have you on board:
1) Go in Early
I know a lot of developers are night owls, but for the first 30 days, you should make an exception. Come in earlier than you normally would, but stay as late as everyone else does. You’ll show everyone you’re serious about the job, and aren’t afraid of work.
Even if you shift your schedule back to a normal one after the first 30 days, you’ve gone a long way to reassure your colleagues that you’re here to help them out.
2) Update Documentation
Was the system setup process well documented? If not, fix it. If documentation doesn’t exist yet for something you’re supposed to learn, create it. Your boss will notice, and you’ll be helping future employees get up and running faster.
3) Ask Questions
It’s one thing to learn how a company does things. It’s better to learn why they do them the way they do.
Look for areas where they don’t have any reason to back up how they’re doing something. If you can find a better way of doing it, pitch it to your boss. You’ll show him you care about the quality of your code, and you won’t have to step on anyone’s toes.
4) Stay Calm
You’re learning a lot of new things, and trying to stay productive at the same time. Don’t rush yourself. Most employers don’t expect their employees to start seriously contributing until they’ve put in 90 days. You’re going to be slower than normal, but that’s ok. Take the time to really learn all the nooks and crannies of the system you’ll be working in now, so you can contribute more later.
You’ve landed a good job. You negotiated a high salary, plenty of vacation days, and flexible work hours.
Congratulations. But don’t stop thinking about your career just yet. Now that you know your way around your current programming language, it’s time to learn another one.
Here’s why:
1) Languages go obsolete
Every programming language becomes obsolete at some point. COBOL isn’t used for new software anymore. Whatever language you’re using now will be obsolete, or at least on the downward trend, in 5-10 years. You don’t want to end up chained to one company (or worse, laid off from said company) with only an obsolete language on your resume.
Pick a language that looks to be on the upward curve, and learn it. Think of it as insurance against the future.
2) Languages express best practices
When someone creates a new programming language, they’re codifying a certain style of programming that they consider to be the best. After all, if Guido Van Rossum thought functional programming was the best style to work in, Python would have been a functional language.
One of the easiest ways to get deep into someone else’s ideas about the best way to program is to learn their language. Consider the learning experience a conversation you’re having with the language creator, trying to learn how they think programming should be done.
You’ll probably agree with them on some things, and disagree on others. Take the things you like - the parts of the language that make some best practices easier - and find ways to incorporate them in the language you’re currently using.
3) Languages don’t do everything well
Most of the general-purpose programming languages we’ve got are actually really good at just one or two things, and terrible at others. PHP is a great scripting language, but pushing it to express a complicated DSL leads to code that’s hard to read and painful to write.
Picking up a new language gives you a larger toolbox to draw on, so when it comes time to build that internal website, or reporting system, or distributed image processing software, you’ll be able to use the best language for the job.
4) Languages lead to jobs
This one almost goes without saying. You can’t land a Ruby job without learning some Ruby. You need to know C++ (or Objective-C) to work in the games industry. If you want to switch from web development to scientific computing, learning a new language is your best bet.
5) Languages teach programming fundamentals
Do you know what a monad is? How about S-expressions? Learning a language that’s radically different from what you normally work in (say, Haskell for Python devs) can teach you new programming concepts. You’ll learn new ways of thinking about programming, and new ways to approach traditional programming problems.
In the end, learning a new language (or several languages) is all part of becoming a mature, experienced developer. If you want to prepare for the future, expand your programming horizons, and keep a secret weapon (or two) in your dev toolbox, then you should learn a new language.
With the market for developers so fierce, we can afford to be a little more careful about where we work.
Over the years, I’ve interviewed at several companies. Whenever we got to the part of the interview where they asked what questions I had for them, I had plenty of stuff to ask about their tech stack, but not as much to ask about their working environment. Here are 10 questions I wish I’d asked at every interview:
You’d be surprised how many places expect more than 40 hours. If they want you to work 45 or 50 hours a week, it’s best to know that up front, so you can negotiate an appropriate salary.
A lot of companies will say they allow working from home. If they’re actually committed to it, though, they’ll be at least one or two developers taking advantage. If no one works from home, it’s because it’s discouraged by management, or they don’t really have the infrastructure (VPN, etc) in place.
A critical question for startups. They’ll usually ask you to take a lower salary in exchange for shares. But if those shares take 5 years to become vested, you’re looking at a long wait for a risky payoff. Do you really want to sacrifice money in the bank for that long? Best to make an informed choice.
Most places are flexible, but have some sort of core hours they want you to keep. These may not fit your natural schedule (I’m personally a morning person, but I know a lot of developers that prefer to code at night).
Several startups are offering unlimited leave these days. It makes sense; if you’re a salaried employee, paid per year to get a job done, does it matter how many sick days you took?
If they won’t go unlimited, consider bargaining for increased vacation instead of a higher salary. You’ll thank yourself later.
Over the life of any piece of software, your tools are going to change. Is this dev team ready to handle that?
You’re going to want to spend time on your own stuff, whether to try out a new language or keep your skills up to snuff. You’ll probably want at least some of that to be open source work, so you can show future employers your coding prowess without violating NDAs. If your new job won’t let you invest in yourself, will they pay for training or conferences to compensate?
Ideal would be reviews after 30, 60, and 90 days for new employees, with everyone else getting evaluated every 6 months. You need the feedback an employee review can give, and they should want to hear from you.
Feedback, feedback, feedback. One of the fastest ways to grow as a developer is to have other people read and comment on your code. Frequent code reviews mean the team is committed to getting better.
Another feedback question. Again, you’re trying to see if the team is serious about getting better.
These questions won’t cover everything, but they’re areas we developers often forget to check when looking for a new job.
Both Amazon and Barnes and Noble claim their ereaders will sync where you are in your books between the different devices (iPad, Android phone, PC or Mac) you might be reading on. Amazon’s works in the background, without a hitch, but Barnes and Noble’s (Nook) takes some finesse to get working.
I nearly pulled my hair out in frustration trying to figure out why the last read page in my books wasn’t syncing between the Nook software on my iPad and the Nook software on my Android phone. I looked in the Settings for both devices, trying to find something that said “sync” and might have been turned off, but no luck.
Here’s how to get them to sync:
Ever since I gave away my trusty Macbook, I’ve been pining for a new computer. The iPad purchase helped, but let’s face it: I’m not going to be able to do any programming on that thing.
I knew I was going to install Linux on whatever I bought, so I thought I’d cut out the middle man and buy one direct from System76. They’ve been making laptops and desktops with Ubuntu pre-installed for a few years now, and their reviews have been positive. So I swallowed my trepidation at buying a laptop without test-driving it in the store first and ordered one of their Pangolin Performance machines.
After two weeks, here’s what I think (in brief):
What’s Good
I’m close to returning it and just buying a Macbook. It might cost more, but at least I’ll know it’s solidly built.
Update 12-15-2010: Finally convinced system76 to let me ship the computer to them for a keyboard replacement. Hopefully this’ll fix the spacebar problem and make the laptop worth keeping.
Update 12-27-2010: They fixed the keyboard! Got the laptop back just before Christmas, and the spacebar works normally (as does the rest of the keyboard). Definitely keeping the laptop now. Thanks to system76 for coming through with hardware support.
30 days ago, I broke down and bought an iPad.
I know, I’ve ranted and raved against Apple’s unfair closed-source system. And yes, I hated the shopping experience my first time out.
But lugging around my netbook + my Nook so I could read books and check email and read pdfs and read The Economist online started bugging me. Doubly so when I realized there were some ebooks I could only get from the Kindle store (damn you, DRM!), but neither my Nook nor my netbook could read Kindle books (Linux, it so happens, is the one platform Amazon’s Kindle software doesn’t run on). So I had to read Kindle books on my phone (Android), Barnes and Noble books on my Nook, and pdfs (Linux Journal - why do you guys cling to the old pdf format?) on my netbook.
Needless to say, this drove me batshit after a while.
So I trudged down to the Apple store to try out the iPad again.
And guess what? My experience was much better this time. There was plenty of software installed on the demo units for me to try out. The staff answered all my questions, and actually seemed to care about selling me one.
I picked one up, and after 30 days I don’t miss the Nook or the netbook at all.
I can read all my books, from every store. I can push my pdfs into DropBox and read them with GoodReader. I’ve even started jotting down notes for a few short stories in Elements, again using DropBox to sync up the files between my Nook and my desktop.
Oh, and I’ve also picked up a few games. Plants vs Zombies HD is almost worth the price of admission on its own.
Can I program on it? Nope. Is it annoying that iTunes can’t play my .ogg files? Hell, yes.
But you’ll have to pry it from my cold, dead hands before I’ll give it up.