Here are a few .Net programming and software development links:
Profession
http://www.hanselman.com/blog/July2008TechnicalReadingList.aspx - just a reminder from good programmers that programming is not only about writing code; keep reading books, keep reading blogs, keep reading other people's code, make sure you complement practice with theory all the time; otherwise you might miss some of the best stuff
Architecture
http://ayende.com/Blog/archive/2008/07/25/Default-Architecture-Layers.aspx - a good layering solution which can be used in most software applications; the idea of controllers describing use cases instead of interface requirements is a nice and subtle one
http://ayende.com/Blog/archive/2008/07/26/The-importance-of-context.aspx - contains some useful pointers on how to implement a context, a concept which can be used in many functionalities / applications; as Ayende explains, an explicit context can be created for each punctual situation, but the most elegant solution is an implicit context (which means that the application framework automatically instantiates and provides this service based on the current state, authentication credentials, etc)
NHibernate
http://ayende.com/Blog/archive/2008/07/24/How-to-review-NHibernate-application.aspx - list of NHibernate best practices, I wish I would have read something like this when we started our first NHibernate application; here are a few good ones:
- Be aware for what is the access pattern of your code, and take measures to reduce the amount of calls to the database.
- If you need to call sessionFactory.OpenSession(), stop and rethink what you are doing.
- Use transactions, always.
- NHibernate is OR/M - That is, it bridge between a database and the domain model. There is no good reason to forget that the database is there, and not use it.
- There is no way NHibernate can be fast if you make it call the DB in a loop, where N is any significant number.
http://www.hanselman.com/blog/LearnHowToUseNHibernateWithTheSummerOfNHibernateScreencastSeries.aspx - absolutely cool, again a resource I wish we had long ago: http://www.summerofnhibernate.com/. It can make NHibernate much more easy to start with.
DDD
http://deepfriedbytes.com/podcast/episode-7-talking-domain-driven-design-with-david-laribee-ndash-part-2/ - if you like technical podcasts, this (together with part 1) seems like an excellent discussion on DDD
BDD, TDD, Unit testing
http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/24/arrange-act-assert-and-bdd-specifications.aspx - RhinoMocks 3.5 might be a good solution for BDD: the final example for the When_placing_a_large_order specification looks efficient and simple. In case you did not know, this is the common template for BDD scenarios (taken from this BDD starting point):
Given some initial context (the givens),
When an event occurs,
then ensure some outcomes.
http://haacked.com/archive/2008/07/22/unit-test-boundaries.aspx - a simple and clear explanation of a frequent obstacle you might encounter in your code when you want to write unit tests, and how to avoid it; as usual, decoupling and interfaces are the key to coding nirvana
OOP
http://lowrymedia.com/blogs/technical/interfaces-vs--concrete-classes/ - whenever you can, you should create dependencies on interfaces instead of concrete classes
http://udidahan.weblogs.us/2008/07/23/presentation-intentions-and-interfaces-online/ - there are many interesting ideas in this PDF presentation:
- again everything starts with good books, this time on patterns and DDD;
- the main idea of the presentation, which goes hand in hand with the previous link (always choosing interface dependencies): make roles explicit; thinking of it, it really makes sense
- custom validation before persistence: this is the most important type of validation, which should never be missing from an application's domain layer
- an important issue related to the lazy loading mechanism that ORMs use (which can create big problems if used incorrectly), and an elegant solution: different fetching strategies
Source Control
http://visualstudiohacks.com/screencasts/addins/slickedit-versioning-toolbox-screencast/ - another solution for integrating SVN versioning into Visual Studio, which also offers a few interesting ways to visualize and manipulate repository information right from the IDE; other solutions are http://ankhsvn.open.collab.net/, http://www.visualsvn.com/, and of course http://tortoisesvn.tigris.org/ (which is not integrated in Visual Studio)