About Me

Training

Nothin But .Net Developer Bootcamp

Navigation

Search

Categories

On this page

Typershark – Improve you typing in just minutes a day
Closing an anonymous method to a known delegate type
Combining two disparate collections
Nothin but .Net London – 2009 Wrap-Up
Van Presentation on Wednesday 15th July – Developer Productivity
Avoid the trap of perfectionism
Show Your Colors
The fallacy of the standardized developer machine/image
RubyMine on Windows 7

Archive

Blogroll

 Agile Developer Venkat's Blog
 Ayende @ Blog
 B#
 Barry Gervin's Software Architecture Perspectives
 Boy Meets World
 Brad Abrams
 Canadian Developers
 Christopher Steen
 Claritude Software News
 Clemens Vasters: Enterprise Development and Alien Abductions
 Coding Horror
 Coding in an Igloo
 Dare Obasanjo aka Carnage4Life
 Darrell Norton's Blog [MVP]
 David Hayden [MVP C#]
 Don Box's Spoutlet
 Eric Gunnerson's C# Compendium
 EZWeb guy: Jeffrey Palermo [C# MVP]
 Fear and Loathing
 Generalities & Details: Adventures in the High-tech Underbelly
 Greg Young [MVP]
 Greg's Cool [Insert Clever Name] of the Day
 IanG on Tap
 Ingo Rammer's Weblog
 ISerializable - Roy Osherove's Blog
 James Kovacs' Weblog
 Jason Haley
 Jean-Luc David
 Jeremy D. Miller -- The Shade Tree Developer
 JetBrains .NET Tools Blog
 Jimmy Nilsson's weblog
 John Bristowe's Weblog
 John Papa [MVP C#]
 Jon Skeet's Coding Blog
 JonGalloway.ToString()
 Jump the Fence or Walk Around
 Lambda the Ultimate - Programming Languages Weblog
 Larkware News
 Lutz Roeder
 Marquee de Sells: Chris's insight outlet
 Martin Fowler's Bliki
 Mike Nichols - SonOfNun Technology
 MSDN Magazine - .NET Matters
 MSDN Magazine - All Articles
 OdeToCode Blogs
 Onion Blog
 Planet TW
 Raymond Lewallen [MVP]
 Rockford Lhotka
 RodMan's Corner
 Roger Johansson's blog
 Sahil Malik - blah.winsmarts.com
 Sam Gentile's Blog
 Scott Bellware [MVP]
 Scott Hanselman's Computer Zen
 ScottGu's Blog
 secretGeek
 Service Station, by Aaron Skonnard
 Signum sine tinnitu--by Guy Kawasaki
 Stephen Toub
 Steve Eichert's Blog
 Steven Rockarts
 The Blog Ride
 The Coding Hillbilly
 The Daily WTF
 TheServerSide.net: News
 Tim Gifford
 Vance Morrison's Weblog
 you've been HAACKED

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

RSS 2.0 | Atom 1.0 | CDF

Send mail to the author(s) E-mail

Total Posts: 519
This Year: 28
This Month: 0
This Week: 0
Comments: 1593

 Wednesday, July 29, 2009
Wednesday, July 29, 2009 2:00:00 PM (Mountain Standard Time, UTC-07:00) ( Productivity | ScreenCasts )

As an excuse to play around with a modified audio/visual setup, I thought I would kill two birds with one stone and do a quick screencast on improving your keyboarding skills over time using the game TyperShark.

This screencast gives a brief overview of the game and a sample playthrough of one level.

The screencast can be found here.

If you enjoy the video/sound quality let me know as I am planning to do a lot more in the forseeable future.

Develop With Passion!!

Comments [4] | | # 
 Tuesday, July 28, 2009
Tuesday, July 28, 2009 2:00:00 PM (Mountain Standard Time, UTC-07:00) ( C Sharp )

If you are using extension methods as a way to achieve more language oriented programming, there are lots of times you will want to be able to run extension methods against an anonymous method, but you will first have to close it to a well known delegate type before it is allowed. Here is a useful method if you want the starting point to be an anonymous method created on the fly:

    public class CreateDelegate

    {

       public static DelegateType of<DelegateType>(DelegateType body) {

           return body;

       }

    }

Develop With Passion!

Comments [4] | | # 
 Monday, July 27, 2009
Monday, July 27, 2009 1:40:00 PM (Mountain Standard Time, UTC-07:00) ( C Sharp | Programming )

During class last week someone had written a piece of code right near the end of the last evening and I committed to showing them a potential refactoring that could be used. Here is the piece of code in question:

 

            var info_list = new List<ResolverConfigurationInfo>(parser());

            var resolver_items = info_list.Select(x => factory(x)).ToList();

 

            var index = 0;

            parser().each(item =>

            {

                resolvers.Add(item.AbstractType, resolver_items[index]);

                index++;

            });

The code is not really complicated. The messiness comes from the fact that an index needs to be maintained so that it can be used to lookup into another equally sized collection that is not the target of the iteration. There are obviously lots of ways to solve this, but I thought "why not just flatten the two collections into a single collection which eliminates the need for the index. Here is the resulting code that was produced:

 

            var info_list = new List<ResolverConfigurationInfo>(parser());

            var resolver_items = info_list.Select(x => factory(x)).ToList();

            info_list.union(resolver_items).each(item => resolvers.Add(item.first_value.AbstractType, item.second_value));

The union method is a new extension method that will take 2 disparate collections of the same size and combine them into a singular collection of Tuple<T,U> types. I created a simple Tuple class as nothing more than as an immutable parameter object. Here is the resulting code for it (very simple):

 

    public class Tuple<FirstType, SecondType>

    {

        public FirstType first_value { get; private set; }

        public SecondType second_value { get; private set; }

 

        public Tuple(FirstType first, SecondType second_type)

        {

            this.first_value = first;

            this.second_value = second_type;

        }

    }

Finally the code that pulls it all together is here in the extension method that does the heavy lifting:

 

        static public IEnumerable<Tuple<FirstType, SecondType>> union<FirstType, SecondType>(this IEnumerable<FirstType> first_set,

                                                                                             IEnumerable<SecondType> second_set)

        {

            Check.not_null(first_set,second_set);

            var first_list = first_set.ToList();

            var second_list = second_set.ToList();

            Check.ensure(first_list.Count == second_list.Count);

 

            for (var index = 0; index < first_list.Count; index++) yield return new Tuple<FirstType, SecondType>(first_list[index], second_list[index]);

        }

This method hides the details of the indexer into a utility method that can be used anywhere where 2 sets of disparate items of the same length need to be combined into a singular set.

Thoughts?

Develop With Passion!!

Comments [14] | | # 
 Saturday, July 25, 2009
Saturday, July 25, 2009 9:31:00 PM (Mountain Standard Time, UTC-07:00) ( Training )

Just got back from another amazing course in London, England. The class was great. As always I think I learned just as much from the students as I was able to impart to them. There were 15 of us in total, and with each successive course I am trying to find a way to get the students engaging in as much practical lab exercises as possible. There came a point where people felt that it may have been too much lab exercise and that they were not getting enough guidance. This feedback allowed me to make some adjustments. On day 4 and 5 the feedback from the auto correcting seemed to register well with people.

I would like to take this time to thank my London class for the honor of being able to share that instance week of training  them. I look forward to seeing what the future holds in store for all of you!!

God Bless You,

JP

Comments [0] | | # 
 Monday, July 13, 2009
Monday, July 13, 2009 7:00:00 PM (Mountain Standard Time, UTC-07:00) ( Presentations )

The folks at VAN were kind enough to give me the opportunity to speak on the topic of developer productivity. We are going to attempt to discuss factors that can prevent us from achieving betters levels of productivity in our workplace. Of course, I am sure there are going to be other topics that come up!!

If you have time and are able to make it it would be great to have you join in on the conversation:

Start Time: Wed, July 15, 2009 8:00 PM UTC/GMT -5 hours
End Time: Wed, July 15, 2009 10:00 PM UTC/GMT -5 hours

Develop With Passion!!

Comments [0] | | # 
 Thursday, July 09, 2009
Thursday, July 09, 2009 3:00:00 PM (Mountain Standard Time, UTC-07:00) ( Inspiration | Productivity )

I am just in the process of thinking about a VAN presentation that I am going to be delivering. The topic is that of developer productivity. One of the things I read this morning was an excerpt from the book Pragmatic Thinking and Learning (an amazing book). The actual fragment that caught my attention was written by an author named Anne Lamott:

"Perfectionism is the voice of the oppressor, the enemy of the people. It will keep you cramped and insane your whole life, and it is the main obstacle between you and a shitty first draft. I think perfectionism is based on the obsessive belief that if you run carefully enough, hitting each stepping-stone just right, you won't have to de. The truth is that you will die anyway and that a lot of people who aren't even looking at their feet are gong to do a whole lot better than you, and have a lot more fun while they're doing it."

This fragment sums up perfectly a phrase I say "a lot" to people that I have an opportunity to work with: "Perfect is the enemy of the good", I can't remember where I first heard that phrase many years ago, but it has been something that I tell myself all the time. I am not at all trying to say that we should not strive for excellence in the tasks that we undertake, I am just saying that the very act of wanting to come up with the "perfect" answer/solution right off the bat is the very thing that can often stop you from even starting the effort in a timely fashion. Instead of writing a crappy piece of code and taking the time to refactor to a cleaner solution, you can spend countless amounts of time staring at a screen, reading a book on good design, looking at other good designs. None of these activities are fruitless, but if they are the very things that stop you from making your own progress then they actually become a detriment to your individual progress. Worse, if those activities further cause you to think about how "imperfect" your own initial solution might be, you can very well paralyze yourself and put yourself in a situation where you will waste precious time.

Today you may well be facing down a tough problem, one that you have not yet faced before. My recommendation for you is tackle the problem in context, draw from your past skills, learn from your mistakes, and just take the first step. As a diligent coder you are not going to allow code smells to remain in the product that you build, but allow yourself to let the code take its initial shape and then "refactor without mercy". Rinse and repeat this process until you have your solution in hand. Enjoy yourself, remember why you became a coder in the first place.

Develop With Passion!!

Comments [6] | | # 
 Monday, July 06, 2009
Monday, July 06, 2009 2:00:00 PM (Mountain Standard Time, UTC-07:00) ( Inspiration | Training )

The Nothin but .Net course has been running for just over 2 years now. In that time I have had the amazing opportunity to share technical and personal information with over 700 developers.

It is always awesome to hear back from alumni and be informed as to how they are progressing in both their personal and professional lives. To feel like you have had a positive impact and were able to add value to someone's life is an awesome thing. I just received an email from a recent alumni who signed his email with the following:

"Developing With Passion"

This is a slight play on words from my companies tagline: "Develop With Passion". It is also extremely appropriate. If you are an alumni of one of my courses and you feel that the course has been something that allowed you to take awesome positive steps in either your personal or professional life, I am going to challenge you to "show your colors" for the next month by signing you emails: "Developing With Passion". Together, let's remind people why we do what we do:

  • Competing against ourselves daily, not for someone else, but because we want to be better
  • Adding value to our families and communities
  • Adding value to our employer
  • Not being satisfied with mediocre in our personal or professional lives
  • Being a catalyst for change in scenarios that seem change averse
  • Working out with patience and diligence the tasks we are given to complete
  • Making our dreams a reality!!

Develop With Passion!!

Comments [5] | | # 
 Thursday, July 02, 2009
Thursday, July 02, 2009 2:00:00 PM (Mountain Standard Time, UTC-07:00) ( Tools )

One of the discussions that comes up with a lot with other developers that I talk with is the question of "How productive I would be if I were not able to use the tools/frameworks that I use to make me a much more productive software developer." The basis answers is: "much less". Having worked in environments where people can be forced to use "standardized" developer images with a common toolset that give no room for individual customization, I can tell you that the observations I have made are a couple of the following:

-Unwilling acceptance of substandard tooling to get the job done
-Potential ,in reality very often often, loss of individual developer productivity
-Developer frustration on a daily basis with the "policing" rules that are in place
......

I stopped the list short as it can really go on and on.

The reason that the standardized developer machine cannot work is that every developer "wields their lightsaber differently". The tools and customizations that I have made to my machine are the steps I have taken that allow "me" to achieve great levels of productivity. I have to stress these are the tools that make me productive. They make me productive because I know how to use them, I have taken the time to hone my ability to use them. I can't expect that another developer who comes onto my machine would be as productive if they were not familiar with the tools/techniques.

Of course if I were to bring another developer to pair with me on my machine and they were not proficient in using these tools, they would be just as unproductive (initially). It is more likely that they have a set of tools/customizations that they have made to their machine that allows them to work extremely effectively. The point is that they are able to make the modifications to their individual machine that allows them to become more productive.

What are your thoughts on approaches to machine/software configurations in teams?

Develop With Passion!!

Comments [5] | | # 
 Wednesday, July 01, 2009
Wednesday, July 01, 2009 2:00:00 PM (Mountain Standard Time, UTC-07:00) ( Ruby | Tools )

Since I moved everything over to Windows 7 the last program that I had not yet installed was RubyMine (JetBrains awesome IDE for Ruby coders). After I completed my installation I fired up the program and was presented with a great exception dialog:

image

A quick search proved that the issue is with some settings in the idea properties file:

# path to IDEA config folder. Make sure you're using forward slashes
idea.config.path=${user.home}/.RubyMine10/config

# path to IDEA system folder. Make sure you're using forward slashes
idea.system.path=${user.home}/.RubyMine10/system

# path to user installed plugins folder. Make sure you're using forward slashes
idea.plugins.path=${user.home}/.RubyMine10/config/plugins
(on my system in : C:\Users\Jean-Paul Boodhoo\.RubyMine10

More specifically, RubyMine was not able to write to those folders as they were marked as readonly after install. I quickly changed the folder permissions and RubyMine was able to start up with no problems.

Develop With Passion!!

Comments [3] | | #