The 5 Most Difficult Issues in Software Development
Recently I had an argument with a friend about what I felt were the most technically-difficult problems in developing software. These are issues that have troubled developers since the early days of programming, and are inherently difficult. I feel that it is unlikely that they'll be completely "solved" by any new technology.
5. Spatial data. I might be biased about this, because I work with GIS systems, but there's something about data that has a geographic location that makes it 10-times more complicated to work with. It starts with the coordinates themselves (how do you represent them? where do you store them?) and continues with all these tasks you thrust upon this data. You have to see how different layers relate to each other, to see which data is near to other data, find paths, display it on maps, and it really never ends. In fact it is practically impossible to work with geographic data without a special software to help you out a bit. Even then, though, it doesn't get easy.
4. Packaging and versioning. I've talked about DLL Hell before. Every software is nothing but a group of inter-connected packages, or assemblies, if you wish to speak in the .NET lingo. And our need to separate our code into different parts, each with its own version, is a source of whole world of troubles. You always have to make sure that one part can find the other, and that what is found is really what it expects to find. And that other part has dependencies of its own, and so it continues. COM demonstrated this more than anything else, but every technology I've worked with has tortured me in this regard. Whether it was C, Java or .NET.
3. Relational databases. A relational database is in the base of almost every information system. The thing is, they're not well suited to working with object oriented languages. Yes, OR/M tools can make your life easier, but they do not solve this issue completely. You still have to understand what goes on behind the scenes. To know how your data is persisted and when or why it is loaded when it is. And you still have to write queries and tune them. There is just no way for you to be oblivious to the underlying relational model. And this tabular model has got nothing to do with the way we see the world, the way we see the objects form and connect. That's what makes it so hard - not working with the database itself - but to be able to fit it with our view of the world.
2. Multi-threading. Well, this is a no-brainer. If you've been developing for a while, you probably ran into threading issues a few times. Multi-threading is so useful (and in web-development, a requirement) and yet it is always such a huge headache. The .NET framework makes it a bit easier for you, but you still have to know your way around your locks and signaling to avoid performance or deadlock issues. In fact, I feel that multi-threading today is not easier than it was when I worked with it in C. The bad news are this is not likely to change any time soon, on the contrary - with the growing popularity of multi-core CPUs multi-threading is probably going to become more and more important.
1. Dates. This might seem weird to you at first. What's so difficult about dates? DateTime is a lovely .NET struct that solves all your problems in this department, right? Wrong. This attitude is exactly what makes dates the most problematic technical issue in software, in my opinion. You should never underestimate the damage of not working correctly with dates can cause. Take Y2K for example. The entire world was panicking because everyone neglected to use a 4-digit year. The world has never panicked because of a threading deadlock, has it? And we've all seen date-related bugs over and over again. There are too many formats, too many cultures and too many options regarding the usage of dates, and every language and system handles this differently, causing developers great head aches. I've seen caching systems failure, database corruption and scripting hell (I mean really, 0-based index for months? The one who's responsible for this Javascript bit was probably drunk at the time), all because of the importance of Time.
So, which issues do you find the most troubling? Share your thoughts.