Tuesday, December 22, 2009

Free eBooks on Agile and Scrum

Here are some links to free eBooks on Agile and Scrum. To download in IE, right click on the link and Select "Save Target As". If you are using Firefox, right click on the link and Select "Save Link As".

Scrum and XP from the Trenches
Scrum Primer
Do It Yourself Agile
Patterns of Agile Practice Adoption eBook Home Page

Monday, December 21, 2009

Tips for students aspiring for a career in Software Development



According to a recent survey, jointly carried out by the Federation of Indian Chambers of Commerce and Industry (FICCI) and the World Bank, 64 percent of surveyed employers are "somewhat", "not very", or "not at all" satisfied with the quality of engineering graduates' skills.
Read More

"Mere 25% of graduates that India produces every year is actually employable." --Jeffrey Fuller, principal advisor of Human Capital, a consulting arm of Mercer
Read More

It is common knowledge that formal college education in India fail to eqip the students with marketable skills necessary to seek employment opportunities after graduation. So we are witnessing a profileration of "Finishing Schools" in India promising to the fill this gap of employable skills (both technical and soft skills) not taught in formal college education. While I do not devalue the role of the finishing schools to fill the skills gap, I doubt if a few months course can make up for a few years of lost learning opportunity in college!

Not getting a decent job after graduation can be very demotivating for the students. So I think the best way out for the students is to take proactive steps to start learning marketable skills necessary for employment while they are in college (as opposed to wasting money in finishing schools after graduation).

Here are a few tips to help the students in IT proactively prepare for a good career:

  • Do not wait to acquire industry relevant skills until your final semister or after you graduate! Start as early as you can (preferably from the first year in college).
  • Theoritical knowledge is sufficient to pass exams. But hands-on programming experience is essential to develop software. If you aspire for a good career in software development, you should write a few thousand lines of code by the time you graduate from college. Contribute to an open source project if you can. This way you will have something worthy to show/discuss for during your job interview. The interviewer will also ask less theoritical questions if you have something worthy to show off!
  • You can learn multiple programming languages which are mandated by your university syllabus. But do not stop there. Select a language you like and get in-depth programing experience using it (preferably on an open source project of your liking).
  • Find somebody who is already working in the IT industry and is willing to help you acquire industry relevant skills. Consider this person your guru and mentor. This will complement your theoritical knowledge that you have leaenrd from your professors in college.
  • Read relevant online journals, blogs and news on IT. There are many free resources on the web to enhance and develop your skills.
  • Watch Podcasts. You can download them on your iPod or any other MP3 player and listen at your convenience. I strongly recommend the Career Tools Podcast.
  • Read good books on programming and design (whether they are part of your college syllabus or not).
  • Last but not the least, you can contact me if you already know Java and willing to try working on some open source projects. I can be reached at saurabh.banerjee@acclaris.com
Relevant Links:

Engineering Graduate Talent Pool in India, Highlights of Research Report, Nasscom, 2005

The Evolving Global Talent Pool - Lessons from the BRICS Countries, The Levin Institute, State University of New York, 2006

Saturday, December 05, 2009

Lean Software Development – Eliminating Waste

There is nothing so useless as doing efficiently that which should not be done at all. --Peter F. Drucker

Lean is a generic process management philosophy derived from the Toyota Production System. The Japanese term for waste is “Muda”. Eliminating waste is the very first step of going Lean. Here are some thoughts on eliminating waste in Agile Software Development for various activities:

Requirements:

• Agile advocates User Stories (as opposed to Use Cases). User Stories capture the high level Goal for a feature/function in one or two sentences in the product backlog. A conscious attempt is made to avoid too much detail. The details are worked out just-in-time during the development. This prevents premature optimization and over engineering of requirements.

• Specify Acceptance Criteria for each user story. Acceptance Criteria is very effective to communicate requirements to developers and discourages gold plating of requirements.

• Slice major user stories (epics) into multiple smaller manageable user stories. Develop the sub features in order of priority. Release something of value to the end user in every sprint. Receive feedback and adapt accordingly in the next sprint.

• Make a conscious attempt to avoid feature bloat (Swiss-Army-Knife approach) as much as possible. Increased complexity increases defect density, compromises usability, makes unhappy customers and drain development team’s resources.

Design:

• Agile teams do not treat design and development as separate silos. Both are integral to each other.

• Avoid elaborate design documents unless when working on very complex features. Live meetings/interactions are more effective for brainstorming design challenges and communicating design decisions.

• Avoid over engineering (use adaptive design as opposed to predictive design). Adopt Refactoring and continuous integration to evolve the design/code over time.

Development:

• Avoid multitasking. Work on one task at a time. Testing must be complete and the task should be ready for release before considering it ‘done” and moving on to the next task. It is important for everybody in the team to agree on a common definition of “Done”.

• Too much work in progress (inventory) in the development branch (code changes which were never released because other work got higher priority) will impede future work. Remove unreleased/incomplete code changes from version control for tasks which were interrupted/de-prioritized midway. Create patch files to preserve (hibernate) the code for future use if necessary.

• Check-in code regularly to version control to avoid last minute integration issues and resulting rework.

• Encourage collaboration (collective code ownership by the team as opposed to individual code ownership).

Testing:

• Do not waste time on elaborate test plans unless the customer mandates them. Keep test plans lean. In my last 14 years in Software development I have seldom seen anybody reading them!

• Keep test cases lean and focused. Avoid too many step by step instructions/details. Otherwise you will get lost in the details and generate useless paperwork. Scripted test cases usually exercise the happy paths.

• Automate regression testing of critical features/functionality which change/evolve frequently.

• Adopt a balanced diet of scripted and exploratory testing.

• Involve the testers from the beginning.

Planning:

• Do not overburden the team. Overworked teams are not effective in producing quality software. Overburden (“Muri” in Japanese) is one of the three types of waste identified in the Toyota production System. We all know how bumper to bumper traffic brings our highways to a standstill! Developers need down time to retrospect, reflect and improve.

• Processes/methodologies are only means to an end (working software). Always keep the end result in mind. Optimizing individual steps (doing things right) may not always lead to the right outcome (doing the right things). So we need to take a holistic look at value creation throughout the entire development process and eliminate non-value added activities as much as possible.

"The most dangerous kind of waste is the waste we do not recognize."
- Shigeo Shingo (Toyota)