Archive for June 2008

Book Review #8: “Making Vision Stick”

A while back, my pastor lend me a small little orange book written by Andy Stanley, founder and senior pastor at North Point Community Church in Atlanta, Georgia.  “Making Vision Stick” is a 74-page book that deals about ways to successfully make your vision a reality.  Even though the author uses examples from the church ministry, you’ll find the concepts and ideas to be compatible in business, at work, in the family, etc.

From the back cover, we can read the following:

Your vision is the lifeblood of your organization.

It should be coursing through the minds and hearts of those you lead, focusing their creativity and galvanizing their efforts.  Together, you and your team will strive to make your vision a reality.

But in order for that to happen, you’ve got to make your vision stick.  That’s your responsibility as the leader.

And that’s what this book is all about.  The examples used by the author throughout the book are simple and concrete.  His ideas are very well explained and I like the fact that he managed to deliver his message in a concise manner without babbling too much or going on tangents.

Without giving you all the details on how to make your vision stick, the following is the process used by the author to help you in making your vision a reality:

  1. State your vision simply
  2. Cast it convincingly
  3. Repeat it regularly
  4. Celebrate it systematically
  5. Embrace it personally

I recommend this book to anyone who is a position of leadership and is looking for simple ways to apply and nurture a vision to a team or organization.

NOTE: Okay, I can imagine some of you thinking “What does this has to do with software development?”. Well, take for example an architectural design or a software process you’d like to implement within your team or organization.  That’s your vision.  Now you need to make that vision a reality.  How would you go about it?  This little book provides some meaningful ideas to not only get buy-in for our vision, but also how to make your vision stick in the long run.

Microsoft’s DreamSpark: free access to .NET development tools for students

Boy was I late for this one!  In case your academic institution lacks a MSDNAA account, Microsoft has launched DreamSpark, a program dedicated for students to get access to various .NET development tools like Visual Studio 2008 Professional Edition, Microsoft Expression Studio, Windows Server 2003 Standard Edition, SQL Server 2005 Developer Edition, etc. for free!  The only caveat is that this program is only valid in the following countries:

  • United States
  • United Kingdom
  • Canada
  • China
  • Germany
  • France
  • Finland
  • Spain
  • Sweden
  • Switzerland
  • Belgium

It sucks that Australia, India and Russia aren’t there also, but hopefully they’ll be added before the end of the year (or before you graduate!).

There’s also a FAQ page available that might answer some of your typical questions.

Now you have a good excuse to put the books down and play with LINQ for a while ;)

Juval Löwy on the importance of interface-based programming (TechEd 2008)

At this year’s TechEd conference, Juval Löwy was interviewed on the principle of interface-based programming vs coding to abstract classes.  Not many .NET developers know the difference between an interface and an abstract class, and even less when and why to prefer one to the other (hhmmm…sounds to me like a good post to write soon).  If you didn’t get a chance to hear his full talk on the subject at Tech Ed 2008, I strongly suggest to invest 16 minutes today to watch this interview.

Microsoft Without Gates (CNN Money.com)

As you may have probably heard, Bill Gates will soon step down from Microsoft and step up to focus more of his energy toward his philanthropic and charity organization, the Bill & Melinda Gates Foundation.

CNNMoney has published quite a nice set of new articles about the legacy of Microsoft and Bill Gates.  Read more on “Microsoft Without Gates”.

The road towards MCPD-EAD: I passed exam 70-536

image This morning I passed the first exam (70-536) towards MCPD-EA which is the foundation exam that most of the other Visual Studio exams are built on.  If you’re considering taking on this exam, I strongly suggest you to get a copy of the MCTS Self Paced Training Kit Exam focused on 70-536.  Make sure you get the version that was printed in 2006, because I heard there were many errors (over 40 pages of them) in the previous release.

I started studying for this exam on May 22th and my strategy was to complete reading the book cover-to-cover in two weeks and then reserve an extra week and a half to practice concepts I didn’t fully understand simply by reading the material.  My daily intake of cramming was about two hours on weekdays (woke up at 6AM every weekday and study/practice until 8AM before going to work) and four hours on the weekend.  Just make sure you create your own study plan and see what fits best for you.  Your best friend when studying for this type of exams is .NET Reflector; if it wasn’t for this tool, I think it would’ve taken me longer to understand how some less familiar classes work in the framework.  Also, make sure you do (and re-do) all the practice questions and mock exams provided in the CD that comes with the book because even though it might not reflect entirely the real exam, you’ll sure learn more than a handful of tricks you can do with the framework.

