Thursday, October 05, 2006

Wanted: Developer Sensei

Young padawan apprentice seeks experienced jedi code master for training.

Ok, here's the scoop. I'm stalled. Spinning my wheels. Torn between going forward to do something - ANYthing - and frustration that the things I'm picking are way out of my league and/or learning in an order that's not necessarily optimal. (and in some cases, detrimental)

This is an extended diatribe...but I'm sure that I'm not the only one in this position. If you've been in this position (or near enough), what did _you_ do? As usual, there's a far greater need than supply of Mr. Miyagis in this world...

I've been doing QA long enough (and read enough of The Daily WTF) to have a good idea of what I don't want to learn/do/be. I use source control. I've designed and implimented auto-build/versioning systems long before they were popular, (let's hear it for perl and batch scripts!) I love the idea of continuous integration, unit testing, and design patterns.

But I'm bewildered at where to begin. Do I continue and finish my Design Patterns book? Work Code Kata (though I don't understand some of the problems) Go again through the "learning c#" lessons graciously provided free by Microsoft/LearnVisualStudio.net? Find an interesting problem that motivates me and start hammering away? Spend a week or two bringing up a continuous integration environment? Figure out how to write unit tests for something other than simple set/get methods? "Just Write Code"? Look at past Topcoder projects and give 'em a shot?

All of these things are possible. All have good qualities. And I've been trying most of them. And getting stuck in all of them. And feeling frustrated that I'm not making progress. (of course, I haven't a clue what progress looks like here) I want to be able to focus my energies...but I don't have a clear idea of where I should do it.

I realize I want a sensei.

In the last two years of practicing martial arts, I've come to appreciate my sensei. A lot. Partially because he'll be the first to admit he hasn't quite mastered the reverse-flying-dragon-pull-a-rabbit-out-of-your-butt-and-beat-the-guy-to-death-with-it kick.

(He's very humble that way)

He's been teaching for 8-10 years. Been practicing martial arts for 20. And he knows people. Understands how folks learn. Approaches each student differently. And with that experience has a good feel for what to introduce to students, when. Basics build on basics, learn one thing and apply it in more advanced ways. Wrist techniques and basic rolls before boot to the head. That sort of thing.

When I'm stumbling at something, he knows when to keep me drilling. Has a good sense for when my frustration level hits the "time to switch gears." Is very patient and complimentary. Gives good positive reinforcement. Understands that this is a lifelong process, and pushes me towards my goals - not his.

This is what I want in teaching me to become a developer. Yeah, yeah..I know. Idealistic.

What kind of student will the teacher get?

A motivated student. (well, I think so anyway) I made a goal 4-5 months ago that I want to be doing development, full time, in 2 years. I've pushed myself this far with online tutorials, videos, books, and finding every excuse I can at work to apply what I'm learning.

A builder at heart. Legos, you are my love.** (my wife didn't hear that...)

I will dedicate 8-10 hours/week (probably 1-2hrs/day) to the task of learning.

I have a goal. I'm looking for expertise in ten years, but I want to at least achive journyman status in the next 18 months.

I'm not just interested in "learning to code" (though that's a big piece) I want to learn how to _develop_ software. That includes good design, infrastructure, and practices.

I humbly admit I'm not a math wonk. I have to work at understanding algorithms. (sometimes) 3d vector math makes my brain hurt. I don't naturally gravitate towards manual memory management or pointers. (though I do understand them) No, Joel probably wouldn't hire me as a superstar. That's ok - I'm content to be a slow genius.

I'm not starting from zero...as I mentioned, I have six years of software quality engineering work behind me. Developing test cases. Writing (very small scale) automation. Implementing source control and automatic build systems. Architecting stress/load test scenerios.


What else will the teacher have to work with?

I'm up to the command pattern in in HeadFirst Design Patterns and worked most of the code. (translating from Java to C# myself, typing...in...everything.)

I've digested Gunderloy's Coder to Developer. Much of it was already learned from years of doing QA, but I still learned a lot. Facts and Fallacies of Software Engineering (Glass) was pretty much a rehash of Peopleware (DeMarco/Lister) with some additional amusing anecdotes.

I've worked through all of the "Beginner's guide to C#" videos @ LearnVisualStudio.net.

I've made some silly little apps myself, as well as one in production use where I work. (though given the general quality of in-house developed apps at large corporations, I probably shouldn't be too proud...)

I'm a reasonable hack with perl's exploded whale guts.

Anyway, I'd say beyond neophyte/beginner, not quite a journyman at regex gut-slinging.

I tried learning c++ years ago and wrote a ditzy little 3d app that used perlin noise to generate 3d terrain. (use arrow keys + mouse to move...and thanks to NeHe for his excellent tutorials on openGL..!) Admittedly I'm so rusty now I'd probably have to relearn everything.

I've written test harnesses in python for macromedia's shockwave 3d.

More ms dos batch scripting than I care to think about.

Enough about me. Let's talk about me..

I want to learn. Grow. Be sharpened. I love being around folks who are furthur along than I. I want to be the "dumbest person in the room", because (yes, this is selfish) I learn so dang much!

I'm not content to sit on my @$$ and do the same thing the same way.

I understand that I need to put in the time for skill, and don't expect to be an expert in 21 days.

I want to put in the time, because I can just start to taste what a high resolution experience must be for a good developer. Where the code flows like wine and apps appear as if by magic..

Suggestions? Thoughts? I'm sure I'm not unique in my situation...how have others approached the same problem and what where your results?

Are you happy with them?

Discuss.



**I'm saving my allowance (Don't laugh. Kids are expensive and I have 3!) to buy the new Lego Mindstorms NXT, with the intent of a lego-ish mashup of JP Brown's Aegis , Daniel Rojas's lego rocket launcher, and Sebastian Dick's "Ultimate Lego Chaingun" .

