The Big Yes, Focus and Squirrels

Lately, the notions of "having a bigger yes that permits you to say to no to other things" and "focused intensity" have been on my mind.

The Bigger Yes

The basic idea here is that you have some compelling big thing that you are saying yes to in your life.  This permits you to say no to other things.  An example would be that students will choose to say no to some activities because they are saying yes to their education.

Focused Intensity

There is the notion of living a life in balance.  There is another of focused intensity.  Mastery and the exceptional are more often associated with focused intensity than balance in all things.

I was doing some research on focused intensity and came across this blog post:

http://mistakemaker.com/2009/11/23/momentum-lessons-from-a-spray-bottle-and-a-4-year-old/  With an interesting formula/idea from Dave Ramsey.  And in a round about way led me here: http://lci.typepad.com/leaders_resourcing_leader/2010/01/my-entry-2.html

I took/thought about the formula in the first and noted that dividing by time (over time) was totally incorrect.  The last post is better.  However, it still seemed a bit off to me.  So, I revised the equation as a summation and added a target set of goals for focused intensity.  I don't think the result is momentum.  To me the result would be the achievement of a goal. 

The Squirrel Diverter

Once upon a time I read about an idea to create a specific to you web page and set that as your start page.  The basic notion is to  redirect yourself away from the squirrel that had grabbed your attention.  Here is Merlin Mann's page: http://www.merlinmann.com/rightnow/

With out too much effort you can create your own default web page.  If you host it on your website and use Chrome with Google Sync it can be your default page everywhere!  Or simply save it as an HTML file on your machine and default to it.

The Result

So, thinking about the focused intensity formula, my big yes and the squirrel diverter, I created my own default page.  I used html so that I could list the most important goals and easily update them.  The end result can be seen here:

http://dbbear.com/focus.html

I would encourage you to think about your big YES and create your own focus intensifying start page.

UPCRC Multi-core programming school @ UIUC

One line summary: The UPCRC multi-core programming school was very intense in a good way.

The Material

We eased into things with a basic intro to parallel computing Monday afternoon. Tuesday-Thursday were all very fast paced. We had lecture from 0845-Noon and then again from 1PM to 2PM. At 2PM they would do an overview and introduction of practical labs that corresponded to the days lecture materials.

There were always more labs to choose from than you could complete in a day. So, it was up to the student to pick the labs which they thought would be most beneficial to them. We had lab time between 2:30PM and 5:30PM. During this lab time the lecturers from the day were available. We had a forced :) supper break from 5:30PM-6:15PM. The lab and lecture area were locked up during this time. The lab reopened at 6:15PM and closed at 10:00PM. During this time frame knowledgeable GTA/GRAs were available to answer questions.

I was already somewhat familiar with Java explicit threading so there weren't any surprises there.

OpenMP was probably the easiest to work with and use. It uses pragmas with C++. Visual Studio 2010 has out of the box support for OpenMP.

Intel TBB took some work, but it is more powerful/flexible than OpenMP.

.Net Parallel LINQ (PLINQ) and the Task Parallel Library (TPL) were interesting. It was interesting to work to apply lessons from here in a previous .Net project that does everything in a serial way. It reminded me that we need to make special considerations when ordering is important. Also, you really need to know and understand lambda expressions.

The OpenCL material was by far the hardest. It was difficult in terms of the steps to set up the code and in debugging/figuring out what was going wrong. I was able to complete a Matrix Multiply lab. However, it took about 5 hours. From what I gather only one or two other people completed that lab.

We had a two hour lecture on Thursday regarding vectorizing code. It was very intense and very interesting. I feel like the professor probably covered two weeks of graduate material in those two hours! It was helpful to learn about dependences and how loops could be unrolled or how loops could be changed to allow the compiler to do more optimizing. I need to review the slides and notes from this lecture.  As I recall we covered 48 slides in each of the one hour sessions.

My overall impression is that it is much easier to work with multi-core CPUs than GPUs. The other I noted that there seems to be more focus/maturity in C/C++ support. I'm sure that will change as the SDKs mature.

We wrapped up Friday with a look at an Intel analysis tool and overview of what had been covered and what had not been covered.

Blue Waters

Friday before lunch we toured the future home of the IBM Blue Waters/NCSA facility. It is simply huge. They had what appeared to be many servers in place, but they were actually the power distribution centers! The first floor of the building is all mechanical infrastructure. The building is also set up to be secure facility with swipe cards, PIN entry, retinal scanning and even a "bell" that you are locked in and weighed in.

