Say you have been programming for over 10 years. You know many languages, with few of those at very detailed level. You have been designing architecture for solutions, worked on and delivered larger projects. You have been studying patterns, best practices, effective coding guidelines, unit testing, multi-threading, etc.

And then you slowly develop a feeling that most of the books you read, give less and less valuable information per 100 pages of text. So they start giving diminishing returns. You still learn, but you no longer improve by leaps and bounds.

Why does learning become less productive compared to how it was before?

Back then, it used to change your way of thinking, taught you new things and broadened your horizons that later improved either your current profession, or allowed to invent/manage/build something new. Why is it no longer the case?

  • 9
    Per the faq, questions about what you should do next (project, book, technology, or language) are off topic. I can understand your point of view, but you can't possibly know everything there is to know related to software development. Your problem is that you've gotten bored, perhaps fallen into an intellectual rut. The thing that inspires you to get out of that rut depends very much on you, and would probably be something entirely different for someone else. But here's the answer: get out of your comfort zone. Learn about embedded systems, math, graphics, or whatever interests you.
    – Caleb
    Mar 11, 2013 at 6:09
  • 2
    I do not see this question limited as to what the OP should do next. It's rather about general approaches professionals have available to further their study. Maybe it can be phrased better, but it doesn't read like "what should I do next" to me.
    – Frank
    Mar 11, 2013 at 6:41
  • 3
    Well, I honestly don't know which questions are not off-topic these days. It's actually becoming hard to find any interesting discussions here lately. Ok, w/e, just lock the topic...
    – Coder
    Mar 11, 2013 at 8:34
  • 2
    I believe the question can be edited to reopen. As far as I can tell, the problem presented: "diminishing returns... studying patterns, best practices, effective coding guidelines, unit testing, multi-threading..." is fairly on-topic for Programmers
    – gnat
    Mar 11, 2013 at 9:53
  • 2
    You will gain a fuller understanding of a subject when you try to teach it to someone else.
    – JeffO
    Mar 11, 2013 at 18:20

5 Answers 5


First, despite the way your question is formulated, there is no end to any studying, especially not in our field, where new things pop up faster than you can read about them. That being said, when you want to improve, there are the following categories that I'd consider. For the most benefit/ROI you should choose something from your weakest area of course.

Foundational Knowledge

Despite knowing programming languages and having practical experience, one often has (esp. self-learned) areas where basic foundational issues are left incomplete. Think about things like data structures, algorithms, cache strategies, hash functions, ...

Note that this also includes the foundations of programming languages - everything from compilers, optimization techniques and type systems, up to category theory, monads, and the like.

If you are well taught, as in have persued a university level degree for several years, then you are likely to already be strong in this category (far from finished of course, but a solid basis). Otherwise, do try to read a few books in these areas to find out if there's anything you didn't even know was missing in your repertoire. This category is the easiest to over-estimate yourself in.

Paradigmatic Knowledge

I am always astounded when programmers show up who think they are know-it-alls, yet are completely ignorant on other than the mainstream paradigms. If you think object-orientation is the end of it, this is your category for improvement. If you think functional programming exists too and might even have heard of logic programming, then it's still a good choice. There are way more paradigms out there and learning about them has the profound effect of giving you something akin to a new view of the world of programming.

Just don't forget: there are often (rather philosophical in their nature) arguments about what can be considered a paradigm or not. Don't get side-tracked by these. Your goal should be to broaden your horizon and that means learning about these things, whether someone else considers X a paradigm on its own, or not, does not make any difference to that.

Specialist Knowledge

The easiest of them all - and the least useful at the same time. Of course, you can commit yourself to a single technology and get to know all its ins and outs, but you should be prepared to pay the price. Technologies age and they do so in an ever-increasing speed, which makes it almost a guarantee that time invested here will be worthless several years down the road.

Also the problem of diminishing return shines here. By the very nature being a specialist on something means you have to spend countless hours on that narrow subject, and hence, by definition it will take you a long time to learn something new and that new thing will be a tiny little puzzle piece that is not going to change anyone's views of anything.

Domain Knowledge

Be it because it's your work's domain, or simply based on your personal interest, but being an expert in computer science and a certain domain is very valuable and rewarding. I am not talking about side-areas of CS here, like computer graphics or AI. Instead notice that computers have taken a hold in everyone's life and that makes every other field subject to computers and an area you can get into.

This one clearly falls into the category of "outside your field", yet it is not a sharp mathematical "outside", but rather a field of application. Consider medicine: I am not advicing you to become a doctor. However, learning the foundations of medicine in order to apply your existing knowledge about computer science to that field's problems is indeed worthwhile. This ranges from visualization techniques, over robotics, to expert systems and mere data management for accounting/administration. While you have done all of that before, doing it in another domain can end up being a whole new experience.

Keep in mind though, that this is a way more radical change in your direction than the other categories. You may not have any contact to that field in your day-to-day work, which makes it extremely hard to pull off. It may even mean switching jobs. Plus, you will need some sort of certification about your new domain - you are a complete newbie to that domain after all, and you have to compete against graduates from interdisciplinary studies, which already began their journey to become experts in that niche.

Supplementary Knowledge

As Mike Brown added, there is also the area of knowledge which in some way accompanies your current job, but is not strictly necessary. You do not need to be a project manager to learn about project management, but as usual, additional knowledge will give you a larger insight on how the other side ticks. One could even generalize this to the point of focusing on soft skills. I guess everyone who worked on a real project with other people knows the value of these.

  • +1, especially for "Domain Knowledge" - that is something that worked at least for me.
    – Doc Brown
    Mar 12, 2013 at 15:10
  • 1
    I agree 100% with what you say. I am taking a keen interest in deeper foundational knowledge. To the effect that I'm enrolled in a course on compilers right now. What you didn't touch on is what I'd classify as supplementary knowledge: graphic design, project management, etc. Mar 12, 2013 at 15:15
  • +1 for paradigm -- I had been doing OOP/procedural for ~10 years (and getting tired of it) and then I started learning functional programming and my eyes were opened to a whole new world.
    – paul
    Mar 12, 2013 at 19:06

I think that software is always evolving and as such there is an emphasis on constant improvement. I understand where you're coming from, I've felt somewhat similar recently and I'm now pursuing an MCSM in SQL Server.

Learn the next new language, or framework, or what's currently "hot". Every year there is a technology, framework or language that comes out, or reaches critical mass that it becomes a buzz word in its own right. I can think a few of these over the past few years: node.js, Ruby, jQuery. This will also likely impact your way of thinking for other platforms, for example, look at what ROR did to Java with Grails.

There is always room for improvement. I think it is very unlikely that you can be an expert on everything, and I read a lot and I am always learning. I do agree with what you say about learning less and less per 100 pages, but this is to be expected when you're a subject matter expert.

In terms of what you can do, here are some suggestions:

  1. Keep abreast of community changes and what people are "getting into". Learn the new stacks, at least so you have enough to recommend them where appropriate

  2. Participate in Q&A sites such as this, where you can impart your knowledge on others. If you take the time to read other peoples contributions, you will likely learn something, and at the very least you will likely see the perspectives other people have.

  3. Pick a hobby that has some relation to your work. There are plenty of hobbies with cross over, think AI, lego mindstorms, RaspPi, etc.

  4. As well as trying to increase the width of your knowledge, look at increasing the depth. For example, learn how EF works under the cover, so you can diagnose those weird corner cases rather than just use the framework.

  5. Pursue top level certification just to prove you know your stuff

Personally, I'll tell you what's opening my mind at the moment. I'm reading 97 Things Every Software Architect Should Know and I'm only partially though it but it's thrown up a lot of sage advice. The book is free to read online at the link I provided.

In terms of the hobby I ultimately took up, I got into vehicle diagnostics (with the computer, obviously) which got me fully maintaining my own car. I actually really enjoy the time I spend working with my hands.

  • Funny, I know one of the authors for 97 Things ;) Mar 12, 2013 at 15:18
  • It's a good book.
    – Sam
    Mar 12, 2013 at 21:23
  • You're welcome. It's great isn't it.
    – Sam
    Mar 13, 2013 at 11:16

After a certain point, you've learned enough about a specific topic that you are comfortable picking up new knowledge on an ad hoc basis. When you feel that there is not much more to learn about your primary field, it's time to start gaining supplemental knowledge that complements your primary knowledge.

For me, I am diving into UX and graphic design because I feel that will make me better as a developer to provide not just elegant structures in code but also elegant interfaces for the end user.

Other topics you can approach include project management, business analysis, system administration, and software process improvement. If you find yourself working in a specific domain, it might make sense to dive deeper into that domain. For example, I have been working heavily in the financial services sector lately. I've signed up for courses on Coursera around financial modeling and the like that will help me speak with my customers on their terms.

There's always more to learn, it just takes thinking outside the box.


There's two parts to this question: why is it harder to learn, and what can you do?

The first part is pretty straightforward - more advanced topics are harder. As difficult as it is to learn how to program, it's quite a bit harder to learn how to design programs well, and even harder to learn how to design large applications. The fact of the matter is that advanced topics are harder, or else they wouldn't be advanced. You'll need to spend more time learning them; more time practicing to master them.

As for what you can do, you seem focused on the technical aspects of being a senior software engineer. You can do a lot more things to help your team create software than learning languages and frameworks. Soft skills, such as mentoring other developers, negotiating requirements, project management, program design, communicating vision, implementing team norms... All those important things needed to make a team of developers effective at making software, not just you.


Each time I go on the site Lambda The Ultimate, I really don't/can't think like I'm knowing-all in the computer sciences field.

LtU will give you a good start point for paradigm and theoretic knowledge left to be learnt.

"The more you know, the more you know how little you know."

  • 1
    how does that answer the question asked, "Why does learning become less productive compared to how it was before?"
    – gnat
    Mar 13, 2013 at 8:37
  • Because when I go there, there are articles with something like 90% of new things I must learn. Which is precisely what the OP is complaining about: The ratio of things learnt by number of line read that becomes too low in his case. Don't you know this site either ? Mar 13, 2013 at 8:40
  • @gnat, and you mistake the question, that is entitled: "What can a technically proficient senior software developer study to keep improving" ? Mar 13, 2013 at 8:44
  • did you read content of the question after the title?
    – gnat
    Mar 13, 2013 at 9:40
  • @gnat Yes of course, I have read his question: it's rather a statement indeed if OP only asks why: after 10 years a so called senior software engineer reads books that no longer change horizons because a senior knows a lot. Yes I have read that. I have smiled. I repeat myself "The more you know, the more you know how little you know." Mar 13, 2013 at 9:58

Not the answer you're looking for? Browse other questions tagged or ask your own question.