RSS 2.0
Journal / Blog
Monday, October 06, 2008
How To Display Your Amazon Reviews and Wish List (on your site) Using Amazon's Web Services
If you've ever landed on Amazon.com then you're probably familiar with their reviews and wish lists. Amazon provides access to these items (and many-many more) through their extensive web services - the Amazon web services can be complex and overwhelming when all you want is a review list and a single user specific wish list. For this site I wanted to pull in my reviews and wish list - displaying them alongside my blog. It's fair to note, that user reviews are available via an RSS feed (but this feed doesn't include all the details I wanted) and the wish list page still doesn't provide an RSS feed. So a custom Amazon web service request was in order.

Let me try to make this story short.

If you want to request your reviews and your wish list you need the following:
Once you have a wish list or review, you then need to:
Once you've collected all those bits, you need to:
  • Checkout and download the source code for the project and build the assembly or download the pre-compiled assembly.
  • Add the assembly reference to your project (remember, I'm assuming you're using .NET).
  • Make a call to the application which will generate XML files containing your respective reviews and wish list.
Setting up the call would look something like this:
IAmazonRequest amazonRequest = new AmazonRequest();
amazonRequest.AssociateTag = "adamkahtavaap-20";
amazonRequest.AWSAccessKeyId = "1MRFMGASE6CQKS2WTMR2";
amazonRequest.CustomerId = "A2JM0EQJELFL69";
amazonRequest.ListId = "3JU6ASKNUS7B8";

IFileParameters fileParameters = new FileParameters();
fileParameters.ProductFileNameAndPath = @"Products.xml";
fileParameters.ReviewFileNameAndPath = @"Reviews.xml";
fileParameters.ErrorFileNameAndPath = @"Errors.xml";

IAmazonApplication amazonApplication = new AmazonApplication(amazonRequest, fileParameters);

amazonApplication.Save();
   And Viola!
  • At this point you can do anything with your XML files (Products.xml, Reviews.xml, Errors.xml). I've consumed mine through an ASP.NET Repeater and displayed the contents within a web page (see it live here, view the code here).
If you'd like to provide some design guidance, fix a bug, or request a feature, then visit (or join) the project on Google Code.

Alternatively, you might also be interested in the LINQ To Amazon source featured in the book LINQ in Action.


Happy coding!

Tuesday, September 30, 2008
The Three-step Sequence: Incorrect Assumptions and Experience
The preface of Object Oriented Software Construction literally introduced me to the three-step sequence:
the well-known three-step sequence of reactions that meets the introduction of a new methodological principle:
(1) "it's trivial";
(2) "it cannot work";
(3) "that's how I did it all along anyway".
(The order may vary.) - Bertrand Meyer
Naturally people consider themselves smart, which sometimes translates into knowing everything, and these three reactions are probably a manifestation of thinking you're overly enlightened. If we put ego aside - along with our natural predisposition for being lazy (trying to avoiding learning new things) - we often change our views altogether.

Looking back at my technological naivety: I was once wrongly convinced that client-side languages would never work and server-side languages / frameworks would dominate (until I really learned JavaScript), I had also mistakenly assumed that I was already doing TDD (until being introduced to the concept of Mocking), and I even thought that HTML table based design was the future (until I really learned CSS). With a little bit of knowledge and some experience I changed my views altogether.

Reflecting on these incorrect assumptions and decisions promotes growth - with every experience we grow. Which of my latest assumptions / reactions will change over time?

How have the three-step sequence of reactions effected you?

Sunday, September 28, 2008
Microsoft and jQuery Finally: Thank-You!
"Microsoft is looking to make jQuery part of their official development platform ... jQuery will be distributed with Visual Studio"
- jQuery, Microsoft, and Nokia


Other links of interest:
Scott Hanselman: jQuery to ship with ASP.NET MVC and Visual Studio
Scott Guthrie: jQuery and Microsoft
I was completely blindsided by this decision.

Wednesday, September 24, 2008
Notes on Software Creativity 2.0 by Robert Glass
Software Creativity 2.0 by Robert Glass (as the title implies and you might expect) is centered around creativity in the processes, methodologies, organizations, and people responsible for producing software. I concur with Steve McConnell's glowing review (Landmark Book, On a Par with People Ware and Mythical Man-Month).
Robert Glass has given the software world many gifts during his 50 year career in software development. This book stands above his other contributions as his magnum opus. I cannot recommend it highly enough. - Steve McConnell
There’s no need for my personal review, but I will say that if Robert Glass had a blog this book would no doubt be his best of.