Success will be determined by the ability of the device to shoot down one of these cool indoor mini-helicopters when it invades airspace.

Well, that and making anyone who comes into the cubicle run right back out...

("Please Exit the office. You have 20 seconds to comply...")

4 comments:

Anonymous said...

Why be a developer? There are occupations which pay much better for much less work.

Mike Schoeffler said...

Excellent post - you're thinking smart.

You're most likely to find a sensei at work - at a good company.

But if you can't get into the right position for the moment? Continue teaching yourself - you've already picked up some critical lessons that place you well ahead of the pack: source control, design patterns, etc.

You'll learn a bunch more by applying what you are learning to real jobs. Doesn't matter if it's open source or "code me an ebay for $49 on rent-a-coder".

Work on something with actual users. Do it right - where "right" can mean Agile, BDUF, or whatever is best for that customer (in your judgement, not necessarily theirs).

To me, this is the equivalent of waxing on/off with Mr. Miyagi.

This will get you closer to the actual sensei and teach you a lot in the mean time.

Wayne J. Earl said...

Rule #1: Relax

Although 'learning' can certainly be hastened by directed effort - and I commend you for your focus and ambition - the payoff is not necessarily a linear function of intensity of effort. ("Just try harder!" is not a useful mantra.) If you can spend time in an environment that naturally engages you and gives you a measure of satisfaction, a sense of achievement, and a feeling of greater awareness the 'learning' will arrive of its own accord.

In short, give primary attention to the journey and the destination with take care of itself.

Steve said...

I started out in QA as well. I don't feel like I was particulary good at it, but it's a tremendous background to have. Only testers REALLY understand how awesome unit tests and test-first type approaches really are. You mean I (QA) won't have to test for this same bug for the next 6 years because it happened once?

I first got into "professional" coding by automating the crap out of everything at work. This gets you a lot of necessary hours of just writing code that compiles/runs the first time, doesn't have any drastic logic errors and the like.

I buddied up to the devs and voluneteered to fix some bugs on their lists. This wasn't the wisest approach...as a 3-10 tester to developer ratio was in place, my workload was already much higher than the devs, but I got to poke around in production code. If you can't do this at work, most open source projects will gladly accept bug fixers.

I think the best way to learn design is to start your own greenfield project/problem with a real user or two to coddle. Anybody in your family need a checkbook program? Any software you've paid for in the past that you think could be a lot better? Screw around with the google maps API or reprogram a tivo. There's a lot of stuff out there. Not that you can't learn from looking at other good and bad designs, but I find you have to have that personal experience with a pattern/methodology to understand why it's great here and absolutely horrid there.

Anyway, I think you have to write x number lines of code before you can feel comfortable touting your coding skills. Likewise you have to have approached similar problems x number of times with different designs to know enough about to design to learn what you don't know. If you can't read a programming/design book from any expert and nod emphatically at half and virulently disagree to the other half, then you need to do some more "work" to figure out what you don't know.

Disclaimer: I'm currently a "mentor" to two jr programmers where I work, but at best I'm a jedi knight leading padawans to their doom :)