Obviously, programming is “hard” otherwise everyone would do it and making solid applications would not be so difficult. However, the expectation does not always match reality. The most basic parts of programming are not hard. If you review my old post on advice for learning a programming language, learning the basics like syntax, loops and collections is fairly simple. Even I/O is not hard to learn for any given language. So, how does programming become difficult?
Paul Homer has an excellent post on contradictions in programming. The most important nugget from the post is:
So is programming easy or hard? When the people around you accept it as hard, then although it may take a while, it doesn’t have to be painful or a mess. But when the people around you think it is easy, they get impatient and take really bad short-cuts to avoid the necessary work, so it becomes increasingly difficult to get anything finished properly within the chaos. Thus it all depends on whether the people around you get that in order for it to be easy, they really have approach it like it is hard. Or slightly restated: it is easy right up until you fall into the trap of thinking it is easy …
Yep, programming is easy up until the point you think it is easy. The reason this happens is really a false sense of security. In the beginning, you learn about the data structures and syntax of a language. Eventually, you start learning more things like common algorithms, binary search and merge sort are good examples. Slowly, you learn more complicated things like creating and modifying a binary search tree. However, after learning these things, you eventually get a job building applications and you realize that much of what you learned is handled by frameworks. So, you start ignoring the basics of programming as you learn more about translating business requirements and technical specifications into code.
Suddenly, you start dealing with weird problems like memory constraints or memory leaks, large-scale search problems, and data aggregation. What you don’t realize is that as you have grown in your career, your tasks have gotten more difficult but they do not seem as difficult because you have slowly gotten used to the level of difficulty. However, this is where the contradictions arise. You are dealing with a class of problems that requires you to question some of your fundamental assumptions.
In many of these types of cases, you need to revisit some of you basic knowledge. For memory issues, you need to see how many objects are being retained in memory. It could be that some of your data should be serialized to disk. For search, you may need to change your search algorithm, or you may need to build search indexes. Data aggregation, which has become very important with all of the social data that is available, requires you to revisit how you are storing data and how you are querying that data.
Retaining your basic skills is something our industry tends to forget because of the wide adoption of various frameworks. Are sites like Programming Praxis, which help you practice programming, really useful? In some cases, they absolutely are. Forgetting how to create a binary search tree is not catastrophic, but remembering that these basic data structures and algorithms are critical to your career. The only time that you can really ignore some of these foundations is when your career is focused on creating administrative applications, like form based data entry, with a limited number of concurrent users. There is a large segment of the programming population that does this type of work, but there are a lot of programmers that create all sorts of interesting applications.
There are some people that believe you need to be working on side projects, meaning applications that you are building outside of your current employment, in order to be a good hiring candidate. I am not a fan of this opinion, but I do value the idea of side projects. Typically, people will work on side projects that have only a limited relationship to what they do at work. The benefit is that these side projects will broaden their skill set because they are dealing with different types of problems than they normally see. I find side projects to be better than programming exercises because they have meaning to the person doing the work. Would you rather write another binary search or create an application that you and others may find useful? Obviously, I prefer side projects for this type of work. These side projects are also a useful way to learn new technologies and languages if you are not learning about them at work.
How are you keeping your skills sharp?