Wednesday, December 29, 2010

New Year–>Learn a New Programming Language

One mantra of the The Pragmatic Programmer is to learn a new language every year.  As a new year is upon us, I thought I'd offer why we should do this and some practical ways to begin a new journey.

Why learn a new programming language?

As software developers, we solve many of the same types of problems day in and day out, typically with the same type of solutions.  Often times we don't know a better solution is out there.  Learning a new programming language teaches you diversity, seeing things in a different light, and offering you the opportunity of solving the same problem in a new, innovative way that wouldn't have been thought of otherwise. 

When we say learn a new language, this does not mean become an expert.  The goal of learning a new language goes beyond syntax, it goes to the heart of expression and learning different ways to solving the same problem.  One may find more efficient tools or concepts in another language that one could bring to the language of their choice; port some of these new concepts over to “your” language by beginning an open source project!

Where do you start?

Start by determining which programming language you want to learn.  If you don't know what programming language to learn, check out TIOBE Software.  They released a programming community index, this might give the gears of innovation a grind. 

I'm a .NET programmer by day but I’ve heard a lot about Ruby on Rails so my curiosity got the best of me and decided to go down that route.  It's amazing to me how advanced Ruby on Rails is compared to ASP.NET MVC (Yes, I know RoR came first).  The concepts of convention over configuration, gems, scaffolding, and database migrations popularized by Ruby on Rails are huge!