Summer School Environment

The building facilities, labs, lecture room (power on top of the table at all spots), meals and snacks were all excellent.  The building architecture itself was interesting.  There were many areas inside and outside of the building where you could sit and work.  They also had areas on every floor with seating and whiteboards.

People

Instructors were enthusiastic about the material and were open to questions. It was great that they helped in the labs and were available for questions that were related to the material yet unrelated to the labs. If you had a question about how something they covered might relate to your research they were interested in talking with you and discussing it.

Assistants were knowledgeable and helpful with the lab environment and the labs too.

Staff kept everything running smooth and on time.  They also managed to arrange for good meals and snacks.

The school was also an awesome opportunity to talk with other students from around the world that are interested in this aspect of programming. It was neat to hear the varied application areas that were being considered.

Summary

Overall, a great experience.

http://www.upcrc.illinois.edu/summer/2010/program.html

Something I may consider for next year is another school that they offer:

http://www.vscse.org/summerschool/2010/manycore.html

Data Parallel Computing

Data Decomposition Parallel computing works by using a shared data object with multiple “processors” working on it. image

the toy problem

To learn more about Data Decomposition type parallel computing I created a toy application. This entailed creating a demo application that utilized a basic stopwatch instrument, a serial computing class and a parallel computing class.  The application will perform row or column based operations on an 8K by 8K array.

Since I needed to time runs I created a basic stopwatch class. This class provides for starting the stop watch, checking elapsed time and stopping it.

the serial code

I created a serial computing class that initializes an 8K by 8K array of integers and has methods for computing across rows and computing down columns. I created these two methods so that I could see potential differences in working with the array via row or column.

The serial class is used as the baseline which the parallel class is compared against.

I wanted to make sure that the results from the serial and parallel calculations were the same. Therefore, I added methods to the serial class that can be used to check that the parallel results match.

the parallel code

Because the implementation language was Java, the parallel code class extends the Thread class. The Thread class works by using a run() method that takes no arguments. To cope with this, I use a private constructor to determine which method to run. The parallel methods create a new instance which takes arguments for if the row or column method should be called and the start and end value of the domain. These arguments set internal variables which are then used within the run() method.

Psuedo-code for the parallel computation:

computeRowsDomainLimited(int startRow, int endRow)

{

Partsize = size / # threads

Remainder = size % # threads

 

For o = 0 to < # threads

{

Start = o * size

End = start + partSize

computeRowsDomain(start,end)

}

computeRowsDomain(end, end+remainder)

 

Set up threads with the above

Then run them

Then join/wait for all to finish

}

Results

The development machine was a powered by an Intel I7-720 with 6Gig of RAM.  The baseline serial methods and the parallel methods of varying partition/thread size were each run 10 times.  The best run time is used in the calculations.

image

image

The code seems to scale well and perform well for the row based computation up to 8 processing threads. Then it seems to drop off a bit and then gradually taper off in performance. I think this corresponds to the machine having 8 logical cores. After 8 the overhead of the additional threads is greater than any potential benefit.

However, the performance the columns seems to peak out around 4 or 5 threads. This could be because of the CPU having 4 real cores with Hyper-Threading. Or it may be that the overhead of accessing non-continuous memory is the determining factor.

Source Code

Source code for the demo application that utilizes the stopwatch class and both the serial and parallel computing classes can be found here:

http://www.dbBear.com/DataDecomposition.zip

In the future I will implement the same computations using OpenCL.

Shim it!

The lock on my front door was tough to turn.  I was afraid to turn the key too hard for fear of snapping it off.  I figured out that if I lifted the handle up that allowed the bolt to properly seat.  I noticed where the bolt was rubbing against the striker plate and the cut out in the door frame.  I bored out the opening in the wood slightly.  Minimal improvement, but still not satisfactory.  I tried moving the striker plate.  I didn’t want to force it too much since the screw holes would have to be filled and re-drilled for any major adjustment.  I even tried moving the locking mechanism to alter the angle of entry into the striker plate.  I did notice that the whole door seemed like it was a bit out of square with the frame.

Then it occurred to me to place a shim under one of the hinges on the door to adjust the whole door.  This worked!  The whole door is now square in the frame and it has a better seal with the gasket.  No daylight.

Software