Interesting excerpts from Software Creativity 2.0:
"When I began working in industry. I was appalled to find that nothing I had learned in graduate school bore the slightest relationship to what I was asked to do on the job."

"Practice often precedes and helps form theory"

"The more a creative person knows about the subject of focus, the less the need for creativity."

"In order to think originally, we must familiarize ourselves with the ideas of others"


Notes about the Creative person’s traits:
"They are especially observant …"

"They see things as others do, but also as others do not."

"They are by constitution more vigorous and have available them an exceptional fund of psychic and physical energy."

"They usually lead more complex lives, seeking tension …"

"The creative person is both more primitive and more cultured, more destructive and more constructive, crazier and saner, than the average person."

Keep in mind I've omitted some of Robert's earth shattering excerpts since I've read a couple of his other books (see this older post for details) - my chosen excerpts don't do justice to the book. Read it yourself! :)

Monday, September 22, 2008
Satisficing: Getting Things Done
"satisficing" (finding a solution that works and is supportable), not "optimizing" (finding the best possible solution)
- Robert Glass, Software Creativity 2.0
The term satisficing has been with us for quite some time and is primarily applied outside the software realm. Inside the software realm as developers working under constraints we make satisficing decisions on a daily basis. A satisficing solution would be one that solves the immediate problem with the least amount of resources and effort. The opposite of satisficing might be to expend resources researching, architecting, and then eventually solving the problem with an optimal solution. Satisficing like most things is not a one-size-fits-all approach, should be practiced in moderation (is not an excuse for being lazy), but is a necessary tool for getting things done. In one of my earlier posts (Necessary Skepticism: Skepticism is not Pessimism) I was skirting around this notion of satisficing without having a proper term for it.

From Wikipedia:
Satisficing (a portmanteau of "satisfy" and "suffice") is a decision-making strategy which attempts to meet criteria for adequacy, rather than to identify an optimal solution. A satisficing strategy may often be (near) optimal if the costs of the decision-making process itself, such as the cost of obtaining complete information, are considered in the outcome calculus

Example: One's task is to sew a patch onto a pair of jeans. The best needle to do the threading is a 4 inch long needle with a 3 millimeter eye. This needle is hidden in a haystack along with 1000 other needles varying in size from 1 inch to 6 inches. Satisficing claims that the first needle that can sew on the patch is the one that should be used. Spending time searching for that one specific needle in the haystack is a waste of energy and resources.
- Wikipedia, Satisficing

Saturday, September 20, 2008
Considerations For Choosing a JavaScript / AJAX Framework
I've noticed that a growing number of development teams are given the opportunity to choose their JavaScript / AJAX Frameworks. This choice is often thrown to the development team because the Architects are more concerned with the bigger picture, and the technical details are over the manager's head. Letting the development team decide on the JavaScript / AJAX framework produces some great benefits: it gels the team, fosters project buy-in, and creates project excitement.

Now, developers can be pretty skeptical, and getting them to agree has been likened to herding cats, but a couple core considerations / values seem to surface when the decision is being made.

Considerations for choosing a JavaScript / AJAX Framework:
  • Transparency - Who are the framework's development team and why should we trust them? Do these developers blog? Attend conferences? Are they featured on podcasts / videos? Is there a high or low turnover within the team? What are their passions? Is this just a job, do they like what they're doing, are they a cog on a wheel? Are they experts in their field?
  • Competency - Based on the information gathered in the consideration above (transparency), how competent do we feel the development team is?
  • Community Support - How well is the framework supported on forums and blogs? If something were to go wrong can we gain access to the framework's development team? Are there widespread experts using this framework readily available?
  • Reputation - How popular is the framework in the industry? Who uses it? Are there any white papers, success stories, case studies available?
One of the easiest ways for a developer to choose a framework is by looking at the developers that built it (and talking with those that are using it). As developers our day job will be stepping into someone else's code for the duration of the project, working with a framework created by competent developers makes our jobs easy. Frameworks without transparency don't allow us to gauge the competency of the developers or the framework.

