# Thursday, May 13, 2010

I have written much lately, I guess I haven’t felt that I have had anything relevant to post or perhaps micro blogging is just too convenient.

I’ve been learning different programming languages over the past few weeks rather than working on writing C# in my spare time.  I’ve spent a couple of weeks with Ruby, then a week with Scala, and now a few days with Clojure.  The interactive nature and quick feedback that REPL gives you is just awesome for learning a new programming language.

Each language definitely has it’s niche, but I feel like there’s something I’m missing that allows me to fully grasp the underlying niche that each language provides.  I have no trouble picking each language up, but I want to get into the guts of the language and try to understand it from the perspective of the person who wrote it.

For instance, I spent several hours pouring over the Clojure source code and found that it was nothing like I had expected. A programming language written in Java!  The nerve.  That was laughable only a few years ago (unless you’re a DBA, then you probably find the entire JVM laughable).  When did we graduate from writing languages in C to Java?  I find it absolutely fascinating.

Not to pick on people smarter than myself, but the source code for Clojure is far messier than I expected.  I’m sure at a high level its very well designed, but the low level source code wasn’t as well abstracted as I expected and with commented out code all over the place.  It made me wonder how it actually worked without bugs seeping out from every corner of the code base.

But the more I learn about these languages, and how they’re written, the lower down in the stack I want to go.  Dragon book lower.  Although understanding BNF and other compiler lingo isn’t required for understanding the Clojure compiler, I think it would answer the question of how it works so well without bugs seeping out from every corner.

Thursday, May 13, 2010 12:58:38 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, August 24, 2009

Indeed it does have the ability to download torrents. I needed to download an Ubuntu VMWare image via BitTorrent, but didn’t want the hassle of downloading and setting up a BitTorrent client.  As it turns out Opera (which I already have installed) comes with a torrent client built-in.  I never would have guessed a web browser would have that ability out of the box, but it does.

Monday, August 24, 2009 4:35:17 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, August 09, 2009

From a software engineer’s craftsman’s perspective, the term architect is not only negative, its down right skull and bones. Only those who wish to speak up towards management would ever want to be labeled architect. The real demon isn’t necessarily architect in the general sense, its a specific type of architect that we disdain, the kind that adds no value: architecture astronaut, from here on referred to as the non coding architect (NCA).

As Joel Spolsky so eloquently put it, emphasis mine:

When you go too far up, abstraction-wise, you run out of oxygen. Sometimes smart thinkers just don't know when to stop, and they create these absurd, all-encompassing, high-level pictures of the universe that are all good and fine, but don't actually mean anything at all.

That's one sure tip-off to the fact that you're being assaulted by an Architecture Astronaut: the incredible amount of bombast; the heroic, utopian grandiloquence; the boastfulness; the complete lack of reality.

Lets be clear on something right now, PowerPoint presentations with fancy buzz words add no value. Sure management likes them and sometimes they’re even shiny (management loves shiny stuff), but what value has been added to the product?  Again, zero, none, nil.  The NCA could create hundreds, thousands of presentations, but still your burn down chart remains unaffected.

The NCA may do more than create PowerPoint slides.  Sometimes they create UML models, RUP diagrams, and maybe even state flow diagrams. This kind of stuff is cute, but it still falls into the “useless” category. Very rarely will an engineer on an agile team ever need to reference one of these stale documents.

“The real problem with an NCA trying to dictate technology choices is that there is one critical element missing, something that should painfully obvious to anyone using an agile methodology: there is no feedback loop.”

Some NCA’s may even venture as far as trying to dictate to the development team on how they should build the underlying system architecture.  This is a line that should never, ever, ever, ever (just keep repeating that until you get tired) be crossed by an NCA. The real problem with an NCA trying to dictate technology choices is that there is one critical element missing, something that should be painfully obvious to anyone using an agile methodology: there is no feedback loop.

The NCA can choose technology X, because its super cool, has lots of fancy acronyms in it, or is “the standard,” but unless they have skin in the game they don’t suffer from their bad decisions on a daily basis like the rest of the development team. The rest of us would like to focus on the real problems of getting a quality product shipped.

Where do we find these evil NCA’s? Joel continues with this:

It's very hard to get them to write code or design programs, because they won't stop thinking about Architecture. They're astronauts because they are above the oxygen level, I don't know how they're breathing. They tend to work for really big companies that can afford to have lots of unproductive people with really advanced degrees that don't contribute to the bottom line.

Usually at large corporatized companies, companies with lots of developers, I would imagine a bank.  Banks essentially print money (well, the government prints it and then gives it to banks, then sends me the bill). In other words, companies that have money to waste.  You would never find an architect on a video game title, they’re too busy trying to make a fun game. Maybe you could make an argument for a NCA at a bank, after all there’s a lot of management overhead and someone has to distract them with shiny things.  If you find an NCA and only 5 developers, you’re in a whole heap of trouble, just like them Duke boys.

There is another type of architect, the antithesis of the NCA, the coding architect (CA). Most often the CA is the lead developer on a team, sometimes referred to as the coach on an XP team. The coding architect isn’t focused on shiny things, the CA is focused on the code and how that code fits within the “architecture” of the system. The CA is also focused on the team, providing guidance to junior developers whenever needed. Martin Fowler call this guidance a key to success in his Is Design Dead? essay.

Indeed one of the several games with words that XP makes is that it calls the leading technical figure the "Coach". The meaning is clear: in XP technical leadership is shown by teaching the programmers and helping them make decisions. It's one that requires good people skills as well as good technical skills. Jack Bolles at XP 2000 commented that there is little room now for the lone master. Collaboration and teaching are keys to success.

All this talk of architecture roles brings up a question, what is the “architecture” of a software system. There is no singular answer to this, and depending on the type of system it could be very different things. Ralph Jonhson has one of the better descriptions of software architecture:

…A better definition would be “In most successful software projects, the expert developers working on that project have a shared understanding of the design. This shared understanding is called ‘architecture.’ This understanding includes how the system is divided into components and how the components interact through interfaces. These components are usually composed of smaller components, but the architecture only includes the components and interfaces that are understood by all the developers."

