CodeBetter.Com
CodeBetter.Com
RSS 2.0 via Feedburner
           Do you Twitter? Follow us @CodeBetter

Eric Wise

Business & .NET
  • See you at TheRuntime.com

    I write this post with a mix of excitement and sadness.  The exciting part is that I am helping form a new developer community site at http://www.TheRuntime.com.  The sad part is that I will no longer be blogging at Codebetter.  When Codebetter was first formed, myself and several other bloggers from DotNetJunkies were concerned about the signal to noise ratio, and wanted to start up our own site where we could focus on development tips and techniques with a lot more meat in the feed.  We succeeded, and Codebetter became a known and popular site in the community.

    In the last 6 months or so though, I've noticed a lot of negativity in the feed and coming in from our readership.  Where once we used to focus on positive aspects of the community and helping developers of all skill levels become better at their jobs, I noticed the perception rising that many posts on this feed are elitist, confrontational, and overly negative.  I'm saddened to say that I agree with these readers, and it saddens and angers me to lose readership over this.  I want to go back to the basics and blog on a site that is about helping developers, not about evangalizing the acronym of the day, or drawing lines in the sand between "us" and "them", and builds the fellowship and closeness of community that I dreamed of when I first entered into the blogosphere.

    Please note that I am not trying to put down my fellow bloggers at codebetter.  They are all talented and intelligent people who would not have the success that they have in their careers if they weren't.  It's just that more and more often, I read the feed and say "This is not me.", and that's something internal that I've had to work through.

    Back to the exciting news though, go ahead and subscribe to http://feeds.feedburner.com/theruntime or go directly to the site, which admittedly is still being worked on but is now functional.  You'll find me, and several other talented bloggers set up there, and we'll be glad to share our experiences with you.

  • Growing the team

    I now have an opening for a mid-senior level Database Administrator.  SQL 2005, OLAP cubes, Performance Tuning, all that good stuff.

    If you know anyone who would like to work in the Akron Canton area with a small kickass team led by yours truly, send them my way.

  • Kudos to Sprint

    I noticed an article today about Sprint Firing 1000 Customers.  I would like to congratulate Sprint for making a tough and potentially unpopular decision for the good of their business.  I wrote a blog post a few years ago about firing clients and I believe much of the same logic applies to the Sprint decision.  Naturally for a company to survive in a competitive environment it must service its customers at a reasonable level.  But at what point should a business decide that some customers simply aren't worth servicing?  I recall the CEO of Best Buy echoing similar views in a "controversial" interview where he spoke about Best Buy seeking high margin customers (don't have a lot of returns, use company credit, etc).  This just makes good business sense to me.

    Businesses are in business to make money, and part of making money is providing good service to your customers.  But frankly, there are customers out there who are never happy with their service, will always call you and question every line item of their bill, and try to complain and finaggle and fraud there way into any discount they possibly can.  Sitting next to the customer service department in our company, I overhear some conversations with customers that are mean, abusive, and outright assholes and frankly I'm glad to see companies showing these customers the door.

  • On H1-B Visas

    This guy knocks it out of the park.

    Our last two open positions we filled with H1-B candidates.  Not because we wanted cheap labor (we pay them quite well, market rate), but because like my compatriot blogger here the quality of the American candidates was pretty poor.  Of the entire stack of stateside resumes we received, only one person had the technical skills necessary, but came off as highly arrogant and not a team player.

    Not to go on a tangent (but I will regardless), it's interesting how not to long ago it was enough to be a code nerd with no personality or people skills to speak of and in todays world I really don't have room for someone on my staff who can't communicate well and handle direct contact with end users.

    Anyways, back to the main point, I find it highly irritating after all this immigration bill nonsense where congresspeople were falling over themselves trying to hand out citizenship and rights to these "poor hard working illegals" (as the pro-amnesty crowd portrays them) but at the same time these government leaders actively try to keep companies from hiring highly skilled, honest, tax paying foreigners.  I like to think that most Americans are not xenophobic and realize that our country was built on immigration, immigration of skilled, hard working, talented people who want to integrate and take part in the American dream.

  • Followup: Rejecting Software Engineering

    Pretty fun post actually, sparked a lot of debate and good examples on both sides.  So I got to thinking tonight and the funny thing about that post is that I was talking about why I reject the title of engineer and of course it led to a debate about whether we should all be called engineers or not which I think is deconstructive to what I was trying to convey.  Then I got to thinking that it would probably make more sense if I provided the audience with what I would prefer to be called.

    I want to be known as a software craftsman.

    I see myself on the art and creative side to be more like a craftsman.  I don't build (or have any interest in building) the operating systems, or the developer toolsets like visual studio or resharper or eclipse any more than the average carpenter has an interest in building his own hammer and saw.  Software craftsmanship is a term that has been bandied about in the community off and on, but it really resonates with what I attempt to do.  What do I attempt to do?

    I attempt to select tools, patterns, and practices and with them craft beautiful, working software.

    To do this properly, I have always tried to approach new tools, patterns, and practices without ego.  Like a master craftsman, I need to understand what is available to me and know when to use a claw hammer and when to use a rubber mallet.  Like a master craftsman I put great care into my code and take materials provided by others and create something of value.  Above all, I strive for my employers to add value faster than I add cost.  This is something that I think many of us forget in our quest to use the latest neato tools and patterns.  Is what we're doing adding value faster than adding cost?  If it isn't, I will reject said tool and pattern for the task I am on.  This is where some others in my circle of the community get annoyed with me, they start talking about new patterns and tools like LINQ etc and the first question out of my mouth is "whats the value to me?  Will this add value faster than cost?".

    As a side note, I tend to favor beauty in simplicity, not in complexity, as anyone who has worked with my code can see.

  • Google? Not for me...

    This wordpress post has been making rounds on the internet as an internal email being passed around at Microsoft about the views of an employee who previously worked for Google.  Being the darling of the day, any look inside Google is of interest to a geek like me and probably you readers too.  Here's the link, read it then come back.

    http://no2google.wordpress.com/2007/06/24/life-at-google-the-microsoftie-perspective/

    So what did I learn from this article?  Despite the pay and benefits, I really couldn't see myself working at Google and being happy and successful.  I have the following observations:

    1. Not having a personal space or privacy to call your own would make me feel like a "cog".  I need a relatively quiet place to work and there's nothing I hate worse than feeling like people are lookingg over my shoulder.

    2. How does the lack of "ownership" on projects work out over the long term?  I mean, in every project there are fun puts and boring parts.  With people being able to jump around, it makes me wonder if the perpetual beta state of a lot of Google's stuff is due to people simply not being interested in doing the boring maintenance and enhancement tasks at the other end of the life cycle?

    3. The management situation disturbed me greatly.  100 direct reports?  I would strongly argue that most managers can't manage more than 7 direct reports if they are in something as complex and highly skilled as IT.  How much personal recognition and how much of the relationship between worker and manager is damaged by this type of structure?

    4. Little in the way of career development and paths?  No thanks, I'm only interested in company that works with me on a career development plan.  If a company isn't going to be open about advancement paths and helping me achieve my goals while I help them achieve theirs, that's not a very good situation for me to be in for the long term.  Will Google be able to keep turnover low over the long term?

    5. Insane hours, sorry guys, I have a family (course I still work 50-60 these days, but it's by choice).  Sounds from the post like there's a lot of pressure to work 80+ hours a week.  I wonder how those high Google salaries look if broken down hourly...

     

    Don't get me wrong, for the most part, I like Google, just doesn't seem like their environment would be a good fit for someone like me.  :)

  • Rejecting Software Engineering

    When I actually get some free time and surf around the blogosphere I often see people referring to software as "engineering".  I've always had a problem with this term because it implies things about software development that simply are not.  Let's take a look at Dictionary.com for a moment.  re: engineering

    the art or science of making practical application of the knowledge of pure sciences, as physics or chemistry, as in the construction of engines, bridges, buildings, mines, ships, and chemical plants.

    So here's where the whole software engineering thing falls down for me.  Building software is not like building a bridge.  It's just not.  In physical, "real world" engineering you have the laws of physics, near perfect information on durability, composition, balance, etc.  A programmer, as Fred Brooks puts it (The Mythical Man Month) is like a "poet who works only slightly removed from pure thought-stuff".  There is a plethora of languages and methods for achieving the same results in software development and none of them are exactly the same.  For something to be labeled as an engineering science in my opinion, it needs to have known values and be infinitely repeatable.  Software development meets neither of these.

    Part of the issue is that programming systems are defined by the user's needs, which are infinitely varied across companies.  Once you step out of standard software packages and into the custom code world, every system is completely unique and is shaped by the users and by the individual humans working on the project.  This is one of the joys of working in software in my experience, since even problems that are similar to ones you've solved before can add new twists and features, keeping the work fresh and challenging.  At the same time though, this is what prevents me from referring to software development as engineering, because there is no silver bullet, no common standard or schema for doing things.  We are artists that are really good at math and logic.

    Look at the estimation problems we have in software.  How many of you out there can truly, honestly, to the day pick out when you will be finished with a software project?  The bigger the project, the rarer this ability is.  Sure you can fudge your numbers and add padding so you can be reasonably sure you won't be late, but calling your complete date agressively is near impossible in large projects with many team members simply because you are working with thought-stuff and unlike building a bridge, you can't pull a template from the last 40 bridges you've built and nail down a relative time line.  Additionally, the human factor kicks in on large projects.  It has been well noted by researchers like Sackman, Grant, and Erikson that "very good professional programmers are 10 times as productive as poor ones".  This is also unlike building a building where the variance in productivity between say, people putting up drywall is far less than 10 times.  If software development was more like engineering you'd be able to walk in and say "oh, you want an invoice billing system, that'll take 500 hours" and you'd hit that target nearly every time.  This is far from reality.

    Additionally, unlike in engineering where you want a free flow of information, I agree with David Parnas, who asserts that the various modules of code should be encapsulated with well defined interfaces, and that your programmers should be shielded from the reasoning, code, etc behind modules that they do not directly own.  I actually learned this the hard way at some past companies where developers across teams and modules got access to all project documents.  This lead to a lot of infighting where developers would cross team boundaries and try to impose their biases and design preferences upon other teams which was horrible for productivity.  The technique exposed by Parnas also lends itself better to separating your application into conceptual chunks, which makes it much easier to manage and parallel develop.

    Regardless, my end point is that I don't think software development will ever be able to be defined as engineering in the traditional sense, and being that a company's use of software technology can lead to huge competitive advantages I really don't think we ever want it to be.

  • Looking Back: Keys To Project Success Part 1

    For the last few months, I've been rather scarce while we put the finishing touches on the new enterprise software that runs the company I work for.  I've been meaning to kick off a series of blog posts on what worked, what didn't, and why the team was able to finish a critical and complex project like this on time and under budget.  Given the abysmal project success rates in software, it's vital that we recognize contributors to success and repeat them.

    Project Background

    I work in the insurance industry, more specifically (and still general enough) the property and casualty niche.  On top of your normal software challenges, those of us who work in the insurance industry also get the trials and tribulations of dealing with a large amount of government regulations in addition to keeping not only your internal users happy and paying customers happy, but also keeping underwriters, auditors, and departments of insurance happy.

    The company was a pretty small company when I started there, with a pretty small customer base.  Since I started, they've launched new partnerships and marketing initiatives, and their growth exploded (good thing).  However, the system that was running their business was not equipped to handle the growth well, was designed during an early phase of the company and as such didn't reflect how the business should operate, and was completely unmaintainable (long story, just take it at face value, this blog is not the daily wtf).

    So the goal of the project was a complete replacement of the system that ran the enterprise.  This means enrollment/sales, underwriting, customer satisfaction, claims processing, invoicing/billing, and marketing.  A huge undertaking of critical value to the business, which is just the way I like it *puts on his superhero cape*.  The project team consisted of myself, 1 junior programmer fresh of out college, 1 midlevel developer, several SQL/.NET consultants, and 2 Web/Graphic Designers.

    So let's get started, shall we?

    Key 1: Know the Business

    One of the things I've always enjoyed about my job is getting out in front of the other departments in a company and learning the big picture about how a company works.  Many people tend to sit in a void where only their department and their direct customers matter.  They don't understand or care how data and processes cross boundaries and flow through the business.  Not only do I care, but I make a point of being a student of business as much as I am a student of technology.  To me, IT is a service that holds up the rest of the business, and justifies its existance by ensuring that the rest of the business has the tools it needs to succeed in its tasks.  In order to provide service, you must become an expert not only in technology, but in the processes of your customers.

    When I first arrived at the company, I spent the better part of several months just interviewing and sitting with people in the various departments of the company.  From the management all the way down to the employees taking the phone calls I examined how everyone was doing their job, what tasks they did most frequently, what tasks were frustrating, and what tasks were nearly impossible.  Many architects rely on the findings of business analysts or meetings with management, but I prefer to go straight to the source.  You'd be amazed what you can learn about interface design and what screens should look like by sitting with the line workers at a company.  I challenge those of you who are in control of page layout to take a layout request from a manager and another from the line workers and compare the two.  In my experience, 9 times out of 10 they look almost nothing alike.

    Don't just take verbal cues either!  Look around people's workstations.  Do they have post-it notes in their workspaces?  Are they keeping data outside the application (usually Excel) because the application doesn't provide them with data in a format they need?  Ask lots of questions, really interview the end users!

    Also, again I can't understate the importance (for internal IT architects) to have formal business education.  Having formal business education allows you to better serve your business customers by providing a common ground of language and knowledge of how a business works.  I can't imagine someone trying to architect a financial module for their company without knowing what "double entry accounting" was any more than you could imagine a piano repair man who couldn't play a note.

     Key 2: Know (and grow) Your Staff

    The human aspect of a software project is probably the most challenging one for IT people to take on.  The challenge has two faces: The first is to get to know the abilities, limits, and aptitudes of your development team so that you can assign tasks to the people most likely able to complete them.  The second is to ensure that your developers are growing and feel challenged and appreciated. One of the most deadly things that can happen to a project is key contributors leaving before the project is complete.  Replacing or adding developers mid stream nearly always causes schedule slip because the new developers have to learn the architecture, business processes, and adapt to the environment.  Thus, ensuring that your performant developers are content is a key task to hitting your deadlines.  Also, because the later it gets in the project the harder it is to replace people, it is important that you identify dead wood developers and get them out the door and productive workers in the door as early as possible.

    Key 3: Get out of the ivory tower

    One tendancy I notice among architects and developers is the tendancy to live in the Ivory Tower.  Jay recently posted his thoughts on "Git R Done" coding and I'm pleased to throw my hat into that arena.  While it is great if you can follow all the latest fads like SOA, IOC, TDD, etc, at the end of the day/project, the business only cares that what you built works, and works to spec.  This is why when I gather a team of developers I give them the following instructions.

    1. Be clear and consistent in naming conventions
    2. Make it work
    3. Clean it up
    4. Refactor to patterns if necessary
    5. Never, ever add gold plating

    I tend to code the way the natural world works.  You never, ever see a creature in nature doing something that has no purpose.  Nor do I believe that developers should abstract, tdd, or ioc code that does not need it.  If a developer comes to me and wants a pat on the back for writing 50 tests for a class that does a few simple database lookups, they are more likely to get a pink slip than a reward for wasting time and energy on tasks that add little or no value to the project.  Developers are passionate about their craft, and this is a good thing, but it can be taken too far and turn into gold plating and abstracting for the sake of abstraction, which is a very very bad thing since it wastes their time, your money, and a future maintainer's time and money since the learning curve for the maintainer goes up when the developer does this.

    This is not to say that IOC, TDD, etc are to be avoided!  Quite the contrary, they make a whole lot of sense and add a whole lot of value in the appropriate situations.  The difference between an architect and a great architect is knowing when and why to use patterns and techniques.  Additionally, in my opinion the refactoring tools (I personally use resharper) are becoming so good and powerful that my step #2 "make it work" just seems natural too me.  Back in the day, if you coded something just to make it work, refactoring was a manual process and a royal pain in the ass.  It was better to spend as much time as you needed up front to designing elegant code.  In today's world with today's tool, you can take that code that just "makes it work" and refactor it into just about any pattern you want in less than an hour.

    Another reason why I push the "get r done" method is that oftentimes I find that in the process of just making it work, you learn a lot more about the process at hand.  This means that since you save your cleanup and refactoring to a later stage in the process when you are more sure about what you want the code to do.  This is one of the things that TDD does bring to the table.  It makes you think about how you want the code to look before you actually write the code, but it's not a requirement to do TDD to achieve the mentality.  This also allows you to rapid prototype the application and handle scope changes in parts of the project where the scope is plagued with uncertainty.

    One of the complaints you see repeated over time in development is that schedules slip or get compressed.  By embracing a "Get R Done" mentality, at least when the schedule does slip or get compressed, you have working code, even if it isn't pretty by the ivory tower standards.  And admittedly, it's downright frustrating being preached to from the ivory tower, as most of us in the real world know.  We don't start with a clean slate, enough time, enough developers, and a free hand to make all the process and architecture decisions.  We have to make do with what we have an deliver value to the business nonetheless!

  • Hello Vault

    Being that I was so irritated with Team System dying on me, in addition to the relative immaturity of the interface there, I decided upon return from Tech Ed to change direction and move the team to SourceGear's Vault product.  In addition to Eric Sink being a stand up guy and blogger community figure, the sourcegear vault product has frequently been a favorite of mine in the 3.* version days at other jobs.

    So today we purchased the latest version of Vault and I'm pleased to say that the initial set up and administration was a breeze.  Even though I had no experience in the 4.* versions, the new web interface was comprehensive and the little documentation I needed to use was more than sufficient to get me going.  I wouldn't consider our source code needs on site to be overly complex (branching/merging/etc) so I can't comment on those features, but Vault offers a whole lot over standard source safe in a very easy interface.

    One thing to point out, sometimes it's the little things that matter.  When I was adding a folder to vault source control, it was smart enough to pre-select actual code files, ignore source safe files by default, and ignore my bin folder by default.  It's actually kind of sad after my years of sourcesafe that such a small thing makes me happy.  Shows how low Microsoft sets the bar on that product.

  • Application Development Manager

    It's actually been more than a month since I received this promotion, but I've been so busy pushing towards release for the new internal insurance processing software that my company needed that I haven't had any time to blog!  Anyways, I thought I'd quickly and formally announce that I was promoted to Application Development Manager which is a positive step forward in my career.

    With the MBA and all I've always planned to move up the corporate chain to Dir/IT or CIO some day, and while I've been a team leader at various times in my career, this is the first time I've had the formal "Manager" title and full "managerly" duties.

  • TechEd Wrapup

    All in all, it's been a pretty fun week so far.  My favorite sessions by far were Rocky's architecture session and David Platt's jam packed session on Why Software Sucks.  Rocky and David are both very engaging speakers who use humor and make the audience feel comfortable in interacting with them and I wish that all the TechEd speakers would take note of this and try to spice up their sessions a bit.

    On the technical side, more of the conference was about Vista, Windows Server 2008, and those types of technologies.  There really wasn't a whole lot of new on the .NET 3.0 front (sessions of course, but very little "new" information).  I continue to be impressed with WPF and picked up Chris Anderson's book which I've found to be a nice read, especially from someone who is something of a software genius.  His talk at TechED on the hows and whys of the WPF model was quite humbling to me since I doubt I could ever conceive of such an elegant design.  Then again I don't have a few hundred programmers at my disposal either.

    On the pure technical side, I finally got a taste of something I crave in LINQ.  I saw a VB demo today (this doesn't work in C#) where the developer used LINQ to emit XML in line with tagged markup.  It was so easy to read and I think it's the greatest thing since sliced bread.  The following syntax is not precise at all, but it will give you the gist of it (I'll blog something more exact when I get the time):

    from c in customers

    select customername, customerid

    var xml = <customer><CustomerName><%= c.customername %></CustomerName><CustomerID><%=c.customerid%></CustomerID></customer>

    Note that you aren't using a dom object, or using text quotes, or anything.  VB just recognizes that you wanna format some xml and gets out of the way so you can do it.  For generating xml documents etc on the fly, this is freaking fantastic imho because the readability will far exceed working with any standard xml classes!  I am definitely going to implement this to generate print files etc to send to our external printer.

    Visual Studio Orcas CTP looks pretty stable for a CTP.  I heard some scuttlebutt that a beta 2 with go live is planned very soon, I'll probably make the move when this releases, just as I did with vs 2005 b2.  There seems to be many improvements in orcas and I'd really like to start putting Chris Anderson's book to the test with my own WPF coding.  It's just pretty clunky without blend or orcas because it's a lot of typing.

    SQL 2008 continues to evolve.  Didn't see a whole lot that blew my skirt up.  The MERGE command looks pretty slick though.  I really like what I see out of Groove for Office and I think I'm going to see about dogfooding that at work to work with compliance (Insurance companies, we have compliance departments and there's a lot of document collaberation going on, Groove seems to suit this without all the extras of sharepoint).

    The jam sessions were pretty cool at the Groove (Universal Citywalk) and tonight is the party at the Islands of Adventure at Universal Studios that I'm looking forward to.  See you on the other side.

  • Bye Bye Team Foundation Server

    Ya know, I really tried to give team foundation server a fair shake.  My opinion on it is as follows:

    1. It's a generally better source control system than source safe.
    2. It's really expensive.
    3. It's a pain in the ass to administrate.
    4. It's a pain in the ass to troubleshoot.

    So, I haven't been around in quite some time.  We've been getting ready to roll out a system that not only runs an entire insurance business (claims, enrollment, sales, billing a million dollar+, etc).  The great news is that the system is live, on-time, and under budget.  (I'm going to do a few posts in the future about why this was so) The bad news is that team foundation server decided to stop working the day after go live.  As in, no services load, the websites are down, it's obviously a service account problem but myself and the lead network admin have been unable to resolve the problem so far.

    So our source control was down, I had to migrate back to vss 2005, and I was pretty pissed off that it ran properly for 6 months, nothing seemed to have changed, and it died this week of all weeks.  Troubleshooting is a pain in the ass.  There's really no admin interface to speak of, the error messages are cryptic, google et al are nearly no help at all.

    So bye bye Team Foundation Server.  We were on workgroup and were going to upgrade to the full server.  But frankly if I'm going to ask my company to spend a few thousand dollars on something, I'd like it to have a gui to administrate from and if it goes down, I should be able to fix it in less than an hour.

    Is that too much to ask?

  • I'll see you at Tech-Ed

    Nuff Said.
  • Offtopic Happy Friday : Webcomics

    I'm often surprised how few people realize that there are some quality comics on the web that aren't syndicated in newspapers.  Here's a list of my top 3.  Happy Friday!

    http://www.penny-arcade.com/comic for general gaming and industry humor.

    http://www.somethingpositive.net For the dry, sarcastic, person inside you.  More of a sitcom style comic.

    http://www.lfgcomic.com A new comic, I'm really enjoying it.  Takes the standard fantasy MMORPG game stereotypes in a fun way.  I hope this one succeeds in staying around.

     

    Followup: Do you have favorite web comics?  Post and discuss.

  • Sahil on FOR XML

    Sahil just posted a nice little primer for getting started with the FOR XML clause in sql 2005. Good start, however I feel like he missed a technique.

    One of my major gripes with working with FOR XML is when you have to join more than 2 tables in your query. FOR XML AUTO tends to create a child node for each join.  Say for example you want to show a list of customers, their contact information (address and phone being separate tables) and their order history.  With a default join using FOR XML you'll end up with something like this:

    <Customer name="blah"><Address element="blah" element2="blah"><Phone element="blah"><order etc></order></phone></address></customer>

    Now to me, this xml makes absolutely no sense.  Customers have a single primary address and phone number, and orders belong to customer, not phone number, (or however you ordered your join).  So while you can use Sahil's techniques to do explicit building of your XML, there is a much easier way:

    Create views.

    If you create a view that pre-joins customer, address, and phone number and a view that compiles your order information, you can do a FOR XML AUTO query on the view joins and life will be good, with a minimum of effort.  And I'm all about achieving results in the easiest, most readable, maintainable way possible.  =)

     

    Posted Feb 20 2007, 07:01 AM by Eric Wise with 2 comment(s)
    Filed under:
More Posts Next page »

Our Sponsors

Proudly Partnered With