Transparency is essential for JavaScript / AJAX Framework teams, JavaScript itself is open and transparent (not compiled yet), it follows that JavaScript / AJAX Framework along with their teams should also be transparent. When the decision for choosing a JavaScript / AJAX Framework is placed in the hands of developers the frameworks that don't meet the above criteria sink to the bottom of the list.
"The only way to succeed now is to be completely transparent, everything is exposed, everything you do" - Gary Vaynerchuk

Saturday, September 13, 2008
Everyone Is Special, I Wish I Was Special
I had x-ray vision as a child - that's right, I could see through walls, clothes, and presents. I was convinced I had super eyesight and my friends thought they had similar enhanced sensory powers - we thought we were super heroes.  In high school I was a wizard (one of a handful of computer enthusiasts).  University, College, and my first job were similar experiences - I felt special because most of my colleagues were fresh graduates void of the lifelong passion for computers.

Through all these experiences I was convinced that I was unique. Then I started becoming part of the bigger conversation. While engaging online I began learning that there were thousands of people like me: weened on computers, interested in good software design, and passionate about what they do.

Imar Spanjaars' signature always reminded me of this lesson:
Everyone is unique, except for me.
Yegge's recent post brought up this thought again:
people like to think they're unique and special, and that their tastes aren't necessarily widely shared by others. This is what drives fashion: the need to differentiate yourself from "the crowd", by identifying with some smaller, cooler crowd. ... The reality is that for any given dimension of your personality, there are oodles of people just like you. - Business Requirements are Bull****
David Heinemeier Hansson reiterates this:
it's somewhat counter intuitive ... for a lot of developers ...  it's counter intuitive for humans in general to think they're not that special, but when they do think they're special ... they kind of get these assumptions that they need very unique and special tools that will only work for them ... We as programmers aren't really unique or that special. - David Heinemeier Hansson, 37signals: "Friday Keynote"
Remember you're not really special. :)

Saturday, September 06, 2008
Noisy Work Environments are Counterproductive, But Compensating With Music Negatively Effects Creativity
Working in a noisy work environment and listening to music is counterproductive for intellectual demanding work. For example: we don't write exams in busy cafeterias, or write resumes through loud movies, and Libraries are quiet for a reason. Noise; whether it be music or background noise does negatively affect your ability to get things done.

DeMarco and Lister (in Peopleware) present the results of an interesting experiment:
During the 1960s, researchers at Cornell University conducted a series of tests on the effects of working with music. ... They put half of each group together in a silent room, and the other half of each group in a different room equipped with earphones and a musical selection.  Participants in both rooms were ... given a programming problem ...
They discovered that the majority of the people working in the silent room could pick out a pattern in the programming problem and could come to a quick clever creative solution. Whereas the people working with music playing were able to solve the problem, but didn't make the creative leap.

