The following document outlines a collection of resources which you can use to help you pursue the art of software craftsmanship.
There is a wealth of material in here that will take a significant amount of time to work through. The goal is not to complete it in a certain amount of time; rather to use the resources as a way to allow you to continually and incrementally work on honing your skills.
Some of the resources in here focus on areas related to general computer science and software engineering, others are resources that are there to help you improve more general areas of your skillset, including tuning up the old gray matter!!
Work Incrementally And Consistently
It is very important to remember that the majority of peoples brains works best when challenged consistently over a long period of time. To this end, it is important that you embed habits of daily practice into your routine. Much like it is important to commit to a workout schedule for you physical health, it is also just as important to apply the same level of discipline to the way that you train your career skill set.
This is really what this entire document is about, the art of crafting a long lasting career as a software professional. There is a huge wealth of information that the craftsmanship site links to. All of it is meant to give you ideas of what it means to be a software craftsman. Some of my favourites from the reading list are:
Lumosity - Train Your Brain - 10 minutes a day
One of the tools on this list which is specifically focused on brain training is a tool called Lumosity. This site is a collaboration between neuroscientists and computer programmers who have developed a system whereby you can increase a host of cognitive functions over the course of a prolonged training program. The initial 45 days of the program helps you establish a baseline for where you need to improve, and from that point on the program tailors itself to help you develop the skills in the areas that you need improvement.
Code Katas - It just takes 20 minutes
The following set of exercises is a collection of code katas that you can use on a daily basis to spend a small amount of time every day working on a set of problems that can allow you to work on broadening the following areas:
- Increase you context pool of ideas around which to approach a particular problem
- Improve your ability to craft your workbench to allow you to work in the most efficient way possible aka. Repeat katas you have already solved and try to mechanically generate the solutions faster using your favoured workbench. This will allow you to identify areas where you can see yourself using your tools in a less than optimal way and work to iron out those items.
- Learn new languages. Use code katas as a way to explore a new language. Revisiting katas that you have solved and trying to implement them in as many languages as you are interested in.
Here is a small list of some katas that can keep you moving for a while:
- TDD Katas These problems represent a small set of challenges that can allow you opportunity to flex you tdd programming muscles. Like any other skill, tdd is something that should be practiced over and over until you feel comfortable with the mechanics of leveraging it. In the beginning you will most likely write fairly bad tests. This is usually because TDD forces you to bring design to the forefront of your coding activity and design using code that serves as the first client of that code. Often when people get started using TDD, they are faced relatively quickly with their deficiencies in the design toolkit they thought they had. This is a great thing, as it gives you an opportunity to purposefully choose to sharpen those skills. I personally feel that the design skills you bring to the table have an impact on the way that you approach executing TDD.
- Project Euler
This is a set of over 350 problems that are fairly math centric in nature. This is a great resource for you to gauge where potential gaps in your math skills are. A large majority of line of business programmers can go their entire career without ever really to flex their math muscles. There is nothing wrong with this at all. Unfortunately, a large percentage of these developers also express interest in getting into other areas of computer programming, that require much higher level
math that what they can currently manage. When faced with this dilemma, they can choose to close the gaps in their knowledge that will allow them to get into those areas of interest; or they will choose to go back to what they know they can do, and have a constantly nagging feeling of wanting to do more.
Using this set of codekatas, you can work through the problems one at a time, and if you hit an problem that is proving a challenge due to a gap in the math skillset, you can close that gap with Khan Academy - discussed later on !!
- Code Kata One of the original code kata sites. It contains a set of problems as well as a great discussion on why to bother practicing code katas in the first place!!
Close some of the gaps in your math skill set
- Khan Academy
This is a fantastic resource put together primarily by the brilliant Salman Khan. Currently the site has over 2400 videos covering topics ranging from basic arithmetic to linear algebra. There are also material on history, biology. It is a crazy resource. For people who may have a gap in their math skillset, this can help you close it.
If you do happen to identify gaps in the knowledge, you have to be willing to be patient enough with yourself to go back to where the gaps stemmed from and work hard to close them. The many people out there who have been convinced by teachers,friends, etc that they are not mathematically inclined have been lied to. It may most likely mean that for you to exhibit proficiency in math, that you have to spend more time practicing and working through lots and lots of problems until it clicks.
Now of course, it should be noted that you can probably enjoy a very long and successful career as a software developer without ever needing to get into higher level math. Especially if the majority of your dev effort is spent in the line of business “crud” style realm. Of course, if you start wanting to branch out into other areas of software such as:
- Machine Learning
- Neural networks
You willl definitely require the use of those higher level math skills. At that point, you will either identify that you have the skills, can refresh them, or you will have to learn them from scratch. If this is the case, I believe Khan academy can definitely equip you with the tools to get into the areas that you have interest in!!
Get a better education
A large majority of computer science based education is not really equipping programmers effectively with what I call “a solid core”. Like building a house on sand, if you don’t take the time to learn and apply the fundamentals, it will be much more difficult to adopt an attitude of confidence in your ability to tackle problems. For some of us, that means we may need to revisit topics that we never had the opportunity to cover in the school that we attended. For some that means even going back and learning about fundamentals such as basic data structures and algorithms. There is a myriad of learning resources out there that are focused on just this task, the following list is a small representation of the huge amount of options that you have to be able to use to ramp up the “core” skills:
MIT Opencourseware. For quite a number of years now MIT has been making large sections of its courses freely available for public use. Specifically for computer programmer, you can spend time looking at the Electrical Engineering and Computer Science. There is a raft of courses relating to a wide field of computer science based disciplines. My recommendation for a lot of people would be to start with the following:
- Structure and Interpretation of Computer Programs
- Introduction to Algorithms
- Introduction to C Memory Management and C++ Object Oriented Programming
- Laboratory in software engineering
To see the impact that MIT Opencourseware is having, check out the following article.
Once again, the wealth of information on here is just amazing. Even in the computer programming section alone there are lots of video lectures from topics ranging from algorithms to iphone programming.
Read some books
Books are a great resource for getting differing viewpoints on techniques and practices. My recommendation while reading books (especially technical) is to focus on active reading techniques that allow you to implement what you are reading as soon as possible. You want to give yourself the opportunity to build your own mental models for how the concepts apply, and I believe that a large majority of technical information you read is best distilled in your editor writing code
and playing around with the ideas.
I have put together a small book list that I have created to focus on some fundamental areas of both software engineering and computer science. Granted it definitely leans heavier into the realm of software engineering that raw computer science, but the books that are on there are a great starting point for helping you to further the building of a solid core.
Check out the book list here:
Build a solid core- In my opinion, the books on this list are far more important than any of the resources I have mentioned so far. Read them and prepare to have transformative things happen in your life!!
Feel free to comment on this resource list (yes comments are working again) and let me know if you think there are good additions I can make to the list of recommendations.
God Bless You.