We have all heard how SPAM is costing us money - wasted time, wasted bandwidth, anti-SPAM software, lost business emails, etc.
Recently I have discovered (unfortunately) a new way. My ISP just notified me that I am violating their acceptable use for incoming SMTP connections - they limit to 5000 per day - I am receiving up to 8000. They want to charge me an additional $30 per month to separate my hosting platform to its own server - that is $360/year to accommodate SPAM. After being a customer of theirs for seven years (yes, 7!), they will terminate my service unless I solve the overuse.
A FICTITIOUS COMPARISON
I liken this problem to a random 100 people from every country in the world deciding to send me a postcard each day - and the post office decides to charge me a premium for handling all the mail!
How do you stop people from even trying to send you SPAM? I am currently running a home grown .NET-based app to isolate SPAM sender's IP addresses so that the ISP can block them.
Anyone else have this problem? What else can you do? When will we finally get real legislation to stop this?
The audience tonight at the Cleveland .NET SIG responded that about half were aware of TDD and around 8-9 attendees were already practicing it!
I have noticed a definite pattern of increased popularity of TDD at each new speaking engagement. Is this just a side effect of the rising popularity of Agile techniques in general? Are the upcoming TDD-based tools in Whidbey adding to the hype? Whatever it is, it is wonderful to see such keen interest - there were around 60 attendees at the meeting tonight. Thank you for your hospitality and enthusiasm. Slides and code are here.
Some of the attendee questions were:
- What is the expected overhead in terms of schedule when using TDD instead of traditional development? (in other words, how much longer will it take?)
Anecdotal evidence suggests that TDD is actually quicker! This is not intuitive since it stands to reason that writing tests and code versus just code must take longer. But as any TDDer will tell you, TDD provides a methodical approach allowing the two steps forward without the one step back (small steps almost always forward with no time lost in the debugger!). This paper argues that if TDD is slower the benefits gained by the improved quality of code may still be worth it. I couldn't find any published evidence for the assumption that it takes less time - but it certainly feels that way for me as a developer. Please let me know if you come across anything.
- What do you do when your tests take too long to run?
Refactor. Profile your tests - the nunit2report task for NAnt is wonderful for generating HTML reports of your test results with test duration times which can quickly help you spot the problems. Andy Marks talks more about this problem and strategies to combat it here. If some of your tests just take a long time and there is nothing you can do about it, then run them on an automated schedule of a build server so that their results are continually available - while this is not ideal, it *is* a workable solution.
- How can VNC be used when programming in pairs?
At one of my clients, we use VNC to connect to our dedicated pairing workstation from our notebooks. This gives us both access to a keyboard and mouse while using a much beefier machine (instead of one of our notebooks). Look for a blog post with a photograph on this soon. Some folks use VNC when pairing remotely over the internet.
I am flying back to DC early tomorrow ... taxi at 4:15AM to the airport!
Good night. :-)
I will be speaking at the Cleveland .NET Special Interest Group (hosted by Bennett Adelson) on Tuesday, 9/14/2004. The presentation will move quickly through the theory and then focus on a hands-on session building a simple ASP.NET application with a database backend. This will introduce the concepts of Test Driven Development while tackling the typical challenges most of us face. We will also use some testing quality tools to determine the quality of the hands-on session. Finally closing with an open floor for audience questions.
If you are interested in TDD and are struggling to understand the books on this topic or are having difficulty applying it to your own work environment - stop by this meeting or contact me for possibilities at your user group or even a private session for your development team.
Last night at the WinProTeam .NET UG Rockville Meeting, Carney Clegg spoke on "Using Hashtables Effectively".
Of course, my burning question on Hashtables was ...
Why is it Hashtable and not HashTable as the .NET Design Guidelines would indicate?
The question went unanswered last night with only my guess that it was kept the same to keep transitioning Java developers happy. Chris Mohan did some research and posted the real answer (below) on the AspNetMetroArea mailing list this morning - thanks Chris!
"In the early days of the BCL design we heavily debated the name of this class. Some felt it should be HashTable and others felt is should be Hashtable (lower case t in table). There was ample prior art for both choices, so it really came down to what fit best in our library. The Pascal naming convention we adopted suggests that each word should begin with an initial uppercase character. So the debate boiled down to the question of what this class is. Is this class a table of hashes, that is, a Hash Table, or is it a single entity, a Hashtable. I think it is likely that the history of the data structure is a special kind of table, but in the end we decided the data structure had entered the common lexicon as a single word-- Hashtable." -- Brad Adams, Primary Author of the .Net Framework Design Guidelines
If you are completely lost by the Rosebud reference, watch this. (Thanks Bob!)
I have just never really understood all the fuss about Generics (the upcoming feature in 2.0). Maybe it is because I have never used templates in C++ or done anything meaningful in C++ for that matter! :)
At the moment, I derive from the System.Collections.CollectionBase and System.Collections.DictionaryBase abstract classes to easily create strongly typed collections when I need them. This approach is poor for performance due to all the casting required but this is seldom a problem in business applications where bigger bottlenecks can typically be found elsewhere and to-the-metal performance is seldom a concern.
Today I came across Generics In-Depth by J. Ambrose Little - our editor-in-chief at AspAlliance. Ambrose goes beyond the typical "strongly typed stack" example that we have all seen in the demos and shows constraints, type inference, discusses limitations and even makes comparisons to Java's upcoming generics (1.5). He also provides some advanced code samples to show generics in use. This article is a great read.
What uses do you have for generics? Do you use CollectionBase and DictionaryBase now (presentations on Generics seldom mention them)?