They go on to explain:
Many of the everyday tasks performed by professional workers are done in the serial processing center of the left brain. Music will not interfere particularly with this work, since it's in the brain's holistic right side that digests music. But not all of the work is centered in the left brain. There is that occasional breakthrough that makes you say "Ahah!" and steers you toward an ingenious bypass that may save months or years of work. This creative leap involves right-brain function. If the right brain is busy listening [to music], the opportunity for a creative leap is lost.
In their book they also make the point that open space work environments and cubical farms are not conducive to knowledge work, and that all employees (or at least groups of employees) should have the ability to close their door. Great companies do follow these guidelines, but many of the smaller companies or transitional companies (at least the ones I've worked in) tend to air on the dilbertesque side (the noisy cubical farms / open concept).

To compensate for the noise in the work place I've resorted to wearing noise canceling earphones without music. These earphones double as a metaphoric door - it indicates to those around me that I'm hard at work and not to be disturbed. Noise canceling earphones let me create my own personal audio walls, but eventually I become the weird guy with the earphones that aren't plugged into anything guy.

As a lowly developers it's hard to make the case to management for a quieter work environment (let alone an office with a door), but we can keep our eyes out for companies that share these values, start our own company, or take opportunities that let us work from home. In the meantime thank goodness for ear plugs (err.. I mean earphones).

Wednesday, September 03, 2008
Thoughts on Blogging: "Turn Up The Good, Turn Down The Suck"
The factors described in this post loosely determine which types of blogs I've been subscribing to.

Quality over quantity: Some blogs adhere to rigid posting schedules. I've never paid attention to a blog's schedule and wonder if anyone (beside the author) does. I find scheduled blogs result in diluted content and that their posts become daunting to sift through. Eventually I start skimming all their content and might unsubscribe altogether.

Consolidated feeds are bad mmmm-kay: Occasionally blogs consolidate posts from multiple authors, or group similar topics into a single feed, this results in excessive noise with no granular filtering capabilities. I won't subscribe.

Personality is important, Professionalism is dull: Personality should permeate your posts. Software development is kind of boring, live it up, inject some originality, show your true colors, try to be funny, take the risk. We're all human, your readers aren't robots and zombies. As a subscriber I'm more interested in getting to knowing you (the developer) than how professional you're trying to be. Professional flavoured blogs run the risk of being too sanitary - a lesson learned the hard way *yawn*.

Easy on the code: I look at code every day. I'd rather read something funny, inspiring, thought provoking, philosophical, or related to the human factor of software development. Code in blogs can often come across as filler, if I really needed more code I'd head down to Google CodeCodePlex, and download one of the many projects (take a look at Chrome). With code, there's a million ways to do the same thing, if you're code isn't in my specific problem domain, then I'm falling asleep already.

Subscribing and reading blogs is important for software developers and knowledge workers in general. Blogs offer cross pollination of ideas between problem domains, organizations, and people. What factors determine the blogs you read?

Saturday, August 30, 2008
More on Naming Conventions: My Naming Heuristics
Following a hard rule for naming conventions in software development is difficult; it's always a compromise between how things were named in the past and where things are going in the future. Other dependencies like the size of the project, the number of developers, and the environment you’re developing in play important factors. In short, there’s never a great naming rule, but here’s my general (heuristic) approach to naming.
My heuristic approach to naming conventions:
New Development / Greenfield Work:
  • Follow the conventions of the language, or the standards used within the larger community, and pay attention to the API. For example: If you’re programming in .NET follow the naming conventions outlined in MSDN, in JavaScript look at the DOM API, in CSS look at the definitions.
  • If a formal naming convention exists for the organization and these conventions makes sense (they aren’t too far off the language APIs) then follow them. If it feels like the naming conventions were created in the dark ages by a very-very senior COBOL Developer then start asking questions.
Maintenance / Brownfield Work:
  • Follow the conventions of the existing code if you’re modifying an existing module.
  • If you’re creating new modules then consider following the conventions of the language and API.

This post was inspired by a podcast by Donald Belcham and Kyle Baley on Brownfield Applications.

Friday, August 29, 2008
Cross Language Naming Conventions: Avoiding Verbosity In The Presentation Layer
Most languages and technologies used in web applications come with their own unique naming conventions - which is unfortunate, but necessary, because diversity is important. Languages like JavaScript and PHP use camelCase, CSS uses-hyphenated-delimiters, and ASP.NET / Java / and the like adhere to the conventions used in their respective libraries and frameworks. Managing the different naming conventions in a web application can be difficult, but with discipline, embracing each language’s conventions can provide some great benefits.

A common mistake I've made in the past, was trying to make all languages adhere to a single convention. As a budding PHP / ASP developer I took the-single-convention-for-all-languages approach. In retrospect, I used this approach because I didn’t completely understand the language I was using, and in order to compensate for this lack of knowledge, I’d try to meld the languages into the mental model I understood best. This was a mistake.

Today, I find that working with the conventions of the language facilitates re-use (experts in the language understand what I’m doing), promotes portability (modules can be used across projects regardless of server-side technologies), encourages global collaboration (open source modules and plug-ins can be easily consumed and contributed to), and helps to a nurture a more maintainable application (developers from other language domains can easily maintain the application with a relatively small learning curve). Like a carpenter working with fine material, I embrace working with the grain of each language. It’s also fair to mention that breaking free from the monocultured (one-size-fits-all) approach to naming conventions provides a broader perspective, and also makes your development skills more universal - it might even open the door to different development domains in the future.

Then there’s the discussion on name length, verbosity, and using meaningful names. Steve McConnell suggests that the optimum name size for a variable or function is between 8 and 20 characters (Chapter 11, Code Complete), but with tools like ReSharper (for renaming / refactoring etc…) I find myself using names well over 30 characters. So names like GetApproveeTotalFromNamedBasket are a common occurrence in my code. However, like most things, verbosity does need balance (everything in moderation right?). In the business layer, descriptive names are a godsend - they jog my memory as I rediscover what the module I wrote last month was supposed to do. But... in the presentation layer languages (like JavaScript, CSS,  ASP.NET, or XHTML) you may want to reconsider using long descriptive names. Since verbose, long running descriptive names in the presentation layer are passed over the network and can degrade performance. Often times these verbose names are combined together - throw in ASP.NET name mangeling, start hooking in verbose CSS definitions, and then start inserting JavaScript events. All this compounds quickly and result in large page payloads filled with elements like the following:

    <div id="ctl00_ContentPlaceHolderForAllTheBestImprotantContent_
             PanelForTheBestReviews">
            <a onclick="LinkButtonClick_ThankYouForTakingTheTimeToReadThis();"
              id="ctl00_ContentPlaceHolderForAllTheBestImprotantContent_
                  RepeaterForAllMyFavoriteBookReiews_ctl00_
                  LinkButtonMarkReviewAsFavorite" 
              class="LinkFormatingCssClass SelectedLinkFormatingCssClass" 
              href="javascript:__doPostBack(
                   ctl00$ContentPlaceHolderForAllTheBestImprotantContent$
                   RepeaterForAllMyFavoriteBookReiews$ctl00$LinkButtonMarkReviewAsFavorite'
                    ,'')">Mark As Favorite
            </a>