As for the real exam, it was almost nothing compared to the review questions and the practice questions/exams provided with the book.  As a matter of fact, you’ll be thrown tons of questions that might get one of your eyebrows up on a side, unless you took some time to apply your knowledge on hands-on exercises.  I recommend you go crazy with your imagination and create your own set of exercises for at least a week (make it fun!).  That being said, I suggest you to go wacko with concepts attached to security (code access and role-based security), cultures and globalization (I had so many questions related to these), serialization, invoking processes, threads and interoperability between managed and unmanaged code (COM, PInvoke, etc.).

If possible, I recommend you studying with a friend or in groups to leverage common knowledge and understanding on some concepts which might be hard to grasp alone.  Also, have fun studying for it…remember that you don’t need to understand EVERYTHING in the framework…just enough to pass the exam with 70%.

Best of luck!

[UPDATE]

  • There’s an interview with three candidates for 70-536 that was recorded at TechEd 2008.

Quickly Search For An Exact Match in .NET Reflector

I love Lutz Roeder’s .NET Reflector. It’s one of those tools that makes me enjoy programming with .NET much like ReSharper does.

Whenever you’re searching for a type, a property or a string, you’ll get back a list of results containing the keystrokes you type. If you’re looking for an exact match for your search, you’d normally take your mouse and click on the Exact Match button (the last button from the search bar). I don’t like to swap my hand from the keyboard to the mouse for these kinds of operations.

Well, there’s a quicker way to search for an exact match in Reflector without having to click the Exact Match button. Just enclose your search query inside a pair of double quotes as the following screenshots demonstrate:

Searching for ‘Thread’ without the double quotes will return a huge list of types that contain the word “thread” in their name or namespace (see Figure 1).


Figure 1. Searching for ‘Thread’ without double quotes
image

Searching for ‘Threadwith double quotes will perform an exact match (see Figure 2).


Figure 2. Searching for ‘Thread’ with double quotes
image

Personal and Professional Development Through Reading

In Ten Simple Tips To Become A Valuable Software Professional, I listed “reading literature on various aspects of software engineering” at the top of the list. As you may probably know, our profession is pretty young compared to the other more traditional engineering fields as building engineering, electrical engineering and mechanical engineering. According to history, the term software engineering was popularized by F.L. Bauer during NATO Software Engineering Conference in 1968.

Exactly 40 years have passed since that conference was held in Germany and practitioners are still saying that software engineering is a pretty immature field and, unfortunately, displays a bad image as one of the major engineering branches. In the first page of the now popularized 1995 software engineering CHAOS Report from The Standish Group, a reason is given which supports the previous affirmation:

One of the biggest reasons bridges come in on-time, on-budget and do not fall down is because of the extreme detail of design. The design is frozen and the contractor has little flexibility in changing the specifications.

However, in today’s fast moving business environment, a frozen design does not accommodate changes in the business practices. Therefore a more flexible model must be used. This could be and has been used as a rationale for development failure. But there is another difference between software failures and bridge failures, beside 3,000 years of experience. When a bridge falls down, it is investigated and a report is written on the cause of the failure. This is not so in the computer industry where failures are covered up, ignored, and/or rationalized. As a result, we keep making the same mistakes over and over again.

There’s no doubt that that statement is still true: today’s software systems are much more complex to design and build than ever before. But then again, just like Jeff Atwood so properly stated, God didn’t invent x86. The laws governing physics in our planet are perfect. I can not say the same for the laws governing software engineering. I doubt whether we are going to achieve success from projects to projects unless we take time for ways to improve the way we design and deliver software. Nowadays we have to take into consideration many factors which comprises a software project:

  • Constantly evolving technologies which we have to familiarize ourselves with (from COM/COM+ to .NET for example)
  • Constantly changing requirements from stakeholders who seldom have a clue of what they want, even less of what they need in the first few iterations (typical)
  • Pressure from the marketplace to constantly ship early, which increases the chance for bugs to make their way in the code (which proves Guy Kawasaki’s thought that in the software market, we ship and then we test)
  • Dealing with social and cultural factors as more teams are composed of different people from around the world, each with their own unique personality, belief system, education and “professional ladder system”
  • Evolving hardware that our software needs to support (by hardware, I don’t mean just computers or mobile devices, but think about automobiles, airplanes, autonomous unmanned vehicles (AUVs), medical devices, etc.)
  • Familiarizing ourselves with heterogeneous software processes and methodologies when a company merges with another one (typical too).

