Salary Survey

I just read the survey results of Stanford grads. The outlook appears very positive. Average salary for bacherlor's degree was $80k. Master's average was $94k. And PhD average was $132k. In addition to the salary, most were offered goodies like stock options and signing bonuses.

This seems in line with the average Carnegie Mellon bachelor's degree starting pay of $85k. Note that most of Standford's grads work in the San Francisco Bay area. So the salaries might be higher due to the cost of living there. Stanford is also not your run of the mill university.

I visited a small college not known for its computer science program. The department chair said that grads with bachelor's degrees made aruond $60k. And master's degrees commanded over $80k. Not bad at all.

Hot Skills in Software Development

One of the recruiting companies listed some top paying jobs in the NYC. Here are some development positions from the Top 10:

  • PHP Developer $96k

  • Python Developer $103k

  • Java Developer $104k

  • Ruby Developer $106k


Strangely enough, another recruiting firms said that top skills for the upcoming year are HTML5, MongoDB (No SQL), iOS, Android, and Mobile. A lot of these fall under the mobile development umbrella. They do not correspond to the NYC top paid positions.

I guess the take away is that it is hard to quantify what is hot. But you can take some of these skills and learn them. There is hardly any downside. You might help yourself to a better job with higher pay.

Ruby on Rails Training Outcry

There is a six week Ruby on Rails training class starting up in NYC. Developers are getting salty because it costs a whopping $2800. I guess if you are a starving developer, $2800 is way over your training budget. But wouldn't you want to get your employer to foot the bill.

The cost does not sound that bad based on what you are doing. I have gone to numerous one week classes that cost $2000++. Compared to those, the six week Ruby class seems like a steal. Then again, I got my employer to eat the full cost. Sure it got counted against my training budget at work. But no money flowed out of my wallet for the class.

The pricing model itself almost classifies the course as employer funded training. I am really glad my employer provides me with a guaranteed benefit of paid training each year. The funny thing is that my employer is loose with the money, but never wants me to be away from my day job. Weird.

These days I usually spend the training budget on college classes that meet in the evening. So it turns out to be a win win. However I pay a whole lot less for my college classes than the Ruby course. It does not matter. I can't get off from work for a week, let alone the duration of the six week Ruby course.

Assume Nothing

Next year we are getting some data from a new source. I was tasked with making sure that programs which depend on this data use the new source. No problem. I knew where the old data got stored. I pointed the code to this previoius position. And I shipped the code.

Our customer has an acceptance team which tries to test everything. They told me my code was not working as expected. I checked it out and found that they were right. So I traced the problem back to the database. It looks like the new data was getting put into a new place. That couldn't be right.

I asked around and found that the new source named the data a little different. Therefore new elements were created in the database. I was referencing the old elements. But I told them that it was just a new way to get the same data. It should go in the same tables and columns.

Then I realized the error of my ways. You should trust nothing. Even the obvious will not be obvious to all. I spent about a week going over options on how to fix this. We needed buy in from the customer since it was late in the development cycle. Luckily the command decision was for those upstream guys would put the data in the expected columns. Whew.

The decision by the stakeholders meant I did not have to change my code. Next time I will validate all my assumptions, even the silly ones.

Help Wanted

We have an Extracts, Transform, and Loads (ETL) team on our project. They take care of a lot of backend stuff. Basically if our system communicates with some other systems, this team handles the communication. The subject matter expert from this team left the company this year. He was looking for some stability. Good for him.

Last week the team lead of the ETL Team left the company. He had been planning this for about 6 months. There are still some developers left on the team. But they are of the variety that need a lot of direction. I came to this understanding recently when interacting with one of them.

The customer acceptance team found what seemed to be a bug in the system. I got volunteered to do some leg work on the issue. I had the tester run some queries. Then I tested the app in a development environment. Finally I came to the conclusion that the loads were not populating a required database table. Then I referred the problem to the ETL Team.

I got a call from one of the ETL guys. He asked if I had any ideas on how to proceed. What? I walked him through my findings, which I had provided him along the way. Then I gave him some ideas. He started on them. But he got confused and asked if I could help interpret some of the results. Oh oh. I feel a trap coming on.

On Hiring

I am frequently taking community college classes to brush up on technical topics. Although I could learn the material on my own, I like the pace that the classes help me keep. It is also an opportunity to network with the leaders of tomorrow.

I keep my eyes out for exceptional talent in my classes. When I find it, I try to make a connection. It is not easy. But I am working it. There was one web development I had with a crazy teacher. He seemed to like to fail people in his class. His assignments would trip you up. Then he would give you a zero. Did I mention he was crazy?