Whether something is part of the architecture is entirely based on whether the developers think it is important. People who build “enterprise applications” tend to think that persistence is crucial. When they start to draw their architecture, they start with three layers. They will mention “and we use Oracle for our database and have our own persistence layer to map objects onto it.” But a medical imaging application might include Oracle without it being considered part of the architecture. That is because most of the complication is in analyzing the images, not in storing them. Fetching and storing images is done by one little part of the application and most of the developers ignore it.

Software is not limited by physics, like buildings are. It is limited by imagination, by design, by organization. In short, it is limited by properties of people, not by properties of the world. “We have met the enemy, and he is us.”

Architecture is the stuff that’s hard to change in a software system, the stuff that’s pervasive everywhere, the building blocks of the application. If architecture is so important, then we want to make sure we put out best people on it and carry the vision forward by coaching the entire development team; there’s no way a NCA could ever hope to do this.

Sunday, August 09, 2009 5:06:12 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, April 24, 2009

Without recessions we wouldn’t have prosperity. Everything in this world is relative, remember?  Everything!  There is no good without bad, no bad without good.  How would you compare and contrast without both?  You can’t!  Apples to apples are only just apples.  How ordinary!

Its recessions that allow me hire the most kick ass SDET ever born to walk this face of wanna be enterprise software ever to be born out of some half ass naked enterprisey architect fool!  Yes, recessions shake this world up, let the dead weight die, and make the good truly shine in all their glorious golden hue.  Code is no different.

I love bad, nay, horrible code.  Without the most clown-a-rific code ever (yes Kent, Clown-a-rific) my code would be so boring and ordinary.  It’s this clown code that makes my code standout and really shine like the terd that it is, er, gem that it is.  My code basks in the glow in the terdious cloud of awful code, so thank you for awful code for your wonderous glowing shine.

My point is we can’t just have good.  If we only have good, we would only have boring.  With boring we have nothing.  Thank you Jeebus that we have good and bad.  Thank you terdious code base for letting me shine! ASP.NET MVC wouldn’t look so good if we didn’t have Ruby.  So thank you Jeebus for some Ruby.  And circa 2005, go die ASP.NET webforms!  Ruby is the flashlight upon ASP.NET webforms.  We all knew around 2005 the problems, but Rails just put the spotlight upon ASP.NET webforms and made them naked for what they were.

Sure, webforms were glamorous, at least they were back in 2001 when I was evaluating ASP+ beta2 (yeah, ASP+, not ASP.NET).  Yes, yes they were quite remarkable.  Compared to classic ASP, ASP.NET webforms was the shiznit, as they say in my hometown.  I’m glad we have ASP.  I’m glad we have ASP.NET webforms.  I’m glad we have ASP.NET MVC.  One without the other is so ordinary and boring, so middle America.  Could we have rich without the poor?  Nay, we would all be so middle.  Again, I remind you dear reader that middle is boring!

So, let me be first to say that ASP.NET MVC sucks!  Sure, right now it’s pretty damn good. It copied MonoRail fairly well (which itself was a copy), but in a couple of years we’ll all be wishing for something else. They all say, too much static typing!  Give me controllers that are dynamic that don’t require a re-compile! It’s so slow! Views?  Views?! JavaScript XXX handles views and has its own templating engine!  I can’t believe we ever generated views on the server!  That’s what they’ll say, they will.

We just need some good old fashioned data services from our web server. Client server shall live again!  Trends always repeat themselves.  Don’t believe me?  Glam rock will rock again in 2012.  History is bound to repeat itself because of cycles.  OK, I’m getting a bit out there.  I agree, but damnit glam rock shall live again!  Guitar Hero Metallica is pretty damn fun!

Without cycles we would have only good which would yawn us all to death.  It’s the bad which makes the good, actually good.  It’s all relative, isn’t it Einstein?

Friday, April 24, 2009 4:03:45 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [3]  | 
# Friday, April 17, 2009

First off let me say that I'm probably the last person to figure this out, but Google Reader allows you to share web pages via a simple toolbar shortcut. Just open Google Reader and drag the "Note In Reader" box to your browser toolbar.

It works exactly as I had wanted, without any browser plugins, the toolbar shortcut is just some Javascript that runs to share the current web page you are viewing, genius!

Friday, April 17, 2009 6:12:10 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Monday, March 23, 2009

My employer Daptiv is currently looking for a couple of talented Software Engineers to join our scrum team. Daptiv is a software as a service (Saas) company committed to providing our customers with the best work management software on the market.

We need someone who is committed to producing quality software and is passionate about continuous improvement of themselves, the team, and the process. We want someone who's smart and isn't afraid to share their opinion.

Although we are primarily a C# and ASP.NET shop, we have a lot of rich client code written in JavaScript and JQuery.

Monday, March 23, 2009 4:42:46 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [2]  | 
# Saturday, August 30, 2008

Somehow I managed to find myself reading a very long rant on RoR and the RoR community by Zed, the creator of Mongrel.  He picks on lots of people, groups of people, technologies, and companies, but here's some of my favorite parts from his rant.

This is exactly what makes Rails a ghetto. A bunch of half-trained former PHP morons who never bother to sit down and really learn the computer science they were too good to study in college.

You hear that? The #1 money maker for 2008 years will be Rails cleanup. I’m not shitting you, it’s true and so just get over it and make the money.

If anyone had known Rails was that unstable they would have laughed in his face. Think about it further, this means that the creator of Rails in his flagship products could not keep them running for longer than 4 minutes on average. Repeat that to yourself. “He couldn’t keep his own servers running for longer than 4 minutes on average.” Assuming his statements are true (which we may never know) he basically duped us all.

What pisses me off is that I know they’re responsible (ThoughtWorks) for turning Ruby on Rails into the next Visual Basic.

After ThoughtWorks left the most recent project we revamped the team. We got rid of pair programming, cut down the number of tests, started cleaning more and more code out, got rid of their shitty tools, and we all started leaving at 6pm. What happens? We doubled our productivity with fewer people.

First it started on the fringe in start-ups and a few lonely places where it’s having mixed success (mostly due to the poor performance of the Ruby platform). Now it’s getting adopted internally at companies where of course it’ll get fucked up again and die off. After that it’ll move to the government sector where it will languish along with it’s new found buddy COBOL.

Saturday, August 30, 2008 5:51:14 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Friday, August 01, 2008
Friday, August 01, 2008 5:25:33 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [2]  | 
# Saturday, July 19, 2008