Have you been tweaking, altering and adjusting parts of your system when a shim could be place in the right place and make the whole system work properly?  Perhaps, a strategically used adapter pattern would make the whole application easier to code?  Maybe some small tweak in the UI could lead to a more enjoyable experience through out the whole system?

Hot on the edges, raw in the middle

Use the microwave at 100% to cook or reheat and you can end up with something that is hot on the edges or the outside, yet raw in the middle.

However, if you utilize the manual settings, like 60% power level with more time you will find that the food is more evenly cooked.  Or better yet, consult the manual and use the correct settings for the food type and quantity.

In the software development processes, breathing time/thinking time is good.

100% full bore gets you done.  However, when you have time to think about the system you may experience remorse.  To extend the microwave analogy--perhaps,  you have a nice shiny UI but rotten messy code under the hood.  With an appropriate “cooking temperature” you’d have both a nice UI and good code under the hood.

Task Parallel Computing

There are two primary parallel computing techniques: task parallel and data parallel.  Some key aspects to consider if tasks can be run in parallel:
  • Are there dependencies between tasks?
  • Does the result of the operations change if you change the execution order?
  • Will there be contention for data or some other resource?
  • Will we get a return on investment for the overhead of configuring and running in parallel?
  • Do we have a significant number of tasks to run?  We should have more tasks to run than we have cores.

Batch processing

I created a BatchProcessor solution with a console application called BPRun.  This project runs a setup portion, the parallel tasks and then the teardown jobs.   The tasks to run are specified in corresponding configuration files.  I use code similar to this in production for batch processing ~20 DOS .bat jobs.  Being able to have jobs run in a parallel fashion has resulted in a significant time savings.

Setup and Teardown

The setup and teardown portions of the application are run in a serial fashion.  The items in the configuration files are executed one after another.  Comments may be placed in the file with // prefixing.

Task Parallel

The task parallel section executes the items in the corresponding configuration file.  As a task finishes the scheduler picks up and runs the next job on that process.  The code that does this is in a corresponding Processor class.

Tasks with dependencies

What if you have a task that has a dependency?  You can chain them.  That is, have the first process or task call the second or dependent task upon completion.  For instance, you may have a job that does some data prep and then chain it to call a task that does analysis.

Keeping Busy

On *nix systems we have the sleep command which we can use to pause for the given # of seconds.  However, this doesn’t place any load on the machine.  I wanted the machine to have a load placed on it by the tasks so that we could see that it is really taxing the machine.  To that end I created a small console application called Busy.  This takes the number of seconds to be busy as a parameter.

Download

You can get the source code for the Batch Processor and the Busy application here: https://github.com/k0emt/BatchProcessor

Video

See a video tour of the code for Busy and the Batch Processor along with demos of the applications here:

Programmer Productivity Tools

I’ve been reading Neal Ford’s The Productive Programmer.  It’s a good read so far.  I’ve picked up a few tools that have already been helping.  Pick up the book for the details on the reasoning behind having/using these utilities.

Virtual Desktop Manager VirtuaWin this lets you have multiple virtual desktops.  I’m using one for communication apps, one for development, one for research and one for miscellaneous stuff.

Clipboard Manager Tool Ditto.  So far, I’m not very fond of the UI but I like the way it works.  Let’s you work with a clip board stack across all of your apps.  I used it to clip all of the URLs for this article and then paste them in appropriately.

Clipboard Manager that is a Windows Gadget.  Lots of background choices.  It’s a Windows Gadget so it’s always visible.  However, I’m not liking the way it works.  I’ll probably drop it.  Just thought I’d give it a whirl and thought gadget lovers might go for it.

Cygwin for bash, *nix-ish utilities, vim, Emacs, wget, curl, etc.  Keep around the downloaded executable.  It’s really a loader and not an installer per se.  You’ll also have a download folder that accompanies the loader.  So, you may want to pre-plan where you’re going to keep that before you run the loader.

Clean code motivates

sweaty_hat I’m still dripping as I’m writing this.  (Okay, maybe not now, but when I did the voice memo recording I was!)  I’m just feeling very inspired and want to get this down in bits.

A lot of people talk about code smell, what it is, how to detect it and anti-patterns.  However, the thing that struck me today was this:  I was out mowing the yard.  The temperature was like a billion degrees, it was humid and I was mowing uphill no matter which way I turned!  So basically, it was hard work.  The thing that struck me was that I hit a section of air that smelled like a fragrant fabric softener.  It really perked me up.  I felt rejuvenated and mowed with more gusto.  I looked forward to returning to the portion of the yard that had the scent in the air.