There was one student who excelled in this biazrro web development class. I knew right away she was one of the shining stars. So I kept in touch with her. Recently she has gotten tired of fooling around in her down time. Therefore she is looking for a job. I jumped at the opportunity to get my company to hire her. Unfortunately we don't hire people from community colleges.

What? Okay I get it. We get a lot of applicants for very little openings. And we use the college you went to as a filter. That's fine. But I keep getting emails from recruiting asking whether I know anyone good to refer for a job. Referrals are the best way to attract top talent. It doesn't matter though. I suspect we lost the chance to hire this to performer.

Help Needed

I got a call for help from a member of another team on our project. He was a newer guy assigned to research a trouble ticket. He found some code that was supposedly not working correctly. I asked him what his concerns were. He told me he could not compile the code. Oh oh.

Now this code is an Oracle PL/SQL pacakge. It is a bit tricky. The code is written against a bunch of synonyms. The synonyms normally point to tables created by the loading application. The tables go away when the code is done. So I guess I could see why this might be a problem to compile. But if you can't compile, you can get anywhere with the problem.

I pointed the new developer to another script which creates a bunch of dummy tables with the correct structure. The script also generates the synonyms and points them to the dummy tables. That way you can at least compile the PL/SQL package. Then I get a call from this guy's boss. Apparently they spent a few days on the problem and were getting nowhere.

I eventually looked over their data and identified a problem with the record definition and SQL population. That's a story for another blog though.

More on Google

Previously I had mentioned that lead software engineers at Google make over $200k per year. That alone is a significant statistic. However there is more to the story than that. These lead lead engineers make more money than other positions at Google such as managers and directors. Bamm.

In normal companies, managers usually make more money than the people they manage. And directors definitely are near the top of the food chain. But not at Google. Perhaps that is because they are very selective of who they hire for lead software engineer. Or perhaps it is because the company was founded by engineers.

Whatever the case, Google will make it worth your while to be the top developer at the place where only top developers get hired.

Lead Software Engineer

I just learned that the top lead software engineers at Google make between $220k and $240k per year. Oh snap. That is about $100k more than what I consider the going rate for lead software engineers is. I wonder if these engineers are also getting stock options that could be worth more.

Maybe a bit of the high wages is the location. I figure it is probably expensive to own a house out by Google headquarters. And we all know that Google is very selective in its hiring. They hire superstars. You know. The get guys like James Gosling, who invented the Java programming language.

If you can't beat them, join them. It might be time to get a top job at Google. The only problem is that I can't see myself moving out there, even if the rewards are outstanding. Heck. I bet these lead software engineers get to spend the 20% of their time on special projects. What a life.

Requirements Presentation Format

I am scheduled this month to do all the work for one of the new software changes we have. This seemed like a compressed schedule. I had three days to do the design. On day one, I dug into the requirements. Every single piece of the functionality seemed to be affected by the change. And the details of the change were vague. I tried my best to figure out how these changes were going to work. I was started to sweat the schedule.

The problem was that I was looking only at the new changes. This was a confusing view of the requirements. Luckily I widened my view and saw the old and new requirements side by side. It was only then when I saw what was being replaced by the change. That allowed me to hone in to exactly what was going on.

I essentially understood the spirit of the changes at that point. All the rest of the changes made sense at that point. Now I find that I am way ahead of schedule for my tasks. All of this traction is due to the side by side presentation of the requirements. Good job requirements team.

Late Again

The customer alerted us to a multi part problem they needed fixed. The project manager asked our team to estimate how long it would take to correct each piece. We procided a high fidelity estimate. That resulted in a schedule of release for each part of the fix.

On the day when the first part of the fix was supposed to be delivered, the customer asked the project manager if we were sending out the fix. That resulted in him asking the developer assigned whether this thing was ready to go out. I came in to work and had a call from that developer asking what exactly the customer problem was. Fail!

Luckily the first part of the fix was a well known issue. I walked the developer through the steps to reproduce the problem. Then I showed the developer the database table that controlled the erroneous config info. The developer proceeded to generate a fix. However the fix was not ready until late at night. The test team was surprised that they were asked to do the fix late in the evening. Thus it did not get done.

The project manager warned this developer to make sure the second part of the fix was going to be on schedule. Let's hope the developer takes this lesson to heart.

Saved by the New Girl

Last week there was a high priority problem from the customer. Initially I was not involved. However the problem was not getting solved. One of the customers mentioned my name. That was because I had dealt with this part of the system before. I was trapped.

I did my best to walk my team lead through the duplication of the problem in his development environment. It took a while. But we got it duplicated. I feared that I would have to implement the fix. But my plate is full with new development. Luckily the work got assigned to a new developer we have. Nice.