You may or may not know that for the past year I've been working for a small startup, GalleryPlayer.  For the most part I'm glad to have had the opportunity to work there, I was able to touch a lot of new technology and learn a lot all while delivering business value.  Overall I was able to learn and grow while there, so I'll chalk that up as a win for me.

Unfortunately as with a lot of startups GalleryPlayer hit a rough spot. We'll leave it at that...

As of July 14th I'm now working with a lot of really great people at Daptiv.  I'm excited to work with a team who are not only smart and driven, but understand the value of agile development and TDD.  There's no convincing that needs to happen, no cowboys that need reigning in, everything is already setup and ready to rock.

Its refreshing to be able to walk into a well organized team and not have technical debt frustrating you at every turn.  This has had a huge impact on keeping my overall stress level at an all time low for being a FNG.  Yes, there is still technical debt (there always is), but the fundamentals are already taken care of, and that makes me very happy.

Saturday, July 19, 2008 5:44:34 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, July 13, 2008

Last week there was an interesting discussion about coding samples on /.  As if technical phone interviews weren't enough, some companies would like or even require you to submit a coding sample for their review.  These come in various flavors, but I've encountered 3 variations of this:

  1. Random code sample of your choosing.
  2. Code you write on site while interviewing, usually on a whiteboard.
  3. Take home test where you complete a specific assignment.

Of the 3, the first one is pretty liberal and for the most part I would expect any decent programmer to be able to come up with some pithy example.  Sure, not all of us spend a significant part of our time writing code outside of work, but you should have something

I think OSS contributions are the best way to answer this type of request - even if you're the only one who uses it.  Its a very simple matter to setup a public OSS Google code playground.  Better yet, submit a patch for your favorite OSS project.  This shows not only you know how to code, but that you can work with existing code on a large project with other people - something you will not likely learn in college classes.

To me, these type of requests are nothing more than a starting point of a discussion between you and a prospective employer.  Which also means, any code you find that is public domain could be turned in.  Is this valid in this context?  I think so, because the code should be a discussion topic and not a test.  You should be able to talk about patterns used, coding standards, and most importantly... what would you do to improve this piece of code.  Clearly you must understand the code to be able to do this.

