As a software developer, one of the main challenge I've met is to find good resources and feedback to keep my learning curve at a certain level: not steep enough to be frustrating, not low enough to be stalling. There are plenty of ways to do it, especially when it's the first time you learn a new programming language. After a certain level, it becomes far more complex and slow. I had that frustration and tried to find good solutions. I'll share that experience.
My journey as a C and C++ developer
At the beginning, I started with C. I learned it before the university mainly by reading tutorials on the web. At the university, I started C++. The courses, the projects and the practical works were good sources of learning. They mainly gave me a list of topics to dig and experiment, and the practical works were the best place to have a quick feedback depending on the teaching assistant.
During my engineer studies, I read more rigorous articles on the web and the big classics including C Programming Language by Ritchie and Kernighan or C++ Programming Language by Stroustrup.
After my graduation, I reached a learning plateau. I missed someone with a better knowledge in C++ to give me insight and path of progress. Hopefully, I met him at the beginning of my PhD. He advised me books, content, people to read or listen (e.g. Herb Sutter, Scott Meyers), or tools but moreover I had someone to discuss the challenges and potential solutions. Even today, it's still someone I come back when I'm struggling with complex problems in C++ or design. During that period I especially learned the benefits of tooling like linter, static analysis, profiler, not only in terms of code quality but also in terms of learning. They underlines problems I wasn't necessary aware of and give me a point to learn and improve.
The other way I progressed during my PhD was by teaching. When teaching something, you need to clarify and refine your understanding in order to communicate it. Moreover, you need to know the bounds and the exact internal working. It forced me to dig into some topics like the STL.
After my PhD, I worked as a freelancer. In most of my contracts, I was the only developer. Of course, as before, I've still read on the web and googled, but when I was facing a big issue for too long, my best solution was to discuss it with one or another friend C++ developers.
As a Ruby developer
I've learned and practiced other programming languages such as Java or Python (or BASIC a long long time ago). Roughly one year ago, I've started to develop, notably, in Ruby for 8th color. I've met another kind of learning challenge.
As a polyglot developer with some substantial experiences and knowledge, I learned the basics quickly. With my level, I'd expected to learn enough knowledge to write not so crappy code. But even if there is a common pattern between programming languages and the algorithmics fundamentals are still the same, the idioms are different, the ecosystem is different, the tools are different, the learning sources are different. I still have a lot to learn and experiment to reach a satisfying level in Ruby.
Even if it exists great active learning resources such as code school or codecademy, once I've finished them, I was far from what I'd expect as minimum level. It took me time to find the good blogs and the good tools. It was interesting but not essential for my progression, I'd have prefered to spend that time to learn about Ruby itself. Hopefully, Martin learned Ruby in a same time and I had someone to discuss and share with.
The way to learn
From my experiences, I'd summarize the different ways to learn as following:
- books, blog posts, tutorials, podcasts, conference talks
- forum, stack overflow questions, mailing lists
- interactive applications (code school, codecademy, robot war)
- tools (linter, checker, static analysis, profiler)
- close developers (colleagues, friends, coach)
- developers (forum, stack overflow, mailing lists)
All of these participate differently to your learning. If well chosen and used, they have all their utility for any expertise level. For instance, tools and close developers are very good to support active learning, i.e. learning by doing. Interactive applications are certainly the best for a beginner. Books can present very introductory materials as the more advanced, but they're only passive knowledge.
I can probably spend another blog post to describe their benefits and drawbacks, and categorize them according your level. But I'd prefer to underline something else first: having the right feedback at the right moment.
The learning challenge for a developer
I used to be the typical profile of lone developer: no pair programming, no team, no senior developer. I need to rely on myself and on some close and trustable peers. In learning, it's not an uncommon situation. You cannot rely on someone else to support you and give you good feedback to frame your learning. Sooner or later, you'll inevitably wander in the dark. It could be because the content you've found it's not good enough, or simply because you don't know where to go first. I've experienced it as an experienced C++ developer and as a beginner Ruby developer. It's a big frustration.
It's a kind of situation you can also meet even when you're working in a team, especially during stressful phase with close deadlines. You don't have always someone available to answer you when the question pops out. If it's a stupid one, you probably don't want to interrupt them as the flow is important.
I've discussed that learning challenge with several developers. It's usually accepted that it takes time and having someone helping you is a must. For me, the time is certainly a pain, but my biggest frustration is the loose and inadequate feedback for my level. My best learning experiences are when I'm facing a certain problem, I find the good blog post discussing the problem, and I can finally try it and implement a solution.
What are your experiences? Your biggest pain? What are your best learning mean? How do you keep improving year after year ?