Then another problem kept coming up week after week. I asked the big boss if I should work on the problem. He told me the customer needed to submit a trouble ticket. I went to the customer, and she had no trouble opening a ticket. Once again the actual work got assigned to the new girl. I like how this is going.

Problem Child

I was asked to help out another team around a year or so ago. It seems I did too good of a job. Now I am responsible for this piece of their system. I would not mind if I could maintain these piece full time. But I already have a full time job. I am supposed to work this additional piece in my "free time".

Just this past week I got an email from our customer. Apparently they did not see the results from last week's run of the software. I checked the audits in the database. Found no evidence of the job being run. Then I logged into the operating system. The logs on the file system also show the job did not run. What the heck is going on here?

The particular job is run as a cron job. It has been running successfully for some time. Now I need to debug this anomaly. My first task is to ensure the job is still in the crontab. Unfortunately I do not have access to the production crontab. Furthermore, there is some type of procedure I need to go through to get assistance from the system administrators of the production system.

This issue is going to take some time to resolve. Previously I had hoped to pass this task on to the actual team responsible for this system. Unfortunately they are in upheaval as some key members of the team recently resigned. I guess I am stuck with this puppy for the time being. It is time to make lemonade out of this lemon.

Versioning

I am responsible for designing some new features in the next big release of our software. The project manager told me I would be handing my design over to the new guys for implementation. Therefore I wanted my design to be as clear as possible. I waited until the other developers were finished with adding their designs to our one design document. Then I grabbed the latest version and started making some changes.

I had some trouble with Rational Rose. The latest version on my system was broken. I tried to get a sys admin to fix it. Turns out he broke more than he fixed. I finally got access to a virtual machine that has Rational Rose on it. I drew some crucial sequence diagrams, as well as a class diagram of all the important clasees.

Today I was getting ready to check in my design document changes, when I found that somebody else had usurped me. My boss created a new version of the design doc. That means my changes were made to an out of date version of the document. Ouch. We use Sharepoint for the documentation. You are supposed to coordinate with the rest of the team. Who knew the boss would be making changes as well?

Coding by Email

We finally got some new developers on our team. Unfortunately they do not have the computers they need to do any work. So now they are doing a lot of reading. Initially we thought their computers would be in quickly. Now it looks like that is not going to happen. The new plan is for these new developers to code by email.

Here is how this is supposed to work. An existing developer with a computer will email them the code to a non-development computer they have. Then coding changes will be done "in the blind". They then email the code changes back to developers who do have access to the correct computers. The theory is that this will allow them to do development. In reality, this is most likely a big fail.

There might be some good to come out of this. The new developer I am working with is longing to look at some real code on our project. This will enable that ability. However it seems to be a waste of time to have a newbie do some coding where they cannot even do a compile or run the application.

The optimist in me says that this is an interesting problem for me to do some coding in. I can perhaps code up a program that monitors for emails from the new guys, takes the code they send, tries to compile it, then returns the build results to them by email. If I can automate all that, I will be king. We can think of this as a sort of email virtual machine.

UNIX Developer

I am responsible for one of the subsystems on our project. This is just one of my side duties. Another team was overburdened a year or two ago. I was asked to step in and give them a hand. Turns out I inherited a subsystem for life.

The big boss said I could hand this duty off to another developer. I took that at face value. There are some changes that need to be made to this subsystem next year. Recently I noticed that some tasks for this subsystem were overdue in the schedule. That sounded like a perfect time to hand the whole thing off to the other developer.

Oooops. That other developer is out on vacation for a month or so. Looks like I am stuck with some extra work again. This is my own fault. As soon as the big boss mentioned that it could be offloaded, I should have jumped at the opportunity to pass it on.

Here is how I know I am not right for this project. It runs mostly on UNIX. Today I did not know how to copy a directory and its contents using the UNIX command prompt. Sure I was able to google the answer. But a developer for this specific project should already know how to do this.

The Power of Debug

A developer on my team got assigned a problem that was supposed to be fixed a long time ago. This developer could not determine the cause of the problem. He told our managers that his system was corrupt. He could not run Visual Studio in debug mode. Thus he could not identify the code that was causing the problem.

This announcement caused all kinds of excitement. Our team lead told the developer to report to our offices (he works in a remote location). He showed up and could not find the rest of our team. So he found an office and started working. Luckily another guy in a remote location informed me the developer had arrived. I grabbed him and we met with our team lead.

Team leader was a bit frazzled. The management team must have beat him up a bit. He kept grilling me and the developer about when this bug could be fixed. I asked him why he was talking to me about it. He said that I was now going to be responsible for helping the developer get the bug fixed.