Note: That mess of code above would fire a JavaScript event then an ASP.NET event. It's the result of placing an ASP.NET LinkButton, inside a Repeater, inside a Panel, inside a Masterpage, and adding a JavaScript event along with some CSS. We can see that using long names in the presentation layers results in a mess of text. It's also fair to mention that the ASP.NET MVC Framework lets developers write cleaner presentation code.
Sure, everyone cites premature optimization as the root of all evil, and we do live in a world of gzip file compression and JavaScript minifiers. But... keeping names short in CSS, ASP.NET, and XHTML isn’t hard as long as you’re mindful of the final goal. Smaller names in the presentation layer will reduce the amount of data transferred over the network which increase the performance of the application.

Joseph Smarr of Plaxo.com once said:
"Web applications are only slow if you let them get slow" – Douglas Crockford, Alex Russell and Joseph Smarr: On the Past, Present and Future of JavaScript [30:00]
My preference (project requirements warranting) is to keep things short and concise in the presentation languages while using longer descriptive names outside the presentation languages. What’s your preference?

Tuesday, July 29, 2008
Free: Win a Copy of: JavaScript: The Good Parts by Douglas Crockford
JavaScript: The Good Parts by Douglas Crockford is an excellent book. At 140+ pages this book is approachable and easy to read. The writing style is terse and clear, and it's crammed with good advice.

I thoroughly enjoyed this book and would like to give a copy away. You can read my review here.

Contest Rules:
  • Comment on this post.
  • Leave a valid email in the email comment field.
  • The winner will be chosen at random and notified through email on Oct 1st.
  • I pay for shipping.
Good Luck!

This contest has commenced, and the winner is Luke Maciak!

Sunday, July 27, 2008
The World is Messy and Complex: Why Should Software Be Different?
Politics, religion, famine, pollution, and relationships; these are parts of our world. I’m messy, my hair falls out, and yours might too. The world is messy and complex, so what would make software different?

During my first real job after graduating College / University, I was horrified by the state of my project's source code. The code was spaghetti; it looked like someone crammed a stack of poorly written technical manuals through a blender that funneled into our source code. Regions (#region) were running willy-nilly, negated values were passing conditions; delegates were calling properties which were in turn calling delegates which were creating infinite loops… SQL rows were being sent across TCP/IP, centralized build servers were taboo, unit testing and TDD was unheard of. Each of the members of our team were build / release masters, developers, and ninjas.  Our job was to maintain this juggernaut and affirm the stakeholders that everything was OK.

But were things really that bad? Remember, I was a recent grad; I was used to creating pristine frameworks (like elevator simulators) crammed with design patterns and fascinating abstract data types. In a way, I was an architecture astronaut being rudely ejected into a toxic tailings pond. The courses I had taken in school, the projects I completed, the languages I used were a great start, but not a valid representation of the real world. In the academic world things were clean; out here (like the rest of the planet) everything is a mess.

I started coming to the realization that, producing software is more about managing people than science, technology, or math. Mistakes and human flaws are the norm, software entropy is inevitable, and technical decisions are often based on nontechnical considerations: time constraints, politics, religion, and relationships rather than sound research and science.

