10) An honest failure can be your greatest tool for learning - so don't fear failure
You will fail. Sometimes you'll fail because you'll try so hard to succeed - too hard actually (now *THAT* one caught me unawares). The only long-lasting mistakes you can make are
1) To NOT to learn from your failures.
2) To NOT make any failures at all - because it means you're not taking any risks.
As Einstein said "Anyone who has never made a mistake has never tried anything new" (link) and technology has always got something new!
I'm not saying people should risk everything, but creating good software is hard and complex and often the right path has some risk attached. The key is, if you're going to fail then "fail fast" and then adapt fast!
9) The only thing to fear is fear itself
Some trepidation is good (e.g. "I don't want to break the build") but most fear and anxiety in development is bad. In particular I'm talking about longer lasting and more pernicious worries e.g. "Will I meet the deadline?".
Will worrying about it make things go faster? No. You just spent a few minutes worrying that could have been spent unit testing, or adding comments and you've also incurred the costs of a "context switch" - "Where was I? So now, which public method did I want to make private again? Which class was that?"
Yes fear and worry can be signs that something needs to be paid attention to but beyond that, fear, worry and anxiety are energy sinks. An old adage is worth noting - "If you can do something about the problem, why worry? If you can't, why worry?"
Trust, grounded optimism, laughter and a happy, motivated workforce will do more for your deadlines than pushing and driving harder. Hiring the right people in the first place helps a lot too.
Yes there needs to be some push to motivate and cause people to adapt, to innovate, to be creative and ultimately to cut out the "crud", but cultures of blame and environments where people get "thrown under the bus" are only self-sabotaging.
8) Software Vendors suck - Open Source software sucks too but at least it's free
So I guess all software sucks? ;-)
Not much to really add to this - all software has bugs - the problem with most commercial software being closed-source is that you are dependent on when the vendor wants to fix it - you may even have to pay for an upgrade! Cars come with warranties - why doesn't software? Wow what a concept! Accountability anyone?
Most commercial software vendors have to make tough compromises for their often massive customer base (or their quarterly results and their shareholders) - those compromises have to annoy someone and often that's got to be you. At least with open source the "round trip" time is often (but not always) pretty fast and hey you can even fix it yourself :-)
7) After good communication skills, the next key to success is flexibility.
Business moves faster and faster these days - the needs of your customers change, your competitors are in motion also. How can you redirect your development team, keep them motivated and not frustrated? It's a tough problem but you need to find a way.
However you also need to know when the "tail is wagging the dog". Sometimes as a lead / manager I simply don't tell my team some information, frankly because next week I know it could turn around 180 degrees. I let them code their brains out - and they do and do it very well! They don't need many of the distractions.
One of the best things managers do is insulate their people from a lot of the "noise" that rightfully is part of collaborative problem solving (and jostling) at the higher levels of business.
6) Software is maintained and extended much over a much longer time that it took to write it
So be kind to your future self or your future co-workers. Add liberal use of
In addition to that, refactor mercilessly and second, use good variable and method names.
5) Cut-and-paste is the quick road to the Dark Side (or "Don't Repeat Yourself")
Luke: Vader... Is the dark side stronger?
Yoda: No, no, no. Quicker, easier, more seductive.
The same is true for "cut-and-paste" - cut-and-paste is just soooo easy . . . It takes discipline to do otherwise - "When 900 cut-and-pastes you have fixed, look as good you will not" :-)
4) Stay Informed
After good communication skills and flexibility, the next key to success in software is knowledge - what's hot, what's not - and most importantly WHY? Why is Spring hot? Why is hibernate hot? Why is Web 2.0 hot? Is it hype or is there a "there" there?
Information is the lifeblood of the modern knowledge worker - find good sources of information with a high "signal to noise ratio" and absorb it. Apply what I call the "5x rule" - if you see a new technology mentioned 5 times in 5 different places, check it out real quick - it might be of use.
It's true, we all pretty much knew from the 90s on that technology was moving fast, but is it just me or has the speed increased by at least an order of magnitude? SOA, Ajax, Ruby, Java 6, Java 7, Open Sourced Java, OpenSourced Flex, Silverlight, JavaFX, GlassFish, YouTube, Blogs, Twitter, Wikis.
That leads nicely into the next item. . . .
3) Avoid information overload - "Core and Explore"
Don't subscribe to every RSS feed and every mailing list. Discover the utility in each one. Keep the best, discard the rest.
When you find a few really good sources, stick to those. Those are your "core". Then don't be afraid to "explore" and find new sources but if you find new ones always be pruning bad ones.
2) Forget Multi-tasking
Until you grow another set of arms and another head don't worry about multi-tasking - just "single-task" as fast as you can
I think multi-tasking is overrated - academic studies show that the costs of the "context switch" are quite large (see link).
Now with the requirement to stay informed (#3) and the tendency towards overload (#2) the urge to try to multi-task increases even more. Try to resist! See the buzz about Getting Things Done - it's basic tenet - just do ONE THING AT A TIME!
1) What got you up the ladder won't keep you rising
Being a very "black-and-white" person is very helpful in the very precise world of software - one misspelled word can cause a million line application not to compile - never mind fail at runtime!
As you rise up in management you can't afford to be so "black-and-white" you have to consider other people's perspectives. I recommend that people in mid-career check out "The 12 Bad Habits that hold good people back". I found it incredibly an enlightening read.
3 comments:
This was more succinct and true than I expected. :)
You touched a nerve on the fear thing :) It's only with age and parenthood that I've managed to just try things out, even if I don't understand them.
It's so many times, I've realized, that I could've done so much better just trying to switch to provider b, or library z instead of worrying whether I'd be able to understand it thoroughly or not.
Thanks for a very good blog post.
Your arguments about context switch costs seem naive, given the speed to CPUs, system responsiveness requirements and the rise of multi-core systems.
Multi-threading must be learnt now (it isn't an easy set of skills to learn properly), otherwise you will write broken and unsafe code for GUIs (like Java Swing) and server applications, and fail to capitalise on the now common multi-core CPUs.
On business systems, 4+ cores are not uncommon, so it would be criminal to waste this resource.
The only time you should be single threaded is for heavy disk I/O limited operations, with low CPU use at all stages of processing and no progress reporting.
Network applications tend to be multi-threaded, by default.
Infernoz.
To Anonymous,
Actually I was talking about Multitasking for people not for Computers (thus the comment about growing more arms / legs and why "context switch" was in quotes).
For computers absolutely - if you're not writing multi-threaded apps you need to learn to do it ASAP.
-Frank
Post a Comment