# Friday, April 30, 2010

I began reading Agile Principles, Patterns and Practices in C# by Robert C Martin and Micah Martin after a friend recommended the chapters on pair programming.  My friend was right, of course. The Martins not only decribed pair programming but included an entertaining script of two developers pairing on a programming problem.

But, as I dove deeper into this book, I found a wealth of other information.

The book begins with a section on agile development, defining some basic terms and concepts recommended practices. It follows with a detailed section on good design practice. This second section is the most interesting, as it describes the famous SOLID principles. SOLID is an acronym for a set of good design practices:

S=Single Responsibility Principle: Each class should serve only one purpose and have only one reason to change.
O=Open-Close Principle: Classes should be open for extension but closed for modification
L=Liskov Substitution Principle: It should always be possible to substitute a derived class with its base class
I=Interface Segregation Principle: Interfaces implemented by a class are defined by the client objects that use that class; a class should implement a separate interface for each client that calls it.
D=Dependency Inversion Principle: To maintain flexibility, you should write code that depends on abstractions, such as interfaces.

Next, the authors present an overview of Unified Markup Language (UML), a graphical language used to describe software designs and requirements. Common UML diagrams and shapes are described and the author offers opinions of which ones are most useful and when to best use them.

The last half of the book is a case study of a Payroll System in which the authors use examples to illustrate the concepts introduced in the first half of the book.

Although C# is included in the title, the book does not focus on C# and almost none of the concepts are specific to any particular language. All the code examples are in C#, which makes it a bit more accessible if that is your strongest language.

The book is filled with lots of information and good advice. For example, the authors recommend an iterative approach to writing software, a test-first approach to development and encourage developers to refactoring their code frequently.

Whether you read all of Agile Principles, Patterns and Practices in C# or pick through the sections of interest, you will benefit from this book.

Friday, April 30, 2010 7:41:42 PM (GMT Daylight Time, UTC+01:00)
# Monday, April 26, 2010

Episode 83

In this interview, Eric Greene describes the advantages of using a Content Management System to rapidly build a flexible web site

Monday, April 26, 2010 4:02:50 PM (GMT Daylight Time, UTC+01:00)
# Monday, April 19, 2010

Episode 82

Monday, April 19, 2010 1:28:26 PM (GMT Daylight Time, UTC+01:00)
# Wednesday, April 14, 2010
  • Saturday April 17, I will be presenting "Building Your First ASP.Net MVC Application" at the Pittsburgh Code Camp at The University of Pittsburgh. More information is available at http://codecamppgh.com/codecamp.aspx

  • Saturday May 1, I will be presenting "Extending your Application with the Managed Extensibility Framework" at the Ann Arbor Day of .Net at Washtenaw Community College. More information is available at http://www.dayofdotnet.org/AnnArbor/Spring2010.

  • Friday August 7, I will be presenting "Effective Communication" at DevLink in Nashville, TN. More information is available at http://devlink.net.

Wednesday, April 14, 2010 11:57:00 AM (GMT Daylight Time, UTC+01:00)
# Monday, April 12, 2010

Episode 81

In this interview, Jennifer Marsman describes some of the new features of Windows 7 and how a developer can use those features to build more powerful applications.

Monday, April 12, 2010 5:27:31 AM (GMT Daylight Time, UTC+01:00)
# Sunday, April 11, 2010

Yesterday, I attended the second Kalamazoo X conference. This year's event featured a great list of speakers, presenting many thought-provoking topics. Ideas came at me so fast, it was tough to keep up. Here are some highlights of the presentations I saw.

"Treating the community like a pile of crap makes it stronger" by Brian Prince

The title of this talk comes from Brian's experience growing up in rural Maine and shoveling manure in the summer months. Manure works better as a fertilizer if you periodically mix it, moving the bottom to the top. The same can be said for user group leadership.
If you are a community leader, plan for a peaceful transition. Identify others who can take over and groom them to do so. Take some time off from the lead role in order to re-energize before coming back.

"Agile+UX: The Great Convergence of User Centered Design and Iterative Development" by John Hwang

John is a web designer and his company is applying agile methodologies to its project. He discussed the challenges of using Agile to manage User Centered Design (UCD) AND User Experience (UX).  The big challenge is that Agile is geared toward making developers more efficient, yet designers are a key part of any web development project. John avoids responding to amy Request for Proposal (RFP) because an RFP forceS you to estimate many tasks that you don't yet know and that are almost certain to change. He emphasized that development and design should be done in parallel and that the feedback loops and iterations of agile should apply to both. Developers and designers should work cooperatively, rather than in conflict.

"How to Work Effectively with a Designer/ How to Work Effectively with a Developer" by Jeff McWherter and Amelia Marschall

Jeff is a developer and Amelia is a designer and the two recently went into business together. They have worked together in the past and they related some of the challenges and lessons learned from their previous collaborations.

"Communication is the key" was a message they reiterated several times during this talk: Ensure that your partner knows what you are doing; verify that it is consistent with what they are doing and that the technology supports it. Developers and designers should strive to learn about the tools and skills of the others. It will help them figure out what they can accomplish.

Mock-ups are a key means for designers to convey information. Jeff said that he often writes business rules in the margins of Amelia's mock-up drawings.

"Does Your Code Tell a Story?" by Alan Stevens

Alan told us we should not bury the lead, so I will tell you his main point now: Beauty is the ultimate defense against complexity.