The crossover

That got me thinking about code smell.  Besides code taking us more time to work through because of quality issues, there is also the issue that it smells!  It is repulsive, it is repugnant, it is de-motivating!  Who wants to go work on the smelly code?  No one wants to do it.  It is like being told to retrieve a book that is in a library that is located in the middle of a landfill.  No one wants to do that.  I think there is a psychological aspect of smelly code that should be considered.  That is, people want to stay away from stinky code.

On the flip side, are you excited when you get to go work in clean code?  Code that is well factored, code that uses patterns, code that you can understand, code that is a joy to work with.  I know that I can honestly say that if I have an application to work on and I know that it exhibits the qualities above, has a good design and has a reasonable amount of documentation I get excited about working on it.

Also, when I’m working in clean code I don’t want to be the one that dirties it up—regardless of who wrote it.

In conclusion, I would counsel that messy code besides having quality issues is also de-motivating.  Clean code, good smelling code is a joy to work with.  Strive for clean code.

Selecting a machine for OpenCL / GPGPU use

What is GPGPU computing?  GPGPU stands for General Purpose computing on Graphics Processor Units.  The basic idea is that we use the graphics card to do some computing.  Today most computers have 2 cores and some as many as 6.  With hyper-threading we may see what appears to be double that many processors.  However, a video card such as the NVidia 480 has “cores” or processors.

Portable or Desktop?

If you choose a portable machine you will be able to take the unit with you for presentations, research or on the go development.  However, you will typically sacrifice in the power or number of cores that the video card has available.  For instance a laptop with a GT330M has 48 cores.  A desktop with a GT330 has 96-112 cores.

You’ll also likely have a much harder time finding a suitable laptop.  When choosing a desktop, go for a mini-tower case or one that can be purchased with the appropriate video card.  Current video cards often take additional power from the power supply and require additional ventilation.  For instance, you could purchase an HP HPE-380T with an NVidia GTX260 with 1.8G of DDR3 RAM and 192 cores!

ATI or NVidia?

NVidia is known for its CUDA entry.  ATI has ATI Stream computing.  Both companies now have drivers for OpenCL.  I chose to go with NVidia because I was able to find my resources for their products.  ATI Stream is fairly new.

Whichever you choose, you will need to know what type of computing/gaming you plan to do and if there is existing support for that.  Also, you will need to make sure to check the manufacturers pages to see if the video card you have selected is supported for GPGPU use.

Cores, speed

In general, the more cores or shaders the better.  Also pay attention to how fast they are running.

Memory

What type of memory? In general you want to stay away from shared memory.  This makes use of the slower system memory and steals resources from the PC.  Look for DDR3 or DDR5 memory.  Sometimes they are prefixed with a G like GDDR3.  In general DDR5 is faster.

How much memory?  After consulting with a professor with experience in the field he suggested 512M minimum.  If you can get more that is preferred. 

Sony CW, F and Z series

Because I wanted to be portable and have the minimum 512M with an NVidia card, I considered the Sony CW, F and Z series computers.

However, these machines are new enough that the released video drivers do NOT support OpenCL.  I did find that there is a way to modify the released NVidia drivers to work on them.

http://forum.notebookreview.com/sony/472664-vaio-f-nvidia-drivers-update-197-16-gt-330m-10de-0a29.html

After using the information above, I was able to run the Particles demo from here:

http://code.google.com/p/nativelibs4java/wiki/OpenCL

However, the hardware identification and mandelbrot set generator on that site don't work.

I also downloaded and tested a CUDA based mandelbrot application that was listed on the NVidia featured applications site.  It ran nicely.

Prelude: CTS, ITS & Parallel Computing

This summer I will start a journey into Computational Transportation Science (CTS), Intelligent Transportation Systems (ITS) blended with parallel, distributed and agent computing.

I will specifically be exploring OpenGL and OpenCL.  One of my major objectives is to explore the use of the Graphics Processing Unit (GPU) in “general purpose” computing (GPGPU).  Specifically, I will be utilizing the NVidia GT330M GPU.

Along the way I’ll also likely explore other environments such as JOMP, JPPF and MapReduce.  I’m also planning to use Neo4j for persistence.