My guess is that it will take many years, if not decades, before we see any improvement in each of those points above. And if Brook’s “Silver Bullet” theorem turns out to be a real prophecy (it hasn’t failed so far), then we better hold on to our keyboards and continue to find improvements to these problems, because just like our planet’s environment, our field is going to become a dangerous zone to live/work in…unless we do something about it. And you know what? There are many realistic solutions to such problems, and lots of them are waiting to be unfolded by people like you and me. I strongly believe that such solutions are being found in books and other literature in which professional individuals took some time in their lives to explain the problems and provide solutions to those problems in order to make our profession a better work environment for all. Not everything in software engineering is 100% about .NET, Java, TDD, Web application, SOA, software patterns, testing or software quality. In fact, according to Wikipedia’s definition on software engineering:

The discipline of software engineering includes knowledge, tools, and methods for software requirements, software design, software construction, software testing, and software maintenance tasks.

Software engineering is related to the disciplines of computer science, computer engineering, management, mathematics, project management, quality management, software ergonomics, and systems engineering.

The same is true for the other branches in engineering: not everything revolves around tools and technologies. In one of my engineering course, a professor once told us that engineers praise the Pareto principle (also known as the 80-20 rule). One instance of that rule is that for any engineering profession, in most cases, 80% of a project revolves around human interactions and only 20% is concerned about tools and technologies. Some even think that the actual rapport is 90-10. Nevertheless, we can agree that even in software engineering, human interactions and relationships have the upper hand in most software projects.

Going back again to the CHAOS report, the researchers discovered that three major reasons that a project will succeed are:

  1. User involvement
  2. Executive management support
  3. Clear statement of requirements

According to them, “there are other success criteria, but with these three elements in place, the chances of success are much greater. Without them, chance of failure increases dramatically. The following table shows what survey participants answered when asked about the factors that contribute the most to the success of a project:

 

Project Success Factors % of Responses
1. User involvement 15.9%
2. Executive management support 13.9%
3. Clear statement of requirements 13.0%
4. Proper planning 9.6%
5. Realistic expectations 8.2%
6. Smaller project milestones 7.7%
7. Competent staff 7.2%
8. Ownership 5.3%
9. Clear vision & objectives 2.9%
10. Hard-working, focused staff 2.4%
Other 13.9%

 

These same survey participants were also asked about the factors that cause projects to be challenged.

 

Project Challenged Factors % of Responses
1. Lack of user input 12.8%
2. Incomplete requirements & specifications 12.3%
3. Changing requirements & specifications 11.8%
4. Lack of executive support 7.5%
5. Technology incompetence 7.0%
6. Lack of resources 6.4%
7. Unrealistic expectations 5.9%
8. Unclear objectives 5.3%
9. Unrealistic time frames 4.3%
10. New technology 3.7%
Other 23.0%

Figure 1. My technology-oriented books collection (.NET, Java, PHP, Perl, OO, etc.)
My software books 

All these results show that human-based decisions and interactions are much more important than knowledge of a technology when determining the success of a project. And as such, I urge software professionals to read books and literature beyond those that are technology-focused. Reading books about .NET, Java, EJBs, or other technology-focused subject is good for your current project or job (short-term) but not that great for your professional ladder (long-term) because technology changes so drastically in such a short time that we have to keep up with the new bits and bytes, whereas reading materials that focus on principles tend to be technology-independent and longer lasting.

That being said, I recommend books that deal about leadership, personal development, teamwork, business, economics, different cultures from around the world, etc. My favorite book of all is the Bible because it is a collection of 66 books that touch base with all those human-oriented subjects. A library of one book…simply amazing! But there are also other books which I highly recommend if you’re serious about becoming a better developer and more solid software professional. Figure 1 shows the technology-oriented books in my library which I have read and have been a great help in my projects…but I haven’t developed with COM/COM+ in over 5 years! I don’t even remember the last time I compiled a C++ application. I keep those books mostly to show novice programmers what was the world of development before .NET, but other than that, I don’t have much use for them. On the other hand, Figure 2 shows the books in my library which deal with human interaction and personal development. These books I have read and re-read many times. They have helped me in the job and outside the job as well. They have helped me to grow as both a professional and as an individual. Rare is a software project that is being built by just one single individual. Even open source software project involve multicultural individuals from all around the world. Trust me: technology is not the primary factor that will bring success to any software project. It will never be. People is the factor that makes the difference whether a project will succeed or not. Software is built by people and for people. Even operating system software and real-time software aren’t primarily built for hardware…they’re built for people. Knowing how to deal with people, even outside your organization, is the cornerstone of any software project independently of its criticality and scope. So next time you’re visiting Amazon, think twice before buying another popular .NET, Ruby or Java book and rather consider purchasing a book that will help you grow as an individual and make you a much better software professional.  

