Friday, September 4, 2015

Career Path Ups and Downs

I've been a working as web developer since 2000, did professional web design starting in 1998, and messed around with websites circa 1996.  Even though I've been around for quite a while, I haven't exactly been a rock star or code ninja, though I did have my moments.  The bulk of my experience is working for smaller companies where I had to do most everything (server setup, database creation and management, and web - both design and development.)  Currently, I am a lead senior .NET developer in a support role.

Note:  Originally, I intended to write about becoming a lead before I was ready, but it morphed into a brief history of my career in computing.  Perhaps, it will be of interest.

Way Back

In the beginning, there was the Commodore 64 and life was good.  Seriously, I got my first computer when I was 12.  It was fun programming on it, but I was no hacker.  I made a color-based alarm that flashed all colors to wake me up in the mornings.  I made a program to help me create characters for different role-playing games (pen and paper variety).  Otherwise, I remember playing games, and writing papers for school on it.

In middle school, I "believe" that I programmed on an Apple II.  Can't swear to it.  I did some simple graphics programming, and even took a course.  There was an amazing guy that was more the hacker, and I did learn some from him.  Sadly, he didn't survive his teens (reckless driving.)  Back to me, I liked computers a lot, but I didn't LOVE them.

Good Beginnings

I got my first taste of the web sometime around 1995/1996.  I'm not certain of the exact date, but I was working as a library assistant for a university library.  I found the web, and I was excited.  It was a whole new world.  I found so much cool information, and I learned that I could make my own pages!  It was simply astounding that I could use notepad to write HTML and see it in the browser.  I still remember when I saw the colors change on hyperlinks when you moved your mouse over them.  Wow!  I dug in, and copied the JavaScript code, so I could learn and do the same.

A Break and a Bump

In 1998, I actually got a job as a web designer.  My personal web page impressed them.  That was a great moment, then I had to work.  I affectionately refer to my work as fast-food web design.  It was work for an online directory, and I had to crank out three page sites for their customers.  The first tool that I had to use was dreadful.  It was all drag-and-drop, and here I was used to hand-coding everything.  It got better when we switched to Dreamweaver.

I did that for a year, and then was moved into a position to manage four web designers.  That was a drag.  I enjoyed working with my designers, but management was a mini-death.  I didn't have time to make anything and I was bored.

Excited Again

Another opportunity arose.  A company wanted a web designer that they could teach to program.  I jumped at the opportunity.  My training?  It consist of them pointing at a computer and telling me to get to work.  I didn't have the benefit of a mentor or even skilled coworkers.  I had to discover everything on my own.  The first year was a little rough as I learned ASP development using VBscript, but it was exciting!

I learned a lot, experimented a lot, and made major improvements to the code base.  I was becoming more skilled as a developer, and cared about my work.

501 Developer

The downside?  There were plenty.  I was too isolated from the development community, and I fear that this has stuck with me even now.  The sites that I worked on changed from greenfield development to legacy projects.  I was being left behind as technology moved forward.  My company resisted the .NET framework, because classic ASP still worked for them.

Why didn't I leave?  I had several reasons for not leaving.  The biggest reason:  I worked in the same office as my older brother.  Other reasons:  I made good money, and the office was 11 miles from my home.  Talk about a great commute.  But I was becoming a 501 developer, and losing my overall excitement.  I still enjoyed experimenting, but I was no longer passionate.

A Kick When I was Down

Sadly, my brother passed away from a brain tumor.  It was a gut-wrenching experience that threatened to break me.  My young daughter kept me grounded, and gave me more support than she will ever realize.  A little less than two years later, the company laid me off.

I got lucky and landed a contract job within two days of being officially unemployed.  Only it wasn't so fortuitous.  The job was maintaining and extending a horrid code base laden with so much spaghetti code that it made me want to run for the hills screaming.  The contract ended early, since the lead wanted fast development without any eye to maintainability, whereas my approach was slower but more maintainable.  Even though they were unhappy with my speed, they freely admitted that I was skilled and knew what I was doing.