Writing code on a whiteboard (#2) is a bit different than one or three.  Its real time coding.  Coding under pressure without the aid of intellisense, IDE, or other technical reference.  Everything is based on your recall which only happens through experience, or at least good memorization.  More on this topic later...

Number three is interesting.  Often time the assignment is very particular and requires your to solve a particular problem, often times academic in nature.  This basically means homework; something you won't do in real life, nor something you have laying around already coded.

I think these type of coding samples are particularly useless for several reasons.

  1. Good coders often won't waste their time tackling these problems unless they are really interested in the position.
  2. They aren't real world and won't likely come up in real life.
  3. These type of tests take time.  Why would a highly sought after engineer waste several hours with a home work assignment?

There are probably more reason than the three I stated, but that's more than enough reason for most good candidates to forgo application.

My question is why do companies do this?  Last I checked neither Microsoft or even Google do anything like this.  Perhaps to filter out the truly dedicated?  Maybe...  but perhaps its because someone non-technical is reviewing these tests?

Companies that do have a programming test of sorts like this are just lazy.  They are unwilling to take the burden of weeding out the good from the chaff, so they put the burden on the candidate with these tests, I mean hoops.  To me, these type of tests are a red flag. Perhaps this works for a small minority, but I surely wouldn't want to work somewhere like this.

A good software company should use code as a starting point for a discussion about software and systems.  Particular design decisions made in a complete vacuum are irrelevant without context.  Its all about the context, and that should just be the starting point of a bidirectional discussion, because that's where the real discovery comes from.

Sunday, July 13, 2008 6:51:09 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, July 07, 2008

Looking for a new job can be an intimidating proposition, especially for developers who haven't changed jobs in a few years.  Are my skills current?  What kind of horrible interview trivia questions are popular these days?  Luckily the initial phone screen is the easiest part of the interview process, especially if you do your homework. 

Despite this, it amazes me how many candidates completely flounder the phone screen regardless of how senior their resume says they are.  I've found that a large majority of candidates don't pass the phone screen.  Yet, its doesn't have to be this way.  Don't rest on your laurels, do your homework!

Most phone screen questions are very superficial and don't go into any depth, you either know the answer or you don't.  If you've been coding every day for the majority of your time then you will generally find the questions very easy.  If you're fumbling for an answer, then that's definitely a bad sign to the interviewer because most of these questions they expect you to just know the answer as if it were reflex.  Its usually better to give answers promptly that are shallow than in depth answers that take a while to get out. 

And if you don't know an answer, just say so - don't try and BS your way through it.  Its disrespectful and you will get negative points, but having said that you should also follow up with a guess if you have one.  Here's an example. 

Interviewer: Is XML case sensitive? 

You: I don't know, but I always pretend it is when I write out my tags.

Beyond that, what kind of stuff should I do to prepare?  I'm glad you asked.  Find interview questions online and spend some time brushing up your skills.  Maybe even take a BrainBench test to help solidify your knowledge, the C# one used to be free.  Eventually you will notice a pattern to the interview questions.  Some of the most common that I've asked and/or answered are below.

General C#

  • Brush up on the basics: and, or, xor, bits, bytes, hexadecimal, max size of data types, etc. etc.
  • Learn the collection types. How does a stack differ from a queue?  What's a linked list?  What collection types are available in .NET 2.0?  How do you find something (quickly) in a given collection?
  • What is the heap?  What is the stack?  You should know how .NET manages memory.  What is System.GC.Collect()?
  • IDisposable.  Why does IDisposable exist?  What does using have to do with IDisposable in C#?  What's a Finalizer? How is a Finalizer different from a C++ destructor?
  • What is the GAC?  What problem does it solve?  What is sn.exe?
  • In .NET is a string a stack or reference type?  Is the .NET string class immutable?  Why does StringBuilder exist?
  • What is an interface?  Abstract class?  Virtual method?  Does C# allow multiple inheritance?
  • What is recursion?  Why would you use/not use recursion?
  • Exception handling. How many catch blocks can a try block have? When does the finally block run? How do you rethrow an exception without killing the stack trace?
  • What's a thread?  What's a process?  Compare contrast a thread and a process.  What's the lock keyword in C# do?  What's a deadlock?
  • What does Debug.Assert, Debug.Trace, Debug.Write do?  Why would you use these?
  • What an event?  What's a delegate?  When/why would you use them?

ASP.NET

  • ASP.NET page lifecycle.  I know, I know... but learn it!  You will be asked this question!
  • What's a postback?  What is Page.IsPostback? 
  • What kind of controls exist in ASP.NET?  What's a user control?  What's a master page?
  • What are several ways to maintain state in ASP.NET?  Where is session stored?  How does having a web farm affect this?
  • How can we secure an ASP.NET application?  Your answer should cover coding as well as infrastructure.
  • How can you debug an ASP.NET app?  How about with IIS?  How about with a remote IIS server?
  • Does POST or GET mean anything to you?  How do they differ?  What is Fiddler?  What's a cookie?
  • What's an http module?  What is an ASHX file?

SQL Server

  • What types of joins exist in SQL Server?  Compare contrast the different types.
  • Learn your indexes and how they differ. How does SQL Server store data?
  • What's a primary key?  What's a foreign key?  What's a candidate key?  How would you model a many to many relation?
  • When would you use GROUP BY and HAVING clauses?  How would you write a query that finds all the duplicate rows in a table?
  • Sprocs and functions, how to they differ?  What advantages/disadvantages do they have?  What are the different ways of returning data from a sproc?
  • What's a transaction?  How do they work?  When would you use one?  What's optimistic concurrency?
  • What's a SqlConnection?  What's a connection pool and why are they useful?  What's a trusted connection?

I'm not sure this is true, but it seems to me that the better employers will ask a few basic comp sci questions (like 1 & 2 above), while the crappier ones skip this area and focus more on ASP.NET or SQL.

Monday, July 07, 2008 7:01:54 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [3]  | 
# Saturday, July 05, 2008
image
Saturday, July 05, 2008 9:54:29 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, May 29, 2008

July 1st is right around the corner and for e-commerce based companies in Washington this means that Senate Bill 5089-2007-08, or the "Stream Lined Sales Tax" bill takes effect.  In short this means that online retailers in Washington need to collect destination based sales taxes.

Washington state is not alone on this.  In fact Washington is joining 21 other states under the Streamlined Sales and Use Tax Agreement (SSUTA).  Notice the "Use Tax" in the wording.  This is what empowers the state to tax based off destination shipping address.  This is just like when you go to register a boat in Washington that you purchased in Oregon, you are paying a use tax, which is legal according to the constitution.

Fortunately the Supreme Court ruled in Complete Auto Transit vs Brady that states cannot tax interstate commerce, which really means that an online retailer in Washington does not have to collect California state sales tax, unless that online retailer also has offices in California

With the passage of Stream Lined Sales Tax bill there are several winners here:

  • Washington state tax coffers.
  • Local brick and mortars.
  • Lawyers and possibly accountants.
  • Tax integration consultants.

Online retailers that only have an online presence previously had a nice loophole around collecting state sales tax since they are generally located in only one or two states.  Chain based brick and mortars (like Barnes and Nobles) that decide to go online are at a district disadvantage since they have presences in most, if not all states, which means they need to collect sales taxes from online sales in just about every state.

The absolutely ridiculous part of this law is the extra complexity to ensure the right local sales tax is collected.  In other words the shipping address dictates the sales tax rate, and in Washington each locality has its own sales tax rate with local governments setting local sales tax.  This means the sales tax rate can vary widely, and you, Mr. e-tailor need to figure it out.

Fortunately we all have zip codes here in the US which we can use to figure out the local sales tax rate, unfortunately we also have zip+4.  Well, zip+4 isn't bad, in fact its actually useful, but most people have no idea with their zip+4 is.  I know I definitely fall into that category.  And wouldn't you know it, the shipping zip code isn't enough to figure out the correct sales tax, you need the zip+4.

We can't start asking customers for their zip+4, since they probably don't have any idea what the last 4 numbers are, but we can ask them for their address and regular zip code which we can then use in a cleansing call to the USPS webtools APIs.  This address cleansing call, as you might now suspect, fills in the zip+4 based off the street address and zipcode.

With zip+4 in hand we can query our local database of sales tax rates and charge the customer the locally correct sales tax rate.

Thursday, May 29, 2008 4:13:03 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Saturday, March 15, 2008

I haven't been doing a lot of blog posting or work on my own personal projects this past couple of weeks because I've been spending my time reading.  I read the majority of WCF Programming, and have almost finished Release It.

Programming WCF Services is pretty much what you would expect from a book with this kind of title.  Lots of code examples of WCF.  Pretty dry and boring, but still the book goes into more depth than a lot of books on the topic.  The plethora of code is also very handy as a reference guide.  Overall I would recommend the book if you intend on doing any in depth WCF programming.  I do wish the book would have covered how to build better services: service contracts, data contracts, faults.  I suppose those topics are more general than WCF. My rating: 4 out of 5 stars.

Release It!: Design and Deploy Production Ready Software is the best book I've read in a long time.  There's only a couple lines of code in the entire book, yet the book provides excellent insight into design and architecture decisions for building and running robust, scalable, enterprise software.  If there's one take-away from this book, its design your systems to be loosely coupled, don't let a failure in a downstream service or application force your application to fail - build your software to be cynical.

Use timeouts!  Make services asynchronous.  Pay special attention to external integration points: services, networks, databases. Apply circuit breakers at external integration points.  Manage your resources wisely: bandwidth, CPU, and RAM are only so cheap, especially for large enterprise applications in a large farm.  Pay attention to your software once it goes live, don't throw it over the wall to IT. 

Build in monitoring and logging from the beginning, this could mean the difference between 10 minutes of down time and a days worth of down time.  Make your logging messages clear, so that IT can understand them.  Your customer facing software is your company, if your software performs poorly or malfunctions, it reflects poorly on your company, which ultimately shows up as lost revenue.

Again, Release It is an excellent book.  Go get a copy!  My rating: 5 out of 5 stars.

Unfortunately I've read the entire book in less than a week, and here I am without a book to replace it with.  My company was nice enough to give me an Amazon gift certificate, just for doing my job, so I decided to stock up so I wouldn't be without a book again, for a little while anyway.  I just ordered what I would consider to be "the essentials", since they are so often referred to:

  • Patterns of Enterprise Application Architecture
  • Refactoring to Patterns
  • Test Driven Development: By Example
Saturday, March 15, 2008 5:16:57 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, February 28, 2008

I hate it when I forgot to include subjects in my outgoing email, unfortunately Outlook lets you send email with no subjects without prompting you.  This blog post has some VBA code to add that functionality.  Just remember to change the double quotes to the normal non-italicized flavor.

Thursday, February 28, 2008 6:11:57 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, January 23, 2008

I just added another tool to my PC tool belt today thanks to Jeff Atwood.  This got me thinking about all the tools I use for development and just general day to day use of my PC.  Here's a list of one's that I use pretty often.

Development specific tools:

  • Consolas Font Family for Visual Studio 2005/2008 - Makes a nice legible Visual Studio font
  • Fiddler2 - Good for debugging anything over HTTP
  • GhostDoc2 - Quick start my class and method documentation - intelligently.
  • HM NIS Edit - IDE for NSIS installers.
  • IE Developer ToolBar - Firebug light...
  • ReSharper 4 - VS Refactoring tool.
  • MBUnit - xUnit tools for .NET
  • NUnit - xUnit tools for .NET
  • Firebug - Firefox plugin for debugging JavaScript, CSS, and HTML.  Absolutely essential for any web dev.
  • YSlow - Yahoo's web performance analysis tool.
  • WatiN - I use this to drive tests through IE.  Its pretty easy to setup and use.  The newest version supports FireFox!
  • Notepad++ - Opens as fast as Notepad, but has tabs and syntax highlighting.  It comes with a nice installer which adds it to the IE view source context menu.
  • SharpDevelop - Used for editing Boo/Brail.  I think I also used this when I was developing Mono applications on Ubuntu.
  • Subversion - This is what I use for source control at work and at home.
  • Tortoise SVN - Explorer plugin for Subversion.
  • Visual SVN - Non-intrusive Visual Studio plugin for Subversion that just works.
  • Visual Studio 2005 - My C#/C++ IDE.
  • Visual Studio 2005 SP1 - You gotta have web projects.
  • Visual Studio 2005 Extensions for .NET 3 - Use this mainly for WCF.
  • CSAH - Allows you to cut and paste as HTML from Visual Studio.  Essential for blog posts.
  • Syntax Highlighter for WLW - This one works well with every programming language I use.
  • SQL Server 2005 Dev Edition - Primarily the DB I use.
  • SQL Server CE - Sometimes use this for unit tests with NHibernate.
  • MySQL - Started using this recently, the installer for Windows makes it dumb easy to setup.
  • Java SDK 1.6 - uh yeah.
  • Eclipse - Sometimes need this for Java (and C++ programming on Linux).
  • ActivePerl - Our C++ xUnit test framework requires this.  There's a free version if you click the right link.
  • CxxTest -C++ xUnit test framework.
  • RhinoMocks - Fluent mock object framework for .NET.
  • PowerShell - A powerful Windows command shell.
  • CruiseControl.NET (CCTray) - Keep the team in touch with the build.
  • WinMerge - Nice merge/diff tool especially considering that its free like beer.
  • TestDriven.NET - Since I'm now force to use MSTest, this an essential tool to keep the TDD rythm.
  • FxCop - Nice to run every once in a while... to catch stuff, especially related to globalization.

Non-Development specific tools:

  • Virtual PC 2007 - Use this run virtual PCs, generally for integration testing.
  • Miranda IM - I get tired of having multiple IM clients, this allows me to use them all at once (and it's OSS).
  • Pidgin - Multi-function IM client which just works.  Much better than Miranda.
  • Firefox3 - My preferred browser, which runs JavaScript heavy sites fast.
  • 7-Zip - An awesome zip/tar/rar/whatever utility.
  • FoxIt PDF Reader - A light and fast version of Adobe Reader that doesn't constantly nag me about updates.
  • ClipX - My newest install, this one allows you to maintain a clipboard history.  I'm loving this one.
  • DisplayFusion - I generally just use this to drag maximized windows between monitors.
  • Windows Live Writer - What I write this blog on.
  • Paint.NET - A powerful .NET paint and photo editor package.  I've dumped my old copy of Photoshop 7 for this.
  • Launchy - Since I'm stuck on XP, this makes finding and starting programs uber quick.

The one overriding theme of all these packages is that most of them are free and/or OSS.  Pretty cool.

Wednesday, January 23, 2008 2:17:41 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Sunday, January 20, 2008

I needed to get directions to a friends house today and sure enough I found myself using Google Maps to get directions.  Nothing astounding about that.  What did astonish, and delight me, was the fact that I found you can change your route just my dragging and dropping the route line displayed on the map!  Is this thing really a web application running on just HTML and JavaScript?

Even more amazing is that you can create hyperlink to send out to people using your new preferred route just by clicking "Link to this page."  I assumed it would lose my customized route, but it doesn't, it keeps it in the URL by specifying a direction change at an intersection.

From now on when sending directions or even my address I'm going to make sure to send it as a hyperlink to Google Maps.  It just makes sense.

Sunday, January 20, 2008 7:21:33 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, January 10, 2008

The company I work for, GalleryPlayer in downtown Seattle (Pioneer square), is looking for a couple of software engineers to develop our next generation content distribution system.  I've worked for GP since last May and I really enjoy the work and the people

Why would anyone want to work for our small startup?

  • As an engineer you'll have a lot of influence over technology and design.
  • We prescribe to the Programmer Bill or Rights.  No you won't have your own office.
  • Our dev environment consists of: SVN, CC.NET, VS 2005, Re#, SQL Server 2000, NUnit.
  • Good location, Pioneer Square in downtown Seattle.  5 minute walk from the Sounder commuter rail station and bus lines.
  • Casual work environment - wear whatever makes you comfortable.
  • All the free, fresh, Starbuck's you can drink... and a toaster.  Yes, we trust you with a toaster!
  • We're using Castle Windsor, MonoRail, and Prototype for our web development backed by unit tests (and perhaps ASP.NET MVC when MS releases a Go Live license).
Thursday, January 10, 2008 9:03:38 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, January 03, 2008

For Christmas my wife got me a new Zune 8GB, which I'm really enjoying so far.  I think Microsoft has done a really good job putting the newer Zune's together.  Not only is the UI pleasant, but the thing light weight and easy to use, which is in sharp contrast to the older hard drive based devices.  Originally my wife got me a 16GB SanDisk Sansa View, which would constantly freeze up, even after a firmware Flash.  I just wanted something that works, so I got a Zune.

Now that I can listen to podcasts on the commute to and from work, I've done a little bit of searching and thought I would try out the following podcasts:

  • DotNetRocks
  • Hanselminutes
  • Polymorphic Podcast
  • FLOSS Weekly
  • Agile Toolkit Podcast

I got these from these Ayende and Jeffrey Palermo's blog posts and comments.

As a side note I stumbled upon what Ayende Rahein means: Freedom Dawn.

Thursday, January 03, 2008 11:07:40 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, December 24, 2007

There's a discussion around lines of code (LOC) and code base complexity right now, and I had commented about one the better code bases that I maintain was around 80K LOC, as compared to a much smaller code base that I maintain.  80K was just a guess at the time, but the engineer in me wanted hard numbers.  I downloaded .NET Line Count Utility from CodeProject and pointed to our back end server solution (yeah it takes sln and csproj files as input!).  To my surprise I had guessed the # LOC within 35 lines.  The actual number was 80,035 LOC.  Either I'm good at estimating LOC, or more likely I just got lucky.

Monday, December 24, 2007 7:42:13 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, December 14, 2007

I asked the alt.net group what issue/feature tracking software everyone would recommend, and thankfully I got a lot of responses about what people are using or have used in the past.  Really useful stuff.  It would take an individual years to glean this kind of first hand experience.  Here's a summary of recommendations (good and bad):

  • TRAC - Python based OSS app. It seemed a lot of people have used this.  Most people think it's OK, but the consensus is that it's kind of "wonky" at times.  The UI isn't particularly pleasant, but Ayende did create a simple Winform UI for it at one point - not sure it still works or how well.
  • Mingle - Developed by ThoughWorks.  ROR app.  The UI is pleasant and customizable.  The pricing is different, it seems you pay monthly.  Wave of the future, especially for software that gets released frequently (permanent beta)?  Compared to the competition this appears to be a rather expensive option - but possibly worth it.
  • FogBugz - The UI is pretty simple/clean, and has a good dashboard.  I liked the fact that is contained "evidence based tracking" which sounds really smart and useful - as long as everyone enters their actual time on a task accurately.  Phil Hack said, "...FogBugz is hands down awesome. Anyone that disagrees with me, you're wrong. End of story."
  • StoryVerse - MonoRail reference project or real OSS based project?  The code AND the UI look really clean.  I'm not sure if this is still active or how full featured it is, but it definitely looks promising.
  • Gemini - Got some mixed reviews, but I think most people gave it a +1.  It looks like a lot of companies are using this one.  Integrates great with SVN.  The screenshot of the home page reminded me of Jira.
  • Elementool - Fairly cheap.  Free version fields.  From Donn, "Unintuitive and just a hassle to use. Never integrated it with anything though. I wouldn't want to. I just want to STOP using this product."
  • Lighthouse - Looks like a hosted ROR app?  From Brian, "It has rough edges in some areas, but overall is a very nice interface, and you can use email to create and comment on issues.  It only has ONE status field (which at first seemed limiting, but then I realized was liberating - at least for this project).  If all you are doing is tracking open items (for example on a maintenance project) it may be all you need."
  • TargetProcess - ASP.NET agile management tool.  It will manage bugs, features, and support tickets.  It integrates with SVN.  What's cool is that it uses NHibernate to data access, so it appears you could use any RDMS that NHibernate supports.
  • BugTracker.NET - This is a very simple OSS ASP.NET app, but one look at the code you'll run screaming. 
  • AxoSoft - TODO: more info
  • MS Project Server - It's "enterprisey".
Friday, December 14, 2007 8:15:46 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Saturday, November 17, 2007

If you need to get the password of a protected Access MDB, Access PassView is free and works.

Saturday, November 17, 2007 4:31:42 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, October 21, 2007

Scott Bellware brought up SmartBear Code Collaborator code review tool as a way to annotate code on the ALT.NET mailing list today.  It looks really interesting to me since my entire team works remotely and facilitating code review is pretty difficult.  We've used NetMeeting in the past, but I would like something that promotes a more organic code review which naturally happens when co-located.

The really neat thing is that integrates tightly with source control systems such as Perforce's Windows client so that you can initiate a code review of a particular changelist before checkin.  I didn't see any mention about SVN integration...

Sunday, October 21, 2007 6:17:41 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Saturday, September 22, 2007

Yesterday I came to the realization that I'm not paid to write code anymore, I'm paid to delete code.  If my employer was paying me by lines of code written, I would owe my employer tens of thousands of dollars just for the past few months of work.  Sure, I've written a few lines of code here and there to refactor our codebase, but even with adding unit tests (that were non-existent before), I've always managed to reduce the size and complexity of the code, because less code is more.

In most cases its just dead code and completely useless comments that I get to delete in effort to reduce noise.  In one memorable instance I deleted over 3000 lines of code from a DAO class!  3000 lines!  If the average programmer writes 10 lines of code per day, then I just deleted almost a years worth of work in about 10 minutes.  Perhaps I rationalized that a bit.  I'm pretty sure most boilerplate ADO access code is cut and paste anyway, but regardless, I must say, very satisfying.

In another instance I reduced the number of assemblies our installer deploys by half, and cut the size of the main executable down by 4MB (from 6MB) by deleting unused legacy resources and being smart in the way the remaining resources are handled.  It appeared that more a more assemblies were added to our installer, but none were ever removed, even when the need for those assemblies had long past.

I'm comfortable in my new deletor position because every line of code I delete is one less to worry about.  After all I just want to see what's important in front of me and get rid of the noise - thank you very much.

-- Thank you ReSharper, because without you I could not be Sneal, aka the deletor.

Saturday, September 22, 2007 7:00:03 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Tuesday, August 07, 2007
I got both my ReSharper and VisualSVN registration keys via email today!  It can't get much better than that.

Tuesday, August 07, 2007 10:01:46 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, July 30, 2007

This is something so simple, but so cool.  In FireFox I just noticed that I can select a piece of text on web page and right click select View Selection Source.  Only the HTML source for the selected area will be shown, all the other noise is gone.  I just double checked and IE doesn't have anything like this.

Sunday, July 29, 2007 11:22:04 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, June 20, 2007

The “empire” cares more about political prestige than it cares or knows about technology.  The empire is setup structurally to create infighting and to stifle team work.  This is done to create the illusion of potential progress but it really just ends with a circle of finger pointing.

The empire is clearly run by a bunch of bureaucrats whose aim is to pacify the masses with bloated software factories.  Why software factories, complicated frameworks, and RAD generated goo?

  1. Claimed reuse.  By spending a ton of money on a platform we ensure support and reduce costs by reducing redundancy.  In reality we end up with an overpriced and bloated platform that only gets us 80% of what we need.
  2. Feature bullet points.  This supposedly makes the customer feel warm and fuzzy because there are a lot of out of the box features.  In reality most of these bells and whistles will never be used; and to top it these features lock us in to the platform.
  3. It makes the empire look professional.  In reality the empire chose the software factory because they really know nothing about software development.  By having a bunch of useless code on the table it gives them something to talk about and hide behind in their endless meetings.
  4. Mort can understand it.  Maybe Mort can run the wizard to generate more goo, but what happens when you run into some nasty threading bug on your web server?  Do you just start over? 

The empire assumes the worst of developers; they believe developers are a bunch of lazy interchangeable Morts or parts.  They pander to the lowest common denominator because of high turn over and the inability to attract real engineers who are not only good, but passionate about software development. 

In effect, the empire doesn’t know the difference between a programming God and a Mort.  Even if a God did manage to sneak into their ranks they would surely be stifled by the systems the empire has put into place to protect itself.  The empire stays safe by locking everything down so that nothing moves; the theme here is to avoid risk at all costs (option 1, do nothing).

Therein lies the root cause of evil within the empire, they almost always choose to do nothing because it’s safer, but it’s safer because their alternative to “do nothing” is the “all or nothing” approach.  They choose all or nothing largely because their process and their software is incapable of adapting, once it has shipped its set in stone. 

The calcified software is only mimicking the inflexible process laid down by the empire’s inner PM sanctum*.  Besides the PM’s living and breathing waterfall, the real tragedy is the funding model.  The funding model wants the exact cost of the completed system up front, well before any design, let alone coding has started.  This funding model tied to an arbitrary deadline gets the customer some software, but as it often turns out its not the software the customer needs or wants.  The end goal is not about satisfying the customer or improving the process, the end goal is to stay within budget and to check all the boxes.

With the project complete (according to the Gantt chart) the empire moves on to yet another project to replace the new legacy system just completed, and the circle of software creationalism start anew.

 

* Interestingly enough the empire’s PM methodology is called Atlas after the great iterative submarine ballistic missile program from the late 1950’s and early 1960’s.  The real interesting part of this is that the empire’s methodology is pure waterfall, and is nothing like the Atlas missile program.  In fact some of the stupid PERT calculations used during that program were bogus and only used to satisfy the bureaucrats.

Other | WTF
Wednesday, June 20, 2007 7:08:27 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, May 04, 2007

I was reading this post by Jeremy Miller and came across this golden nugget of wisdom that seems to be very applicable:

"Oh, and the people out there swearing up and down that giving the business end users a screen to configure a business rules engine themselves will save the day?  BS.  Drawing workflow's with pictures is coding -- with every bit of the risk and danger that coding brings.  Only now you're making noncoders code in the production system.  Think about that last sentence. "

Bingo!  Allow me to elaborate on this:

  • There are no unit tests surrounding the changes, which imply legacy “code”.
  • No verification step.  QA is completely out of the loop, I doubt they would appreciate that.
  • Engineers will need to be brought in to fix problems when something unexpected happens.  This is a reactionary situation which causes people to work over time and under stress, both of which I know I like to avoid.
  • There is no formal change control surrounding the process.  This sounds bad, breaking the law kind of bad.
  • Who wants to code through Visio or some one off custom UI anyway?  Last I checked Visio didn’t have a debugger, and if Visio doesn’t have a debugger certainly your one off custom UI won’t.  Good luck tracking a problem down without full disclosure to the system code and infrastructure.

These issues are not just merely applicable to business rules engines; they are also applicable to highly customizable applications with lots of admin screens.  Do you really want end users to be able to go in and add/remove workflows, user accounts, test points?  Do they really need these features?  Probably not, and this could potentially open up all kinds of data integrity issues.  Who really wants to restore a database from tape because some user made a change they didn’t truly understand?  This is why it’s important to have someone own the change process, like a development team or business rules expert.  Someone needs to be accountable for the integrity of the system.

On top of all this we need to take into account all of the extra work that will need to be done just to create the hellish user interface to the back end of the system.  Add documentation, testing, and training to the mix and you just doubled or tripled your system cost, and what have we gained?  We gained: lots of extra work, bugs, and data integrity issues.

Having the system be highly end user configurable makes the business feel more comfortable because they believe they’ll have ultimate control and flexibility.  Probably a far better solution (and more cost effective) would be to work on your trust issues with the business.  Put them at ease about the system by making them feel like they are part of a cooperative team rather than just a customer.  When release 1 hits they need to know the development will still be there to add additional features and fix any issues that crop up in a timely and predictable fashion.

Friday, May 04, 2007 4:45:32 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Thursday, May 03, 2007

In manufacturing wastes are well documented and generally understood, however in software development waste is acknowledged but usually misunderstood, especially by Microsoft Project Project Managers.  In many circumstances (especially in waterfall shops) the common root of all software waste is deemed to come from not planning enough, or not documenting enough.  Basically, all this effort is expended up front trying to ensure that the cardinal sin is not committed.  What is this sin?  Throwing code away. 

In reality we want to throw away code, as much code as possible.  I'm not saying we should generate code just to throw it away, but we should always be looking for opportunities to trim back the code base.  Less code is easier to maintain and test. 

Developers often think through tough business problems and technical problems by coding.  Coding is not just a statement of some requirement, coding is a mental exercise performed by programmers to better understand the problem domain.  It’s through coding we arrive at greater understanding and insight.  Coding allows us to make logical connections between entities, rules, and requirements.  During this research phase should the code be thrown away?  Not necessarily, but in all likelihood all this code will be thrown away as understanding of the problem domain changes over time.

If what I say is true, then throwing away code is not a waste, in fact throwing away code is quite productive.  Waste in software development comes from other areas.  Mary and Tom Poppendieck make the case that waste in software comes from the same areas as manufacturing, however with a slightly different software twist:


Manufacturing                             Software Development


In-Process Inventory          Partially Done Work
Over Production               Extra Features
Extra Processing              Relearning
Transportation                Hand Offs
Motion                        Task Switching
Waiting                       Delays
Defects                       Defects


Thursday, May 03, 2007 5:06:10 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
An entertaining quote from the book I'm reading, "It is better for developers to be surfing than writing code that won't be needed."

They aren't referring to technical spikes or learning opportunities, they are talking about features to a real product.  In other words do option 1*, its cheaper.  Adding unneeded features to your code base will cost you more money over the lifetime of the product than paying the developer to do nothing at all.  Each feature you add complicates the code base making each additional change more costly.

* There are always 3 options to any decision, and option 1 is always "do nothing."

Thursday, May 03, 2007 4:33:33 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, May 02, 2007
Right now I'm reading Implementing Lean Software Development by Mary and Tom Poppendieck, and something about the Toyota Production System caught my eye.

"Both Toyodas had brilliantly perceived that the game to be played was not economies of scale, but conquering complexity."

I translate this to mean, RAD code generated goo from Visual Studio versus elegant loosely coupled code based solutions (the kind most often found in OSS).

Wednesday, May 02, 2007 9:49:24 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
Thank you Google for providing with all kinds of useless, but entertaining, information.  From the Urban Dictionary...


A sneal is not quite a snack, nor is it quite a meal. A sneal lies somewhere in between the two, and snealing is most commonly practiced by college students. When confronted with the question of what the healthiest methods of eating are, it has been said that regular "snealing" is more beneficial to the individual than regular "mealing." A sneal, in most cases, is equivalent to 2/3 of a meal (This also means that 2 sneals equals roughly 1 1/3 meals).
To date, the most common snealing plan involves a regular breakfast, a regular lunch, and two sneals in the evening (one typically at 5 p.m., the other typically at 8 p.m.). Though the average "snealer" eats two sneals a day, it is quite possible, and perhaps more beneficial, to eat three in a single day to support the growing minds of college students.
Another part of the sneal involves 2 - 8 oz. glasses of the choice beverage. Though milk is encouraged to be at least one of these drinks, it is not absolutely necessary for a healthy sneal.

If we sneal now at 5:30, we will still have time for another one before the cafeteria closes.


Wednesday, May 02, 2007 5:40:56 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, April 15, 2007
Now this is what I consider a good morning:



Virtual Server 2005 R2 with Visual Studio Orcas CTP and VMWare with Ubuntu for other dev...
Sunday, April 15, 2007 3:57:07 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Tuesday, February 13, 2007
I've been catching up on my DVR'd 24 episodes, and I came across a part where pair programming would have helped them out tremendously at CTU.  Kind of funny that was the first thing that popped in my head.

Tuesday, February 13, 2007 5:02:41 AM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [2]  | 
# Thursday, September 28, 2006
I'll have to add to this in the near future.  From Jeff Atwood: http://www.codinghorror.com/blog/archives/000666.html

  1. Every programmer shall have two monitors

    With the crashing prices of LCDs and the ubiquity of dual-output video cards, you'd be crazy to limit your developers to a single screen. The productivity benefits of doubling your desktop are well documented by now. If you want to maximize developer productivity, make sure each developer has two monitors.

  2. Every programmer shall have a fast PC

    Developers are required to run a lot of software to get their jobs done: development environments, database engines, web servers, virtual machines, and so forth. Running all this software requires a fast PC with lots of memory. The faster a developer's PC is, the faster they can cycle through debug and compile cycles. You'd be foolish to pay the extortionist prices for the extreme top of the current performance heap-- but always make sure you're buying near the top end. Outfit your developers with fast PCs that have lots of memory. Time spent staring at a progress bar is wasted time.

  3. Every programmer shall have their choice of mouse and keyboard

    In college, I ran a painting business. Every painter I hired had to buy their own brushes. This was one of the first things I learned. Throwing a standard brush at new painters didn't work. The "company" brushes were quickly neglected and degenerated into a state of disrepair. But painters who bought their own brushes took care of them. Painters who bought their own brushes learned to appreciate the difference between the professional $20 brush they owned and cheap disposable dollar store brushes. Having their own brush engendered a sense of enduring responsibility and craftsmanship. Programmers should have the same relationship with their mouse and keyboard-- they are the essential, workaday tools we use to practice our craft and should be treated as such.

  4. Every programmer shall have a comfortable chair

    Let's face it. We make our livings largely by sitting on our butts for 8 hours a day. Why not spend that 8 hours in a comfortable, well-designed chair? Give developers chairs that make sitting for 8 hours not just tolerable, but enjoyable. Sure, you hire developers primarily for their giant brains, but don't forget your developers' other assets.

  5. Every programmer shall have a fast internet connection

    Good programmers never write what they can steal. And the internet is the best conduit for stolen material ever invented. I'm all for books, but it's hard to imagine getting any work done without fast, responsive internet searches at my fingertips.

  6. Every programmer shall have quiet working conditions

    Programming requires focused mental concentration. Programmers cannot work effectively in an interrupt-driven environment. Make sure your working environment protects your programmers' flow state, otherwise they'll waste most of their time bouncing back and forth between distractions.


Thursday, September 28, 2006 5:24:01 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
Jeff Atwood pointed out a very interesting XP change diary by James Shore

"It was 2002. The .com bust was in full slump and work was hard to find. I had started my own small business as an independent consultant at the worst possible time: the end of 2000, right as the bubble popped. I had some noteworthy successes doing what I loved: coaching agile Extreme Programming (XP) teams in doing great work for a valuable purpose. And then the work dried up.

Eventually I admitted that I was going to have to find some "real" work to fill the gap. I took a contract job as a programmer on a team customizing some web software for a large institutional customer. This team was the opposite of agile. I was bored and frustrated. It didn't take me long to remember Martin Fowler's advice. As a peon, could I make the kinds of changes I made as a (damned good!) XP coach? Or would they kick me out, causing me to change organizations a little more abruptly?"


The full diary can be found here: http://www.jamesshore.com/Change-Diary/.  I highly recommend reading it, even if you aren't that interested in XP.

Thursday, September 28, 2006 5:20:14 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  |