It is my intent to model some non-signal controlled intersections this summer.  Long term I will explore coordinated signal controlled intersections.

As part of this exploration I will also seek input and insight from those in the industry and in academia so that I can avoid reinventing the wheel and stand on their shoulders.

Forthcoming posts will include specifics about hardware selection, and software installation.

Outlook Tips

Here are some Outlook tips and tricks that I find very useful.

Hide/Show Buttons

Hide buttons if you want more vertical navbar space.

image

Customize the Quick Access Bar

I have mine optimized for TabletPC use.  I can do a send-receive, undo, delete,  show/hide navbar and show/hide reading pane.

image

Additional Windows

Right click on a button and choose Open in New Window to open an additional window with that item type.

image

Schedule an item with drag and drop

Drag and drop an email or to do item onto the calendar in the to-do bar or the calendar that is showing in another window to schedule a new calendar item.  If you do this with an email it will drop the email message into the memo portion of the calendar event.

image

Dropping on a date/time on a full calendar the event will default to that date/time.  Using the to-do calendar you will need to specify the time.  You can also customize your to-do bar to show more months, filter what appointments are displayed and choose to the task list by right clicking on it.

Keyboard Shortcuts

Write a new email with <CTRL>+<SHIFT>+M

When viewing an email <CTRL>+R to reply to the selected email.

<F9> do send-receive.

Here are a couple of articles with many more keyboard shortcuts:

http://www.groovypost.com/howto/microsoft/outlook-2010-keyboard-shortcut-keys/

http://gadgetinspiration.com/blog/outlook-2010-keyboard-shortcuts

Your Turn!

What are your favorite, but maybe obscure power user tips/tricks?

The "I" in Team

We often hear the expression, "There is no I in team!" Let's take another look at that. Where are the I's in team? To me, the first thing I think of is the individuals that make up the team. Some “I's” that are associated with the individual are individuality, initiative, imagination, insight and intrinsic motivation.

I know some of you are going to find this hard to believe, but individuals don't always agree on everything all the time! Individuality and respectfully differing opinions should be welcomed on the team. It makes us stop and think about why we should take one approach and not another. We have some creative people on our teams, so we shouldn't be surprised that there will be multiple (noncompatible) solutions offered. Perhaps we can splice and merge together from the solutions offered to create an even better solution!

It will help in these times of differing opinion to consider that the other person, like us, is working toward the same common goal. A shared vision for a common good has been embraced by the team. It is important that there be open, respectful communication within the team since there will be people with differing personalities and skill sets. In a team setting like this, we come to expect that individuals who are subject matter experts will work with other members to achieve the common goal and to mentor and help them grow as well. The individual is truly valuable in what they bring to the overall health of the team.

Our team members show initiative! If they spot or think of a potential problem, they will bring it to the manager’s attention and most likely already have thought of a solution. Individuals bring value to the team when they've exercised initiative to find a better way of completing a common task and share it with the team. For instance, if a team member demonstrates to the team a refactoring feature, or does something with an advanced language feature, the whole team benefits.

One of the most valued aspects of the individual is his or her imagination. Software development is a creative endeavor, especially UI design. The UI designer must think about how a user will interact with the software, keeping in mind principles such as "least surprise" and "expected default" and presenting a visually pleasing interface. The business layer developer must think about how the classes will work with each other and consider where inheritance and polymorphism make sense. The difficult part for managers is knowing when and how to interject their own individual view on the solution.

Our team members bring valuable insight into our business processes. It is especially true that, in information technology, our development teams gain a deeper insight and understanding of the business practices the longer they have been with the organization. Oftentimes this insight can answer the question, "Why?" Be sure to create an environment that fosters true teamwork, pairing and cross training among all people on the team.

This individual we have been discussing is also likely intrinsically motivated to achieve his or her job goals and to continue professional development, while being a professional and doing high-quality work. Software standards and processes can be mandated and taught. However, until they become an intrinsic part of the individual’s personal software process, the team will not see the benefit.

A team is not merely the sum of the individuals that make up the team. I believe when you look at truly productive teams, you will find an environment of communication and shared vision working toward a goal of common good.

Authentic Dialogue

When I am talking with someone and I don’t understand or know the term/idea they are using, I say so!  Yes, there is some feeling of vulnerability.  However, the honest communication will lead to a more authentic relationship which hopefully translates into a more productive and enriching exchange.

