Do you want to become a much better programmer than the one you are now? Unless you really don't like being one then I am sure that the answer is yes!!
The following list outlines a set of strategies that you can look over for some thoughts and techniques that I have found to work well, and that I have shared with others over the course of the years. This list encapsulates both lessons that I have learned on my own, as well as the many lessons that I have learned from many great people over the course of my years so far!!
My definition of unlearning is the ability to "leave your baggage at the door" while you willingly step out into a realm of uncomfortability to explore new ideas with a fresh set of eyes. Being an effective unlearner enables you to take an unbiased look at a new way of approaching a situation/problem/challenge without the weight of being dragged down by your old baggage(ideas). It allows you to take the time to form a reasonable mental model of the new concept as you experiment with it and apply it; to see whether it is something that could be considered worthwhile.
It is a lot harder for people to unlearn bad practices and ideas. Unfortunately this can get in the way of allowing them to adopt and play around with potentially good and useful new ideas.
Give yourself small daily opportunities to practice "unlearning". Tackle a problem you have solved before and don't allow yourself to leverage your old ideas to solve it. As you practice unlearning, it can be helpful to remember that the process is often more important that solving the problem, as you are learning how to "leave your baggage at the door" as you work through the process. Which can have a dramatic impact on your ability to unlearn in the future.
A lot of programmers believe that they posess a higher level of skill than they actually have. Unfortunately this, combined with comfortability, can keep people in this "twilight zone" for quite a long time. One strategy to minimize this is to seek out and collaborate with people who make you feel a little out of your element. This will ensure that you never allow yourself too much time to congratulate yourself; which keeps you in a mode of trying to continually improve yourself.
If you can also manage to surround yourself with people who you can form good relationships with, then it can be an encouraging thing that enables you to reach levels in your ability that you may not have able to realize on your own.
There is a constant flow of information coming at us all the time. One of the targets that I am going to pick on right now, ironically, is blogs. There are a lot of very skilled programmers out there who are more than happy to share their wisdom and experience with others through the means of blog posts. These can be valuable tools to help people keep plugged into speheres of knowledge and concepts that they may not have come across yet. Unfortunately, with the large number of these blogs, many people have fallen into the trap of subscribing to too many. They work hard to keep on top of the daily (sometime hourly updates) that these great developer care to share. In the hands of people who know how to manage the information carefully, these feeds can be extremely valuable resources.
There has, however, been something that I have observed of many developers that I met over the last couple of years. Let me describe this observation in the form of a short story:
CoderBoy is an average programmer who wants to become better. For the last year he has spent a lot of time picking up, and reading books on the latest and greatest technologies that have come down the pipe. This reading was purely passive in nature as he did not spend any time trying to practice and play with the concepts that he was reading about. Able to drop buzzwords like they were going out of style, he started to get frustrated by the abscensce of any new insights/techniques he was sure would magically manifest when working through coding sessions.
To remedy this; CoderBoy started reading blogs. Subscribed to a handful of aggregated feeds and lots of individual blogs, he spent the first part of his day at work reading about the discoveries, experiences, successes, and failures of other people. With each new blog read, there were more links to traverse, other blogs to read, more information to digest. By the time he got through his morning blog read ritual, he felt even more discouraged about his skill level than when he started.
And if that were not bad enough, he convinced himself that the things that people were writing about were much more engaging that the projects and challenges that he had to work on.
Attempting to shrug off this feeling, he dove into code. Only to be hit by another brick wall. He spent the next chunk of time thinking about all of the different ideas whirring around in his head. Instead of attempting (and potentially failing at implementing) a couple of different ideas, he got stuck seeking out the perfect solution. If he finally managed to find what he thought was a good solution, the next morning he would read something else which makes him feel terrible about the code that he wrote. And the cycle continues. This became a very destructive cycle that robbed him of the joy of creativity, exploration, and even the craft itself.
Reading is no substitute for doing. A great quote by Albert Einstein reads:
Any man who reads too much and uses his own brain too little falls into lazy habits of thinking
We are all infused with the desire to create. When we fail to exercise that gift it can often leave us with a feeling that we are not quite living up to our potential. We each need to realize that the gifts we bring to the table are completely unique. Gifts, however , have to be opened, and then further used, if they are going to be of any value. Books and blogs can be great resources to inspire you to maximize and challenge your own creative potential. You have to make sure that you allow yourself time to flush out some independent ideas. Learn from the mistakes of others, but allow yourself plenty of room to come up with your own ideas. Give youself plenty of room to fail, and learn from those failures. The only real failure is the failure to try.
Going along with the idea of allowing yourself to cultivate and stretch your creative gifts. You should allow yourself time every week to just play with new ideas. The pupose of this is not about getting something right or wrong. It is about allowing yourself the freedom to have fun with just messing around with some code. It could be:
The point is to just let yourself "play". People who allow themselves to get into this mode more often can find that the spikes in creativity that result, can carry forward with them into the stuff that they have to tackle on a day to day basic. Also, this structured focus on allowing themselves room to experiment, frees them up to think about completely new ways to solve problems. Even if the way they solve the problem has been "found already", it does not negate that they have raised their level of skill by coming up with a "new" way of solving it. I am reminded of the story of how John Carmack created Carmacks Reverse:
Carmack's Reverse (formally known as z-fail stencil shadows) which he devised for Doom 3...While he was not the first to discover Carmack's Reverse, he developed it independently without knowing of the prior research done on the subject.
Do you think that was just reinventing the wheel? From his perspective he was not at all. He was trying to solve a problem (without knowledge that it was a solved problem). This provided him with an opportunity to stretch and maximize his creative ability to attack the problem for what it was.
A lot of great programmers that I have met over they years would seem on the surface to exhibit temporal cases of extreme NIH. Lots of them have written their own version of [insert frameworks here]. Of course a principle tenet of a true NIH camper; is the unwillingness to leverage known solutions to existing problems (discounting truly not got implementations that is). In the software space this means, existing frameworks that solve the problem that they are trying to solve. The real question is, what is their motivation behind writing another [framework x]. Dig deeper and you will see that a lot of these "projects" start off as nothing more that a planned excursion into the realm of the mad scientist. They ask one question "I wonder if I could do this?" and they set off to try and answer the question. They don't have time to get caught up in the politics of whether one already exists or not, because for them, it is just a fun challenge that gives them an opportunity to stretch. It can give them an change to explore and think about problemsthat they may not feel comfortable with. This utlimately results in growth!! The periods of exploration will often come back to manifest as better ideas with which to tackle the challenges they are dealing with on their real project.
It can be very easy to get caught up in the software version of keeping up with the Joneses. The proliferation of internet based information has made it even easier for people to continually find someone who they should be chasing after. Unfortunately, this is a never ending race. When you think you have caught up with the skill of [developer x], either their skill level has increased or you have found another developer whose skill you covet. Constantly wanting, never content.
Lots of people waste their lives, by measuring their own life against someone elses yardstick. It is a joy sapping journey to never feel satisfied with the gifts and abilities that your have been blessed with. You need to work hard to maximize the potential of the gifts you have been given (and we all have gifts that we can leverage). You need to also remember, that even with lots of work, the level of ability you are able to reach, may not be at the same level of someone else who has also worked hard. That, however, is ok. It's not about being the best. It's about being your best. As legendary coach John Wooden ("The Coach") said:
Don't think about what you have accomplished. Rather, what you should have accomplished with your abilities.
When I was younger my Dad gave me some great advice. He said:
There will always be someone who is better than you, there will always be someone who is not.
Simple, profound. This tiny bit of wisdom at a very young age helped me not to fall into the trap of self comparison.
There will always be a programmer who is more skilled than you; there will always be a programmer who is less skilled. The only thing that you should focus on is whether you are a striving to become a better programmer than the one you were yesterday. That is the real person to mercilessly compete against daily. Being able to track your progress against "that" guy, will help you see that day by day, in small increments, you are improving.
I think a lot of people would be unpleasantly surprised at how may inefficiencies are present in the way they utilize their workday. Running a tool like timesnapper can give them a nice unbiased snapshot into how they actually spend their time when in front of the computer. You would not think of fixing something that is not broken. One problem is not knowing that something is broken and in need of repair. Do you know how much time a day you spend in the following activities:
Right now, you could probably make some guesses about how much time you spend on each. Most will grossly underestimate. I cannot stress enough how much you can make your workday count to your advantage. If you end your days with the persitent feeling of "I do not feel like I got enough done", it could be an indicator that some significant diagnostics need to be performed. The feeling of not getting enough done can unfortunately have ramifications on much more than your performance at work. It can carry on into your thoughts once your are home with your family, which can distract your from giving your full attention to them. It could also propogate into your sleep patterns, preventing you from being able to realize a good restful sleep. You owe it to your family, health, and employer, to take an active role in seeing how effectively your are leveraging your workday. Any extra time that you can free up in that timeline is time that you can allocate to more meaningful activities which could:
Allowing yourself to do some deep introspection will often moved you to make changes that can have lasting ramifications.
It can be very easy to become so focused on your own individual improvement, that you can often forget about the people you are surrounded by who could greatly benefit from the skills that you already bring to the table. Making a concerted effort to show genuine interest and care for the well being, and development of your co-workers; can create an environment where synergy, collaboration, and friendly competitiveness raise the level of all of the people on the team. Here is a great poem that I was sent by a past student that outlines perfectly what it means to be a leader in the teams that you are in:
Do you want to change your team, or just one person on the team? Stop trying to change them with soapbox speeches and incessant rambling about how they should be improving their skillsets. All the while making sure to point their attention to all of the amazing stuff that you are doing that they should just be "on board" with. Roll up your sleeves and get involved in the work they are struggling with. Take time to understand them on a personal level. Get to grips with the concepts and ideas that fluster them on a daily basis. Don't make your goal to convince or change. Make developing the person, and investing in them the goal. This will most often open up the doors to a level of collaboration and improvement that would not have been possibile when you were just focused on youruself. In this type of environment, change and growth is now a natural side effect of the process of building people who build others.
So simple, and yet very easy to lose sight of. The reality of keeping the element of fun present in the tasks that you do, can often be more about attitude than it is about aptitude.
Do you dread having to do that 5 minute a day FTP upload? Write an script to automate the task so that you can do another task that you would rather be doing.
Are you faced with a negative project situation and people who have succumbed to a defeatist attitude. Challenge yourself to be the voice of light in the darkness. It is not about denying the fact that there is a problem. It is being courageous enough to be someone who is still willing to press through and find potential solutions to remedy the problem.
Are you tired of writing the same thing over, and over, and over. That is not fun. Try to tackle the problem differently. Give your brain an opportunity to stretch itself. Find a way to make a seemingly mundane task something that allows you an opportunity to play.
I don't think anything really worth having, comes without some hard work involved. Be it a great relationship, or acheiving a high level of ability in a certain skill. There has to be a certain amount of effort exerted to cultivate that element into something great. Keeping the fun in what you do on a day to day basis (granted you will most likely go through periods where you are just not there!!) is something that requires just as much hard work. It requires an inquisitive eye, a high level of personal and environmental critiqueing. And ultimately, courage to take action to fix the elements that rob the joy from the task.
I have to stress that this does not necessarily mean that things have to "go your way" for things to be fun. You will often need to cultivate a mindset of being able to find the fun in a potentially not fun situation. This can often end up having a positive impact on both you and the people that you work with!!! You have to choose to make decisions that you know are right even when your "feelings" try to lead you astray.
We are blessed to be in a career that we chose to do. Let's enjoy the process of daily becoming better at it, and enjoy the journey!!!