Friday, October 15, 2010

The importance of soft skills in IT

Soft skills are crucial to being a successful developer in the IT industry.  Some of the soft skills I've found beneficial in my career are:
  • Being a good communicator.  It's not just about talking, but listening as well.  Dirareah of the mouth is never cool, especially when a job needs to get done.  Strive for mutual understanding in a conversation. Communicating in the IT world isn't just limited to talking and listening though.  
    • Having the discernment to know when to write an email versus actually talking to a person is important as well. I do not recommend doing all your communication through email.  Communication in emails can easily be mis-understood or mis-construed and take on an entirely different meaning and tone than you originally intended.  Emails are great for documenting decisions.  
    • Make sure that the content of your email deals with the subject you've put in  your subject line.  For example, having a subject line of 'Quote for project XYZ' but then talking about quotes for that project AND other projects in that email is bad news.  Send you quotes for the other projects in a different email with a more relevent subject line (I know this from experience).
  • Developing relationships.  Extending communication a bit further and actually developing relationship with people in the office is huge as well.  Questions like "How was your vacation?", "Where are you going on vacation?", or "What did you do over the weekend?" are great for this. When you've got a relationship in place, there's trust.  Many times I've been granted exceptional privileges and become more productive in my work because I've had a relationship with a key person who trusts me.  These relationships can also help in the future as well when you are looking for that next gig.
  • Having patience.  Whether it's letting somebody else go to the front of the 'line' for access to production, or having forbearance when dealing with a difficult client, patience can go a long way to strengthening that 'trust' in your relationships.  Sometimes work (or working with clients) in IT can get frustrating.  Things I do to help me step back and get some perspective are:
    • go for a walk
    • find something else to do for a while
    • talk to someone - use them as a sounding board
    • take a day off or go on vacation
    • Positive Attitude. I like to keep my workplace fun, interesting, and upbeat.  To promote this around me I'll sometimes:
      • Bring baking from home to share
      • Audibly rejoice in small victories (getting a solution migrated and compiling from VS2005 to VS2010 for example)
      • Write thank-you notes (either hard or soft copy) to others who help me
      • Encourage people who are down. We had a large project I was helping with and the lead was concerned that between the time and the technical challenges he had, he wasn't going to be able to finish on time.  I believe he could and I told him so (and backed it up with my help).  In the end, he did finish.
    • Being Flexible.  Generally, you are always working for a client.  Invariably, they will change their mind or want an enhancement.  Microsoft will upgrade their software, the US president will change daylight savings time one more time, the CTO will be convinced that Tibco will solve all the business problems again.  I've found that being able to take these changes in stride is crucial to maintaining my mental health (avoid being overcome with frustration).  It's all part of the territory - and frankly, job security.

      Thursday, October 14, 2010

      Business Idea - Jam Joint or Practice Pad

      I was getting into some music on the commute home the other day, lamenting the fact that I don't have a drum set to practice on anymore when I was struck with this business idea.  Rent a smaller stand-alone building and renovate it to have reasonably sound-proof practice rooms.  Furnish smaller rooms with drum kits, leave some empty (for electric guitar/bagpipe/tuba practice), and make some bigger for bands to jam in.

      Many drummers, musicians in general have no where to practice in cities because it disturbs the peace.  Renting these practice/jam rooms out might be an interesting and franchise-able business opportunity.  My wife could only listen to me play the piano at home for so long (and I don't think I'm that bad - 11 years Royal Conservatory).  As soon as I started practicing technique, her patience got thin. :-)

      Wednesday, October 13, 2010

      Log4Net performance issue with WCF

      We ran into an interesting production problem recently that had an interesting resolution. After upgrading our application server to use WCF calls, we found that performance was lagging in production. We were able to replicate this problem in our development environments and spent a good deal of time trying to resolve the issue.  Avenues we explored included profiling calls to the databases (using Sql Server Profiler and filtering on database name and login Id), mining activity logs in the database, pouring over configuration files, utilizing WiresharkSysInternals Process Explorer , SysInternals ProcessMonitor (and filtering by processName and PID), and the Windows PerfMon (performance Monitor - viewing the defaults and various performance objects).

      Interesting things I learned/discovered were:
      - IE browsers (IE 7 and older) default to only two connections to the web server See this link
      - It seems IE processes javascript before rendering a page while Firefox process javascript after the page is rendered in some cases
      - The default for WCF connections to the database is serializable rather the read committed!
      - WCF connections default to some low threasholds for ConcurrentCalls, ConcurrentSessions, and ConcurrentInstances.  These can be changed using the serviceThrottling node and attributes of a service behavior you create.  See this link for more detail
      - In dos, you can filter a netstat to only show specific ports and statuses like this:
      netstat /n | find "ESTABLISHED" | find "8085"
      - Use /n with netstat to not resolve dns names - without /n, dns name resolution can make netstat take a while.
      - In dos, you can use the 'tasklist' command to show something akin to a process list in the Task Manager
      - Retrieve IIS process names from the command line by executing this command:
      cscript c:\WINDOWS\system32\iisapp.vbs

      In the end, the resolution to our problem was to turn off a custom implementation of Log4Net that had running.  In the process monitor we saw that log4net was re-initializing, re-reading it's configs, and re-creating all the log files for EVERY page request.  We discovered this because it seemed that there was a several second lag time between when the request was executed on the browser and when the web server actually acted on it.  Disabling log4net entirely improved our performance by a significant amount. (10's of seconds)

      Update - Nov 26, 2010.  One of the reasons we were running into the issue above is the log4net configuration loader was placing a lock (being very pessimistic) on the configuration file every time it was loading.  Agreed, this solution should likely have been using a static logger - one instance for the application.  However, given the way it was implemented, I'm thinking that we could have avoided a bunch of hurt if we had made the configuration loader a little more optimistic and used:
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />