So, what have YOU been learning lately?
One of the worst things that can happen to you professionally is stagnation. You know what you are doing, you know how it works, and you can coast along very easily. Unfortunately, there is the old, it isn’t what we know that we don’t know that is going to hurt us. It is what we don’t know that we don’t know that is going to bite us in the end.
One of the reasons that I have routinely been going out and searching for difficult codebases to read has been to avoid that. I know that I don’t know a lot, I just don’t know what I don’t know. So I go into an unfamiliar codebase and try to figure out how things work over there.
I have been doing that for quite some time now. And I am not talking about looking at some sample project a poo schlump put out to show how you can do CQRS with 17 projects to create a ToDo app. I am talking about production code, and usually in areas or languages that I am not familiar with.
A short list of the stuff that I have been gone over:
- CouchDB (to learn Erlang, actually, but that got me to do DB stuff).
- LevelDB
- LMDB
- NServiceBus
- Mass Transit
- SignalR
- Hibernate
- Hibernate Search
Those are codebases that do interesting things that I wanted to learn from. Indeed, I have learned from each of those.
Some people can learn by reading academic papers, I find that I learn best from having a vague idea about what is going on, then diving into the implementation details and seeing how it all fits together.
But the entire post so far was a preface to the question I wanted to ask. If you are reading this post, I am pretty sure that you are a professional developer. Doctors, lawyers and engineers (to name a few) have to recertify every so often, to make sure that they are current. But I have seen all too many developers stagnate to the point where they are very effective in their chosen field (building web apps with jQuery Mobile on ASP.Net WebForms 3.5) and nearly useless otherwise.
So, how are you keeping your skills sharp and your knowledge current? What have you been learning lately? It can be a course, or a book or a side project or just reading code. But, in my opinion, it cannot be something passive. If you were going to answer: “I read your blog” as the answer to that question, that is not sufficient, flatterer. Although, you might want to go a bit further and consider that imitation is the sincerest form of flattery, so go ahead and do something.
Comments
Its funny that you do the same thing, i always thought i was the only one who is doing that.
Recently? Lisp/Scheme, VoIP/SIP, Lua/LuaJIT, SignalR,some C/Unix programming just to remember how to do that Learning mostly by experimenting with code + reading books/tutorials + discussion groups Unfortunately, none of the above allowed me to make any money - currently I'm earning my wage as a .Net developer
@Rafal but any learning outside of .NET helps you learn other concepts and ways of solving problems that can be applied to .NET, it makes you a better .NET developer.
Android, linux, node.js, CQRS and PERL. Working as a .NET/java dev.
The best way to learn something is to build something with it. Be it a real project or a toy project that is conducted like a real one. Although you might theoretically know everything you will still stumble a lot the first time you use something.
Alea.cubase: method of kernels. Multilayer perceptrons. Slowly getting back into the habit of reading academic papers.
My first F# demo is a fractal fern app: http://www.spiegelsoft.co.uk/fern
And yes, this blog -- although it is at its most informative and entertaining when you get called out by other members of the community (e.g.the deadly laptop).
Currently delving into Haskell - tried once before, but didn't get too far. As a .NET dev some concepts are hard to crack. For me the difficulty is that many Haskellians are quite happy to blog about the beauty of certain abstractions just for their own sake without going into their value in production environments. This is a challenging outset for me as I usually do not find value in abstractions without a clear application in a typical "real world" app and I was never that good in pure maths, much better in applied maths. Still, so far it seems like it could be worth it.
Building a project (service) with Windows Azure (ServiceBus, NoSQL, async, knockout, lots of javascript). Reading books on Angular, Async, CQRS.
I managed to get lucky and find a job in a completely different environment that was willing to maintain my current pay rate. So I left the world of Windows and .Net about seven months ago and was thrown into the deep end of Java, Groovy, Ruby and Javascript (not in the browser ironically enough) in *nix and that's been keeping me very busy! I've also been trying to pickup Erlang on the side, we have a super awesome functional programmers user group.
I stumbled onto this blog reading about AOP (http://ayende.com/blog/3474/logging-the-aop-way), which catapulted me into a whole new world of paradigms that I never knew about. It changed how I program and continues to challenge me to write more maintainable code. Mark Seemann (http://blog.ploeh.dk/) has taught me a lot about unit testability, DI and IoC, anti-patterns (that I've used and disliked myself, but couldn't figure out exactly why). Brock Allen (http://brockallen.com/) and colleauge Dominick Baier (http://leastprivilege.com/) have taught me a lot about security and claims. The list is ever-growing.
My day job is a .NET developer, but I've always wanted to write games in some capacity, so my current personal project is a 3D game using C++.
It's quite the contrast to .NET business app development! Completely different problems to solve in completely different ways. But, my side project and job both benefit from it in subtle and not so subtle ways!
Just wanted to add -- and this is very relevant to the post, is that when I started my game, I initially tried to create my own rendering engine. I quickly found that to be a bad idea and a monumental task, since I too learn by watching how something works, and breaking it apart. Rendering engines are complicated beasts and not for the faint of heart.
I ended up using a solid and mature 3D engine called Ogre3D (which has been around for about 13 years), which has helped immensely. Not just that it helped get me up and running quickly, but it lets me get a good idea of how a working 3D rendering system is built, so my next project I have a lot better idea of how I can start on my own system by borrowing concepts that I know work.
I think looking at how other real-world systems are built and work is a fantastic way of learning new stuff.
Angular.js (inspired by Scott Allen http://odetocode.com/), node.js and Ruby on Rails. Just a couple of pet projects to see how things work.
In my date time job as .NET Dev I been doing a lot of work on DSLs and knowing more than one language/platform, actually helped a lot to improve the design of those languages.
I also wanna learn Erlang, but life its too short! ;)
I download and read books voraciously. I do this in many areas - programming, chess, fiction (been going through all the old classics), and many others. I read more or less every math-centric blog you can imagine, including Eric Lippert and Mark Chu-Carroll, and dive into several other great programming blogs in general every day. Finally, I'm writing a book (fiction novel), two Android applications, a Windows 8 application, and I'm resurrecting my blog soon, all in my spare time.
Over the last year I have been reading whitepapers on different topics - most of the time on information retrieval (search, information extraction, machine learning) as well as different algorithms and data structures. I've even done a few naïve implementations (inverse index, string similarity matching, bloom filter, and started on raft but got interrupted and haven't gotten back yet). Now I'm developing a course for Pluralsight on search (Tika, Lucene, Elastic Search with SpringMVC). My end goal is to build a search service that uses information extraction, retrieval and recommendations together to improve the user experience. probably using mahout in addition to the other tech mentioned above.
By day I am a .NET Services Engineer
Any tips on how to read large codebases - especially for more novice programmers?
I started a little side business doing radio stations for niche genres of music.
Before doing that, I didn't know how to even setup a website in IIS; I was a Windows developer hacking away at dumb WinForms stuff. Then came WPF, then Silverlight, and now here I am as a lover of all things web dev. :-)
It's scary to think your skills are obsolete in just a few years. But, like Oren said, it keeps us mentally sharp. And personally, I find the never-ending-learning cycle of software dev keeps things fresh and interesting.
I have been learning about PostgreSQL, and getting it to work with my ASP.NET MVC apps. The big learning curve for me is hosting the database server on Linux.
I want to add something a little different here - I recently joined CoderDojo in NYC which is a group that mentors kids that interested in programming. The events are varied from teaching Logo to OverTone, which is an open-source real time audio environment in which Clojure code is used to generate sounds and music. I have to say that watching the way young minds can absorb programming and seeing the free flowing ways that they apply what they just learned is almost mind blowing. Besides doing a good thing to promote programming in future generations, I think that this is a roundabout way to keep yourself sharp. I would encourage others to get involved in their communities to teach programming to others.
Many things caught my eye recently: ubuntu, jekyll, vim, asp.net mvc, oracle 11g, knockoutjs, angular js, twitter bootstrap, responsive design, frameworks for console apps, powershell + psake...
I started to go deeper with DDD and CQRS and read many posts including yours about the infamous abstraction levels. Been also learning NServiceBus and mastering NHibernate, you might remember I was in your class in London in May. Now I am building a project with Azure, NSB and RavenDb plus some WebAPI, KnockoutJS and SignalR. In addition I am trying some completely different things like Python on OpenWRT and FreeSwitch VoIP scripting. Quite a lot of interesting stuff.
But what I can mention from my job search experience, some more narrow minded employers are confused when meeting someone with a broad range of skills and interest. One employer has asked me: "so you are kind of a generalist and not have been going deep on one single thing?" He fails to understand that I would go deep enough in anything that I am really dealing with.
Eh. I would ask the same thing. Anyone can be a dilletante. It takes real mental concentration to be focused enough to go deep in one area. Experience like you describe doesn't demonstrate that focus. It wouldn't convince me, anyway.
I've been writing code since I was 11. Over the course of time I've explored many different areas of computing - kernels, filesystems, network protocols, security/crypto, speech recognition, music recognition, compilers, debuggers, realtime, graphics, etc... But I would never rattle off a dozen+ topics that have "caught my eye recently." In the span of 1 year I would probably have explored no more than 2-3 disparate topics, at most. Learning anything takes time. If you're hitting all these things in the span of weeks or months, you haven't actually learned anything - what you think you've learned will have evaporated just as quickly as it arrived.
One genius can do the work of 100 average people, but 100 average people can never do what one genius can do. A background like you describe only shows at best, average level of expertise with a variety of things, and no extraordinary expertise at any particular thing. Folks with a shallow understanding of multiple topics are a dime a dozen. Prove that you have both the dedication and the insight to actually be an expert at something, and I might interview you.
There's a flip side too of course, which might be a case that you could make - that you understand things at such a fundamental level, that you can apply prodigious problem-solving skills to any situation. That would be extremely valuable, obviously. A lot of people think they have this. Upon closer inspection I'm usually disappointed.
Howard Chu is somewhat correct.
Memory is definitely issue. I'm one of those people who if I don't use it, I forget it within a month. So learning new things without any likelihood of actually being able to use the skills is next to useless.
On the other hand, as Ayenda says, "I just don't know what I don't know". This is the problem with Howard's argument. How could you know if SignalR is useful for your projects unless you spin it up and give it a try? How could you know that whether there isn't some brilliant solution that someone else has already solved in their code base that could help you out too?
Howard, The list I rattled off is from 2007/8. So it covers 6 or 7 years.
I was reacting more to Nick's list.
cbp: This is where being able to generalize, and understanding things at a fundamental level is important. There aren't a lot of brilliant new solutions out there in the first place, most of them are just warmed over rehashes of older solutions. You can search around, read abstracts/FAQs/descriptions, pick out keywords, and get a rough high level understanding of a system or tool. Certainly you never stop reading, that's also a requirement for gaining expertise.
But a lot of the problems you're trying to solve are the exact same problems everyone has been facing for the past 50 years of computing. The principles have not changed, the physics haven't changed. If you've already done your homework, then you should already recognize those same principles recurring over and over again.
I do better learning from books, in the Manning / O'Reilly softcover variety. I'm very slow at reading code, especially when it's uncommented. Going over some sample apps (todo lists included) helps as well.
That said, what CQRS books are out there worth a damn? It's something I've wanted to dig into further but aside from blog posts I can't find anything.
What has really helped me along in the latest years, is: - organizing and participating in user groups - newsgroups - twitter - writing and commenting on blog posts (mostly the rubber duck effect and learning from comments). - joining events (both as a speaker and as a spectator) - contributing to a plethora of OSS repos in a plethora of languages previously unknown to me. - writing umphteen DDD/CQRS implementations to truely grasp the essence, which in the end is quite simple (for both of these I have my github account to prove it: https://github.com/ToJans) - lots of pro deo skype/email-consulting. - taking on projects at a highly reduced rate in an area that I am completely unfamiliar with (i.e. new language/platform/domain) - taking on "impossible" projects (usually it's a people thing) at a very high rate to fund my mini-retirements. - taking mini-retirements to try something completely out of my comfort zone (f.e. trying startups, contributing to a new programming language). - reading non-fiction books about non-software development, f.e. "Anti-Fragile" by @nntaleb.
- improving my social skills, understanding of the human psyche
I'd say the biggest lessons come from sharing your failures with others, and applying non-software insights to the software development process. Also, being able to pick the brain of one or more experts during a dinner after the conference REALLY helped me to open up. There might be others, but this should be the gist of it.
I have to agree that most efficient way to learn new things in programming is reading code. The fact, that programming is taught (and thought to be best learned) by doing is bizarre one. I cannot remember a single course in university where we had to go through substantial amount of code. I don't think there was anything more than code snippets demonstrating the language, not the concepts. Which is in my opinion absurd and utterly inefficient. And leaves deep psychological tuning towards "Hey, why bother reading 12 hours while I can play with the thing for 32 and get 80% less knowledge on the matter when reading".
I try to pick some kind of theme each year. This year I have focused on languages that I don't feel confident in. I have messed around with Prolog, Erlang, Haskell, Smalltalk, German and French. There is this idea from classical philosophy that your thoughts and strictly limited by the language you express your thoughts in. If you master a language well, you can express and grow ideas better. This is why I included a few natural languages as well. Most programming languages are somewhat rooted in English grammar, so it is actually inspirational to learn some alternative ways of expressing yourself. German, for instance, has this wonderful unambiguous grammar, when compared with English.
How to use a debugger is what I learnt with C and Java. I also should learn how to debug python.
Comment preview