Luckily I had did the initial analysis on the issue. I knew exactly how long it would take. The team lead kept trying to dissect the analysis to figure out how we could ship it out quicker. I stuck to my guns. That there were two people involved did not cut the estimate in half. One guy could not debug the app. Luckily when we got to my desk, built a debug version of the application, it was a short while before we found exactly where the problem was occurring.

You need to be able to run the application in debug mode. There is no substitute for this. If you cannot debug the main applicaiton, you must treat this as an emergency and get it fixed. Otherwise you will be of little use to a maintenance team. Even the managers can see that.

Design Test


This year I got assigned one of the main changes to our system. The hard part was nailing down the exact requirements for what I needed to change. Once that was done, I went to town documenting a design for the changes.

The big boss told me I would do the design. But a new developer would code the changes. With that in mind, I made sure I explained a lot of details in the design.

Today I reviewed the requirements with a new developer. Then I provided him with my design document. The test was to see whether the design gave him enough info to allow him to write the code. He only had one or two questions after going over the design.

The next step is to design some of the changes the customer wanted but were not approved on the first time around. I know they are going to want everything they asked for. We just got a break in that all the changes are not due immediately. The rest of the changes will be in a staggered roll out.

New Hires

Our team is finally getting some new members added. We have been struggling with a limited staff for what seems like a whole year. Now we got some new blood. The challenge is to get them up to speed as soon as possible.

In my opinion, we should throw some bugs their way. You learn a lot about our system when you fix the bugs. That's how I learned most of my domain knowledge. You really don't learn as much when you add a new feature here or there. The only problem with this is that we don't have laptops for the new folk to use yet. So fixing bugs is out of the question.

The current plan is for the new peeps to pair program with experienced developers. This has worked well in the past. One of our bright stars spent the first few weeks shadowing me on some new development. He says he learned more during those few weeks than he has his entire time being here.

I got one guy shawoing me at the moment. So far I have gone through development of one of my scripts with him. I also reviewed some requirement changes with him so we could help another developer on the team. The only difficult part of this arrangement is that my new guy lives far away. He has a massive commute to get to my office. We worked out a deal where he spends two days a week at my office. Let's hope he learn a lot.

Case of the Missing Data

Our customer has been reporting that some of their screens are coming up empty. However they perform a SQL query and find that there is data there. This was quite a mystery that we could not recreate in development. I took a look at the code involved. Somebody suggested that I inspect the databsae table that gets populated by a stored proedure and used by the application.

I found the database table name. But I needed more info. Which schema is this table contained in? I found out it was in the main schema that holds most of our tables. Then I found some strange code that seemed to delete all records out of the table every time somebody logged in. What kind of race condition did they set up here? Before jumping to conclusions, I decided to test out the use of the table with my app.

When I ran the app, I saw data in the application. However I could not find any data in the table when I ran a query. That was strange. This was my own private schema. Nobody else would be working in it. Then another developer thought that the app might be deleting the data. That was a possibility. I decided to remove the app from the picture completely.

I just used some SQL to insert data in the table. I could immediately see the data. However when I tried to query it from another tool (connected in a different session), the data was not there. Aha. I determined the behavior of the table. It turns out it was an Oracle global temporary table. The data was private per session, and removed after session end.

Sometimes you got to test things out for yourself to gain understanding. This was one of those cases. I was not up to speed on how Oracle global temporary tables work. But I knew how to run specific tests to determine what was going on.

Separate Operations Support

I have spent the last week and a half researching and resolving high priority customer problems. This meant that my normal work was put on the shelf. Now I am slowly trying to get back to my prior tasks. This is a tough way to run things.

Today the big boss said we are splitting out our teams into new development and sustaining operations. We had a meeting scheduled with the big boss to go over the new changes for the next year. He declared that I would be free to design the good stuff for the next delivery. Yeah. I can live with that.

Some other poor chap got stuck with the maintenance duties. I hope he is ready for a lot of phone calls. That how I used to live my life in the maintenance world. There is some other good news. We are hiring a couple new people on my team. The big boss told me I could design away the changes, and let the new folks do the coding. Again this works for me.

The Big Time

I was reading this techical magazine on the weekend. There was an advertisement in the back for a Goldman Sachs associate. The pay was between $225k and $400k a year. And this was for a 9 to 5 job. What the heck? Who makes $225k a year in development? Nobody I know.

The position required experience with derrivatives software. Perhaps this is the niche you need to enter to make the big bucks. Now I do know that living expenses in New York are high. But $225k a year should cover that and then some.