I would encourage you to pick something totally out of your comfort zone (not C# to VB.NET or vice versa, this doesn't count).  If you're a .NET programmer, trying something open source like Ruby; likewise, if you're a Java developer, try out some Microsoft technologies or other open source projects. 

Learning Resources

1. Koans - teaches you the syntax, structure, and some common functions and libraries through a "path of enlightenment" and testing in order to learn a new language.

My experience with working with Koans have been great!  It's a new, exciting way to work through the basics of a new language using tests.  I'd highly recommend giving them a try!

2.  Online Media (Blogs, Screencasts, Videos, etc.) - One of the many reasons I like the Development community is their openness to share what they've learned.  Take advantage of this community by searching for "How To" blogs or "101" blog entries or videos to learn your new language and then, most importantly, give back!  You'll discover issues you need to fix or new concepts you've learned, blog about it, contribute to a forum on that language.  Help others by giving back what you've learned!  It also serves as a great reference for yourself so you don't have to fight the same battle again.

Here are a few examples to start learning:

3.  Books - a more traditional way of learning a new language but is still effective (depending on the book).  With the age of e-books and multiple monitors, tutorial or step by step books are an ideal way to learn a new language and to gather some of the new concepts.  The Pragmatic Bookshelf publishes books that are very, pun intended, pragmatic.  They leave most of the theory and rhetoric out and focus on getting you coding as soon as possible.

Here are a couple examples:

  • Agile Web Development with Rails (4th Edition) - I'm currently reading/working through this book, it's a great example of writing a Rails app using Agile methodology.  It's another good example of a walk thru but has additional explanation as the author walks you thru building a shopping cart application.
  • Seven Languages in Seven Weeks - for those overachievers out there, pick up this book and begin a fast paced journey on learning 7 languages in 7 weeks!


Practice! Practice! Practice!

Often times learning a new language can be boring because we don’t have a particular problem to practice on.  We’ve learned the basic syntax but now we want to practice our new found knowledge and apply it to different sorts of problems. 

The following are examples to put your new found knowledge to use!  The key to working through the examples is to focus on the process, not the solution.  Focus on both syntax and the thought process behind it and, most importantly, focus on what you are learning through the process!  This is how we develop diversity!!

1.  Code KataDave Thomas has written a number of problems  that are worth trying.  Some examples include word chains, Klondike, and anagrams.

2.  Ruby Quiz – this site has sample quizzes based on, you got it, Ruby.  There are also suggested solutions that are implemented in Ruby.  However, this can be easily adapted with whatever language you are learning.  Examples include Paper Rock Scissors, Numeric Maze, and Dice Roller.   Remember, it’s the process, not the solution that counts!

3.  Project Euler – these are primarily mathematical/computer programming problems.



  • Learning a new language is fun but can be frustrating at times.  I’d encourage you to time box some of these learning activities.  Use the Pomodoro Technique where you practice for 25 minutes, then take 5 minutes off.  There are many apps out there that can help facilitate this.
  • Start small!  Don’t expect you can write a huge complex application out of the gate.  Realize that learning is a process and needs to be practiced!
  • Don’t focus on just learning the new syntax.  Immerse yourself in the new thought process of the new language.
  • Teach your new found knowledge with other developers who will listen!  If no one will listen, and even if they do, blog about your experience!

I hope that with the coming new year, you'll add one more New Year's Resolution (except you’ll keep this one): learn a new programming language!  It will pay back in ways you've never thought before!

Wednesday, December 22, 2010

Driving Technical Change Book Review

How do you drive technical change within your organization?  This is the key question that Driving Technical Change by Terrence Ryan answers.  We've all been there, we want to improve things in our environment, albeit technical tooling or processes to make our lives easier but often times receives resistance from skeptics.  Ryan categorizes these skeptics into the following categories (the Uninformed, the Herd, The Cynic, The Burned, The Time Crunched, The Boss, and my personal favorite, the Irrational).  He then goes on to explain different techniques in order to work with each kind of skeptic and finally wraps it up with a strategy on how to drive this change.

This book was an easy, practical, and fun read.  We, as developers, discover new tools or techniques to improve the developer's quality of life but lack a pragmatic way to communicate as a way to adopt that change.  As you read through the book, you'll put faces with the skeptics.  Imagine how you can work with them (ideally, not at them) to show them how this new tool or technique can improve their quality of life.  This book is great for building your arsenal with tools on how to better collaborate with others and how to drive technical change within your organization.

I have a friend who is passionate about Agile and Scrum but is perceived as not having good communication skills and not being able to collaborate with his peers in an effective way.  After I read this, I immediately recommended this book to him because it will help him see things in different perspectives on techniques on how to deal with different skeptics. 

Remember that a leader leads and a manager manages.  You don't have to have a manager title to lead others (although sometimes it helps).

Thursday, December 16, 2010

Scrum of Scrums

We have 3 application specific agile teams underneath one large product.  There exists a need for cross team communication, that is where the Scrum of Scrums comes in.

What is the Scrum of Scrums?
Scrum of Scrums (SOS) is a daily standup comprised of the Scrum Master from each team in order to facilitate cross team communication.
SOS occurs after all agile teams have completed theirs.  We ask the same questions as in an agile team stand up but on a team level instead of an individual level:
1.  What did you do yesterday?
2.  What are you doing today?
3.  What, if any, roadblocks exist?
4.  One additional question:  team ideas or gauges of teams feedback.

At the end of the iteration, we have our morning Iteration Retrospective and Planning Meeting <LINK>.  That afternoon, the SOS will meet to compose an e-mail with each team's action items.  One Scrum Master will e-mail everyone (all teams) with all action items, if a team member has questions, they will be encouraged to speak with their Scrum Master.  This serves as one point of contact and also documentation of the action items.
For us, this has been a good form of cross team communication and has also spurred conversation/ideas that would effect all teams such as changing Source Control Versioning System or blocks of code that would effect an underlying architecture.

Additional Resources
Jerrel Blankenship Blog

Monday, December 13, 2010

My First HTPC Build Experience…

I decided that it’s time to build my first Home Theatre PC (HTPC).  I’ve built my own PCs in the past for development and such but now was the time to build an HTPC.  This HTPC Guide helped a lot in determine specs.

I had two big dilemmas: Intel Vs. AMD and SSD vs. SATA drive.

I chose AMD purely based on cost (as you’ll see below).  I decided I could get a much bigger bang for my buck going with AMD.

SSD vs. SATA drive – I decided that SSD was still expensive and I wanted to keep this build to a small financial footprint so I went with the SATA drive.

I decided upon this build:

Case nMEDIAPC HTPC 5000B $54.99
Power Supply COOLER MASTER Elite 460 $29.99 + $1.99 Shipping
Blu-Ray Player LITE-ON Black 4X BD-ROM $39.99
Motherboard MSI 785GM-P45 mATX Motherboard $20.00 – $20.00 MIR (bundle deal with Processor)
CPU AMD Athlon II X4 640 3.0GHz Processor $95.99
Hard Drive Samsung HD103SJ Spinpoint F3 Hard Drive – 1 TB, 7200RPM, 32 MB, SATA-3G $59.99
RAM Corsair 4GB DDR3 RAM – PC10666 $69.99 – $20 MIR
Wireless Keyboard/Mouse Gearhead Wireless Desktop | KB3750W $39.99
  Sata Cable 18” $4.99

Total (After Rebates)


*Note:  Prices are subject to change as I ordered some of the components on Black Friday.

Since I had a copy of Windows 7 64 bit Ultimate that I’ll be using as my OS.  I setup a 60GB partition and installed Win 7 using a USB Flash Drive since I was short a SATA cable (which I got later).  The installation went smooth, the only hiccup was making sure you change your boot drive to your hard drive after the first reboot or the system will read from the Flash Drive and want to setup Windows again.  After I setup the OS, I connected it to my Samsung 52” television via the onboard HDMI, everything went without a hitch!

I installed XBMC Camelot (version 9.11) and learned a couple gotchas with XBMC:

1.  Do not install XBMC using Remote Desktop, it needs to be installed on the box directly. 

2.  XBMC will not open in an RDC session, you’ll need to be directly on the box to open it.

3.  If you are using IMDB as your scraper and using XBMC Camelot, you’ll need to update your IMDB xml file (XBMC\system\scrapers\video) to this one.  If you don’t update, your movie titles will not show in the library.

I’ve had this build running for the last few days and it’s quiet.  The loudest component seems to be the optical drive which I don’t use that much so I’m fine with it.  It will not disturb my movie watching!  I’m also on the lookout for a better input device to replace the wireless desktop I have.  I love the smaller keyboard but the separate mouse is cumbersome for navigation when you’re sitting on the couch.

For now, I’ve decided not to put in a TV tuner card due to my television viewing habits.  I can expand that later if I see there’s a need for it but for now I wanted a good, inexpensive system.

Overall, it was great experience and I’m going to enjoy watching what I want to watch, when I want to watch it!