There is hope; realize that you can’t control everything, that the one-size-fits-all solution and silver bullets are myths. Then focus on what and how you can change yourself, your software, and your situation. Developing good software (like living a good life) is about making informed decisions, choosing opportunities that encourage growth, reducing complexity, and having a long term vision or goal. Today I still think software is messy, and I'm still horrified by most source code, but abstractions, n-tiered design and testing sufficiently help me manage the chaos.

Science often exists in a pristine clean vacuum, whereas software deals primarily with people. Software is not a science, and humans (like software) are inherently messy and complex.
"The tar pit of software engineering will continue to be sticky for a long time to come." – Fred Brooks, The Mythical Man-Month
What experiences have you had when moving from the world of academia or research into the real world?

Sunday, July 13, 2008
Gross Generalizations: Software Evangelists, Rock Star Developers, Senior Developers, and Software Architects
Generalization like rumors usually have some truth to them – at some point, someone formed a thought around a frequently observed piece of truth and… Viola! A generalization was born (or maybe a rumor). Generalizations are incorrect for every single possible case (the exceptions), but there is truth to them.

That’s my disclaimer; now let’s have fun with generalizations.

The Software Evangelist

The epitome of an Evangelist can be observed on Sunday morning TV:
"SHEBBA-WABBA-MULLA-MONEY-POWER-BOOYACKA-POW-BOW!!!!"
A congregation frying like bacon on the floor, 800 numbers requesting money seared into your TV set, and an Evangelist at the helm orchestrating the show.

Evangelists are a great source of inspiration, excellent communicators, and great leaders. However, they often present a one sided biased opinion, a narrow focus, and can be driven by ulterior motives (money, power, viewership, readership, etc).  Listen to any Evangelists with a grain of salt.

Rock Star Developers

Rock Stars are on MTV, and featured in tabloids - they live hard and die young. 

The lyrics of Great Big White describe the life of a rock star:
Well I'm a wasted rock ranger
I live the life of danger
On the road to find a higher high
I don't need no one's affection
All I need is my injection
The music of wild rock will get me by
Some companies seek out "Rock Star Developers", here’s an excerpt from an email I received:
are you a Rock Star? I have an opportunity for a rock star … I am reaching out to you in the hopes that you might the star I and the client are looking for!

So, what is a Rock Star Developer? My perception is a: narcissistic, self-centered, prima donna – someone who doesn’t work well in a team, doesn’t listen, does whatever they want, and lacks dependability. Hiring a Rock Star Developer probably isn’t recommended - unless your organization has a liberal guitar smashing policy, doesn't mind drunken belligerency, and is run by a one man show.

Senior Developers

Everyone wants a Senior Developer, but occasionally these developers are more senior than developers, and certainly not senior developers – often the developer's age (not experience) determines their title. Studies have shown that a developer with 2 years experience can perform at the same level as a developer with decades of experience. Still some Senior Developers have an unexplainable need to let the world know of their seniority through email signatures, resumes, business cards, LinkedIn profiles, and so on.

If you work for 10 years, do you get 10 years of experience or do you get 1 year of experience 10 times? You have to reflect on your activities to get true experience. If you make learning a continuous commitment, you’ll get experience. If you don’t, you won’t, no matter how many years you have under your belt. - Steve McConnell, Code Complete 2nd Edition

Software Architects

Software Architects can be glorified Senior Developers - an architect might be a developer who is senior (like a curmudgeon with a walker) that needed a new title.

Thoughts on generalizations:

There are two sides to these generalizations, the people who claim to be, and the people who are. The people who claim that they’re a Senior Developer are usually impostors, whereas the person who is a Senior Developer is collectively regarded as one by their peers.

Generalizations (like metaphors) are communication mechanisms, sure, there are edge cases and exceptions. Occasionally I encounter aversions to generalizations. Responses like: "Hey that’s not completely true, X,Y,Z disproves that", or "Naw... that’s just incorrect" seem to be made when we forget that we’re just using generalizations.

What generalizations stick out in your mind?

Tuesday, July 01, 2008
2008 Summer Reading List: What Are You Reading?
Summer is finally here! Well... "here" as in, "here in Canada" where we have 8 months of winter, fall, and spring...

This summer I hope to finish up the following books:
Books and reading are essential for personal and professional development. The more you read, the more you understand and the more resources you have to fall back on.

What books are you reading this summer? Do you have any recommendations?
Page rendered at Monday, October 06, 2008 9:29:51 PM (GMT Standard Time, UTC+00:00)