How does one get any experience in this field? Maybe you need to start off as a junior associate making minimal cash. Or you could write some hot code in your free time and try to impress someone at Goldman. There is one other explanation for this job. It might be a fake.

There were many abbreviations in this long article. Almost every sentence had multiple abbriviations. That does not sound like Goldman Sachs recruiting. It could have been put together by a recruiter. However the address to send applications/resumes was Goldman Sachs. I tell you what. I would like to make $225k a year for a 40 hour a week job. But if something sounds too good to be true, then you know what that means.

Visual Studio 2010 Aborts

I have been working on a new project using Visual Studio 2010 Professional. And I wanted to see how I could deploy the finished product. In the past, I had used an old copy of Installshield. My Visual Studio has an InstallShield plugin that is free.

I downloaded Installshield LE and set it up to deploy my project. The resulting self-extracting executable worked pretty good. There were some features disabled in the free Installshield. But that did not hold me back.

All of a sudden, Visual Studio kept crashing when I tried to edit the C++ header files in my project. I removed and readded the files. It still crashed. After a while I realized that the addition of an Installshield LE project in my solution caused Visual Studio to crash.

What a fail. The work around is to create a separate solution to prevent the abort. This does not bode well for me to purchase Installshield.

Coordination

Last year I helped out a struggling team on my project. I volunteered for a piece the team knew nothing about. As usual, I did a good job delivering and supporting the product. It was a bit tough because I had my normal duties to do in addition to the new work. But I made it happen.

This year I got loaded up on all kinds of work for my team. But I looked ahead and knew the other team was hurting again. I did not hear anything about the piece I had done for them before. So I asked whether I was still on the hook to do the work. The answer was yes. My team is not happy to lose some of my time. They were most upset that nobody took this into account when setting up our schedule.

So far I have not worked on this additional piece of the system. Today I found the time to work on testing some bug fixes that are going out in the next release. However at the end of testing, I found my tests deopended on some other fixes being made. Doh! Nobody determined there would be a dependency. I tell you. We are one uncoordinated team.

Java to the Rescue

The customer has been encountering performance problems with our system. Some screens are so slow they don't even come up. The customer has since reverted to doing some work manually. Now they need to get the system updated with their work.

All of the customer data has been collected into a Microsoft Excel spreadsheet. Essentially each row in the spreadsheet is going to be an update in the database. The updates will be controlled by a stand alone script. How should developer go about creating this script?

In the old days, I would write a C/C++ program to read in the data and generate the script. However the security team is cracking down on "rogue" programs such as this. I think I figured out the solution. Write the script generator in Java. That way the security people think we are running "java.exe", which is on the list of approved apps.

Some other people are looking into the script generation. However I think I will develop and have my Java program ready to roll.

Talkers and Workers

A higher priority problem from the customer came in. We were in the middle of fixing other high priority problems as well. I decided to take the new problem myself. I hate working on these.

Here is the normal pattern. Some manager wants a conference call. A lot of people join. They all try very hard to suond intelligent. However they ask a lot of questions. The only person who can usually answer those questions are people like me who do the actual work.

That means I have two jobs. I got to answer questions of clueless people trying to sound smart. Then I also have to determine the right questions to get to the solution. This is just a total fail.

Luckily with this latest problem, I was able to take the initiative. I dove in and said I had some ideas and was investigating them. I finished the total solution before any conference calls got started. Winning.

Who to Hire

I just read an article that says you should hire for the person and not their specific skills. For my project, I don't know whether I agree. We have very specific technical needs on our project. We don't have time for you to learn on the job. Techn skills are king here.

But what if you had the lineup shown in the picture here? At first glance, you might want to hire the female because she looks good. Those who look good usually get the advantage. The other two guys look not quite right.

However you need some hackers to get the job done on your project. Maybe you do want someone who looks like a hacker. Along this thinking, I might have to choose the guy in the middle. He is squinting like he stayed up all night writing code in the dark. That is my kind of guy.

Visual Studio Debacle

We are upgrading to a newer version of Visual Studio for our next big software release. There was an event in the schedule where we were supposed to get the new software. That milestone day came and went.

After a few weeks, I heard some managers talking about the schedule. I mentioned that the scheduled was wack because we did not have the software. I explained that without the software, no progress would be made. Furthermore we were losing weeks that could not be made up later.

Suddenly the Visual Studio software became a hot item. Why does it take an emergency for me to get the tools I need? The customer arranged for somebody to install the software on my system. The big boss told me I was going to be getting a call from the installer. It never happened.

Instead I found out that somebody installed the software on my system. They put it in the wrong place. I let them know the install was wrong. This simple software upgrade is turning into a nightmare. Now the real work can begin. Let's upgrade our projects to use the new compiler and IDE.