Living in “the fake” will wear you out.  If you don’t know or understand, say so!

-- the truth will set you free!

Gut Alignment

Ok, so back to this coffee pot.  It is just too nice to give up on it.  So after another read of the manual and not learning anything from that, I looked at the coffee pot.  I tried to leave my preconceived notions of how it should work behind.

After some study of how I thought the filter should go in and how it sort of worked, I tried something different.  I noticed a “trough” of sorts at the bottom of the basket.  This time, I rotated the filter 90°.  That made all the difference in the world.  The filter now fits snugly into the basket and all is right with the world.

So, when I let the coffee pot reveal itself to me I gained insight and now there is a symbiotic relationship!

In our relationships and work environments it is important to try and understand the motivations of our employees, employers and customers.

For instance, reflect on what is important in life to you, your values.  Then consider the goals of your employer.  If there isn’t some alignment it is likely that you won’t be happy there.

Bad coffee pot! X^(

I know, I know! Back to the coffee pot. We were trying to make adjustments to the process and having trouble. The management (my wife) noticed the problems I was experiencing. Most noticeable were the backed up coffee and grinds overflowing onto the counter.

So, we were losing time, precious resources (beans), creating a mess and had nothing to show for it. Management said, enough!

The coffee pot was removed and we went in search of a replacement. We ended up with a high quality (and high initial expense) specialized single cup brewer. This works out really well since I am the only coffee drinker in the house.

I've gotta say, after the team metaphor with the last post, my team was really dismayed to hear that the coffee pot got swapped out! The moral of this post is therefore left as an exercise to the reader.

New Team, New Rules

I have had my old coffee pot for years.  It uses a basket filter.  I grind my coffee beans right before brewing.  Over time I had figured out the proper amount of beans and the correct granularity of the grind.  The result was great coffee every time! :)

My wife recently got me a new coffee pot.  It is much nicer with features like a clock, timer and higher capacity pot.  The new machine uses #4 filters instead of the basket style filters.

So, I followed the instructions for doing the initial “cleaning” runs.  I went to make my first full pot of coffee and I used the amount of coffee and the granularity that I have been used to using.  Then I heard the sound of coffee on burner.  What?  The grounds had gotten up and around the filter and clogged the dispensing hole.  :(  I chalked it up to the shorter filter.

Tried another full pot on another day with a new improved bigger filter.  Similar result, grounds in my coffee.  No bueno!

Then it occurred to me, I was grinding finer than “drip” granularity and this was causing the problem.  Maybe the cone style basket doesn’t need as many grounds either.  I guess I’ll have to check the manual!

As always, I’m thinking of how do these lessons translate to software development?  To me, I pull away that we can’t use the same procedures we’ve always used when we have a new environment.  In this case the environment consisted of the coffee maker, water, filter, beans and grinder.  (Let’s not consider condiments!)  Change any of these critical components and you can’t expect the same results.

So, if your team changes, your management changes, the tools you use change, etcetera, expect that your process must change as well.

Transference of process or technique

You know how you're always hearing about work-life balance.  It really is a good idea.  You can pull from experiences in "outside" activities to enhance your software development skills/process.

What?

When you participate in other activities like camping, hiking, bicycling, toastmasters, painting, etc you learn new techniques.  You gain insight into that activity that you can likely bring to your software development practice.

Give me an example

For instance, you're into bicycling.  You've picked up different bicycles for different types of terrain/activities.  You've added various accessories to your bike to make the experience more enjoyable.  You carry a back up tube and air pump for emergencies.  Water and a power bar and gel are along for the ride as well.  You've come to realize that you can go farther and faster over more difficult terrain when you're riding with a buddy.  After training for a while you are stronger and have better riding technique, know the bike better and how to adjust gears for the terrain.

Reflecting on the above you ask yourself:

  • Do I have or use different tools for different projects?
  • What accessories can I add to my development environment to make the process more enjoyable?
  • Where's my development safety net?
  • What do I do to keep going while I'm developing?
  • How can a buddy help me go further and faster creating software?
  • Am I better developer now-- that is, do I have better technique now? Do I know my tools better?
  • What would it mean for me to "shift gears for the terrain" in terms of software?

Summary

In summary, that work-life balance/outside activities can make you a better developer.

I encourage you to evaluate your experiences from other activities and bring that knowledge to your software development craft.

Vista Gadget for following the Missouri House

Over the holiday break I updated my Missouri House Vista Gadget for the 2009 Legislative session.  This gadget has links for frequently accessed pages on the Missouri House web site

This session there are also three new custom Google search tools added as well.  The Legislative Search indexes the combined sites of the Missouri House, the Missouri General Assembly and the Missouri Senate.  The RSMO search indexes the Revised Statutes of Missouri.  The Constitution search works through the Missouri State Constitution and the Preamble.
Please use the gadget forum or Twitter to let me know how the gadget works for you!
image

We've come a long way, baby! (TabletPC's)