Alan took the advice of successful novelists and applied their principles to the art of writing code. "The code in our industry is crap", he asserted; then he explained how to make it better: Take chances; write shitty code in your first draft; refactor it several times; and make it clear, simple and obvious before releasing it.

"Unwritten Rules of Resumes" by Jeff Blankenburg

Jeff's major point was that your resume should stand out and distinguish you from other candidates. He advised ncluding a strong first paragraph in a personal letter, accompanied by a self-addressed, stamped return post card with your resume. This will help to establish you in the minds of the hiring personnel. Establish a strong professional network and avoid the temptation to burn bridges when you leave a company.

"Have you hugged your brand today?" by Clovis Bordeaux

Per Clovis, building a brand begins with a mission statement. A critical part of building your brand is getting every employee involved and on the same page, regarding the message you are sending about your company. 

Kalamazoo X home page



Sunday, April 11, 2010 5:31:03 PM (GMT Daylight Time, UTC+01:00)
# Tuesday, April 6, 2010

There is a reason why computer languages are called "languages". These languages share many common characteristics with the languages that humans use to communicate.

Humans use languages like English, French, Mandarin Chinese, and Farsi to communicate with one another. Programmers use languages like Java, C# and Visual Basic to communicate with computers.

Human languages contain words and each word has one or more correct spelling and one or more meanings; Computer languages have keywords that have a single correct spelling and one or more correct meanings.

Human languages have a grammar to which writers and speakers are expected to adhere. Deviating from this grammar makes it more difficult to understand the message. Computer languages also have a grammar that we call "syntax". It is not sufficient to throw together correctly-spelled keywords: They must be structured properly. Some languages have stricter grammar rules than others, such as a requirement that we declare each variable before using it.

Writing quality software in a computer language is similar to writing a good book or article in a human language. It is possible to write a poorly-written book in English that has perfect spelling and grammar. Microsoft Word will report no errors when you press F7 when editing such an article, but that tells us nothing about the quality of the writing, which may still be confusing or boring. Similarly, it is possible to write slow, non-scalable, difficult-to-maintain software that violates no rules of spelling or syntax. This software will compile but will not perform well.

The main difference between human languages and computer languages is the precision required by each. We can communicate reasonably well in a human language, even if we use poor grammar and poor spelling. This is because we have other communication mechanisms to use, such as expression, tone, gestures and a shared context with others. Computers are generally not smart enough to understand us unless we are very specific in the words we use and in the way we structure those words. We must be more careful what we type and how we compose our words when communicating with a computer.

This is why I believe that writing software has improved my communication skills in general. By forcing me to choose carefully my words and grammar, I get in the habit of communicating with greater clarity.

Tuesday, April 6, 2010 5:53:25 PM (GMT Daylight Time, UTC+01:00)
# Monday, April 5, 2010

Episode 80

Monday, April 5, 2010 5:20:24 PM (GMT Daylight Time, UTC+01:00)
# Thursday, April 1, 2010

The last couple years, I have significantly increased my use of social media.

I don't believe that online social media is a replacement for face-to-face human contact or for a phone call. But it is a good way to stay connected with others between personal visits.

My primary social media sites are LinkedIn, Twitter, Facebook and Flickr. I use each of these channels for a different purpose and to communicate with a different audience: My resume is on LinkedIn; I chat with IT professionals daily on Twitter; I re-connect with old friends on Facebook; and I use Flickr to share photos.

I joined LinkedIn a couple years ago in order to connect with professionals with whom I had worked. I input my resume and built up a network of current and former co-workers. At the time I was building this virtual network, I didn't realize how useful it would be. A few months after joining LinkedIn, I found myself out of work and needing to network. I reached out to my connections and asked people to log in and write their opinions of the quality of my work. The response was overwhelming. Over 30 people wrote recommendations within a few days of my request. Several times, a potential employer mentioned these online praises during a job interview. I ended up finding a job quickly, via networking.

I use Twitter to communicate with like-minded souls in the tech community. As a software developer, I'm drawn to people who share my passion for learning and for technology. Many of the developers I know are also on Twitter. As a general rule, I tend to follow only those people that I've met in person or that I think I might meet soon. I see many of them at conferences a couple times; but our conversations on Twitter help to keep the relationships going between in-person visits.

I'm a pretty passive user of Facebook. I see my kids using the chat feature and I often see long, threaded conversations on the walls of others. About the only thing I do actively and regularly is advertise new blog posts, announce new episode of Technology and Friends, and show off photos I've taken. Despite being passive, I have reconnected with quite a few friends from my past. Many classmates from my high school days sent me friend requests and now I am using Facebook as a communication medium for our upcoming 30-year reunion. Facebook also provides a good way to get a message out to a lot of people in a hurry. Last year, my sister passed away and I was able to widely communicate her funeral arrangements by posting the details on Facebook. A number of people came to pay their respects after reading my Facebook message.

Flickr provides a social media mechanism: You can connect with other users, comment on photos and share ideas; but I don't use its built-in features. Instead I post photos on Flickr and link to them from Twitter or Facebook. Taking photos at a conference or other event and sharing them online is a great way to stay connected with the community. Recently, I have begun to cross-post my photos on SmugMug because this makes it easier for others to buy prints of my photos.

The sites you choose to connect with others online are not nearly as important as the messages are delivering and the connections you are making.

Thursday, April 1, 2010 2:48:21 PM (GMT Daylight Time, UTC+01:00)