Just in Time Departure


I had a rough weekend. Had to work on a high priority problem for the customer. So when I came to work on Monday, I was tired. I was on a mission. There were some set tasks I needed to accomplish. There were also some risks I needed to mitigate in order ot meet the schedule I proposed.

As soon as my tasks were done, I hit the road to go home. My team lead delayed me a bit because he needed some info. But after that conversation I was out the door. It turns out that was the best move of the day.

Right after I left, a couple more high priority problems came in. Now I would not have been able to do much on these new problems if I stuck around. I was already burning out. Plus I needed to concentrate on the problem I was working on first.

I came in early the next day. A lot of developers were already busy working early in the morning. That sounded strange. They were working on the new problems that came in. This is a good thing. Me not being there forced management to get other developers involved. There is only one question. Should I bolt early today too? We shall see.

Tricked Again

There was another high priority problem reported by our customers. I thought I was safe. The problem was obviously in a part of the system I don't work on. The team had a conference call to talk about this problem.

I should have know I was getting set up when the team lead responsible for the problematic part of the system started saying this was not his problem. I fell for the bait. That's when I did some research to prove it was in that part of the system.

Next I alerted management to the fact that the developer who manned this specific program actually left the company. I advised them to appoint a new developer to be responsible. Next thing I know, I am in another conference call to work out how we were going to fix this problem.

Initially they were talking crazy about the fix being done in a day or two. I told them no way. Next thing I know, I got signed up to set up the data and do the testing for the fix. They actually somehow got the guy who left the company to develop the fix. Dang. The testing is the hard part of this problem. I should have volunteered to do the fix. Ok. I helped shape the rollout schedule for the fix.

Now to meet the schedule I was going to have to do some weekend work. That was not optimal for me, but I was going to do it. Then I get a call from a manager saying the customer wants the fix even earlier. That's when I knew I had it all wrong and I was being set up. After some heated debate, my original schedule was accepted. In the future, I got to do Dilbert style and pad the heck out of my estimates.

Getting Agile


I just finished reading an eBook on agile development. There were some key insights in there that I want to share. To start with, you need to identify the backlog of work to do. This includes both new features and bugs to fix.

When you estimate the time needed to complete the work, focus on user stories instead of requirements. Count developers for only 6 hours of productive work at the max. I personally would only schedule based on 4 actual productive programming hours per day.

Development is split up into sprints. It is wise to have a Sprint Zero to get your team organized. Some sprints should harden your system by focusing on bug fixes alone. We do this on my current project.

Require progress updates once per day. When you finish any given sprint, review all the tests. Hopefully your tests are automated for optimal test team performance. Waste is defined as any activities that do not add value to the final product. You are going to want to trim waste with a vengeance.

Finally there are only two values for percent complete that matter. They are 0% and 100% done. Anything in between is best thought of as 0% complete. Radical.

Skills Required

I recently met up with an old friend that is a developer. He has been looking for work for a while. The challenge is often that employers want developers with experience in 8 to 10 technologies. Who has that type of skill set?

Yesterday I read an article that seems to confirm this phenomenon. Developers need to know a lot of different things. This includes SOA, OOP, and UI development.

It makes sense that a developer might need to know more than one programming language. That gives you additional insight. I don't know whether it makes sense to know a little bit about 10 different technologies. That is a generalist that specializes in nothing.

Code School

The people at Envy Labs have opened up their Code School. It is an online learning site. The goal is to "learn by doing". They have short videos, along with hands on exercises. You got to pass some sort of challenge before moving on to the next section.

Right now they have a course on Ruby on Rails. It costs $45, a discount from the normal price of $75. Some other courses that are coming soon include jQuery, HTML 5, and CSS.

I am not sure whether this is a good deal. If their hands on technique can teach me stuff in just an hour, I might buy in. It helps that my employer foots the bill for my technical training. If it was my own money, I don't think I would be buying though.

The Software Architect

A lot of developers aspire to become a software architect. The title sounds impressive. And you figure an architect is going to be making a lot of money. I found it humorous that one team on my project decided to declare itself as the architects. Even though such antics are humorous, I think there is some validity to moving ahead by becoming an architect.

I read an article on how real life people advanced to the software architect position. One factor was getting involved with new technology early on. Another is doing publishing or public speaking. You must have top notch communication skills.

Business Objects

I have a coworker that is in training for Business Objects this week. It might be a good time to be learning. SAP just did a major upgrade to Business Objects 4 recently. SAP bought Business Objects 4 years ago. Now they are moving forward with the product.

There have been some job postings recently that require Business Objects Universes experience. Well that term is obsolete in the new version. That functionality has been grouped in with other functions into the Business Layer.