This post is in response to a blog post by Jim Lehmer.

Why/how do I use my Gateway M-285 Convertible?

I use the tablet in slate mode when reading or annotating PDF's, going through email, going through RSS feeds with Google Reader.  Having a Tablet PC comes in handy with drawing applications.

With PDF Annotator you can mark up and annotate a PDF.

I use the Grab and Drag add-on to FireFox so that I can use my stylus for sliding the page I'm viewing up and down.  Using Google Reader in "expanded view" mode with the slate configuration you can quickly and easily go through lots of feeds while sitting on the couch.

With Tablet Extensions for Outlook (TEO) you can use the stylus to easily create and send emails and appointments, etc in slate mode.

As far as keeping the screen clean, it really hasn't been an issue for me.  When I notice that it's getting a bit too smudged up, I'll pull out the cleaning cloth (magic 3M fabric) that's included with most (all?) Tablet's.  Or I'll just use some screen wipes.

Sure, I'll agree, that the current generation of machines still is lacking in the pen on paper feel.  However, I'm sure we'll get there.  Years ago I used a special stylus from Cross on my PDA and it had a great feel.  It was a bit unsettling how it wasn't smooth.  At least today's styli like those in the M285 aren't itty-bitty toothpicks anymore.  Some devices even have an electronic "eraser" at the other end of the stylus, like on the M255.

When you are meeting with a client, or you're in a setting where you're taking notes, slate mode with handwritten notes is the way to go.  Other people aren't distracted by the keys clicking and you've removed the physical barrier that the screen creates.  The technology blends into the background, letting you focus on what you're really trying to do.

Many people are much faster typing than hand writing.  So why do they take notes on paper in meetings?  Because it's more natural?  It doesn't get in the way?  It's less constraining?

Enter the killer app for the TabletPC - OneNote.

If you take your notes with OneNote you can easily add in more space to the page - even in the middle!  Not something you can do with pen and ink.  Keep the pen toolbar handy and you can easily change between pen types, colors, and widths.  Or pick up a highlighter.

With OneNote you can do handwriting recognition & search.  OneNote will do conversion from handwriting to text.  Yes, it's not 100% perfect.  You can correct it, but I've found it's best just to leave it in handwriting.  Why do you need it in text?  Odds are you don't.  So, after a meeting I'll often email notes out to participants in handwriting.

OneNote also offers voice recording & search within the audio.  Although, the practical aspects are such that I don't use this capability.

A feature I do use is image search.  You can snap a picture of a white board or scan a document in and you can search the text within the image!

One Note offers some integration with IE and OutLook.  Send documents from IE to OneNote.  Create OutLook tasks from within IE.

I'm just going to gloss over this, but OneNote notebooks are shareable via network drive, USB Flash Drive or SharePoint.

So, use OneNote just like all of those paper notebooks and notepads you have laying around and get everything in one place that's searchable, shareable and malleable.

There are other features of the application I haven't touched on that make OneNote just as home on a traditional laptop or desktop computer.  You owe it to yourself to check it out!

Prior blog posts that mention TabletPC's & OneNote:

How our Dev team uses OneNote

Tablet PC Head to Head

Developer Tool- Digital Camera

Who maintains the burn chart?

jamescarr asks random agile question: who should maintain/update the burn-down, customers or developers?

In an ideal world, the developers mark completed and the customers mark accepted/rejected.

This information is then reflected on a stacked burn-down/up chart like in projectcards.

Of course in (my) reality we schedule our iteration and often end up with quadrant I stuff that gets thrown into the mix along the way.  So what you see down below is iteration story churn.  We're a small team with many projects going at once.

Often the PM serves as the customer proxy and updates the status of tasks reflected in the burn-up/down charts.  It is important to note that the PM really does check the product and verify acceptance with the customer.

clip_image002