Monday, January 31, 2005
DateDiff in C#
So I tried to see what else I could come up with. I did uncover this thing called System.Timespan. Apparently, Timespan will give you the difference between two DateTimes in something called 'ticks.' You can then take the ticks, and convert them to days, hours, minutes, seconds, and milliseconds. The drawback is that if you want the difference in years or months, you have to do some hoaky manual calculation that may or may not jibe with what the span really should come out to. In my research, this was the best example of how to duplicate the DateDiff in C#.
Thursday, January 27, 2005
Estimates...Need I Say More?
I have a friend, Avonelle, who is an independent. She has a very different way of dealing with estimates. Instead of giving an estimate to her client and tracking her actual hours versus her estimated time so she can bill hourly, she assigns a “value” to her projects, and bills the “value.” Although she creates an estimate to help her decide what the value should be, the actual number of hours she works is immaterial. She is encouraged to be efficient with her time since her “hourly rate” decreases with every additional hour she has to put into the project. It is still in her best interest to deliver quality solutions to her clients if she wants repeat business, so her client should not suffer for Avonelle’s efficient use of time or cutting of corners.
I wonder if a large consulting company could ever take this approach to billing clients…
Thursday, January 06, 2005
Microsoft Certification Tests
I have taken and passed two tests so far. The first test I took was the 70-316 exam - Developing and Implementing Windows-based Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET. The second test I took was the 70-320 exam - Developing XML Web Services and Server Components with Microsoft Visual C# and the Microsoft .NET Framework. Why I didn't take exam 70-315 immediately after exam 70-316, I will never know. The two exams overlap quite a bit, and now I am going to have to re-memorize all of the facts on the test.
Anyway, I passed the web service test and I have never written or consumed a production web service. I would like to. I played with web services in my studying, and felt that I did learn a lot while studying for that test. But do I know enough to be certified in web services? Maybe, I guess.
I had to study just as hard for the Windows test. I have been involved in many WinForms .Net projects in my career. I have been involved in an enterprise-level implementation of a WinForms application. In this implementation, we integrated with Office 2003. We also built a build helper to go out and crawl Visual Source Safe for us to make it easier for our three-man project team to coordinate efforts without stepping on each other's toes or having to wait for one another. It was a cool project.
So here is what I struggle with. I should have been able to quickly and easily pass a certification test on .Net WinForms with minimal studying. I should have had to pour over the Microsoft Web Services information in MSDN and done a painstaking number of hours of work to be up to snuff enough on web services in order to become certified.
But the truth of the matter is, I had to study an equal amount of time for each test. I also found each test to be very silly in the minute details that I was tested on rather than being tested on everyday uses of Visual Studio and on the far-reaching implications that your architectural decision could make. For example, there was not one question on best practices for organizing your classes in a project. There was not one question on best practices for using coding standards, commenting your code, or having project-wide standards for the user interface design. Not once was I asked about what I should do as a developer to prevent cast errors when I am trying to persist data to a database with a field type of smalldatetime. I was not asked when validation should be used, and why. I was not asked what are the best practices for creating a usable menu structure in my application.
I was asked questions about how to set up a connection string. How many of you out there know the syntax for a connection string by heart? All I have to do in the field to figure that one out is open up google.com. But I can't use google to show me how to organize my code in a manner that will make it the easiest to refactor and maintain. So why doesn't Microsoft test us on these things?
I guess my concern is that certifications mean very little if an inexperienced person who picks up a book and memorized a few facts has the same chance of passing the tests as someone who has been studying software engineering and implementing enterprise solutions, using Microsoft tools, for years.
Is it meaningful to be certified? Is it merely a marketing tool that we can use to make us look like more bona fide professionals when seeking out clients? And how could Microsoft build more meaningful questions into their exams so that skills other than syntax memorization are tested?
Wednesday, January 05, 2005
One to One Relationships
First, I feel that there are two scenarios where a one-to-zero or one relationship applies. The first example represents two distinct objects, such as an employee and a computer, where a business rule states that one employee cannot have more than one computer, and one computer can only belong to one employee. I would probably argue that in time, this will turn out to be a false business rule, as when one employee leaves, the computer is assigned to another employee. Or when the computer dies, the employee gets another one. But for now, lets just pretend that the one-to-zero or one applies here. I think it makes sense for there to be an employee table and a computer table. Each table would have its own primary key, and lets just assume that they key is an auto-incremented identity. How should the tables be related? Should we add an EmployeeID field to the Computer table? Or should we add a ComputerID field to the Employee table? Here, it really shouldn't matter. We might choose to put the ComputerID in the Employee table because we feel that "employee has a computer" makes more sense than "computer has employee." Either way, it shouldn't really matter, though.
But how about in the second situation where we have a one-to-zero or one relationship to represent a supertype/subtype relationship? For example, we have a supertype of Individual with subtypes of Employee, Contact, and Owner. The Individual table has fields for the first name, middle name, last name, address, phone number, SSN, and there is an auto-incremented identity column which holds the IndividualID. Let's assume that the Employee table has fields for the employee number, title, related department, hire date, start date, and end date. The Contact and Owner table also have unique field in them. So how do we relate the Employee table to the Individual table? How do we represent the "Employee is an Individual" relationship in the database?
I have seen this handled in two ways. First, we could have the primary key of the employee table be the IndividualID. This is also a foreign key to the Individual table. So the IndividualID would exist as the primary key of four tables, the Individual table, the Employee table, the Contact table, and the Owner table. In the Individual table, Employee table, and Contact table, the IndividualID would also be a foreign key to the Individual table.
Or, we could have the primary key of the Employee table be an auto-incremented identity field called EmployeeID. We could then store this ID as a foreign key in the Individual table. So the Individual table would end up with three foreign keys, the EmployeeID, ContactID, and OwnerID. Each of these fields would allow null, and only one field should contain a non-null value.
Which solution is the better one?
Tuesday, December 14, 2004
Gemini Update
Monday, December 06, 2004
Issue Tracking
I have had some experience working with Mercury Test Director. SWAT worked with my project team on my last project, and they recommended Mercury. On that project, we even had automated tests (although I am still not sure what percentage of our test cases ended up as automated tests). I thought Mercury was okay, but for that project we did not use the web version of issue tracking, and I thought it was a real bugger noting my issues in notepad until I got into the office the next day.
My current project is using the issue list in SharePoint as our issue tracking. While this solution is a good enough solution, it would be nice if my fellow team members could see all of thier issues at once from multiple projects. Sure, we could have set up one wss team site to handle all issues, but I don't think SharePoint security would effectively manage who can add issues to which project and who can see which issues, and so on.
So for a smaller consulting company, what is the best solution to issue tracking? I am not sure the complexity of Mercury would be a good fit (or the price tag). SharePoint really isn't meant for full-fledged issue tracking for a corporation. A custom solution would be fun to build, but I am not sure the amount of time we would have to invest would be worth it.
I did a little research, and although I am often annoyed at the lack of pricing information on product sites, here are some that look interesting:
So have you used any of these tools? Anybody have any reviews to contribute or any other tools to add?
BTW - Thanks to David Hayden for his blog posting about Gemini. I ran into a bunch of open source issue tracking tools (like Bugzilla), but had trouble finding a free .Net issue tracking tool.
Tuesday, November 30, 2004
ORM Instead Of ER?
So has anyone else used ORM instead of an ER diagram for database design? What do you think about ORM? Will you leave ER diagrams in the dust?
Monday, November 29, 2004
Free Market
This topic has been hot for the past number of years, and I think I fall in the minority when I say that I am not against outsourcing to India if the market in India can produce the same quality software products that are being produced here at a fraction of the cost.
I am not saying that I hope to have my job outsourced to India. What I am saying is that in a world where I believe in free markets, when competing for business, the company that can offer a product or service of equitable quality at the lowest price should win the business.
If I am unable to compete with the engineers from India, should I be angry with disloyal American companies who outsourcing? If my salary is much higher here than it would be were I living in India, should I fight for laws to prevent money from flowing out of our economy and into another? As a local consultant, am I offering services that can be easily replaced with foreign labor? Should I, instead of trying to stop open competition, figure out a way to offer a service to US companies that cannot be outsourced?
And if the implementation of a design spec can be outsourced, can the initial analysis also be outsourced? How about the project management? Are there things that we, as software engineers living in the United States, can offer that cannot be outsourced? Should we, as an engineering community, focus on growing our unique skills and ensuring our place in the world market?
So the question is this: can India offer the same quality software end-product that a local consulting company can offer at a lower price? I am leery of the possibility because on the projects in which I work, constant communication with my customer is paramount to success. I wonder how the communication barrier is overcome when dealing with an implementation team that lives in another culture. I am curious if anyone out there has experiences, good or bad, with outsourcing software engineering to India.
Monday, November 22, 2004
What's in a Title?
I have heard of companies that use titles in lieu of paying their talent well. "We cannot afford a large raise for you this year, but how about we give you this fancy title of 'Senior What-a-ma-bob'." So what is the point of a title? Do titles help define our skill set? Do titles help communicate our level of excellence? Or are titles a way for management to placate us into feeling important without giving us monetary reward? What if we did away with titles all together?
Wednesday, November 17, 2004
Agile Methods vs. the Waterfall Method
As some years have passed, or maybe as my employer has changed, the agile methods have really seemed to catch on. Iterative approached are being tested, and in my experience they are successful. I do not claim to be a guru on agile methods, and I do not claim to know the ins and outs of SCRUM versus Extreme Programming. But what is the key difference between the agile methods versus the traditional methods to software engineering?
I think the difference can be summed up in one word: communication.
While communication has always been an important part of software engineering, I fell that the traditional approaches encourage us to lay everything on the table from the start. Go through a phase of requirements gathering. Go through a phase of specification writing. Go through a phase of writing a detailed design document. Finally, build what you planned. Plan your work and work you plan, right?
I say wrong! To me, the key to the success of the agile projects I have worked with lay our ability as a development team to admit that we cannot ask all of the questions up front. Besides the fact that requirements change with time, so does our understanding of the business problems. And I have never seen a requirements document that is not laden with holes and ambiguities. A small detail missed in the requirements phase can be the downfall of the entire project.
Agile methods appreciate this risk and mitigate it through constant communication. There is no one phase where meetings are held with the end users. The end users are involved in meetings with the development team throughout the life of the project. The end users are part of the team and play an active role in communicating with the development team and working with the seeds of the end product from its infancy to its completion.
As a result of my experiences, I hope to never spend a year working on a functional specification again. I hope to never face another deployment phase of a project that follows a year of closed-door development. I hope to say goodbye to the waterfall approach once and for all and hello to agile development.
Wednesday, November 10, 2004
Education?
While I do believe that education is important, I believe that education can come in the form of reading books, working, traveling, and just living life in general. Albert Einstein was a high school drop-out (okay, later in life he squeeked his way past earning a degree) who wrote his amazing papers without any academic instruction while working as a patent clerk. He hated the rigid structure of the classroom setting.
So in my estimation, a person's worth should be measured by their ability to present themselves, by their passion, and basically by their performance rather than by a piece of paper signifying their diligence to show up to and pass college level courses. Don't get me wrong, you can get a lot out of college. You can also get very little.
Visual Studio Solution Files
Has anyone else come across a similar problem? Has anyone installed the hot fix? Has anyone fixed this issue by getting rid of the solution file and only using file references?
Thursday, November 04, 2004
Visual Designers?
When people started programming in DOS instead of using punch cards, I bet some people were up in arms. I wonder if the argument flew around that real engineers did not use DOS. Where is the discipline in DOS? Anybody can write programs in DOS, it takes someone with training and superior intelligence to program on punch cards! Look at all these rag-tag new-fangled youngsters with no experience hopping right in to the development community!
I also have known people who love notepad. All you need to write a good application is a text editor and a compiler, right? Visual Studio is for sissies, and intellisense is for people who are not careful enough to spell correctly when they are typing and for people who don’t already know which assemblies house which classes.
To that, I say bah!
I think that using visual designers fall right along side using intellisense while coding. If intellisense helps you work faster and cleaner, then I don’t buy the argument that we should experience a certain amount of pain in order to be respected as intelligent software engineers. In my opinion, visual designers sometimes come in handy. I use the visual designers when I would otherwise be writing a bunch of repetitive HTML. I can drag a control onto a page and position it with a click. In short, tools such as the visual designer can help me with simple and repetitive tasks and leave me more time to focus on my programming logic.
Monday, November 01, 2004
User Acceptance Testing
When the design was solidified and approved by the client, the implementation phase was next. Our implementation phase was followed by deployment, and we were paid and the project was wrapped (theortetically) when the client gave us final sign off by agreeing to and walking through the user-acceptance tests to validate that each requirement was met and user interface was bug-free.
Nowadays I find myself working with agile approaches to software development, but I do still find value in client testing. I am not talking about handing the product over to the client and asking them to start using it. I am talking about creating some test scripts to help the users cover each logical path in the application, and building validation testing into the scripts. Since my company does not have a test team, I recently took a stab at writing a test script myself. How do the rest of you do this? Do you rely on the use cases that are created during design as your test scripts? Do you use an automated testing tool alone to test the user interface, or do you use an automated tool in conjunction with user-acceptance testing? Is user-acceptance testing out-dated?
Visual Studio .Net 2.0
Wednesday, October 27, 2004
Vault
The Squeeze is On
The time is t - 12 and counting. I am sure you have all been there. You have planned out all of the tasks. You have worked hard to meet the deadline. You felt in control of the iteration. You knew you had this one nailed. But then, as the hour of deployment draws near, it seems like a cruel trick has been played. Suddenly there is an insurmountable amount of work left. Are the tasks multiplying? It seems like as each loose end is tied up, two new ones pop up as if some evil magic spell were cast on the project. It is in this hour, when the odds sometimes seem overwhelming, when I am beginning to forget what the outside world looks like from the long hours of staring at my laptop screen in my cubicle, when the pressure is on, that somehow I feel that I do my best work. Am I a masochist? I have decided that either I perform well under pressure, or I am delirious from a lack of sleep. Do you know the feeling? Where after staring at a problem for hours the solution appears to you so clearly it is as if it were the result of pure genius and you feel completely satisfied with the world…then again, maybe even a hack looks like an ingenious solution when time is short.
Databases
I think I may have maintained a database he was involved with once or twice in the past...
Tuesday, October 26, 2004
Removing Haloscan
So do all of you out there in the blogosphere have your own custom tracking tools?