My coworker previously attended some training on Crystal Reports. She got a bit of Business Objects training back then as well. What's the difference between Crystal Reports and Business Objects you might ask. Crystal Reports, like Dashboarding, is one of the interfaces to Business Objects. It is a simple one at that.

I hear the new Business Objects has event processing down pat. Perhaps I shall quiz my coworker when she returns and find out the real inside story. Let's hope she learned some of the new Business Objects 4 features.

Getting the Build Working

My team lead asked me to assist a junior developer with their compile problems. The team lead tried to help previously. But our software would not build on one developer's new machine.

I took a look at some of the errors. There were calls to bitmap functions, passing in literals like OBM_CHECKBOXES. I searched around and found these were defined in "winuser.h". That file should be getting included I thought.

So I went and traced how "winuser.h" gets included. I found that it all starts with "stdafx.h", and eventually get included from "windows.h". Then I saw that these header files were present and included on the new machine. They were.

Upon closer inspection of "winuser.h", the literals are only defined if you have already defined OEMRESOURCES. I went through the exercise again finding how OEMRESOURCES gets defined on my machine. It is part of the project. Turns out the new machine had a project file which failed to define OEMRESOURCES for the debug build. Getting a correct project file solved this problem.

The details of the debugging are not important. The process is important. I did most of the investigation along side our junior developer. Hopefully some of this is rubbing off. Next step is to debug why another project fails to build on the machine due to missing DLL dependencies. Fun stuff.

Tips on Getting That Raise

You want a raise at your company. The biggest obstacle to overcome is that you need to actually go ask for one. Now there are some other factors that may increase success.

Work on some challenging tasks. It is best if they bring in a bunch of revenue. Make sure you take credit for the results. Emphasize the benefit to the company (this is easy if the benefit is that the company made a boatload of cash).

When you ask for more money, don't tie the request for the great job you already did. Talk about what further great deeds you will do. Couple this with a plan to increase your duties.

Before you head in for that raise, have a plan for what you will do if you get denied. Read up on a lot of books on successful negotiation. They will tell you about this. Finally be prepared to switch companies, and maybe even move to a new city.

Use the Logs

I am helping out my old team, researching bugs reported by the customer. Recently one was opened that was going to be a big deal unless it got fixed pronto. The customer put this fact in the bug description. I worked with my team lead on this problem since he had some access issues on his computer.

First thing I did was get an agreement on how the application was supposed to act in the normal flow. Then I reviewed some abnormal flows. Finally we looked at the production data for the examples provided by the customer. I have been doing this for many years. So I knew how to mine our audit tables for the history of how objects flowed through the system.

My team lead was amazed by this. He apparently had never queried the database to get this information. We got a bunch of triggers which store off state changes of interest. This comes in really handy when you are debugging tough problems. I spotted the pattern. The software was actually behaving as designed. These were just some boundary cases which do not behave like the normal flow. As soon as I briefed the main customers on our findings, the trouble ticket was closed with a reason of no trouble found.

How to Get a Job

Just skimmed a book on how to get a programming job. It was packed full of info. Here are some highlights.

You need to possess some key traits such a being smart, able to get things done, and being passionate. Learn on your own.

Don't wait for your company to send you to training. You should especially research technology that you know your company is moving towards. To be efficient, get in the habit of writing the minimal set of code to get the job done.

Hit up the normal suspects on the web for your job search. This includes Dice, Monster, and Career Builder. You should also check out USA Jobs if you are willing to work for the government. Forget about the freelance sites unless you are willing to work on projects that pay fifty bucks for the entire project.

Sending resumes if a low probability game. You are lucky if 10% of the resumes you send out even get read. You can up your success if you also email the resume to the person you will actually be working for.

Bring multiple copies of your resume to any interviews you go to. Do not seem desperate for a job. Know test driven development (TDD). And if you are going for a JavaScript job, make sure you know the DOM, events, JSON, and jQuery.

SharePoint Development is Hard

SharePoint is not like other development platforms. You need to learn many skills to be proficient at SharePoint. Unit testing is very difficult on this platform. You must know your markup languages such as XML. To deploy you need to know something like PowerShell.

That is not all. You had better know web services to be a good SharePoint developer. Let's face it. You might be learning all your life to be a good SharePoint developer. That might not be a bad thing.

I don't know. This sounds too complex for me. Maybe if I got in early I would be interested in SharePoint development.

Programming Languages


What are the hot programmings languages developers need to know? The real question should be what will be the hot programming languages in the future. Web programming has involved Ruby, Python, and PHP. However they are being eclipsed by JavaScript.

