Work smarter, not harder… and faster!
Maybe it’s obvious. When you try to do things really fast, it can actually be slower.
I always thought “A stitch in time saves nine” meant that you should stitch as fast as possible. I think I just assumed that, which I need to be careful of, because when you ASSUME, you make an ASS out of U and ME.
It’s certainly true with programming. When it comes down to it, if you look at a finished application, it’s conceivable you could just type the code for it in an afternoon, especially if you have good tools that let you express your intent quickly. Of course, you don’t know exactly what the code will look like until you start to create it, but let’s ignore that for a sec.
So… taking my time and thinking for a second to save time. I was too frantic for the last couple years, and wrote a lot of Log object instantiations.
public static final Log log = LogFactory.getLog(NiceObject.class);
I wrote that a lot, and got a Das Keyboard so I could type it even faster. I knew that Eclipse could do this for me, but there’s that nagging startup cost, where the first time I set it up, it would take longer, and I might go looking around for more of the same (or blog about it), making it much longer than typing it out.
Correction!
Well, I learned that what I said yesterday isn’t quite true. It IS true that the geocoder.us site does a bad job geocoding on this street. You can see their map here:
http://geocoder.us/demo.cgi?address=4050+BEN+LOMOND+DR+PALO+ALTO%2C+CA+94306
BUT, if you zoom in, you see the shape of the street is right, they just have the pin in the wrong place. The maps come from the TIGER/Line data as well as the geocoding. The problem is that the Perl module, Geo::Coder::US, doesn’t use one of the data files in the TIGER set – the RT2 “type 2″ data. This file is Complete Chain Shape Coordinates which means it has midpoints for some street segments. I found the two midpoints for the street I showed yesterday, and put some pushpins at those spots – and behold, the curvy street problem would go away!
Now, too bad I can’t find any libraries (in any language!) that do the same thing as the Perl library, but use the RT2 data…
Why TIGER/Line can be a bad source of geolocations
I came up with this neat map in Google Earth, showing the difference between Google’s coordinates for some addresses in Palo Alto, CA, and a line connecting those to the TIGER/Line-backed geocoder.us coordinate, colored blue-to-red based on how far off it is. The TIGER/Line data only has endpoints for a range of addresses, and the geocoder.us Perl module tries to do a linear interpolation to get addresses in the range. Obviously this doesn’t work well for non-linear streets like this one…
FeedBurner, finally!
I have sort of known in the back of my head that I ought to have my feed managed better. It would be nice to see who is subscribed, both because I don’t really want to blog to hear myself talk, and also because you get an incentive to write more interesting and useful stuff if there’s an audience.
So I hooked up feedburner, and was pleasantly surprised by how useful it is. Not only do I get my basic readership metrics, it also manages the trick of getting existing subscribers under the metrics (by telling blogger to redirect requests for the feed URL) and lets me fold in daily bookmark digests and photos.
Hopefully my 2 readers (?) will also enjoy my random API and documentation bookmarks (?) and at the same time, my attempts to do film photography (?).
Now I am wondering how to advertise my Twitter and Skype and Facebook and so on. I guess it’s good to make them widgets on the right side of the blog, and just assume that one URL will give away my complete identity. Maybe hCard is good for this? I do feel like my “Card”, whether it’s vCard or whatever, should have my contact info including many URL’s, and should be easy to broadcast my card to *everyone*, not just online friends. Then the offline people like grandma get my new phone number, and online people get the skype ID, and all is well.
That would be another reason to try out one of the email->snail mail gateways – I can subscribe my grandmother to my vCard feed and she’ll get it via postal mail… slick. Except then she’ll call me wondering why I sent her a letter, just because I added a web 2.0 service to my card… maybe I should think about that some more.
liveblogging from barcampdc
I saw the technorati page over justin’s shoulder so I should probably contribute. The conference is cool, it’s a little presentation-heavy rather than interactive, I guess that’s just because it’s hard to get people comfortable with other participants when there are 9 sessions in 8 hours.
I was thinking about how attendees at this sort of conference are into scripting, web 2.0, design, user experience, “lightweight”, fun stuff. There isn’t much community forming around enterprise, Java stuff anymore. The NoVA JUG has been trying to recover from near-death, as far as I can tell from the mailing list. Maybe dynamic, smart people just want to spend their free time on the fun stuff that’s hard to get paid for.
Building codes
When I was at my last government contract, we were developing a Single Sign-on solution that dragged on forever due to Oracle bugs, misunderstanding of the requirements, politics, and the other usual suspects. In the meantime, across the street and plainly visible from my seat, a building went up, a nice 8-story office building with a parking garage. They literally broke ground, dug the foundation, erected cranes, put up the building, added HVAC, walls, windows, and it was basically done, while we still hadn’t implemented a working single sign-on solution across all the applications that were supposed to have it. We were just typing, and these guys had brought in truckloads of materials and assembled this giant structure.
This has always struck a nerve for me, especially because I think erecting a building is the single best analogy for software development. I’ve heard others, like from my crazy first boss who always said that if we were missing a certain feature, it was like a car with three doors. But a car isn’t a good analogy for development – they are mass-produced, never modified, consumer products with a pretty small set of complexity – combustion, electrical, mechanical, suspension, seat cushions.
Buildings, on the other hand, share a TON of interesting features with software. They are large projects, similar to each other in form but each unique in their implementation. There are a number of skilled workers, with different areas of expertise that must participate. There is a complex schedule that must account for the dependencies between pouring the foundation and inspecting the concrete and so on.
Pre-fab is another nice part of the analogy. I don’t know much about it, but I think there are a lot of standards in buildings that make it possible to get lots of your materials in a partially constructed state. Door frames are a similar size, and you can just buy the door already hinged into a frame, nice and square and level. I see trucks with rafters for houses, already assembled and ready to “raise the roof”. Same goes in software, where standards like those from the JCP let us plug in pre-assembled components rather than building them from scratch.
Looking further, there is an agency problem. The people who will ultimately inhabit and use the building are rarely stakeholders during the construction. The builders do the construction, but don’t have to live in the structure or deal with the problems that the maintenance company uncovers. In software, end users are similarly more like tenants than they are landlords.
Yet, in real estate, there is much less sense of risk or mystery about the quality of the work, whether the building will stay standing for 5 years, whether it’s safe and structurally sound, if it was built by qualified craftsmen. When you see a new building go up, you’re pretty confident that it will get finished and be a successful project, as long as the funding stays intact and the contractors aren’t too disreputable. But in software, while companies focus a lot on a structured development process and testing, they don’t have a grasp on what the code ends up looking like, whether the system is structurally sound and safe from fires (= production emergencies of course).
I want to explore why this is. I think I’ll look at it over a series of posts and maybe develop this into an article, because I think there’s something very interesting that software development could gain from civil engineering practices.
To start answering questions, I’m thinking of how buildings work. First, there are house inspectors. I can’t just look around a house they might buy, and figure out if things are structurally sound, yet I expect I could hire someone with this skill to give an honest, impartial appraisal. I’m sure this is the case for new, commercial construction as well. Yet I’ve never heard of a third-party auditing/appraisal service for software.
Next, the inspector has a set of building codes, enforced by local law, that guide him to check many important features, and provide an objective baseline of criteria that the building should satisfy. The most popular set of codes is the International Building Code – I think I’ll poke around in there and see how they manage to capture the complexity of what they assess. Just as with software, I’m sure there are a lot of grey areas and places where there’s some discretion the architect can take, yet there’s a right and wrong way to assemble the house. We do have some such guidelines in software, but I think this could be improved based on how the civil engineers do it.
Finally, there’s the qualifications of the craftsmen. I like posts like this from Ken Auer on apprenticeship in software that talk about how software engineers learn their craft. You really don’t learn it in school, or from a book. (Maybe Cisco or MS engineers can do book learning and take a certification test, but I don’t know any good software engineers who do this.) Sure, programming is not all science, there is art to it as well. But there’s also art in architecture, and maybe even in quality welding, for all I know, and those guys don’t just learn their craft by copy/pasting some code and trial-and-error.
So, if I keep this line of thinking running through my head, I think I’ll write about:
- How building code works, how it is applied to real world buildings, and whether the software analogy works
- How building inspectors can apply the building code, and whether there are such people for software
- The way craftsmen like electricians, welders, as well as artists like architects and designers, learn their craft and conform to the code
How do buildings go up faster and with less risk than software??
I’m interested in comments!
Eclipse Europa and Modeling
I needed to whip up some class and sequence diagrams today, but had some time to spare first. So I thought I’d reevaluate how easily I could get a modeling tool working that’s code-aware.
First, I saw that sometime over the last week, Eclipse released Europa. I’m still a little confused how that relates to Eclipse 3.3 – I think 3.3 is the new version, which is released, however they encourage people to get Europa instead, which is a bundled release for 3.3 along the lines of Callisto.
That was only the beginning of how fragmented the development efforts around Eclipse seem to be. I started poking around in the ever-disappointing GEF/EMF/MDT/UML tooling. It seems like they’ve abandoned/renamed/re-organized these projects more frequently than they’ve gotten meaningful releases out the door, and although there’s a project called UML2 Tools that’s supposed to provide class and sequence diagramming, there’s zero documentation on how one would use it in Eclipse. I get the impression that despite the large number of eclipse tools and projects that make up the modeling stack, none of them is meant to be used by “users”, they’re all for “toolsmiths” (http://wiki.eclipse.org/GMF_Tutorial)
And this toolstack always caused the dreaded Eclipse plugin spaghetti mess for me in the past, so I’m still not really impressed with it. Maybe I’m completely misusing it, but I’ve put in a good faith effort to read some docs and learn what to do, and it can’t be that hard. So, time to move up the stack to the vendors who build on top of the eclipse tooling.
One tool I’ve used before, Omondo, seems to have gone through some nasty personnel issues, because now there’s a competing plugin, eUML2 that apparently came from Omondo’s CTO and a mass defection of engineers. So I gave eUML2 a try.
It’s nice to see it builds on the Europa/Eclipse toolstack concisely. It helped me through the reverse engineering, although I got XDoclet-style annotations in my source files rather than Java5 annotations. It’s terribly slow even on my MacBook Pro, but it does eventually pull in the classes I want, has a very nice presentation (including full package name, yellow warning icons, etc), and manages to discover some of the connections between the classes. The sequence diagram editor had some problems with the view falling a step behind the true model state, which I had to work around. Also, it didn’t leave enough margin for some text, although it did so consistently. Overall, it was usable, and I got my diagrams done… I think it would drive me nuts for a real design phase though.
Also used the new Spring IDE 2.0 which was just released – I didn’t hit any new features but I do enjoy the bean dependency graph, that makes for nice quick documentation too.
blogging from the iPhone
just a quick post to announce (brag) that the iPhone is nice
Apple Proselytism
I try not to be a total fanboy when I can help it. It’s really easy to do this with Apple computers – once you’ve switched, you are consumed with a desire to open they eyes of your friends who are still in the PC blindness stage.
I want to share my favorite description of the virtues of Macs, something short enough and indicative enough to give it all away.
“When you’re using a PC, and an error occurs, sometimes a dialog tells you to contact your systems administrator. This is because they expect you to HAVE A SYSTEMS ADMINISTRATOR!!! You’re at home, you should never be told this. Macs don’t expect that you have one.”
Choices, choices
I’ve been thinking about the choices programmers have to make eventually. I guess this assumes that you’re somewhat talented, ambitious, and thoughtful, because I’m sure a lot of coders can just sit happily at a desk and not ask themselves this. Also, it’s just one way to divvy up the options, there are probably better ways.
I don’t feel like writing pros and cons, so I’ll just give cons and you can use your imagination.
Product company or Consulting?
Product company
You will have to work on the same thing for a long time. At first, when the product is under development, there are a lot of cool things to try and big decisions to make. But then it gets boring, you have production support to do, and some of those decisions turn out to have been wrong and can’t be easily corrected. The bottom line for the business at this point depends more on sales of the existing products, so the emphasis on cool technologies is diminished.
Because you’re supporting existing code, it’s hard to find a chance to learn new stuff. Maybe you can deceive your manager into using the stuff you want to learn about, under the guise that the system needs to be re-written and this technology will save a lot of money or fix a lot of problems.
Consulting
You’ll have to work with “non-ideal” client’s employees. If the client hired a lot of really smart developers, they wouldn’t need the consultants. Or maybe the really smart developers know to stay away from working there, so they need to pay the people who are willing to work anywhere as long as it’s only for a year or less at a time. This makes it harder to be challenged by your peers to improve – if you’re spending most of your time working with people who are not smart, you tend to go down to their level instead.
You’re pretty much guaranteed to work on junky code. Again, if they had to hire consultants, they need your help to solve the challenging problems. It’s probably not an interesting new business idea being implemented, more likely it’s a self-created problem with their monster spaghetti codebase and vendor-provided toolset.
You have to give up some of your ideals about the quality tools/platforms you prefer. If your company gets a .NET contract, and your client insists you use Windows, then guess what? You’re going to use a closed platform with second-rate versions of your favorite tools (if there is an ‘N*’ of your tool) and you’re not going to use your Mac even though it’s your more productive environment without a pile of bugs. And if the client is using the Oracle J2EE app server, then you’re going to be decompiling it. This is a tough one, since a good developer stays agnostic about the tools and platform – but sometimes you have that ideal for a reason.
Many people don’t want you there. Sometimes this includes your client-side supervisor, who was told to bring in consultants by their boss but thinks they could handle it fine on their own. If you produce a report that supports their pre-conceived ideas, then maybe they’ll be excited about having you there, but more likely you’ll be creating work for them and telling them things they don’t want to hear. And of course the client’s employees are mistrustful and think you’ll make them look bad. And they probably value job security more than you do.
Keep coding or move to management?
Keep coding
You may get stuck as a “line programmer”. This is like modern factory work. Your job is outsourcable or offshorable because there’s a heavy reliance on “requirements” as an excuse to do waterfall, so the programmer doesn’t have an interactive role and anyone can do it. This happens because many people think programming is typing and will never understand the art of it.
There are few places where you can move up the pay grades as a programmer. The Java Posse did a listener feedback question on this once, and said if your company doesn’t promote really good developers as highly as managers, then you should move to another company. Problem is, Sun, Apple, and Google are mostly doing this work in the Bay area so that leaves a lot of people out. I’m still hoping there are more places like this.
Also, you may not get a chance to be a leader or promote your ideas. Developers don’t have much decision-making power.
Management
You will probably become a bullshitter. Since you are disconnected from coding, you won’t know exactly how the software behaves in a corner case, or how difficult a feature would be. So you make stuff up and make educated guesses that become random guesses over time.
You’ll have to give up the dream of being the next Gavin King or Craig McClanahan or other coder hero. Instead, you will be driven to improve non-programming skills like corporate finance and negotiating.
The business environment is cutthroat, which doesn’t match well with hacker ethics.
Worst, you won’t do what you love, you will write proposals and performance reviews and project plans and push tickets and schedule releases instead.
Use left-side or right-side of your brain?
Right-brained – the Artist
It’s hard to find a paying gig where you can invent the next great thing (or be a part of it), so you have to do one-off contracts and either manage a lot of business stuff yourself, or be a starving artist type. Until you get your job at Apple, where I think most of the programmers are the artist type.
It’s not clear how to pursue an artist/hacker ethic. You can work on your brilliant idea at home, but where are the interviews for this sort of work? Perhaps there are not many openings and a lot of applicants, like aspiring to get in the NBA.
You have to gain true respect of your peers, for example, become open source committer on a well-known project. The artist rejects unearned corporate rank and title, especially when bestowed by someone who doesn’t recognize quality.
Left-brained – the Analyst
You won’t “save the world” – you will create predictable products that mimic others.
There may be pressure to create average-quality products, since there is no business need to exceed customer expectations, especially if it makes development more expensive.
About Me
Tweets
- @LaChilangringa thank you, he will be called Walter and might like trains or frogs. You were at the rally? What did your sign say? in reply to LaChilangringa 2010-11-06
- It says I'm not eligible to get a payout in the Buzz settlement. I'll have to settle for juggling with the Buzz developers. :) 2010-11-03
- It's Movember and you can sponsor my mustache. http://goo.gl/Z1O4 I miss the beard; It's very drafty on my face today. 2010-11-02
- Can 4 guys make themselves look enough like Mount Rushmore to fool Google Goggles image search? Love the demo slam. http://demoslam.com 2010-10-20
- Saw Dalai Lama on Thurs, running last 6mi of SF women's marathon with Peggy today. Too many crazy crowds this week! 2010-10-17
- Attn: people of the future. We wanted to avoid all that litter! It was our 2nd priority, right after annoying noises. http://bit.ly/cJzkGT 2010-10-09
- Headed to Hardly Strictly bluegrass in GG park. Elvis Costello free! 2010-10-03
- I vote that @TCooganPlants is having a rough week and deserves nachos. Who's with me? 2010-09-29
- More updates...
Powered by Twitter Tools


