CodeBetter.Com
CodeBetter.Com
RSS 2.0 via Feedburner
           Do you Twitter? Follow us @CodeBetter

Jean-Paul S. Boodhoo

Develop With Passion

November 2007 - Posts

  • Getting started with BDD style Context/Specification base naming

    I have received a number of good responses from people who have a couple of aesthetic issues with the BDD style naming that I am starting to use. Let me clarify, I have been using the natural sentence style test naming since Scott introduced me to it in earlier in the year. I have not used the context/specification style test naming on a project yet, though it is my intent to write each successive test from this point forward in that style and if I feel pain points I will let you know.

    From my experience so far here are some tips that I think will resolve the issues that the people who are trying to use it will find:

    Issue 1 – “I ended up really not liking those fixture names because I felt it was hard to find fixtures for specific classes, and navigate with Resharper Type navigation.  Was wondering what naming convention you came up with for fixtures?”

    A: My recommendation for this is to create a single test class in your test project called $SystemUnderTest$Specs. Where SystemUnderTest corresponds to the name of the class that you will be testing. This is just a grouping construct for all of the “Contexts” that will be run against that fixture. Inside the “Specs” class, you will create classes for each of the different contexts. Here is an example of one that I just rewrote the tests for the ShoppingCart class is the nothinbutdotnetweb.app project using this new style and I personally have to say that it was an awesome experience. One of the things that I found was that I could copy the body of one fixture and change the name to reflect the new context and I could focus solely on the interactions and behaviour that is pertinent to that particular context. Take a look at the Report that is generated when run against the specs in the ShoppingCartSpecs class:

    • When a product is added that is not already in the cart
      • The cart item factory should be used to create a cart item for the product being added.
    • When an item is added
      • The item count should be incremented
      • The item should be added to the underlying list
    • When the same product is added again
      • The item factory should not be leveraged
      • The quantity of the item should be incremented
    • When changing the quantity of a product in the cart
      • The item should be updated with the new quantity
    • When changing the quantity of a product causes the item to be empty
      • The item should be removed from the cart
    • When changing the quantity of a product that is not in the cart
      • Nothing should happen
    • When a product is removed from the cart
      • The item representing the product should be removed
      • The number of items in the cart should decrease
    • When asked to remove a product that is not already in the cart
      • Nothing should happen
    • When the cart is emptied
      • There should be no more items
    • When asked for the quantity of a product
      • The cart item representing the product should be asked for its quantity
      • The result should be the quantity of the item for the product
    • When asked to calculate the total cost
      • Should be the sum of the total cost for all items

     

    One of the things you will notice about the tests in these fixtures compared to the others in the rest of the project (so far) is the use of Setup to stress the context setup. I added a virtual method to the AutoMockingTest base called because, which calls out the action being invoked on the SUT.

    This actually resulted is some tests that contained no body whatsoever, and the ones with assertions actually only needed one assertion.

    This is a learning experience for me to, but so far, I am loving the expressiveness and focus this style of testing brings to the table.

    By grouping all of the fixtures into the ShoppingCartSpecs class, you can solve the navigability issue.

     

    The second issue I received was:

    “Quick question ... while the idea is great, it doesn;t flow for me, as ReSharper keeps cutting in and completing my words for me - Intellisence is great, but in this context is is annoying as hell ...

     

    How do you avoid this problem?”

     

     

    A – This is actually a ReSharper setting that I have had turned off pretty much since I started using ReSharper:

    • Go to ReSharper – Options
    • Select the Intellisense item in the left nav bar
    • Uncheck Letters and Digits in the Completion Behaviour pane on the right!!

    That’s it. Now you can write you natural sentences without ReSharper getting in your way. Since I have been without this setting since ReSharpers inception, I have gotten quick at using ALT-SPACE/CTRL-ALT-SPACE a lot, this may take a bit of getting used to for the people who were use to the Letters and Digits autocompletion behaviour.

     

    Again, as far as quickly navigating to the tests for a sut, you can just go CTRL-SHIFT-N and then start typing in the significant letters for the Spec class, in this case it would be:

     

    CTRL-SHIFT-N -> SCS

     

    Because all of the fixtures will be contained in the file but there will be no ShoppingCartSpecs type. I guess you could create one as a nesting construct, but that is what the file is for.

     

    Again, let me stress that this Context/Specification style naming is a little new for me, and there is a possibility that the tests in the ShoppingCartSpecs that have no assertions could be a smell (I’ll get that verified by Scott in a little while), I already see the benefits from both the documentation perspective as well as the ability to truly only focus on one specific context at a time.

     

    Develop With Passion.

     

  • Updated BDD Naming Macro

    After an awesome session pair programming with Scott the other day, I am going to start taking advantage of natural sentence style naming for not just my test method names, but the names of the test fixtures themselves.

    The name of the fixture will now become the context for the tests inside of that fixture. It is actually surprising what level of detail this allows you to express yourself.

    I had to change my test naming macro to support classes also. Here is the fix:

     

    Imports System Imports System.Windows.Forms Imports EnvDTE Imports EnvDTE80 Imports System.Diagnostics Public Module CodeEditor Sub ReplaceSpacesInTestNameWithUnderscores() If DTE.ActiveDocument Is Nothing Then Return Dim wrCS As Boolean = DTE.Properties("TextEditor", "CSharp").Item("WordWrap").Value Try DTE.Properties("TextEditor", "CSharp").Item("WordWrap").Value = False Dim selection As TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection) Dim index As Integer selection.SelectLine() If selection.Text = "" Then Return Dim methodIndex As Integer = selection.Text.IndexOf("public void ") Dim classIndex As Integer = selection.Text.IndexOf("public class ") index = CType(IIf(methodIndex >= 0, methodIndex, classIndex), Integer) Dim prefix As String = CType(IIf(methodIndex >= 0, "public void ", "public class "), String) prefix = selection.Text.Substring(0, index) + prefix Dim description As String = selection.Text.Replace(prefix, String.Empty).Trim selection.Text = prefix + description.Replace(" ", "_").Replace("'", "_") + vbCrLf selection.LineDown() selection.EndOfLine() Catch ex As Exception MsgBox(ex.Message) Finally DTE.Properties("TextEditor", "CSharp").Item("WordWrap").Value = wrCS End Try End Sub End Module

    Develop With Passion

    Posted Nov 29 2007, 02:15 AM by bitwisejp with 3 comment(s)
    Filed under:
  • Setting The Record Straight - My Thoughts On The MVP Variants (for web applications)

    Having received a bunch of emails in the past couple of weeks from people who have been asking me questions with regards to Passive View/Supervising controller patterns for web applications. I needed to let people know that for the last couple of months I have been developing web apps in a completely MVC style which eliminates the need for patterns like Passive View/ Supervising Controller.

    For the people who are using the MVP pattern in their (web) applications I personally would now lean to the Supervising Controller style as it eliminates a lot of necessary chattiness between the view and the presenter. It also lends itself to much more simple unit tests.

    Having gotten back into the Smart Client realm, I am once again reminded of the importance of patterns like Supervising Controller and presentation model as becoming essential to ensuring correct separation of responsibilities.

    For my web applications, however, all I use now is a:

    • Front Controller
    • Commands
    • View Templates (ASPX style!!)

    Here is an example of what I mean, for the nothinbutdotnetstore.web.app project that is currently hosted on google code, here is the Command that processes getting a list of the main departments in the store for viewing:

     

    using NothinButDotNetStore.Infrastructure; using NothinButDotNetStore.Infrastructure.Container.Common; using NothinButDotNetStore.Tasks; using NothinButDotNetStore.Web.FrontController; namespace NothinButDotNetStore.Web.DepartmentBrowser { public class ViewMainDepartments : ICommand { private ICatalog catalog; private IRequestContext requestContext; private IViewEngine viewEngine; public ViewMainDepartments(IHttpContext context) : this(context, DependencyResolver.GetImplementationOf<IRequestContextFactory>().CreateFrom(context), DependencyResolver.GetImplementationOf<IViewEngine>(), DependencyResolver.GetImplementationOf<ICatalog>()) { } public ViewMainDepartments(IHttpContext context, IRequestContext requestContext, IViewEngine viewEngine, ICatalog catalog) { this.catalog = catalog; this.viewEngine = viewEngine; this.requestContext = requestContext; } public void Execute() { requestContext.AddToStateBag(ViewBagItem.Departments, catalog.GetMainDepartments()); viewEngine.Display(Views.ViewDepartments); } } }
     
    Here is the complete ASPX (View Template) that gets rendered for that command executing:
     
     
    <%@ MasterType VirtualPath="~/Store.master" %> <%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" MasterPageFile="~/Store.master" %> <%@ Import namespace="NothinButDotNetStore.Web.FrontController"%> <%@ Import namespace="NothinButDotNetStore.Web"%> <%@ Import namespace="NothinButDotNetStore.Infrastructure"%> <%@ Import namespace="NothinButDotNetStore.DTO"%> <asp:Content ID="content" runat="server" ContentPlaceHolderID="childContentPlaceHolder"> <p class="ListHead">Select An Isle</p> <table> <% int rowIndex = 0; %> <% foreach (DepartmentDisplayItem dto in ViewBag.GetItem(ViewBagItem.Departments)) { %> <tr class='<%=(rowIndex++ %2 ==0 ? "nonShadedRow" : "shadedRow" ) %>'> <td> <a href='<%= Url.ToBeProcessedBy(CommandNames.ViewSubDepartments) .AddPayloadValue(PayloadKeys.DepartmentId,dto.Id).Build() %>'> <%=dto.DepartmentName %> </a> </td> </tr> <% } %> </table> </asp:Content>

    There is no code behind for this aspx page. The logic in the aspx file is there because it is rendering related logic. This aspx page does not talk to a service layer or domain objects or even a data access layer. It reaches into a ViewBag looking for information that it can render, and then it proceeds to do exactly what it should, render the information. What may not be immediately obvious is that this is a plain aspx file with no codebehind file. The page inherits from System.Web.UI.Page.

    As far as testability of this style of development, here is a sample test for one behaviour of the ViewMainDepartments command:

    [RunInUnitTestContainer] [Test] public void Should_populate_the_context_with_the_departments_to_display() { ICommand sut = CreateSUT<ViewMainDepartments>(); IEnumerable<DepartmentDisplayItem> results = CreateMock<IEnumerable<DepartmentDisplayItem>>(); using (Mocks.Record()) { Expect.Call(mockCatalog.GetMainDepartments()).Return(results); mockRequestContext.AddToStateBag(ViewBagItem.Departments, results); } using (Mocks.Playback()) { sut.Execute(); } }
     
     
     

    In the next little while I am going to shed some more light on this approach to web application development. IMHO, the separation of concerns for web applications written in this style is much greater than when trying to stuff in a pattern that (again IMHO) did not fit well for the technology, and was leveraged for the sake of increased testability.

  • code.google.com/p/jpboodhoo!!!

    I finally set up a googlecode project to host source code for the various things I have been doing over the last year. The first major significant contribution is of course the code drop that I promised a week ago now!!

    The application is the start of what I hope will evolve to be a great learning resource for lots of things related to .Net development. The application does not currently cover any of the “extra” topics that I did not have time to get covered in the course. This is perfect because as request come in from people (including past students) asking how to tackle a certain problem, I will use this application as the demonstration area where I can tackle the problem, and update the code base, and you will be able to update your local copy and carry on.

    I am currently in the midst of a large Smart Client application that I am hoping to be able to harvest pieces of code out and do the exact same thing except for the smart client realm. I have much more experience developing in the smart client realm and that is where I feel most comfortable, so I am looking forward to be able to do another code drop (for a different application) in a couple of months.

    I am going to write up another post about the Web Application as it is built very differently from traditional .Net based web applications. In following with the theme for my courses, there are currently no 3rd party frameworks (other than log4net) that have come into play. My goal with this web app is to demonstrate to people how far we can push raw .Net. The goal being that expanding their knowledge of how to creatively leverage .Net, they will be better prepared to jump into frameworks that they may currently feel daunted by. As time goes by, I will swap pieces of the application out with components that people are asking to see meaningful samples on:

    • NHibernate
    • Castle
    • Prototype
    • JQuery
    • ..*

    As the app stands right now I see it as the beginning of what will shape up to be a pretty mean machine!!

    I am going to post a screencast that will show people how to get started working with the web application. For people who are eager to get going right now, here are the quick and simple steps without a lot of explanation (that will come in the next post):

    • Anonymously checkout the trunk from the google code repository using the following svn command line:
      svn checkout http://jpboodhoo.googlecode.com/svn/trunk/ jpboodhoo-read-only
    • Navigate to the checkout folder
    • Go into the build folder
    • Copy local.properties.xml.template and paste it into the same directory, then rename the copied file to local.properties.xml
    • Open up the local.properties.xml file with your favourite text editor.
    • Modify any of the settings in the file that are different on your machine.
    • Open up a command prompt and navigate to the build directory of the code.
    • type: build load.data and hit enter.
    • type: build test.all.woc
    • type: build run
    • The last task should fail (I haven’t automated everything yet)
    • Create a virtual directory called nothinbutdotnetstore that points at the following location (this location is created after you attempt to run the build run task) : ${checkoutfolder)\build\deploy\web\app
    • After successfully creating the virtual directory try the build run task again.
    • If the web browser pops up pointed at a web page (for the app) you are in business. Feel free to click through the first set of pages that are implemented (only 3 pages are currently implemented).

    As far as what I have planned to implement in the web app (that is currently not implemented):

    • Build out a more extensive domain model that encompasses some more advanced scenarios of the application (especially around order processing).
    • Unit Of Work for the service layer
    • Implement a lightweight OR/M layer
    • Integrate some UI frameworks like prototype
    • Eliminate Master Pages completely and switch to a much more elegant template view pattern.
    • Introduce a more robust container (as the current one is a simple dictionary wired up in a simple procedural fashion).
    • Introduce the concepts of lifecycles for the items in the container. Right now, everything wired into the container is essentially a singleton.
    • Introduce CSS based layout for the web pages (working with a designer on this one).
    • Bring security concerns into play
    • Demonstrate how to effectively manage sessions
    • ……lots,lots,lots more!!!

    Obviously I will be leaning on people checking out the code and playing around with it and submitting requests for things they would like to see.

    There are a couple of things that you will immediately notice about the application:

    • Clean front controller implementation with ASPX pages as the template views. There are no code behind pages in this web application. All web requests are handled by command objects that interact with the service layer, push the details into a “ViewBag” and then choose which view to render.
    • Logical layers in the project are separated using simple folders and namespaces (not full blown projects)
    • Build automation is its own project in the solution (props to Jay Flowers for this inspiration)
    • The current container implements (CustomDependencyContainer) is very simple and is handled by a big procedural application startup task.
    • Compile time support for the database layer. A couple of classes ago I introduced the concept of a generic TableColumn<T> type. In England after introducing this concept Scott Cowan leveraged his knowledge of MyGeneration to automatically generate strongly typed table definitions that we could leverage to do mapping (trust me when I say, this is nothing like datasets). Until moving into OR/M concepts deeper this gives a good place to start as the generation of the TableDefinitions is linked to whenever the SQL files change, so you will get compile errors if column types are now mismatched etc…

    There are lots of other things I could talk about, but this code really is the start of what I see being a long running conversation between myself and other people wanting to learn. In all honesty for all of the emails I have not paid attention to this year, hosting code through google will allow me to answer peoples questions in a much more meaningful way as I can point them at this site to see the implementation of the code they had questions about.

    I am going to be placing all of the code for presentations that I have done for the last year as well as continue to update it with the source code that comes out of new courses that will be coming out in the new year, and the DNRTv episodes.

    Once again, the application is currently in its infancy, but as people start sending in the requests I now will have a venue and example to add upon to answer questions in a much more timely fashion!!!

     

    Develop With Passion!!!

     

     

  • Alternative To ALT-INS For ReSharper Junkies

    Everyone who knows me knows what a big keyboard junkie I am. When I am typing on my MacBook keyboard and not my natural (or datahand). There is not Insert key that I can use when in ReSharper.

    I know that there are utilities to remap keys to emulate the insert key, but I am not going to get into those.

    Here is the keyboard sequence to get to the Generate Code dialog (normally accessed by pressing ALT-INS):

    ALT – R – C – G

    Now here is the funny thing. After just using this sequence for a couple of hours I find it much faster than ALT-INS. I think this is because even though there are more keys to hit, the flight path of my hands on the natural keyboard is greatly decreased because I don’t have to move my right hand off home row. When I want to hit the insert key on my natural keyboard I have to move my right hand (this could also be due to poor keyboard technique on my part).

    Nonetheless, the nice thing about this sequence is now I am using the exact same key sequence when I am on my natural keyboard and my macbook pro keyboard!!

     

    Develop With Passion

    Posted Nov 25 2007, 03:23 PM by bitwisejp with 7 comment(s)
    Filed under:
  • Update To VS2008 Issue

    Thanks to everyone for all of the feedback. In the end, the first response that I tried was to install the latest copy of VisualSVN (I was running a slightly older version).

    After installing the latest version of VisualSVN everthing is functioning as expected.

    Posted Nov 23 2007, 10:02 AM by bitwisejp with 2 comment(s)
    Filed under:
  • VS2008 - Bringing Attention To An Issue

    Well, today I installed VS2008 on my machine. Setup went great and completed with no errors.

    This was a fresh install on a machine that had no prior beta bits installed whatsoever. So I did not anticipate anything weird happening.

    Fired up VS2008 for the first time and  it went through its normal first time setup deal. So there I was, in a blank IDE with my C# RSS Feed showing from the help page.

    I go to add a new project and I’m presented with this wonderful dialog:

    Ok…. So I try a few (lot) more menu items and the same thing happens. So, I think to myself, just exercise the standard Windows remedy. Get out, get back in, and see if it is better!!

    I would do that, if I could exit Studio!! Even hitting the big red x in the top right corner of VS2008 pops up this dialog. The only way to shut this down is to kill the devenv process.

    I am currently running XP with SP2 and an existing installation of VS2005. Again, let me stress that I have not installed any beta bits of VS2008.

    After un installing and reinstalling to no success (same result) I quickly googled. I happened to stumble into an MSDN forum where people are having the same issue and are also not sure how to go about resolving it.

    Has anyone else ran into this issue? How did you fix it?

    Posted Nov 22 2007, 11:01 PM by bitwisejp with 12 comment(s)
    Filed under:
  • Static Gateway - Part 2

    In the last installment I left off with a class that served as a Static Gateway for Logging functionality. The nature of the members being accessed statically allowed for pure syntactic sugar for clients who wanted to consume logging functionality. I got a lot of feedback from people who made comments about why I could not make use of a IOC container to accomplish the same thing. This post is my answer to those questions as that is exactly what I do on my own projects.

    When I get to the point that I need to introduce IOC into my codebase I drive it out in a test first manner. In the last implementation that I did here was the first test that I wrote:

     

    [Test] public void Should_leverage_container_to_resolve_an_implementation_of_an_interface() { Provide<IDependencyContainer>(CreateMock<IDependencyResolver>()); IDbConnection mockDbConnection = CreateMock<IDbConnection>(); using (Mocks.Record()) { Expect.Call(mockDependencyResolver.GetImplementationOf<IDbConnection>()).Return(mockDbConnection); } using (Mocks.Playback()) { DependencyResolver.InitializeWith(mockDependencyResolver); IDbConnection result = DependencyResolver.GetImplementationOf<IDbConnection>(); Assert.AreEqual(mockDbConnection, result); } }

    I am making use of the automocking container in this test so try not to get hung up on the semantics of what the Provide<IDependencyResolver> call is doing.

    All this test demonstrates is that I am going to have a class called DependencyResolver that will serve as the Static Gateway, to IOC functionality. I have also show that it is not necessarily going to do the work, but rather it will delegate to an IDependencyResolver implementation (mocked out in this test) to accomplish the work on its behalf. The implementation code to get this test passing is as follows: 

    public class DependencyResolver { private static IDependencyResolver resolver; public static void InitializeWith(IDependencyResolver resolver ) { DependencyResolver.resolver = resolver; } public static Interface GetImplementationOf<Interface>() { return resolver.GetImplementationOf<Interface>(); } }
     
    public interface IDependencyResolver { Interface GetImplementationOf<Interface>(); }

    So far so good. I continued to write one more test (based on my prior experience with leveraging containers) to ensure that I had better error messages if a dependency could not get resolved properly. This is most often caused by the underlying container not being configured with an implementation of a particular contract: 

    [ExpectedException(typeof(InterfaceResolutionException))] [Test] public void Should_report_more_detail_if_unable_resolve_an_implementation_of_an_interface() { Provide<IDependencyResolver>(CreateMock<IDependencyResolver>()); using (Mocks.Record()) { Expect.Call(mockDependencyResolver.GetImplementationOf<IDbConnection>()).Throw(new Exception()); } using (Mocks.Playback()) { DependencyResolver.InitializeWith(mockDependencyResolver); DependencyResolver.GetImplementationOf<IDbConnection>(); } }

    The accompanying implementation is fairly trivial:

     

    public static Interface GetImplementationOf<Interface>() { try { return resolver.GetImplementationOf<Interface>(); } catch (Exception e) { throw new InterfaceResolutionException(e,typeof(Interface)); } }

    The custom exception is as follows:

     

    public class InterfaceResolutionException : Exception { public const string ExceptionMessageFormat = "Failed to resolve an implementation of an {0}"; public InterfaceResolutionException(Exception innerException, Type interfaceThatCouldNotBeResolvedForSomeReason):base(string.Format(ExceptionMessageFormat,interfaceThatCouldNotBeResolvedForSomeReason.FullName),innerException) { } }

    Having used this technique on my last couple of projects, it did not matter if the underlying implementation of IDependencyResolver was a Spring adapter, a Castle adapter, or a StructureMap adapter, if the real container framework had trouble resolving a dependency, I would get a nice line in my log file that read:

    (omitting tracing information**) – Failed to resolve an implementation of an (Whatever the contract is).

    This helped me quickly go to the container configuration and deal with the errors as they were always to do with the way I was wiring things up.

    Now that I have this gateway for Dependency resolution in place, I should be able to leverage this from the Logging static gateway. I do this by changing my Logger test as follows: 

    [Test] public void Should_ask_dependency_resolver_for_a_logger_factory_that_can_be_used_to_return_a_logger_to_the_client() { ILog mockLog = CreateMock<ILog>(); ILogFactory mockLogFactory = CreateMock<ILogFactory>(); Provide<IDependencyResolver>(mockDependencyResolver); using (Mocks.Record()) { Expect.Call(mockDependencyResolver.GetImplementationOf<ILogFactory>()).Return(mockLogFactory); Expect.Call(mockLogFactory.CreateFor(typeof (LogTest))).Return(mockLog); } using (Mocks.Playback()) { DependencyResolver.InitializeWith(mockDependencyResolver); ILog log = Log.For(this); Assert.AreEqual(mockLog, log); } }

    This turns my implementation of the Log static gateway into the following: 

    public class Log { public static ILog For(object itemThatRequiresLoggingServices) { return For(itemThatRequiresLoggingServices.GetType()); } public static ILog For(Type type) { return DependencyResolver.GetImplementationOf<ILogFactory>().CreateFor(type); } }

    This means that from this point on, when I want to introduce another static gateway for some other piece of, typically, cross cutting functionality such as logging. The Static Gateway for that functionality can make use of the dependency resolver to resolve its dependency and it completely eliminates the need for static fields and initialization method in everything but the main DependencyResolver Static Gateway itself.

    I like to keep classes like Log kicking around because in my code that consumes Logging functionality I would much rather have a line of code in a client class that reads:

    Log.For(this).InformationalMessage(“Blah”)

    As opposed to:

    DependencyResolver.GetImplementationOf<ILogFactory>().CreateFor(this).InformationalMessage(“Blah”)

    The Log Static Gateway still shields the consumer from the details of how to go about logging so the consumer can carry on it its happy simple world.

    Develop With Passion!!

  • Stop Reading - Start Doing

    I had to laugh when I read “TDD Ain’t No Snowboarding from Alessandro Burrato. It is a direct counter to my TDD is Like Snowboarding post!!

    His experience of TDD is very different than the experience I documented based off of my experience introducing it to clients. And I feel that his recollection of the experience is definitely one that I would like to see more in the clients that I engage and the people that I talk to

    He makes one very good point that I can’t stress enough to people who spend their days reading blogs about the great stuff that people are doing, to quote him:

    “If, and only if, you stop seeking pre-cooked answers from those who already tried it and start friggin’ DOING something.”

    At one point or another, practical knowledge of a topic far outweighs any theories you may have built up in your head!!

    Nice post Alessandro.

     

  • Downloading VS2008

    The title says it all. Looks like I will be prepping a new VMWare image in a couple of hours!!

    Now the JetBrains people have a good target to aim at with getting a release out that supports the RTM of VS2008!!

    Develop With Passion

  • Amendment - Nothin But .Net, College Station Texas

    I made an error when I posted about the course I will be holding in College Station yesterday. The course that I am going to be offering in college station is a new course that I am delivering titled Nothin But .Net Fundamentals. This course is radically different than my Nothin But .Net course in that it is specifically targeted at people who are new to .Net development or who consider themselves at beginner level.

    One of the consistent pieces of feedback I have received from my courses this last year is the apparent firehose effect that comes from me not clearly specifying the prerequisites. In the case for the fundamentals class, there is only one prerequisite:

    • You need to have some familiarity with the C# syntax!!

    That’s right. That is the only requirement. As you can imagine, the class and the content that is covered varies greatly from the Nothin But .Net course, where I drill into topics like :

    • Domain Driven Design
    • Test Driven Development
    • ORM
    • Dependency Injection

    The fundamentals course is strictly about getting people comfortable developing using the .Net framework as a tool in their toolkit.

    I had to post this, in the event that people might sign up for the course accidentally thinking that it was going to be like the other courses I have delivered this past year, and that is not the case.

    Please re-read the post that I made (which has now been updated with the correct information) so that you can better understand how this course differs from the original Nothin But .Net course.

    Develop with Passion.

  • The Expert Mind

    An article , that David Truxall was kind enough to leave a comment about, explains beautifully what I was trying to convey in my Tale of two sons story.

    If you have a mentor, or someone you look up to as an expert in an area that you currently feel lacking. Maybe this article can give you some insight into the process that developed their abilities to the level you are aspiring to.

    http://scientificamerican.com/article.cfm?articleID=00010347-101C-14C1-8F9E83414B7F4945

    The following is one of my favourite excerpts from the article:

    A Proliferation of Prodigies
    The one thing that all expertise theorists agree on is that it takes enormous effort to build these structures in the mind. Simon coined a psychological law of his own, the 10-year rule, which states that it takes approximately a decade of heavy labor to master any field. Even child prodigies, such as Gauss in mathematics, Mozart in music and Bobby Fischer in chess, must have made an equivalent effort, perhaps by starting earlier and working harder than others.

    According to this view, the proliferation of chess prodigies in recent years merely reflects the advent of computer-based training methods that let children study far more master games and to play far more frequently against master-strength programs than their forerunners could typically manage. Fischer made a sensation when he achieved the grandmaster title at age 15, in 1958; today's record-holder, Sergey Karjakin of Ukraine, earned it at 12 years, seven months.

    As another commenter reminded me, Thomas Edison once said -

    "genius is 99 percent perspiration and 1 percent inspiration"

    Develop with passion!!

    Posted Nov 16 2007, 08:56 AM by bitwisejp with 3 comment(s)
    Filed under:
  • You know as much as you know "right now"

    Having had a lot of conversations with people over the last couple of weeks on strategies that have worked in my life to help ensure that I maintained my focus, I thought I would share a tip that my Dad gave me a long time ago.

    “There will always be someone who knows more than you do”

    Such a simple phrase, but it has had a huge impact on the way that I, in my own life, have dealt with the issue of personal development. If I don’t have to worry about “keeping up with the Joneses” that means that I can truly focus on improving myself for the sake of personal satisfaction and nothing else. I can be free from playing technology monopoly and only take a look at bringing on board technologies if and when I see a role and advantage to be gained by integrating them into my work.

    I can read blogs by people who are doing cool stuff and have it be an empowering thing and not a stumbling block to my own creativity. If I know as much as I know right now, I will know more tomorrow. Why? Because now the only person I need to challenge is myself. I can leverage the skills of people I have been surrounded by to be my sounding board for potentially wacky ideas that I come up with. The whole time, I am honing my craft and expanding the way my mind looks at solving problems that it is presented with.

    Posted Nov 16 2007, 12:40 AM by bitwisejp with 5 comment(s)
    Filed under:
  • A tale of two brothers

    (This story is purely fictional, although I am sure that in the course of history it is very likely that something similar happened)

    One day a husband and wife were blessed with a double miracle in the form of 2 identical twin sons.

    Within the first 4 years of their lives it had become evident that God had blessed the boys with a raw talent in the arena of sports. In order not to pressure them, and to ensure that each son was given the opportunity to pursue their passion, the parents decided to see how these natural abilities would evolve over the course of the years.

    Up until high school, both boys naturally participated in the same sports clubs and because of their God given gifts, they were able to excel to a level that eclipsed that of most of their peers. Fast forward a couple of years to high school.

    In high school one of the brothers decided to drop out of sports and follow an interest in business studies. In the meaning his brother was relentlessly pursuing the improvement of his physical abilities. His average day consisted of the following routine:

    • 5:00AM – Wake up for 30 minute jog to the swimming pool
    • 5:40 – 6:40AM – 1 hour intense swimming
    • 12:00PM – 12:40PM – Gym session at school
    • 4:00PM – 6:00PM – Gym session at local YMCA

    You get the point. This brother was taking the “time” and “effort” to hone a gift he was given. The other brother had found a new passion and although not given a natural gift for business, he was devoting his time to learn everything he could about business studies.

    Fast forward 10 years. The brother who followed the athletic path, excelled above and beyond both his peers and his brother in the arena of athletics. His brother, who was still gifted in athletics, was still at a slightly higher athletic level than that of the average athlete, but he was an order of magnitude of skill lower than his brother and even other people who had not been given a gift for athletics but had spent years improving their physical makeup and developing themselves as athletes. He was now an accomplished businessman and had build and developed several successful businesses once he had graduated high school because it was something that he trained to do, and improved on continually.

    What is the point of this story?? A lot of people ask me the question “How Do You Do It?” My first response to them is “What?”. They will continue by saying things like :

    • Maintain a healthy marriage for 11 years
    • Raise a family of 4 kids
    • Blog
    • Speak
    • Excel in particular areas of .Net

    My answer to them is plain and very simple. Why is software any different that any other skill that a person chooses to pursue. I absolutely believe that there are people who are born with a natural gift to be able to write software. A gift left unopened is still a gift unrealized. If you are one of many developers who has acknowledged that software is a craft that you can choose to hone like any other skill; you will see that all these people out there who you currently consider as “experts” are no different than yourself. The only difference is that lots of the forerunners in the field have chosen to hone their skills in one or more areas to a level that helps them stand out from the crowd.

    What does it mean to hone your craft in software development? In all honesty I truly feel that first and foremost it means writing a lot of code. Getting out of your comfort zone and solving a problem you have solved dozens of times before in a completely different way. Finding a group of peers who can challenge you in a friendly and competitive way to raise your own level of expectations for yourself.

    There truly is very little magic when it comes to looking at anyone who has been able to excel in their field. From the people that I look upto, they all share the trait of pursuing excellence in the craft that they have chosen for their careers. Be that software development or not.

  • Building a culture of integrity

    I had to laugh a little. The one blog post that I wrote this year which also generated the most comments is the only one with a hint of negative sound to it!!

    I have to stress one thing and people need to hear me when I say this. I am completely in acknowledgment of the fact that people make mistakes. As a sinner saved by grace, I am reminded of this fact daily. I make mistakes on a daily basis. If and when I get the opportunity to meet you, you will find that I wear my emotions on my sleeve and am extremely passionate about what I do for a living, and because in this past year I have been blessed with the opportunity to influence others on a larger scale it has raced to the forefront of my mind the importance of integrity in the role of leaders.

    In my last post, people were quick to jump on the fact that I seemed to be singling out some people in the community with the comments I was making. And that is definitely not the case. Let me also quickly state that regardless of how people read into that last post I in no way hold myself in any higher regard than anyone else.

    What I do hold myself to is striving to daily achieve a level of excellence for myself in the arena of software development. I strive to foster a community that cares as much about quality of character as much as it does quality of the code that is produced by a development team. I am not against people being out in the community sharing information that they have found to be useful for themselves. I personally feel that everyone who is out there sharing information should be letting people know that whatever knowledge they are sharing is based on their current level of knowledge and is information that, in my opinion, should be validated by a group of peers who are able to challenge the ideas that they are presenting.

    What I am asking for is for people to stop worrying about being politically correct (good point that was brought up from an attendee of my last course) when it comes to challenging “the experts” whether it be me or anyone else. I want developers to be more honest with themselves and the people they are engaging about the skillsets they have. I want developers to not have to feel stressed about the fact that a position is asking for skillsets X,Y,Z and they only have strong knowledge in one of the 3. For myself, I have found it such a freeing experience to be able to speak open and honestly with both clients and peers about where my skills do and do not lie. This completely changed the landscape of the interview process for me. I can be completely honest about what I do know and what topics I personally feel very strong in. I can also,be brutally honest about what I don’t know and what is currently not on my radar to look at in the immediate future. If one of these areas is a skillset that will make or break the deal, then so be it. I will have been given the opportunity to meet a new set of people and the decision will now be in their court and they will have been given information in its rawest form to make a decision that benefits them and their current set of needs.

    What is the point I am trying to make in short?:

    ( IsABlogger() && HasAnMVP() && HasDoneLotsOfPresentations()) != IsAnExpert()

    All that the above points identify is that an individual has all of the prerequisites that need to be in place to be recognized as a community influencer. It does not make them an expert. Expert, IMHO, is a very relative term. If you bring me onto a project and I am not able to deliver effectively with your team, then it does not matter how I was selling myself to the interview team, the developers that I am working with will be able to weed me out quicker than management potentially could.

    For myself and others (involved with community or not) I would like to see us be more honest with ourselves and the people we come into contact with on a daily basis about where our strengths and weaknesses lie in the realm of development. I would like developers to be able to drop the facades and set client expectations early in a very realistic way. I think if this were done on a more consistent basis, it would make for a much less stressful situation all around. 

    As for people who were asking me to name names, I am not going to. Part of my responsibility as someone who has witnessed and experienced this is to challenge and have conversations with the parties in question. All of these conversations that I have had over the year have ended in positive outcomes. It does not negate the fact the practice is there and there are changes that can be made to completely eliminate it from our everyday development culture. I would hope that if and when I start making claims about myself that are not true, somebody would be brave enough to step up to the plate and personally challenge me about it. Maybe that would be all I need to put my focus on integrity back into check.

    Posted Nov 15 2007, 11:30 PM by bitwisejp with 3 comment(s)
    Filed under:
More Posts Next page »

Our Sponsors

Free Tech Publications