The enterprise uses Java. You don't see your main apps being rewritten with Ruby. Ruby is used for some smaller non-critical apps. Yet Ruby developers are currently commanding the big bucks.

So Ruby has some gas. But in the end it will probably be JavaScript that rules. Python, Perl, and PHP will most likely fade. You got to invest in the right language to pay off in the future.

Stack Overflow

Yesterday I read a rant about Stack Overflow. The author explained how things actually work with Stack Overflow. You start with a reputation score of 1. If you get downvoted, you lose rep. You get more rep by answering questions.

Unfortunately most questions have 10 or more answers. You need to try to answer new questions quickly. But everyone else is doing this too. It is hard to get an answer in there quickly enough.

One thing the author did not take into account is that you can also gain rep by asking questions. There are some techniques to game the system. For example, you can find new questions and put a placeholder answer in there. Later you can go back and edit your answer with a solid one.

Personally I don't support Stack Overflow. I used to like the Joel on Software discussion boards. However Joel seems to have let these languish. Instead he is concentrating on his new Stack Overflow startup. So I am on a sort of boycott of that system. There might be good information on there. But I figure the Internet has answers our there as well.

Developers Need Production Access

My old development team is hurting for resources. I got assigned to give them a hand. There were some production problems they could not replicate. They searched the source code, but could not come up with any definitive answers.

I spent the morning scanning the source code as well. However I have access to the production database. This allowed me to ensure the applications were behaving correctly. The other developers on the team did not have production access.

Now I can understand you don't want everybody looking at production data. But if you want your developers to be able to solve problems fast, give them read only access to production data. If can be the difference between solving a problem in a few hours, versus floundering around for a few weeks or a few months.

Going to UNIX

The big boss told me he wanted to me join another team on the project. They just lost a member and are hurting for help. There is just one problem with this plan. This team does C/UNIX programming. I am a C++/Windows developer.

Sure I guess I can figure things out. But it will be a slow process. I got my configuration management set up on my UNIX account. However I did not know the command to do a "find in files". I normally let my Visual Studio tool do that for me. Now I need to know the command line to accomplish that task.

Ok. I figured out how to search for a file. But now I cannot build a UNIX program. They even got a make file and I cannot get the darn thing to build. Must be some config settings that are missing in my environment. I don't want to waste the other team members' time. So I am slugging through it on my own. This is going to be painful.

Running Around in Circles

My boss told me to address a customer problem ASAP. I could not figure what was wrong. So I called the customer up directly. She said that they were following a manual work around process to load some configuration data. However the system administrator was running into some errors.

I investigated and found that the code required was commented out of the package. The fix seemed simple. I enable the code and gave it to my DBA. He had some trouble promoting the fix to other database schemas. I looked into those problems, made some code adjustments to the stored procedures, and again I thought we were good to go.

Another customer piped in and said that the whole manual work around was obsolete. Some new features in one of the applications had been made to take over the functionality. Doh! I had been running around for the last couple days to get this back end process running. But it turns out they did not really need that. Ouch. It even hurt more when I had to back out my changes. Let's hope the new functionality in the application takes care of our customer needs.

Programming Wisdom

I skimmed through a compendium of 100 things programmers need to know. There was some good stuff in there. I will summarize the top 10 or so right here.

The first is that technical debt may be inevitable in the short term. Sometimes you just got to ship. Be quick to remove it though.

Automatically format code. Do it as part of the build. I like the sound of that. We have some nasty formatting in most of our code. We normally try to fix this manually. Ouch.

The best methods are about 10 lines of code each. You should also limit the number of parameters passed in to a max of 4.

Good programmers care about the code they produce. Great ones care about the entire team's code. I am not sure I am ready to be one of the great ones. Honestly.

The best programmers are great because of hard work. There are normally not any shortcuts. No pain, no gain here. Once again I doubt I am ready for any more pain that I am already enduring.

Here is a tip I like. If you try to be productive doing code for more than 30 hours a week, you are working too hard. Try telling that one to the management team. Hehe.

Thou shalt learn to use the command line version of your tools. Period. All great UNIX hackers already know this. Time for the Microsoft crowd to catch up.

Testing should be done on the weekend. That is, you should automate your testing. If it takes too long to run, run it overnight. The weekend is a great opportunity to run the full suite of tests.

Too much logging is no good. We suffer from this ailment on our project. I try to cut back on the logging. However I find programmers just go in behind me and want to add the massive logging back in. You know we are in trouble when the database blows up due to massive logging.

Finally you should test your unit tests by injecting an error and seeing if it is caught. I tried pitching this idea once before. Management was actually receptive. Then I got real busy and dropped the ball. Time to reintroduce this one to the project.