Figure 2. My human-centric books (personal development, business, leadership, etc.)
My human-centric books

As you can see from both pictures above, my human-centric books only require one shelf, compared to two shelves for my technology-centric book (I might even need a third shelf as I’m starting to stack one upon another). You don’t need as much of these human-centric books. Just a handful is plenty enough. My favorite authors of such literature are Seth Godin, Guy Kawasaki, John Maxwell and Malcolm Gladwell. Three out of four of these authors maintain an active blog which you can access publicly at no cost.

But please, dear reader, don’t misunderstand me on books focused entirely on technology. I’m not saying they’re not worth it, quite on the contrary. They are excellent for reference on a very specific topic, but their scope is very narrow. There are two excellent resources which I recommend to software engineers who are looking for better ways to improve themselves and their profession:

From Wikipedia:

The software engineering body of knowledge is an all-inclusive term that describes the sum of knowledge within the profession of software engineering. Since it is usually not possible to put the full body of knowledge of even an emerging discipline, such as software engineering, into a single document, there is a need for a Guide to the Software Engineering Body of Knowledge. This Guide will seek to identify and describe that subset of the body of knowledge that is generally accepted, even though software engineers must be knowledgeable not only in software engineering, but also, of course, in other related disciplines.

The Code contains eight Principles related to the behavior of and decisions made by professional software engineers, including practitioners, educators, managers, supervisors and policy makers, as well as trainees and students of the profession. The Principles identify the ethically responsible relationships in which individuals, groups, and organizations participate and the primary obligations within these relationships. The Clauses of each Principle are illustrations of some of the obligations included in these relationships. These obligations are founded in the software engineer’s humanity, in special care owed to people affected by the work of software engineers, and the unique elements of the practice of software engineering. The Code prescribes these as obligations of anyone claiming to be or aspiring to be a software engineer.

I’ll end this post with a powerful statement from the CHAOS report as they conclude their report:

There is one final aspect to be considered in any degree of project failure. All success is rooted in either luck or failure. If you begin with luck, you learn nothing but arrogance. However, if you begin with failure and learn to evaluate it, you also learn to succeed. Failure begets knowledge. Out of knowledge you gain wisdom, and it is with wisdom that you can become truly successful.

That wisdom you also gain it by learning from each other: from your team members, your customers, your managers, your employees, and others. An easy and quick access to such wisdom is also in taking some time in reading human-centric books over technology-focused books. It worked for me…no doubt it’ll work for you.

Geek Links for June 14th, 2008

I didn’t do much passionate reading in the past few weeks due to my studies for MCPD certification, but I did get a chance to find time in reading the following articles.  I hope they’ll be helpful to you as they were to me.

  1. Ten Commandments of Egoless Programming
    A couple of tips concerning good behaviors to mimic in order to become a better team player and developer.
  2. Patterns in Practice: The Open Closed Principle
    A good practical introduction on the Open Closed Principle by Jeremy Miller
  3. Foundations of Programming – pt 8 – Back to Basics: Exceptions
    This post talks about some good practices to follow when handling exceptions in .NET. A must read for all .NET developers!
  4. Ten Books on Investing Recommended by Warren Buffett | Business Pundit
    Because you just never know.
  5. Coding Horror: A Visual Explanation of SQL Joins
    A beautiful and simple post on what different kind of joins do…visually. This is one of my favorite posts from Jeff Atwood, because he took the time to explain something that’s not too easy to remember in a very simple way. Great resource for novice developers wanting to easily memorize powerful SQL join strategies.
  6. 10 Things You Shouldn’t Do with SQL Server
    An article about 10 common pitfalls to avoid when developing in the backend using SQL Server. The author based this article on a popular talk he gave at TechEd 2004. A must-read for all you data access developers!
  7. Managing Software Engineers
    Excellent article by Philip Greenspun on how to nurture, keep and develop great programmers at work. Software engineers are a different breed of office workers. Many managers don’t realize that and at the end of it all, they can lose key developers from their organization.