From that contract job, I saw the writing on the wall that I should never develop classic ASP again.  Now, I did like it, but putting it on IIS 6 was an issue.  The technology worked, but the support was diminishing and that would make it much harder to support these sites as technology marched on.

Excited Again and Then...

I managed to land a .NET web developer job, but at a 20% pay decrease.  In the long run, I thought that it was worth it.  And I was right.  It started off as a wonderful place.  I got some excitement back, and was able to do more in the .NET space, and showcase my JavaScript Client-Side skills.  There were still issues.  The environment started to shift from the attitude of doing everything in-house to in-house bad, COTS (Commercial Off The Shelf) software good!  I was beginning to wonder why they were employing me.

A Career

I still feel like I haven't decided what I want to be when I grow up, but I should take a programming career seriously.  Amazing, isn't it?  I've been working over a decade in development, and I just now decide that maybe this is my career.

New Goals and D'Oh!

I started a new job with the purpose of becoming a better developer, and really start taking my career seriously.  I told my manager about my goal of sharpening my skills, so that I would be worthy of the title of lead senior developer.  Well, son of a gun... they hired another developer, waved a magic wand, and made me a lead.

What's the deal with the d'oh?  Isn't this what I wanted?  Honestly, I don't think that I'm skilled enough yet to be a lead.  This will definitely be on-the-job training.  I've been successful with mentoring junior developers in the past, but a lead is different.  Juniors come to the mentor for help and to learn.  A lead must, well, take the lead.  I can no longer be heads-down with my code and oblivious of others.  I need to be more aware of what my team mates are doing, and I need to check on their work when necessary, and guide them as needed.

So Far

It sucks.  I have a lot to learn, but I think that it will be good for me.  I have no desire to move into management, but I will need to develop a subset of managerial skills.  I need to improve my own programming skills, and be confident in my knowledge, but not arrogant.

Saturday, June 6, 2015

Writing Bad Code On Purpose

In my current position, I am a .NET Developer that is part of a support team.  I'm responsible for supporting brownfield applications used by the business.  The applications range from Windows Forms to Web Forms to ASP.NET MVC applications, and I even have a CMS to support for the company's public-facing website.  Soon, I'll have some WPF applications and web services handed off to me from the New Development team.

Now, I love greenfield development (who doesn't?), but this is a good opportunity for me to work on my debugging skills and my software archaeology skills.  I even joked that my title should be changed to Software Archaeologist, since I am having to delve into poorly documented legacy applications and carefully sift through layers of code to understand what the original programmers were trying to accomplish.

I like writing good code.

And I do know that I can always improve.  When I need to work on an application, I do my best to improve the code, and leave it in better shape than when I found it.  Unfortunately, there are times when I can't and that truly pains me.

When should I be "okay" with writing bad code?  

Ideally, never.  However, I came to a realization or simply confronted an ugly reality:  There are applications that I shouldn't clean up the code (except for bug fixes) and I can't take the time to write what I consider to be good code.  Though I must state that what code I write, however bad, should be as bug-free as possible or what's the point?

How did I come to this awful conclusion?  

I needed to update a point-of-sales Windows Form application.  I scrolled through line after line of hard-coded values, and was constantly seeing other instances of bad code smell spread throughout the program.  Some of these hard-coded values were rules for the application (i.e. if store has this rule, then allow this function.)  Changing any of these required a rebuild and deployment of the application.  Why weren't these types of values placed in a config file that could be updated via a text editor and deployed?  How in the world would we know what a rule number meant if we lost the database?  I could spend months on fixing all the issues that I considered to be wrong.

The Application has an expiration date.

That fact changed everything - I still didn't like it.  I can't spend valuable development time correcting and changing code that I believe needs attention.  I can't take the time to write code that is going to be maintainable for years to come.  The application isn't going to live that long.  A newer version is coming down the pipeline.

I still struggle.

I do my best to avoid writing bad code as much as possible.  I keep maintainability in mind when I am writing code.  For those legacy applications that have a short lifespan, I write code that is "good enough" to correct the bug or add the required functionality.  And I definitely aim to do no harm when I have to write that less-than-ideal code.