I found this "book" yesterday after Scott Hansleman twittered about it. I just started reading it and just a few pages in I already felt inspired to start discussing it. This is purely based upon some initial statements made about YAGNI (You Aren't Going to Need It) and being in the ALT.NET frame of mind instead of the MSDN frame of mind.
I really enjoyed the initial statements on MSDN versus ALT.NET. I really do feel that there is a big difference between these ways of doing things. In the book, Karl quotes Jeremy Miller (who I used to work with) as stating "that the MSDN way is a practice of having too much focus on learning the API and framework details and not enough emphasis on design and coding fundamentals."
I absolutely concur 1000% with this statement. I used to think this way, because that was, for many years, what I was told was the way to think. There used to be a days when I used to know the entire Win32 API, and I was really proud of it.
Then one day I realized that this wasn't doing me very much good; it wasn't necessarily doing me much harm, but it was limiting me in that through the process of this type of learning I was unknowingly preventing myself from really seeing how to solve real issues in software that were important.
I don't know where or when it happened (but I'll guess is was about 10 years ago if not 5 or so years before that), I started to think in larger abstractions about the problems I was dealing with. I started to think that, well, in my adventures in enterprise software development, that:
- I wasn't really solving any new problems
- All of this detailed knowledge wasn't helping me solve those problems any better every time I had to do it again
- That there must be better ways of doing this
I don't know, perhaps you might say that was when the lightbulb turned on and I started to thing like an architect instead of a programmer. That may be it, but I think its too simple of a statement. And I'm not sure what I think about the moniker "architect" either, as I think today it presupposes things, both good and bad, that may not really be important either.
I guess what I'm saying is that after years of trying to solve how to do things better, it feels that it is to me exactly what Karl states about the philosophy of ALT.NET, which is to focus on alternate solutions and approaches to the MSDN way of thinking, and I'll add specifically that this is a way of using best practices learned through experience of the community to solve problems through knowing the patterns of how to solve the problems, and then worrying about the details of solving the problem only if there isn't a solution already available.
To me this is a very fundamentally different way of thinking about going about the things that I do. I often get asked many times what are the specific method or so and so class in interviews, and I'm often like, "I don't know off my head, but give me a second with Google, or better yet, why know them when I can solve the problem with a better tool providing a solution to the overall problem."
See, I think this kind of stuff is just cognitive overhead, knowing all these details. Over the years, instead of knowing all the details in memory, I've built ways of knowing how to look up the details at a moments notice. And by defering to other tools (like Google, or open source projects, or patterns and practices) for storage of the details, I really feel like I have allowed myself to become more creative and at the same time more productive. I've effectively become more atune to being able to solve the problem effectively, instead of just focusing on mastering the tools.
The thing that I wonder is if this type of reasoning can be taught from inception instead of having to learn through street smarts over many years. I think that sometimes this can be, but at other times I think we're just so entrenched in software with mastering tools instead of mastering solutions using the tools.
I mean it still amazes me that in many places that I consult, or with people that I talk with in my field, that they just stick with this means of doing things the way it always has been done. Its really an anti-pattern, and it's a difficult one for many to break.
For example, I once told another developer on a project that I was consulting for, in front of his boss, that when he was done with some code he was writing to integrate data between several systems, that I would like to write a unit test for this code. This would be something that would be mission critical, and run every day, and I wanted to make sure that if we had problems with it that I could be able to prove the failure using the test so as to fix it and make sure we don't have that problem again.
Well, I was aghast by the reponse I got, almost before I even got the entire sentence out. Testing wasn't important, and that I need not (and I mean that I am flat out not to) build that test, as there were more important things for me to focus on.
Well, the really amazing thing about this was that this piece of mission criticality was just run for the first time, with some dummy data, and that was apparently good enough to push it into production the next week without any additional testing or plans on how to handle it if it failed.
Guess what? It failed. And it failed hard the next week. And the users were pissed. And I got to write that test then. And it was another 8 weeks until the users allowed us to try this again, delaying us several months when I could have put together preventative measures in a few hours of work.
So, where am I going with this? Perhaps nowhere really, but it's stuff kicked into my mind in the first few pages of this book that I though I had to get out. I do really think that we're moving into a new paradigm in the next 10 years with software, and I think that some of this is embodied with this contrast of MSDN and ALT.NET. I just hope we as a community can make this happen.