tag:blogger.com,1999:blog-66788552024-03-07T09:56:36.671-08:00A New BeginningAgile Experiences and ThoughtsShanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.comBlogger127125tag:blogger.com,1999:blog-6678855.post-69534849111199075712014-09-10T07:25:00.001-07:002014-09-10T08:03:18.888-07:00ELK and Elasticsearch<br />
<h2>
<span style="font-size: 16px;"><span style="font-family: inherit;">Distributed Architecture with Cloud Computing</span></span></h2>
<span style="font-family: inherit;"><span style="font-size: 16px;">As the number of applications designed to run in the cloud increases, the distributed architecture has become more main stream. Instead of a monolithic application that scales vertically, more applications are built to scale horizontally and many are even aware of the cloud environment they are in. These applications are deployed with clusters of components over a network of compute nodes, each specialized for its specific goal. These components constantly communicate with each other as they carry out the business functions for the application.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">This distributed design allowed the component to be monitored through infrastructure monitoring tools typically used by Ops team. The nature of distributed architecture means there are now many more processes to watch, logs to collect. The value of single pane of glass to see what is going on at the overall application level has never been greater.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">As the information collected at the infrastructure level reveals deeper insight of the running application, the activity between Devs an Ops are now more intertwined. Ops team need to work closely with Devs to help understand the production status through the collected information, and Devs need to be able to put the information from different processes together to interpret the result. Those who can adapt to the new working dynamics can build successful product in the cloud era.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Devs and Ops together need a tool that is horizontally scalable, powerful enough to process all the data efficiently without sacrificing the user experience, a UI that is flexible and easy to use. More importantly, with the explosion of data the cost of total ownership needs to be easily understood and estimated.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">ELK stack appeals to the team who are proficient enough with deployment and self-monitoring service. Its built on top of a production tested lucene. Elasticsearch and Marvel both have the smooth out-of-box experience. The decoupling among logstash, elasticsearc, kibana and Marvel provides the most flexibility for deployment, something that always holds the highest value among Ops teams. Elasticsearch has the capability of scale without sacrificing the power of search. Its REST API is a must-have for the cloud era. </span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Developer-centric team, often found in early stage startups, might end up spending more time than they deem necessary to work out the details of the ELK deployment that does not come out of the box. The examples are:</span></span><br />
<ul><span style="font-family: inherit;">
<li><span style="font-family: inherit; font-size: 16px;">Tougher out-of-box experience for logstash agent than that with elastic search server, even though both are supposed to be a service</span></li>
<li><span style="font-family: inherit; font-size: 16px;">The programming experience during the configuration of logstash</span></li>
<li><span style="font-family: inherit; font-size: 16px;">User still need to dig around the internet to find the right grok patterns for common platform components</span></li>
<li><span style="font-family: inherit; font-size: 16px;">No out-of-box security, requires the knowledge or research on setting up reverse proxy.</span></li>
</span></ul>
<span style="font-family: inherit;">
<span style="font-size: 16px;">Comparing to SaaS like Loggly, ELK stack still comes with the cost of hosting and maintenance. For example, Some teams probably will need choose to use a monitoring-as-a-service to avoid the monitoring inception problem and ensure a much higher SLA needed for the ELK stack. </span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Log analysis has been a challenging problem to solve, and it has become harder than ever with the explosion of processes in Cloud Computing industry. The Devs and Ops see their goal as solving the production issues and keep systems running. They will build and tinker with tools if necessary but it is not considered as the primary job function. These users see a product like ELK be the essential part of their toolset, and are willing to put high value on services that will enable them to spend less time doing the chores and more time following the insights. With the ever growing community behind elastic search and log stash, Elasticsearch can become the thought leader in the community, drive discussion and foster innovation that leverages ELK stack. In addition to support license and monitoring license, there can also be revenue from training and consulting.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">At the same time, this is already a competitive market in big data archive, search and analysis on machine generated data. Since Lucene is of Apache Software License, there is not a barrier of entry for using the technology. The Apache Solr is one of the examples (a two-year old feature comparison can be </span><span style="color: #042eee; font-size: 16px;"><u>found here</u></span><span style="font-size: 16px;">). As Cloud Computing market continues to grow, the need for a log/eventing system will as well. Other factors like the cost of compute, disk, or UI development will continue moving to lower the</span></span><span style="font-size: 16px;"> barrier of entry to form a new end-to-end solution, </span><span style="font-family: inherit;"><span style="font-size: 16px;">encouraging new entrants to enter the market by attacking the problem from another angle. For example, there will always be the appeal of logging-as-a-service type of product like Loggly, which has the pay-as-you-go model and maintenance free for the users. By nature, the early adopters of ELK will always seek for better alternatives. </span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">In summary, with the community behind ELK stack, teams formed organically from the main contributors to the open source projects and a clear go-to-market strategy, Elasticsearch as a company does have the wind behind its back to grow user base, increase adoption and usages of the ever popular ELK stack.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;"><b>Beyond ELK and Democratize the Google Search</b></span><br />
<span style="font-size: 16px;">Given the existing user experience of ELK, designed to appear to the Devs and Ops, and the fact that the technology behind Lucene is for a more general purpose, it might be worth asking the question of what other customer Elasticsearch might be able to serve.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Google is known for its simplicity to use. There are many teams willing to push their email data to Google, sometimes violating company policy, because it is much easier to find related email and get their job done than Outlook or Exchange server. There will always be a need to search at local level with a limited scope and yet there is no clear winner in this category like what Google has for the internet search. </span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Can there be a product with the vision of "Democratizing the Google Search" to "Search UI to every company, organization and maybe even home"? How big would that market be?</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">If we consider a license and support fee on average $50 per person in work force, given the latest number of 150 million working population from Bureau of Labor Statistics, the total market value can be estimated at 150 million * $50 = $7.5 billion.</span><br />
<span style="font-size: 16px;"></span><br />
<span style="font-size: 16px;">Assuming one third would use a SaaS solution, charged based on volume, and assuming on average each person will have 10 GB charged by $0.20/GB/month, the total market value can be estimated at $3 billion. To clarify, this is different from the online storage like Box, Dropbox. The product is more like a search plugin for Yahoo! or Outlook.com, where the user can search at ease just like the Gmail users.</span></span>
Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-80178641586223922422013-03-26T18:00:00.002-07:002013-03-26T18:00:34.200-07:00What we have achieved at DevOps GTDI drafted the following response to an internal employee. As I finishing and going through it with my lead on the mentioned GTD pod, I cannot help but feel proud of what we have been able to achieve in the past year. I feel fortunately to be the manager of such a great team that pulled through the tough times. (Names have been swapped)<br />
<br />
<blockquote class="tr_bq">
Tony, we can help you get that $400 expensed as part of DevOps budget, and let¹s work together on what you are trying to achieve as a joined effort. I talked to Andy and he will reach out to you and coordinate. It probably will appear to take longer but it will have much better chance of organizational adoption and being sustainable.<br /><br />We at DevOps share your desire to change the status quo and make things suck less if not being phenomenal. These inefficiencies were easier to deal with when we were smaller, but it starts killing our productivity as we scale up. This is especially true for someone like you with a lot of knowledge and experience. Almost everything passes through has something tangible yet you know from history that almost nothing will be retained with our current setting. The valuable institutional knowledge remains in people¹s head rather than in a media that is easily accessible and searchable.<br /><br />The great thing working at Guidewire is that we have amazing persistence from the members of this community. People always strive to find a tool or process to make things better. When something sucks, people go beyond the call of duty to try something new, make some change for the better. Sometimes things work out great. After a bit of fumbling period, we have got production quality system like Jenkins, Confluence, GitHub, Nexus, upgraded JIRA system. Something staggered or failed. Open Q&A was out of commission with hardly anyone noticing. ReviewBoard is still on life support. But either way, the spirit of innovation goes on.<br /><br />Ideally, DevOps GTD pod would like to make that process smoother and better by providing our full attention to these initiatives and help along the innovation process. In the past year, it has been very difficult to break away from the daily grind with only one person (Adam) focusing on these with me help on the side. Even so, we (<b>mostly Andy</b>) were able to put certain systems in production operations, upgraded JIRA system, and keeping up with understanding and documenting the needs and desire of the teams even in the case where we couldn¹t address them, especially like this one.<br /><br />To follow your format, why this email?<br /><br />First, I hope I have credibly acknowledged your frustration and desire to make things better. You are not alone on this. No one should be. This is the job of GTD pod, a pod with a peculiar name because we care nothing but help you to Get Things Done.<br /><br />Second, in the past 12 months, we have been able to secure two open position to get us above the water, and we were able to fill those position before we suffocate along the way. With Ryan and Mandy joining in this year, we have finally got ground cover on JIRA initiatives and the Guidewire product release process. We can now stick our head out and are ready to be more involved with these initiatives.<br /><br />For the rest included in this thread, we would like to reiterate what we have been posting in DevOps regular updates (<b>PLEASE read them and let us know what you think</b>), please send your request to Dev Helpdesk so that we can gauge the demand for requests like this one and consolidate the effort in making things better. By aggregating the demand data, we will be able to align our long term initiatives and back them up with investment on people, tools, and process from the company. </blockquote>
Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-7082461249366262232012-10-29T10:26:00.000-07:002012-10-29T10:26:09.329-07:00Job PostingJob posting has been nothing short of an art these days. You want to attract the talent by describing the job as challenging and the environment as fun. Of course, it always helps if it is really the case. <br /><br />Fortunately for me, this is the case for Development Operations team at Guidewire. And fortunately for me, I got a lead who cares deeply about attracting the talent, and he drafted the following posting by himself. <br /><h2>
<span style="font-size: 14px; font-weight: bold;">Development Operations Engineer</span></h2>
<span style="font-size: 12px; font-weight: bold;">Foster City, CA, United States</span><br /><br />
<strong>How we hire </strong><br /> We’re looking for someone who’s good for the role, good for Guidewire and good at lots of things.<br />
Things move quickly around here. That means we have to be nimble, both
in how we work and how we hire. We look for people who are great at lots
of things, love big challenges and welcome big changes. We can’t have
too many specialists in just one particular area. We’re looking for
people who are good for Guidewire—and not just for right now, but for
the long term.<br /> <br /> <strong>How we interview </strong><br /> We’re
looking for smart, team-oriented people who can get things done. When
you interview at Guidewire, you’ll likely interview with four or five
team members. They’re looking for four things:<br /> <br /> <strong>Leadership</strong><br />
We’ll want to know how you’ve flexed different muscles in different
situations in order to mobilize a team. This might be by asserting a
leadership role at work or with an organization, or by helping a team
succeed when you weren’t officially appointed as the leader.<br /> <br /> <strong>Role-Related Knowledge</strong><br />
We’re looking for people who have a variety of strengths and passions,
not just isolated skill sets. We also want to make sure that you have
the experience and the background that will set you up for success in
your role. For engineering candidates in particular, we’ll be looking to
check out your coding skills and technical areas of expertise.<br /> <br /> <strong>How You Think</strong><br />
We’re less concerned about grades and transcripts and more interested
in how you think. We’re likely to ask you some role-related questions
that provide insight into how you solve problems. Show us how you would
tackle the problem presented--don’t get hung up on nailing the “right”
answer.<br /> <br /> <strong>Fit at Guidewire</strong><br /> We want to get a
feel for what makes you, well, you. We also want to make sure this is a
place you’ll thrive, so we’ll be looking for signs around your comfort
with ambiguity, your bias to action and your collaborative nature.<br /> <br /> <strong><u>The Position</u></strong><br /> <br /> <strong>The area: Development Operations </strong><br />
Development Operations provides a solid infrastructure to enable our
development team to quickly and efficiently develop new products. This
critical team combines software development, software administration,
and product management expertise to support our Guidewire development
team. As the primary infrastructure team at Guidewire we have the
ability and responsibility to make decisions that will benefit Guidewire
in the long term. We provide an infrastructure on which Guidewire can
cost-effectively scale. Every member of our team is expected to provide
new ideas, while we work as a team to prioritize and accomplish the
work that gives us the most bang for the buck. We can't do it all
ourselves, so our job is to communicate with those outside of DevOps to
establish healthy working relationships needed to support work of
Product Development and by extension our own work. Our job is to
educate our users to prevent fires from happening. We can't prevent
them all, but we can identify risk areas ahead of time and build an
infrastructure on which we can quickly respond. We hire creative
engineers and technology enthusiasts who enjoy being challenged by
organizational problems, with a strong desire to make services better
for users. Our teams come from diverse backgrounds, and we are actively
seeking new team members to bring fresh perspective to solving
problems, along with the technical and soft skills needed to keep
Guidewire's services growing and reliable.<br /> The role: Development
Operations EngineerYour job is to understand the daily activities of our
development teams and constantly think about ways to make them more
efficient. This includes:<br />
<ul>
<li>Listening to individuals across development, understanding their
activities, and constantly thinking about ways to make it more efficient</li>
<li>Searching for suitable software and tools</li>
<li>Making recommendations</li>
<li>Purchasing software</li>
<li>Install, configure and administrate tools with support from our Information Technology and Systems department</li>
<li>Giving presentations about the software tools</li>
<li>Documenting your work</li>
<li>Finding ways to provide training materials</li>
<li>Being the software system administrator and expert for JIRA, including:<br />
<ul>
<li>Designing and implementing workflows</li>
<li>Building custom plugins</li>
<li>Identifying and deploying 3rd party plugins</li>
<li>System administrator systems like Confluence, Mediawiki, GitHub, Perforce, Nexus</li>
<li>Lead projects across Development, Information Technology, and Information Systems</li>
</ul>
</li>
<li>You will scale your job by encouraging organizational learning and self-sufficient teams</li>
<li>You will encounter challenging, novel situations every day, and work
with just about every other engineering team and department at
Guidewire</li>
<li>You will be looked upon as an expert and advocate to fellow engineers</li>
</ul>
The ideal candidateWhat drives your work?<br />
<ul>
<li> More than a paycheck, you love your work and want to maximize your positive impact on the people in an organization.<br /> </li>
</ul>
Minimum Requirements<br />
<ul>
<li> BA/BS in Computer Science, Computer Information Systems or related
technical field. (In lieu of degree, 4 years relevant work experience).<br /> </li>
<li> Strong written and spoken English language skills<br /> </li>
<li> Solid communication skills<br /> </li>
<li> 1 year of experience at a small startup company or a startup-type team<br /> </li>
<li> 1 year of software system administration experience<br /> </li>
<li> 1 year leading a project to accomplish a goal<br /> </li>
<li> Do it yourself experience with Linux and Windows<br /> </li>
<li> You have served as an expert in 1 or more areas at a company<br /> </li>
</ul>
Additional Requirements<br /> You should meet about 8 of the following 12 requirements:<br />
<ul>
<li> 1 year in project lead or similar role<br /> </li>
<li> 1 year in tech support or similar role<br /> </li>
<li> 1 year in quality assurance or similar role<br /> </li>
<li> 1 year coding software using object-oriented techniques (in order of preference, Java, .Net, C++, Python, other)<br /> </li>
<li> 1 year hosting software as a service<br /> </li>
<li> 1 year as a doc writer, or otherwise extensively documenting your work<br /> </li>
<li> Experience troubleshooting web browser experiences: Internet Explorer, Google Chrome, Mozilla Firefox<br /> </li>
<li> Experience with Linux and Windows as an administrator<br /> </li>
<li> Experience with Linux systems requiring the use of scripting languages like Python, Perl, or Shell<br /> </li>
<li> Experience with Windows and Mac/Linux as desktops<br /> </li>
<li> Experience with Kanban or Scrum as a user<br /> </li>
<li> You have built your own product or service which is/was used by 10 or more people. This could be internal or external<br /> </li>
</ul>
Example Profile<br /> We don't expect someone to match this exactly, but the ideal candidate will have this kind of breadth of experience:<br />
<ul>
<li> 2 years of experience running and building a 2-3 person technical support organization<br /> </li>
<li> 2 years of being the only QA for a 4 person development team<br /> </li>
<li> 3 years of experience on a 2 person team hosting software as a service for 80+ customers<br /> </li>
<li> 4 years of experience building a customer facing product from scratch, deploying it to 20 customers, and supporting it.<br /> </li>
<li> 4 years of platform development using object-oriented techniques in VB.Net and VBscript<br /> </li>
<li> 1 year of experience writing an 80 page user guide to be used by over 300 customers.<br /> </li>
<li> 1 years of experience building a test infrastructure to automate deployment and running of automated tests<br /> </li>
<li> 1 years of experience leading a team of two to run those tests automatically across a large swath of servers.<br /> </li>
<li> 1 year of experience preparing a merge of a QA department into a Development (Coding) department.<br /> </li>
<li> 7 years of experience serving as an expert on JIRA, even though it wasn't your job.<br /> </li>
<li> 2 years building and supporting a tool that is used by 200
developers. The tool is part of a customer facing solution, which you
built the first fully functional version of.<br /> </li>
<li> 4 years of experience doing platform level JAVA Enterprise development</li>
</ul>
Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-5267027604009825552012-10-03T15:24:00.001-07:002012-10-09T23:19:16.539-07:00Leadership Trio - from the Beginning(All names here are fictional, and I recommend the readers not to think if they are based on any real characters. The point here is to tell a story about an idea that can be very interesting)<br />
<br />
"You should write this down." Andy told me, "The result of your effort is the change in us three leads.We are very happy with how you have coached us and provided clear opportunity for growth. But others in the company might not see it that way. They will see the three of us getting things done and nothing from you. And they will find reasons that they can believe for things that they don't understand. You need to communicate about your work, maybe in the form of blog."<br />
<br />
I brushed it off initially, thinking with my work during the day and school during the night, the last thing I want to do is to keep a blog about what I am doing at work. But that idea grew on me. After all, we should only brush off ideas because they are not good, not because we are too busy. Doing so would lead to the possibility that we might be spending effort on less worthy ideas right now and might be wasting our lives.<br />
<br />
So here I am, backtracking the footsteps of this most rewarding journey that I have stumbled upon as someone who is searching for the leadership style that fits me as a team member, a manager, and in the future, as a leader of a business unit or organization.<br />
<br />
<h2>
Prelude</h2>
<div>
<br />
The form of trio was the result of nothing more than pure luck. As I am getting to know the team and the operations after moving over one year ago, I slowly realize that I have been blessed with three capable leads. Believe it or not, it takes some training to be able to reach that realization. Andy, Vitaliy and Bernard are the leads who are ready for further career coaching. I have now established a good relationship with them. At the same time, I took the "<a href="http://www.totalleadership.org/">Total Leadership</a>" class in Wharton MBA that involves putting myself through a leadership coaching process. While still in the training myself, I can see the power of the coach framework. By the time that my training required me to design experiments that served the interests of my stakeholders and achieve four-way wins in the area of work, community, family and self, the idea came to mind to apply the same coach framework to the leads.</div>
<div>
<br /></div>
<div>
The format of my training made it pretty easy for me to write down essential elements for the experiments. I discussed them with my coaches (TA, Alumni coach and my coach trio) and received positive feedback and strong encouragement.</div>
<br />
I talked to the leads, confirmed their desire to be responsible and accountable for all aspect of their teams. I also got their agreement to form a trio as part of their training process.<br />
<h3>
</h3>
<h3>
Leadership Trio</h3>
<br />
Originally, I called this "Management Trio". However, the term "manager" has raised more eyebrows than I anticipated or wanted to deal with, because of its association with the HR policies and legal implications. Whatever the term is, the idea is to let the team also understand the non-technical side of the team operations. The purpose is to let members with technical background be involved with major decision-making and have a taste of life outside their normal realm. It serves as a natural career path for those who have the potential to become full-time manager, which is extremely valuable yet hard in a technical startup. It can also serve as a valuable education ground for those who decides to remain technical. The extra knowledge will make them more valuable because they can support the managers better.<br />
<br />
The trio structure provides quite a few benefits. It provides the check and balances it needs while supporting the coaching style management. It provides a good self-learning foundation, which is more valuable in a process where the main purpose is to promote learning to build a functional team. By leveraging the existing core competency and resources, the trio can effectively work through the challenges. By providing supporting structure for real-life learning, the trio structure can be easily duplicated elsewhere and can lead to grassroots movement.<br />
<br />
From the manager's standpoint, this structure is aligned with the change of management style in fast companies. The people with the best information are making decisions. The job of the managers is to communicate and coach the team so that the objectives and incentives are aligned and the teams are making the right decisions. Our company has recently grown from a start-up to a publicly traded company. As tit has grown, I have witnessed many cases where people turn to a manager to make decision for them or the manager steps in to head decision-making process. These behaviors have been pulling us away from the goal of always searching for innovation in organization structure and team governance. We should be mindful of the example set by companies such as GE, Semco who have maintained a culture of innovation despite their tremendous growth. We must make sure we don't lose the innovative culture we have built here.<br />
<h3>
</h3>
<h3>
Leads</h3>
<div>
<br />
It is still hard to say what kind of people are suitable candidates for this trio. For that I consider to be extremely lucky because I didn't have to go through the interview process. The most thinking that I have done was to look at my current three leads to decide if this serves their interest, and if they are ready for something like this.</div>
<div>
<br /></div>
<div>
Vitaliy brings his understanding, voice of reason, and good communication to the trio. Eager to learn and eager to help, Vitaliy has been the natural leader of his team. Vitaliy has a good way of communicating externally as well as internally, especially in contentious situation. I have learned much just by observing his interactions with others. Vitaliy provides good understanding and voice of reason which generates trust in the trio.</div>
<div>
<br /></div>
<div>
Andy brings his capability of strategic thinking under fire to the trio. Andy has been operating in a challenging environment for a year. He survived and delivered a major internal system upgrade single handedly, which is no small feat. While others like me always have the tendency to jump into any request and help people out, Andy has established a good practice of looking at the requests based on the urgency and impact, possibility of user error, so that he can address those who really need his help, and push the rest to learn to be self sufficient. There is always a contention with this model, and he has walked the fine line for over a year, and survived. This gives him the time and energy not only to survive, but also to think strategically about what we really need. This is how he was able to recognize the need to research and implement the solution ahead of anyone else in the department. Examples are the service level of certain servers, the disaster recovery readiness, the cost and benefit analysis for the medium term projects in the next two years.</div>
<div>
<br /></div>
<div>
Bernard brings in his style of Charisma to the trio. That statement is not as tangible as the two above, and that is because he has been in the shadow of the former leader until recently. There are a lot of signs showing that he has the capacity to lead and he has made it clear that it is his career interest. He has been watching the operations of Vitaliy, understand its value and want to learn the art of adopting it to his team. He has been learning about our build system and wants to migrate the system to fit more into that model. I have sat in quite a few user meetings and they all went very well. Bernard is confidence in voicing his opinions, while still take others input into consideration.</div>
<div>
<br /></div>
<div>
All three leads are smart people with good grasp of concepts and understanding the importance of business operations in additional to the pure product development. They learned the elements of operations on the job and acquired practical skills to succeed as a leader. At the same time, learning in a resource restrained environment has made it difficult to slow down enough time to look at the business as a whole and think about strategic plans, especially where there is no guidance or training about how to do that. All three leads are known for their capability of listening to people and making good judgment calls in terms of functionality and urgency.<br />
<br />
Each lead also has his own areas for improvement. I am not comfortable listing them here, yet, as it is highly personal. I do plan to invite them to be the writer of this blog to see if we can fill the missing information here.</div>
<h3>
</h3>
<h3>
Preparation</h3>
<div>
<br />
The only preparation is to make sure the leads are ready. Being a lead is a rewarding and challenging journey, and it is certainly not in the interest of every software engineer. During the one-on-one meetings, I talked with the team leads about their strengths as well as areas for improvement. Instead of simple praise or passing of critical judgment, I focused more on the future of the team. What do they want to do achieve for the team and for themselves, and what is preventing them from doing it? Through that conversation, I brought up the trio framework and they all signed up immediately. That was definitely a good moment because I was off to a good start.</div>
<h2>
</h2>
<h2>
Session I - Kick Off</h2>
<div>
<br />
The first session is the kick off session. I want to bring the coaching dynamics in the one-on-one to the trio. To do that, each lead needs to learn more about each other and be aware of the desire and strength of each other. There will be time for them to learn about the area where each other needs help with but that will come later.<br />
<br />
We went around the circle asking the question: What is your goal? What would you like to achieve for the team and for yourself? The answers were interesting such that they are on different level: relationship with customers that we are serving, the value we are bringing to the company, and the technical innovations that we can foster within the team. This is another sign that the trio is a versatile group.</div>
<div>
<br /></div>
<div>
The second round of question was: Identify one thing that you can bring to the group that others don't necessarily know about. I don't have the notes on the answers but I remember we got good laughs. My goal of building rapport among the trio was definitely achieved.</div>
<div>
<br />
After that round of exercise, it is the experiment framing stage.<br />
<br /></div>
<div>
"This is an experiment that will benefit Guidewire as well as us individually. By experiment I meant that it can fail, even though the chance of success is high. This is an idea that I have thought through, and have got feedbacks from others. As of now, you three are part of a trio for learning about team and organizational management. You will practice and learn how to coordinate on behalf of your team. You will learn how to reach non-political agreement."<br />
<br />
Then I open the floor to let the trio talk. The topic was mostly focused on how much this is needed at this stage of personal growth and company growth. I think we also touched on my role in this and my answer was that I will assume the coach role and I expect them to reach decisions through peer discussions. The lead could and should look for me for advice and I would still focus on talking through the issues and help the leads reach decisions.<br />
<br />
The next two questions are based on the feedback I got from my coaches. How would the trio reach agreement on decision? At what point would we know that this is not working?<br />
<br />
For the first question, the agreement was to talk about it through open conversation. Later, we moved this to an online chat room, so that the conversation can keep going even as we are busy with other tasks, and even when we are remote.<br />
<br />
For the second question, the answer was that when things are being dropped, that would be the sign. I agreed to keep sending feedback whenever I want the confirmation that things are not being dropped.<br />
<br />
The meeting then adjourned, marking the start of trio.</div>
<br />Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-12028782281364998122012-10-01T00:34:00.001-07:002012-10-01T00:34:31.000-07:00Bonus SystemA bonus system is to be designed with the idea that it is a motivation tool. Its purpose is to maximizing the desire of the members to do better. While there is certainly some benefit of paying attention to only a small number of elites in the organization, the effectiveness of a bonus system can reach to majority of the community, including those who don't receive the bonus.<br />
There are many articles, case studies, blogs, videos and theories around motivation and reward system. When it comes to bonus system, it helps to think from two perspectives: equity and expectancy. They can be applied to understand the motivation oriented compensation. To reach a solid structure for a particular company, other factors like the history, recent events, and members also play a big part.<br />
<h2>
Equity Perspective</h2>
One way or another, individuals will compare their job inputs and outcomes with those of others and then respond to eliminate any inequities. People have strong psychological reactions to fairness in how they are paid and these need to be managed carefully. Given the uncertainty of bonus for each year, this psychological need is especially strong during the payout period. A effective bonus system can present enough degree of fairness and continue motivate even those who don't receive them. When not managed carefully, a bonus system can generate anger for the under-rewarded, guilt for the over-rewarded, and confusion across the organization, thus defeats the purpose of the bonus system as a motivation tool.<br />
<br />
When inequity is perceived, the result can be damaging. Some will lower their input; some will change their outcome (e.g. increased units produced at lower quality); some will distort perception of self; some will distort perception of others; some will choose a different reference for comparison; and mostly commonly in silicon valley, some will leave the field or the company.<br />
<br />
The key element here is an individual's perception of justice. While the differences of opinions make it hard to manage, the subjective element suggests that the most important piece is the perceived fairness of the process used to determine the distributed rewards. For employees to see a process as fair, they need to feel they have some control over the outcome and feel they were given an adequate explanation. It is important for the manages to be consistent, unbiased, make decision on accurate information and is open to appeals. This is why it is important for managers to provide early feedback as well as frequent feedback to detect inconsistency and gather more information base on the reaction from the employees. This interaction is more important in the case of bonus, because there is an implicit reset after each year. At the beginning of the year, the employees and the manager start the process again by providing the employee an opportunity to present his or her point of view about the desired outcome to decision makers.<br />
<h2>
Expectancy Perspective</h2>
The following picture illustrates the expectancy theory (source: Wharton MGMT 621 class material)<br />
<img alt="" src="data:image/png;base64,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" /><br />
In practical term, employees will be motivated to exert a high level of effort when they believe that effort will lead to a good performance appraisal; that a good appraisal will lead to organizational rewards such as bonus, a salary increase, a promotion, or a public recognition; and that the reward will satisfy the employees personal goals.<br />
<br />
This is particular applicable to bonus because of the one time nature of the rewarding system. The reward only applies to the past review period, thus giving managers and employees a common ground to repeat the motivation process on annual basis. Among others, bonus remains as a desired outcome for most employees because it is always extra money that is in proportion of the regular income. In this case, an effective manager will be able to build the shared connection between performance to outcome, and from effort to performance.<br />
<br />
<b>Performance to Outcome</b>: While it is easy to define outcome (bonus rewards) and performance (annual appraisal), it is harder to build the connection from performance to outcome in an organization where there are different teams and roles. The perspective of equity mentioned above goes a long way to design a process that can be perceived as fair. <br />
<br />
<b>Effort to Performance:</b> In the context of bonus system, the manager can set goal ahead of the time, and use it for performance appraisal. When the right goals are set, the employees can see a strong connection between their effort and the performance rating they will get. The most effective goals are difficult but not impossible, specific, and have to be accepted by the employee. Another way to describe the criteria of a good goal is SMART: specific, measurable, attainable, relevant, and time-bound. These criteria, especially time-bound, fit very well in the bonus system.<br />
<h2>
In Conclusion</h2>
It is always a challenge to design a reward system in a corporate setting. That challenge applies to the bonus system as well. When it comes to bonus system, however, one can gain deep insight by being informed and continue thinking in the perspective of equity and expectancy.<br />
<br />Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-49196698329795486392011-05-11T13:12:00.001-07:002011-05-11T13:12:27.129-07:00Blog of the dayInteresting article because it relates exactly to what we are going through. I am only wondering about the stage we are inShanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-51855296853478316662010-07-28T10:04:00.000-07:002010-07-28T10:06:27.148-07:00Top 10 Reasons for Slow Velocity<a href="http://www.svpg.com/top-10-reasons-for-slow-velocity/">http://www.svpg.com/top-10-reasons-for-slow-velocity/</a><br /><br />My current challenge at work is to capture velocity reliably, but I am sure this post will come handy sometime down the road.Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-92086097172314409452009-10-22T22:42:00.000-07:002009-10-23T22:00:01.933-07:00Automation of Burn-up and Burn-down charts using GScript and EntranceI have always found that the burn-up and burn-down charts are very informative and fit to the iterative story-based development very well. Every project that I work on, I will try to figure out <a href="http://agileworks.blogspot.com/2009/01/burn-up-and-burn-down-charts.html">different ways to generate burn-up and burn-down charts</a>.<br /><br />Two months ago, I took the job on putting Platform on Sprints. After some consideration, I have decided to follow the setup that I have for the AF team, creating the stories <a href="http://agileworks.blogspot.com/2009/02/jira-story-wall.html">in the form of JIRA issues</a>. However, the chart generation that I had for AF team was still semi-manual, which means that it takes a couple of minutes to download, and a couple of minutes to update the stats every morning. The worst part is that when I get busy or sick, I will forget.<br /><br />So my first action item was to figure out how to generate the same kind of charts with the push of a button. The idea seems to be easy enough:<br /><br /><ol><li>Figure out the search criteria to retrieve all the JIRA issues of the backlog</li><li>Count the issues that are in different states</li><li>Update the data with the counts, and check it into Perforce.</li><li>Refresh the chart with the updated data<br /></li></ol>Number one and two were actually not that hard, because Guidewire GScript has a nice WebServices support. With a few tries, I was able to count the beans.<br /><br />Here is an example of the data generated. I think you get the idea just looking at it.<br /><blockquote><span style="font-size:85%;">Date,Day,Closed,Deferral Requested,In QA,Open Stories,Open New Features,Open Bugs<br />10/09/2009,41,55,0,1,13,7,40<br />10/12/2009,42,55,0,1,14,7,40<br />10/13/2009,43,56,0,0,14,7,40<br />10/14/2009,44,56,0,0,16,7,41<br />10/15/2009,45,56,0,0,21,8,42<br />10/16/2009,46,58,0,1,19,8,42<br />10/19/2009,47,58,0,2,28,8,42<br />10/20/2009,48,58,0,6,26,8,42<br />10/21/2009,49,58,0,6,26,8,42<br />10/22/2009,50,58,0,7,25,8,44 </span><br /><br /></blockquote>Number three took less time but a bit of research because Perforce Java library's API is not exactly straightforward.<br /><br />It took me a while to figure out how to do the last one. After looking into <a href="http://www.jfree.org/jfreechart/">JFreeChart</a> and <a href="http://code.google.com/apis/chart/">Google Chart API</a>, I eventually turned to my dear friend, <a href="http://www.todlandis.com/">Tod Landis</a>, who is also my partner at <a href="http://dbentrance.com/">Entrance</a>, and he quickly drafted an entrance script for me. Based on it, I was able to write a template that can be used for all teams within a few hours.<br /><br /><blockquote style="font-family:courier new;"><span style="font-size:85%;">PLOT<br />very light yellow area,<br /> light yellow filled circles and line,<br />DATALABELS<br />very light orange area,<br />light orange filled circles and line,<br />very light red area,<br />light red filled circles and line,<br />very light blue area,<br />light blue filled circles and line,<br />very light gray area,<br />dark gray filled circles and line,<br />very light green area,<br />dark green filled circles and line,<br />all AXISLABELS<br />WITH<br />ZEROBASED<br />TITLE "Sprint"<br />TITLE X "Days"<br />TITLE Y "Points"<br />SCALE Y 0 100 0<br />CLIP<br />legend<br />gridlines<br />collar<br />no sides<br />SELECT<br /> `Open Bugs`,<br />`Open Bugs`,<br />date,<br />`Open New Features`,<br />`Open New Features`,<br />`Open Stories`,<br />`Open Stories`,<br />`In QA`,<br />`In QA`,<br />`Deferral Requested`,<br />`Deferral Requested`,<br />`Closed`,<br />`Closed`,<br />day<br />from report;</span><br /></blockquote>Please note this is the final PLOT script, there are other SQLs run before this to import the data into the MySQL database, sum up the data to produce a stacked chart, and even out the labels.<br /><br />And I now have this chart generated automatically every morning with the help of a windows scheduler.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKgsAGcLYN4xfflZmEL4JGeIhXcz33AlN47WH3mykUH5dzO4PKzv2yHut63mWznPj2oeMi_pn9M1uuF7jOpvWFMYypluz4nEAHFhpAnIn8DKZx2H4BZpmpwQbeCgxPY1176NoM/s1600-h/entrancechart.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKgsAGcLYN4xfflZmEL4JGeIhXcz33AlN47WH3mykUH5dzO4PKzv2yHut63mWznPj2oeMi_pn9M1uuF7jOpvWFMYypluz4nEAHFhpAnIn8DKZx2H4BZpmpwQbeCgxPY1176NoM/s320/entrancechart.png" alt="" id="BLOGGER_PHOTO_ID_5395671255487643026" border="0" /></a>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-19199626662840590762009-06-10T10:18:00.000-07:002009-08-21T23:33:56.228-07:00Cotta Asserts vs FEST Asserts<b><span class="Apple-style-span" style="font-size:large;">Background</span></b><div><br /></div><div>Cotta-asserts is a public release of the JUnit 4 assertion adapter that came to as part of the Cotta implementation and my search for a better sematics for assertions in test.</div><div><br /></div><div>FEST-Assert is a Java library that provides a <a class="urllink" href="http://martinfowler.com/bliki/FluentInterface.html" rel="nofollow">fluent interface</a> for writing assertions. Its main goal is to improve test code readability and make maintenance of tests easier. </div><div><br /></div><div><ul><li>Cotta-asserts: <a href="http://cotta.sourceforge.net/assertions.html">http://cotta.sourceforge.net/assertions.html</a></li><li>FEST-assert: <a href="http://fest.easytesting.org/assert/wiki/pmwiki.php">http://fest.easytesting.org/assert/wiki/pmwiki.php</a></li></ul><br /><span style="font-weight: bold;">Bottom Line</span><br /><br />The bottom line is that these two libraries are trying to solve the same problem in a different way, so they are both viable solution for writing assertions through fluent interface. Even though personally I like what I have built, I would not argument very hard about using one versus the other, same way as I would never argue between JUnit and TestNG, even though all my projects have been JUnit (And I know some people feel strongly about it).<br /><br />I can also say the same thing about Java versus Ruby. When it comes to the bottom line, having a gelling team building high quality software that makes the user happy is all I care.<br /><br /><span style="font-weight: bold;">Why I like FEST asserts</span><br /><br />Don't get me wrong, I love FEST asserts. Their API looks solid and really complete. Even now, Cotta Asserts still has some way to go to catch up, it is simply not high enough on my list, and I have not found anyone willing to contribute.<br /><br /><span style="font-weight: bold;">Why I like Cotta Asserts</span><br /><br />With that said, I think it is worth it to write down the reason that I like Cotta Asserts.<br /><br />First of all, Cotta Asserts is aimed to filling the gap of JUnit and Hamcrest, nothing more. It is just an API adapter that exposes the assertThat method in JUnit 4 and the matcher classes in Hamcrest. If one day this fluent API appears on the new JUnit release, I would be happily retire this little side project, and get back to the next item of my long list of things I would like to try as an open-source project.<br /><br />Second, you can extend Cotta Assert however you want it to be, because all the classes are open to extension. You can extend AssertionFactory and add more methods to return other assert objects. You can make your AssertionFactory return different StringAssert.<br /><br />For FEST-asserts, I always wonder why they made the classes final. It does not seem to serve any purpose. Then again, I never asked, so there could be some good reason behind it.<br /><br />If you have been using assertThat method in JUnit, chances are that you already have a bunch of matchers lying around, and probably start having trouble remembering where they are. You just need to create your AssertionFactory and Asserts to leverage them and you don't have to throw anything away or even change anything.<br /><br />With FEST-asserts, when you look at <a href="http://docs.codehaus.org/display/FEST/Extending+FEST-Assert+with+Custom+Assertions">an API like this</a>, something is just not right...<br /><br />FEST-asserts requires you to add one assertThat method for each object type that you want to run asserts on, and <a href="http://docs.codehaus.org/display/FEST/Extending+FEST-Assert+with+Custom+Conditions">one method for each custom condition</a>. It can get confusing sometimes if you have different modules that do assertion on different objects in the module.<br /><br />With Cotta Asserts, you only need one field declaration from the super test case class, and everything just goes from there. So it is really easy to set up, and really easy to customize it so that each module can have methods that only create asserts that are applicable to the module.<br /><br />So here you are, happy testing!<br /></div>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com2tag:blogger.com,1999:blog-6678855.post-17001167472533898102009-06-05T11:15:00.000-07:002009-06-05T12:03:36.201-07:00Touché<div>(This one definitely falls in "<a href="http://jamesshore.com/Agile-Book/energized_work.html">Energized Work</a>" category)</div><div><br /></div>In an email thread with my old XP mentor and a long time friend, <a href="http://www.agileinstitute.com/">Rob Myers</a>, about coordinating the next <a href="http://www.bayxp.org">BayXP</a> gathering, I mentioned that I have another baby coming soon.<div><br /></div><div>Rob: "... about time!"</div><div>Shane: "... are you saying that I should get a life and stop messing with this thing called 'agile'?"</div><div><br /></div><div>Rob:</div><div><div><blockquote><span class="Apple-style-span" style="font-size: large;"><b>"Au contrare my friend. Living 'agile' is supposed to provide you with the opportunity to have a life beyond the office. We should coach through example! :-)"</b></span></blockquote></div><div>Shane:</div><div>"..."</div><div>"..."</div><div>"Touché"</div><div>"..."</div><div>"I think this deserves a blog post"</div><div><br /></div><div><br /></div></div><div><span class="Apple-style-span" style="font-family:arial;font-size:100%;"><span class="Apple-style-span" style="font-size: 13px; "><div><div><br /></div></div></span></span></div><div><span class="Apple-style-span" style="font-family:arial;font-size:100%;"><span class="Apple-style-span" style="font-size: 13px; "><br /></span></span></div>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-48651582857723483622009-06-03T23:04:00.000-07:002009-06-03T23:21:21.120-07:00JUnit Assertion AdapterI have been trying different assertion styles ever since I read <a href="http://joe.truemesh.com/blog/000511.html">this blog</a>, like many others. If you google "assertThat" you can find many hits.<br /><br />With the creation of <a href="http://cotta.sourceforge.net">Cotta</a> project, I got a chance to really think hard on simple file operations and tests to see how I can make the API as polite as possible, and I think I have found a good answer.<br /><br />With the default JUnit 4 assertion, you still don't get the benefit of a static typed language, in that you have to remember the class to use to create the matcher for a certain type.<br /><br />So I created a JUnit assertion adapter that will allow you to type<br /><blockquote><span style="font-style: italic;">ensure</span>.that(yourValue)</blockquote>and get the appropriate assertions object based on the type of the object being passed in. The type of the returned object will have just the assertion methods that are applicable to the value.<br /><br />This also brings an additional benefit. For example, you can have a list instance and call<br /><blockquote><span style="font-style: italic;">ensure</span>.set(list)</blockquote>and it will automatically convert the list to the set and return the set assertion object.<br /><br />I have just made a release under the cotta project for general feedback <br /><br />The simple document page is here: <a href="http://cotta.sourceforge.net/assertions.html">http://cotta.sourceforge.net/assertions.html</a><br />and the jar can be downloaded here:<a href="https://sourceforge.net/project/showfiles.php?group_id=171037">https://sourceforge.net/project/showfiles.php?group_id=171037</a>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com3tag:blogger.com,1999:blog-6678855.post-40486110406912806472009-03-07T20:44:00.000-08:002009-03-27T09:38:02.956-07:00Phoenix First Two XP SprintsPhoenix has finished its Sprint 5 and 6, which are the first two XP Sprints.<br /><br />An XP team always goes through four stages, "forming, storming, norming, performing". The first Sprint felt like a storming stage, where we are trying to figure out the best way to get the code in without spending too much time on upfront design. At the same time, we are also getting used to paired programming.<br /><br />Even though paired-programming has become an old trick for me, I still feel that my pairing skill has gotten worse during the past three years of working solo. The second Sprint felt a lot better, and I am hoping to keep this trend.<br /><br />Items that worth noting:<br /><br /><ul><li>We modified <a href="http://agileworks.blogspot.com/2009/02/lava-lamp-with-cruisecontrol.html">the lava lamp</a> to have a green light on when everything is good. Even though it is redundant, it has very positive effect among us. The only thing we might need to watch out is that someone mentioned that they could be fire hazard because the lamp gets very hot at the end of the day. So we are going to turn them off by the end of the day. This is when I found out that the X10 remote controller does not work, so they are back for replacement now.</li><li>The lava lamps are helping us getting on the habit of treating broken tests as the highest priority. Due to the nature of Phoenix, we got some interesting test breakage already. We got tests that only break on the server, tests that only break on Linux, and a test that hung. One interesting discovery is that each time we are forced to figure out what is wrong and fix them, our tests ended up making better sense and being more like behavior driven, and I was planning on settling for hacks to keep the test passing!</li><li>At the beginning of the project, we chose to create just enough stories to get us through the first Sprint, then created a few more for the second Sprint. Looking back, I think that is a good choice. The kind of stories that we create now are so much different but better from the earlier ones. I think that is because at the beginning, your system has literally nothing. It would take a very good story writer to come up with a list stories that really fit into the "<a href="http://xp123.com/xplor/xp0308/index.shtml">INVEST</a>" category of the story. I am not saying it is impossible, I just think that two Sprints of bad stories is not a bad price to pay to get the ball rolling as early as possible and avoid lots of hassle to learn and teach and debate about good stories vs bad stories.<br /></li></ul>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-33311999795253256112009-02-23T12:35:00.001-08:002009-02-24T10:01:53.081-08:00Lava Lamp with CruiseControlAs we are getting Phoenix project under way, I am trying to get it started right by introducing more XP practices. The first three things that we are trying to do are Paired-Programming, Test-Driven Development, Continuous Integration.<br /><br />Actually, Guidewire has already built an internal tool, ToolsHarness, to handle continuous integration, as I have written in "<a href="http://agileworks.blogspot.com/2008/02/enterprise-agile-testing-part-iii.html">Managing Tests with ToolsHarness, Individually</a>". The only difference that I want to introduce for Phoenix project is to fix broken tests <span style="font-weight: bold;">AS SOON AS POSSIBLE</span>.<br /><br />What this means is that I want the testing status of our branch to show right in out faces, without us having to launch a browser, so that we know to take action the moment a test is broken.<br /><br />I talked to the developer who manages ToolsHarness, and he wrote a servlet that serves information about broken tests and test status like <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuKPdpIuqYQlCSLyagkmzKr-PxYvIzKFAYwTXwX9WtlN9sk5vRRBxpIb8FkqK2krK1WmAUnMNhn9AdJF2IjVDyqU1RPcpRilNTvLOpaAiJSo_cZhJjArKhDfJQxBKwjkGpjFeo/s1600-h/trackingtests.jpg">this picture</a>, except in one HTTP GET. Then I set up <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a>(version 2.8.2) with X10 publisher, following the setup described on this blog post <a href="http://pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/Devices/BubbleBubbleBuildsInTrouble.rdoc">"Bubble, Bubble, Build's In Trouble</a>".<br /><br />One thing about the normal lava lamp setup has always bugged me in the past, which is when the continuous integration server is in the "testing" state. When you have test broken, the red lava lamp will be on, and you just have to remind yourself that the fix is in and test is running. In some projects, I have used "<a href="http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/ListeningToComplexSystems.rdoc">project soundscape</a>", so that when tests finishe but are still broken, you will know about it. But if you happen to step outside, you will miss it. Or if you just came in, you have to check the browser or ask others.<br /><br />So this time, I have done it a little differently, taking advantage of the fact that CruiseControl is not the process running the tests. I bought two lava lamp, one kind of in the red color and the other in blue. I set it up so that when there are two independent lava lamps:<br /><ul><li>Red Lava Lamp for broken tests: When there are broken tests, it will be on, otherwise, it will be off</li><li>Blue Lava Lamp for testing status: When there are tests running, it will be on, otherwise it will be off</li></ul>In this way, you have four state to display:<ul><li>Neither is on: All tests pass and the tests are up-to-date</li><li>Blue is on and red is off: All tests pass so far, but there are tests running against newer changes</li><li>Blue is off and red is on (see below): You have broken tests, and no code checked in to fix it<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLnrrwxojDNq2dqmAwhv1TfjT70uo9yGMwq81vp_87jRAlz8pOksTP5JXuj9eYXukHOTRjsuXDpZRc-DIFM9abq19C12FYa-e9HLwX0NdgJGod3uLwRRQalDZl-N_efFrheLQs/s1600-h/broken.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLnrrwxojDNq2dqmAwhv1TfjT70uo9yGMwq81vp_87jRAlz8pOksTP5JXuj9eYXukHOTRjsuXDpZRc-DIFM9abq19C12FYa-e9HLwX0NdgJGod3uLwRRQalDZl-N_efFrheLQs/s400/broken.jpg" alt="" id="BLOGGER_PHOTO_ID_5306094337327611714" border="0" /></a></li><li>Both blue and red are on (see below): You have broken tests and someone has cheked in new code (hopefully to fix it)<br /></li></ul><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXgzs_gErCNqLn74gtXXUI9b3J_MIg2sDxALZcppxf4-vPPWCQGs2rkHyp-omwuxheCO_q9aWCiSy7CKP7ZjXhSRea0A3uKfArX1SUDUWXi48EnMW9Jf9ZAHz68XsjwJYAQpiK/s1600-h/fixing.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXgzs_gErCNqLn74gtXXUI9b3J_MIg2sDxALZcppxf4-vPPWCQGs2rkHyp-omwuxheCO_q9aWCiSy7CKP7ZjXhSRea0A3uKfArX1SUDUWXi48EnMW9Jf9ZAHz68XsjwJYAQpiK/s400/fixing.jpg" alt="" id="BLOGGER_PHOTO_ID_5306094341510844370" border="0" /></a><br />The setup is pretty straightforward, except CruiseControl 2.8.2 release is missing two crucial files, "lib/win32com.dll" and "lib/javax.comm.properties", for X10 publisher to work. That, and me missing a tiny but also crucial detail in the documentation, caused my three-hour-hair-pulling experience, and that was with <a href="http://blog.jeffreyfredrick.com/">Jeffrey</a> coming to rescue through GTalk. I am going to submit the patch for the release script to include those two files, and documentation with the following checklist:<br /><ul><li>You should provide all <span style="font-weight: bold;">FOUR</span> attributes related to X10 for the <x10> element, so that you are aware of them and make sure they are correct. These four attributes are as following:<br /><ul><li>"houseCode" and "deviceCode" are for X10 module configuration.</li><br /><li>"port", with the value of COM1, COM2, etc., to match the place you plugin the COM module.</li><br /><li>The last one is "interfaceModel", which you should really double check with the COM module that you have.</li></ul></x10></li><br /><li>Make sure "javax.comm.properties" is in your CruiseControl lib directory (should be there after 2.8.3)</li><li>Make sure you copy "win32com.dll" from CruiseControl lib directory (should be there after 2.8.3) to your Java bin directory<br /></li></ul><span style="font-weight: bold;font-size:130%;" >In the end, I would like to say that I am a satisfied <a href="http://the.ci-guys.com/">ci-guys</a> customer!</span>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com3tag:blogger.com,1999:blog-6678855.post-49170647128588346532009-02-22T12:44:00.000-08:002009-02-22T12:47:30.848-08:00Greate Article on Pair-ProgrammingAll I can say is that this article says <span style="font-weight: bold;">EXACTLY</span> how I feel.<br /><br /><a href="http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/">http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/</a><br /><br />One thing to add is James Shore's <a href="http://jamesshore.com/Blog/Whats-Pair-Programming-Really-Like.html">Programmer Man's Theme Song</a> (see end of the post)Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-85955922478339783782009-02-08T21:09:00.000-08:002009-02-09T21:30:55.629-08:00JIRA Story WallWith the "shared dashboard" feature of JIRA, we have been experimenting a shared dashboard that can be served as a virtual story wall that can be useful to us. And here is one version.<br /><br />AF stories are in the form of JIRA items, in this way, JIRAs created by other teams for bug fixese or support can be rolled into one backlog. Creating stories in the form of JIRA is not nearly as trivial and easy as creating stories on the index cards. But once you pass that phase and get yourself used to it, it does bring a lot of benefits of a digital media.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1AIWiix4RXQ/SY-8ny7TmJI/AAAAAAAAA2U/Ax8BTqAMr9M/s1600-h/af_information_radiator.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 244px;" src="http://4.bp.blogspot.com/_1AIWiix4RXQ/SY-8ny7TmJI/AAAAAAAAA2U/Ax8BTqAMr9M/s400/af_information_radiator.jpg" alt="" id="BLOGGER_PHOTO_ID_5300662678309804178" border="0" /></a>On the left, the first section shows the stories for the current Sprint with status and the person who is working on them. Each person is to finish the JIRAs assigned to him or her, before picking the ones assigned to the general bucket (AF General).<br /><br />The section section shows the stories allocated for the next Sprint, grouped by assignees and components. The third section shows the full current backlog by component and priority. We used it a lot when trying to figure out what to work on next or what to push to next release. The last one is the backlog for the next milestone.<br /><br />During the Sprint, some issues will come up. The most urgent ones will be pulled into the current Sprint to be dealt with right away. The others will either be added to the next Sprint, or add to the appropriate backlog. At the beginning of the Sprint, after counting the JIRAs already added to the Sprint, carrying over the ones from the past Sprint, we will select more JIRAs from the backlog by looking through the components.<br /><br />On the right, the first section is the list of the JIRAs that the current user is working on (In Progress). It has been pretty useful to me to come in and get started right away by looking at this short list. However, I just learned today that everybody else is just looking at the JIRAs assigned to him or her in the current Sprint.<br /><br />The JIRAs in the next list are the ones that have been marked as resolved by developers but not verified by QA. They are sorted based on the order that QAs would like to process them. QA team uses this to pick the JIRAs to verify during the Sprint.<br /><br />The last section on the right contains the JIRAs that have not been added to any backlog. In this way, all the JIRAs will be looked at before adding to the backlog. One thing about using JIRA as story is that anyone can create a JIRA and assign it to your team, which mean your backlog can grow without you knowing it. With this extra step of adding newly created JIRA to the appropriate backlog, we are always aware of any new work coming our way.Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com2tag:blogger.com,1999:blog-6678855.post-67561758255420368302009-01-21T21:35:00.000-08:002009-01-29T09:46:44.360-08:00Burn-up and Burn-down Charts<div><div>I have always thought Sprint reporting is a major communication tool to be used within the team as well as to the outside. It is the time for the team to take one step back, look at the project as a whole, comparing notes, and make continuous improvements. It is also the time for the team to report the progress and any difficulties encountered, so that the stake holders can make plan adjustments and provide help if needed. </div><br />Burn-up and burn-down charts are my favorite report, because they fit very well in the story based iteration model of the project development. Anyone understanding stories and iterations (not that it is always easy to learn) can understand these charts very easily. I also find that these chart can generate more questions and lead the team in the right direction.<br /><div><br /><span style="font-size:130%;"><span style="font-weight: bold;">Burn-down Chart</span></span><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQabFaKZR9hVE8jZ32FllS93NjUo7EczArz86Ju0AnwxQqkk2ogVYcRd4YdTsjOGqoX8CYnnApE3Y4V3oabv8rcM7lT8nD6-4RthCAWYRmTP7pwIL88cqIcGh737_tdoCosRsY/s1600-h/pivotal_burndown.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 228px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQabFaKZR9hVE8jZ32FllS93NjUo7EczArz86Ju0AnwxQqkk2ogVYcRd4YdTsjOGqoX8CYnnApE3Y4V3oabv8rcM7lT8nD6-4RthCAWYRmTP7pwIL88cqIcGh737_tdoCosRsY/s400/pivotal_burndown.jpg" alt="" id="BLOGGER_PHOTO_ID_5294362063759197250" border="0" /></a></div></div><br />Burn-down chart is straightforward and easy to understand. It measures the burn rate of the story in the unit of the story points. It is really easy to understand different ways of predicting the outcome of the project by predicting the future velocity of the Sprints.<br /><br />All the iteration tracking tools that I have tried have this support. This one is made by <a href="https://www.pivotaltracker.com/">Pivotal Tracker</a>.<br /><br />For those who use <a href="http://www.atlassian.com/software/jira/">JIRA</a> or good-old story cards to track the iterations, it is not hard to produce this chart as well, with the worst part being figuring out where to use what formula. The following are from the other two projects, made with Microsoft Excel and Google spreadsheet. With customized tool, I get to explore different styles.<br /><br />In the first one, the stories are divided into "must-have" and "everything else" category, and tracked at the same time. The prediction lines are shown in different color. In the second one, the progress is shown along with the burn-down, so that in the case where it is actually "burning up", it shows that it is not caused by losing velocity.<br /><br /><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhql0EcJGras8ARynjxTDYIhasHo9ToN7VVIwVyvohWs4fMmUjDBSrGqz8chvDIV_0PlzwX8q029NUJK7PzzLkDydwtN025EdZrbeLOau7hh2USZBx7AII2ZW7jspy0wgYyHN6k/s1600-h/excel_burndown.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhql0EcJGras8ARynjxTDYIhasHo9ToN7VVIwVyvohWs4fMmUjDBSrGqz8chvDIV_0PlzwX8q029NUJK7PzzLkDydwtN025EdZrbeLOau7hh2USZBx7AII2ZW7jspy0wgYyHN6k/s400/excel_burndown.png" alt="" id="BLOGGER_PHOTO_ID_5294362071292692162" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhSaleH5s1QlTLDIvZ7MxFV8ohq-gARNZtAW1zFRcFBtCTx13DFlg2GCjaphBo0rgrxQ-BWF_Cj4o6jCgK2FABr8i3pD6KmoZ2QG8VKih2kSLCWt1QRdoBfqbPoE-SFco4LHpx/s1600-h/googledoc_burndown.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 224px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhSaleH5s1QlTLDIvZ7MxFV8ohq-gARNZtAW1zFRcFBtCTx13DFlg2GCjaphBo0rgrxQ-BWF_Cj4o6jCgK2FABr8i3pD6KmoZ2QG8VKih2kSLCWt1QRdoBfqbPoE-SFco4LHpx/s400/googledoc_burndown.png" alt="" id="BLOGGER_PHOTO_ID_5294362074297159714" border="0" /></a><br /><br /></div><br /><br /><p><br /><br /></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span></p><p><span style="font-size:130%;"><span style="font-weight: bold;">Burn-up Chart</span></span><br /><br />For a project with just a single coach, burn-up chart can be a great help. It can explain a lot of concepts in the story based development, iterative development, and can help the coach recognize the patterns in the development and take actions to adjust the direction of the team.</p><p>I have found that burn-up chart always a bit harder to understand, and might look intimidating. So if you are introducing it for the first time, you should not just paste it in a report and email to others. It is best to show it in person and let the conversation start.<br /></p><div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFGkotUAmoMaIGXTY0paqR0Ly8tp9BVihyphenhyphen6DSQiJRhWPB5iG4d9MFE2EFEcYUYNMmtnpvNaqaH-qqwIQvkTZOJUs5gAbDYBRzzvRjTeeu5f5wEwONYxUd2ykAPrntw6wYGaKbz/s1600-h/excel_burnup.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 292px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFGkotUAmoMaIGXTY0paqR0Ly8tp9BVihyphenhyphen6DSQiJRhWPB5iG4d9MFE2EFEcYUYNMmtnpvNaqaH-qqwIQvkTZOJUs5gAbDYBRzzvRjTeeu5f5wEwONYxUd2ykAPrntw6wYGaKbz/s400/excel_burnup.png" alt="" id="BLOGGER_PHOTO_ID_5294362226304373138" border="0" /></a>The first chart shows a project where development is fairly smooth, QA can just keep up with the story being finished. On the other hand, the project requirement is very volatile. The interesting thing to point out is that because the team is focusing on one Sprint at a time during the release, and one story at a time during the Sprint, the dramatic scope changes did not affect the development at all.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeoKH7FUVbKwPFTDazIyNV1pCtCpfc3G8pJz3swPRlXFwHLLSMWWn17pNDfjIq_BKxhBDyt_nSIti9uobMVSp7IIuT4E5e06LGKDQI11KIpHskOWsklhvLl-XhZBjFatdm7MVa/s1600-h/googledoc_burnup.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 242px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeoKH7FUVbKwPFTDazIyNV1pCtCpfc3G8pJz3swPRlXFwHLLSMWWn17pNDfjIq_BKxhBDyt_nSIti9uobMVSp7IIuT4E5e06LGKDQI11KIpHskOWsklhvLl-XhZBjFatdm7MVa/s400/googledoc_burnup.png" alt="" id="BLOGGER_PHOTO_ID_5294362234617632914" border="0" /></a><br /><br /><br /><br />The second one is a quite typical burn-up chart, where the team discovers new cases as they go, and adding the understanding to the backlog in the form of the stories.<br /><div><br /></div><div><br /><br /><br /><br /><br /><br /><br /><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Sprint Burn-up Chart </span></span><br /><br />I also found a burn-up chart for the Sprint is useful to figure out what happened during the Sprint. I think this is what is called "Sprint Signature" in the <a href="http://books.google.com/books?id=hJwMAAAACAAJ&dq=isbn:9780130676344&ei=XeuBSaajEJXSlQS-6qyJCg">SCRUM book</a>.<br /><br />A Sprint burn-up chart should be used strictly internally, because only the team who have just been through the Sprint can look at it, talk about it and then draw conclusions. This should never be used for managerial purpose, in my humble opinion.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTq_eYyxDsNXCYkFGYV1hO4BXJaXS0vmakCZLNML6Rta4YQs6dZKkb4o3YsAetOi_jTVmqvSnCCY-QeicasjLp3uiJx5nivYLYONfpKZNrRzpnMuoX5IqLNuKFV4-ka0ZQ3fvg/s1600-h/excel_sprint_burnup.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 264px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTq_eYyxDsNXCYkFGYV1hO4BXJaXS0vmakCZLNML6Rta4YQs6dZKkb4o3YsAetOi_jTVmqvSnCCY-QeicasjLp3uiJx5nivYLYONfpKZNrRzpnMuoX5IqLNuKFV4-ka0ZQ3fvg/s400/excel_sprint_burnup.png" alt="" id="BLOGGER_PHOTO_ID_5294362229865829858" border="0" /></a><br /><br /></div><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0ZW25ayZVpersva28hCu6yfkPjUsU9NyhfTCtsJ3bRnXJKpCX0lmejAjEmcPJ9WoExLjbVaBZ9x7Rr6QzY2QhTnAYw35JUB9nQ1Mo54ipMXvwp9Iz-G2JKViVDBdnj-s6g83u/s1600-h/googledoc_sprint_burnup.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 228px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0ZW25ayZVpersva28hCu6yfkPjUsU9NyhfTCtsJ3bRnXJKpCX0lmejAjEmcPJ9WoExLjbVaBZ9x7Rr6QzY2QhTnAYw35JUB9nQ1Mo54ipMXvwp9Iz-G2JKViVDBdnj-s6g83u/s400/googledoc_sprint_burnup.png" alt="" id="BLOGGER_PHOTO_ID_5294362234640138674" border="0" /></a><br /></div>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com5tag:blogger.com,1999:blog-6678855.post-43190004602590106932008-11-15T22:16:00.001-08:002009-01-06T09:16:26.353-08:00Staying Agile by Going off "Agile"This is a blog post of a statement that I finally made after reading "<a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html">The Decline and Fall of Agile</a>"<br /><span style="font-size:180%;"><span style="font-weight: bold;"><blockquote>I am going off "Agile"</blockquote></span></span>No, I am not going to give up test-driven development. In fact, I am doing more of it by adopting more behavior-driven development, which is actually harder at certain cases. It helps me understand the code and verifies the design (I believe it does that rather than "drives" out the design nowadays but that is another post).<br /><br />No, I am not going to give up aggressive refactoring. Every time, and I do mean EVERY TIME, I slack on it, I end up paying the price one way or another and kicking myself. I have been proud of every single line of code that I have produced (cannot say that for all the code that I have inherited and worked on), and they always serve me and my team well.<br /><br />No, I am not going to give up on iterative development in the form of Iterations or Sprints. They help my teams focus, avoid distractions, and can still response to the request from outside the team with crystal clear transparency.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">So what is it?</span></span><br /><br />I am going to take "agile" off my vocabulary in all communications.<br /><br />Rather than saying<br /><blockquote>"Not able to have QA accepting the stories as soon as they are finished is not agile"</blockquote>I'll say "We need to get those finished stories accepted as soon as possible, so that we can close the feedback loop. When they are accepted, we know we are doing a good job. And when they are not, we can trace back to our thoughts as we were developing them and understand where it went wrong".<br /><br />Rather than saying<br /><blockquote>"Not setting a goal at the begining of the Sprint and verifying them through the Sprint signature is not agile"</blockquote>I'll say "We need to establish a way to provide feedback regarding our work and make continuous improvement to the way we work, so that we can provide better value to the people who pay us. One way we can do that is to look back at our progress in the past Sprint, talk about our experiences and thoughts, and come up with action items to make things better"<br /><br />Apparently this will make conversation longer, because I have to present proof more than a good book (dozens of good books available as a matter of fact). Sometimes, I will have to wait, patiently, for the opportunity to present itself so that I can use as an example to persuade others to slow down, do it right, and do it well.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Why</span></span><br /><br />I have been thinking along this line for a while. I read the "<a href="http://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html">Good Agile and Bad Agile</a>", felt annoyed because there is truth in what he is saying. From time to time, I get annoyed by the negative comments that don't even make sense to me. I wrote one post about "<a href="http://agileworks.blogspot.com/2006/09/things-you-cannot-get-certified-for.html">Things You Cannot Get Certified For</a>", and argued hard on several news groups that I subscribe.<br /><br />Very soon I got tired of it. Using the word "agile" has caused more distraction than its worth. Practices are sometimes picked upon literally and are attacked. Rather than looking at the value something is trying to bring, many seem to tend to look at the cost(time, tools, processes) first. It got attacked, it got debated, and at the end nothing is done and the bad things just keep going. And you get people from all over the world writing about how "agile" did not work for them and laughing at anyone who is interested in trying.<br /><br />To add insult to injury, you can also hear usage of agile in the format like "Let's be agile about it, instead of insisting on ... ". It is really hard to argue in this situation, because you cannot just simply say "no, lets not be agile about it because we should insist on going through this three hour meeting to make sure that our stories are up to the standard".<br /><br />I have been avoiding throwing agile around for a while and I think I am happy with the result. I also have been ignoring the bad usage of 'agile' out there so that I can stay healthy to focus on bringing agility to my teams. (I swear this is the last time). A month ago, I went through all my blog posts and took agile out of the labels and categories. This post will remain the only one with "Agile" as the label.<br /><br />I have been thinking about writing a post like this and finally decided to do it after reading James' post "<a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html">The Decline and Fall of Agile</a>"<br /><br />Other References<br /><br />I am collecting references of others with similar ideas here:<br /><br /><ul><li><a href="http://johlrogge.wordpress.com/2008/08/24/why-would-anyone-want-to-become-agile/">Why would anyone want to become agile</a></li><li><a href="http://blo%20g.robbowley.net/2008/11/15/lean-scrum/">Lean SCRUM</a></li><li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=246513"><span class="ts">Traps & Pitfalls of Agile Software Development - A Non-Contrarian View</span></a></li></ul>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-9460677283274888172008-10-28T21:33:00.000-07:002008-10-28T22:02:52.909-07:00Two Sprint EquationsWhat should be the order of items to do when installing a Sprint process from scratch? In the coaching days, we requested one to one ratio between the coaches and the rest of the developers plus a project manager, go all out for a couple of sprints, give everyone a chance to adjust to the process, before adjusting the process to the team.<br /><br />For a single person, the strategy would have to be different. You would need to look at all the practices and make trade-offs with eyes on the big picture. The following two equations are what kept popping into my mind as I am installing the process to the two teams.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Value = Scope * (Feature Quality * Code Quality)</span></span><br /><br />One comment to make here is that during the product development, these three factors are sometimes working against each other. A good business analyst or product manage is one that knows how and when to balance them. Only then, one with a strong personality can bring the best value to the product.<br /><br />Scope is measurable, as the second section will show. Feature quality and code quality however are simply not something can be determined by objective measurement, not purely on it anyway. When pushed on something like a scope, the things that are not measurable get sacrificed, and everyone ends up paying for it sooner or later.<br /><br /><span style="font-size:130%;"> <span style="font-weight: bold;">Scope = Velocity * Number of Sprints</span></span><br /><br />Assuming that the quality of the product is controlled, the scope would be the next thing to look out for during a project. This is pretty easy to understand: the more the team can do without sacrificing the quality (both feature quality and code quality), the better.<br /><br /><span style="font-weight: bold;">Velocity</span> is something that can only be affected by tuning the Sprint process of the team, but can never be demanded. What is left for this equation to work would be to adjust either the <span style="font-weight: bold;">scope</span> of the project, or the time of the project (<span style="font-weight: bold;">number of sprints</span>), and most of the time both. This is probably one of the commonly stated facts, at the same time it is probably also one of the most ignored fact.<br /><br />Boosting velocity is the same as boosting productivity of the team, which is the job for the team lead. This is the purpose of a lot of XP practices: TDD, paired programming, co-location, shared ownership, continuous integration.Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-35520442178252864162008-10-24T21:04:00.000-07:002008-10-26T09:22:47.222-07:00An Interesting Agile Team ParadoxI learned this on the latest BayXP meeting<br /><br /><blockquote>A good self-organizing team is commonly one with a strong leadership</blockquote>I think there are a lot to this interesting comment. I'd like to find out more about its origin and elaborate on it at latter time. I just want to write it down because I have almost forgot it twice already.Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com2tag:blogger.com,1999:blog-6678855.post-24690272854557593982008-08-17T00:52:00.000-07:002008-09-12T20:44:55.310-07:00Building Java Project with Ruby - Part II<a href="http://cotta.sourceforge.net/reports/" target="_blank">http://cotta.sourceforge.net/<wbr>reports/</a><br /><br />is now produced by this:<br /><br /><a href="http://cotta.svn.sourceforge.net/viewvc/cotta/trunk/rakefile.rb?revision=200&view=markup" target="_blank">http://cotta.svn.sourceforge.<wbr>net/viewvc/cotta/trunk/<wbr>rakefile.rb?revision=200&view=<wbr>markup</a>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-52236933158955375772008-08-13T00:02:00.000-07:002008-08-13T00:06:18.501-07:00Building Java Project with RubyI probably would be stretching it if I say this is THE solution. But would you not look at <a href="http://cotta.svn.sourceforge.net/viewvc/cotta/trunk/rakefile.rb?revision=196&view=markup">this</a> and think 'this just feels right'?<br /><br />Next to do:<br /><br />* Implement 'project.test'<br />* Implement 'project.report_coverage(dir_to_emma_files)'Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-16087584834316661722008-07-10T10:04:00.000-07:002008-07-10T10:09:54.303-07:00Converting in Image in Ruby - Can it get any easier?<blockquote>require 'RMagick'<br />Magick::ImageList.new('image.jpg').write('image.tif')</blockquote><br /><br />Ok, that is way too short. Let's add crop operation:<br /><blockquote><br />image = Magick::ImageList.new('image.jpg')<br />image.crop(0, 0, 64, 64).write('image.tif')</blockquote>(I think I can add the first example to <a href="http://cotta.sourceforge.net">Cotta</a>)Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-73543609703870786892008-06-16T21:23:00.001-07:002008-06-17T21:07:27.702-07:00Five Sprints into SCRUMWe have kicked off Sprint 5 today for Application Framework team.<br /><br /><span class="blsp-spelling-error" id="SPELLING_ERROR_0">Guidewire</span> development is following SCRUM methodology. However, through all these years, due to various reason, the ideas behind Sprints are not exactly followed. There are many reasons for this, some of which are actually good reasons. However, that does not mean it was the best decision, and some development teams are trying to bring back meaningful Sprints to the development process, including AF team.<br /><br />So what have I done differently this time?<br /><br />We ended up using <span class="blsp-spelling-error" id="SPELLING_ERROR_1">JIRA</span> to track our stories. There are many reasons for this. I think the first one is the kind of work we are doing right now. We are not yet doing active development, but rather fixing bugs for a point release and run performance testing. Since all the bugs are created in <span class="blsp-spelling-error" id="SPELLING_ERROR_2">JIRA</span> already, using <span class="blsp-spelling-error" id="SPELLING_ERROR_3">JIRA</span> to track items that are not bugs makes it easy to track all the items we need to do given any Sprint. On the weekly work-from-home day, which each <span class="blsp-spelling-error" id="SPELLING_ERROR_4">Guidewire</span> employee can choose freely, it is very convenience to go to <span class="blsp-spelling-error" id="SPELLING_ERROR_5">JIRA</span> to pick the next work to do.<br /><br />I am still keeping a Sprint board by writing down the <span class="blsp-spelling-error" id="SPELLING_ERROR_6">JIRAs</span> on the story cards but it is not as effective as I would like it to be. I think one reason is that <span class="blsp-spelling-error" id="SPELLING_ERROR_7">QAs</span> are verifying the <span class="blsp-spelling-error" id="SPELLING_ERROR_8">JIRAs</span> on their own schedule. (And the reason for that is some <span class="blsp-spelling-error" id="SPELLING_ERROR_9">QAs</span> are not part of AF team, because AF work affects other application teams). I know it sounds <span class="blsp-spelling-error" id="SPELLING_ERROR_10">strang</span>, but that is the situation right now. We are talking about how to get away from this mode and have a real complete independent development teams but before that happens, we will just have to pull it through.<br /><br />The purpose for Sprint board now is more for daily Sprint meeting, where we talk about what we have achieved yesterday and are planning to do today. I use it to help the team focus and work on only the blocker <span class="blsp-spelling-error" id="SPELLING_ERROR_11">JIRA</span> or the <span class="blsp-spelling-error" id="SPELLING_ERROR_12">JIRAs</span> scheduled for the Sprint. Old habits die hard but we are making progress in that direction. When we schedule too many for the Sprint, which has been the case for all the past Sprints, I use Sprint board to figure out what to push to the next Sprint. I have not bee doing this aggressively. Now that I have an idea of our current velocity, I'll do more now.<br /><br />I am also changing the Sprint planning format. I am not going through the <span class="blsp-spelling-error" id="SPELLING_ERROR_13">JIRAs</span> one by one and ask question on them anymore, because the feedback has been that it takes a long time and becomes uninteresting. I think the first reason is that we are not sharing enough to make it a team conversation. Rather, it is me and whoever owns that part of the system talking with each other and figuring out the tasks to do. Even that, because I cannot pair on each and every <span class="blsp-spelling-error" id="SPELLING_ERROR_14">JIRA</span>, I am not able to track and check that each <span class="blsp-spelling-error" id="SPELLING_ERROR_15">JIRA</span> is estimated correctly and each <span class="blsp-spelling-error" id="SPELLING_ERROR_16">JIRA</span> is done within a Sprint. Without following them up and closing the feedback loop, all the work of creating tasks and track them become rather pointless.<br /><br />So in the Sprint <span class="blsp-spelling-error" id="SPELLING_ERROR_17">plannig</span>, I now show the <span class="blsp-spelling-error" id="SPELLING_ERROR_18">JIRA</span> list scheduled, talk about them briefly in groups by the functional area, and track down the estimate after the meeting. I think I will change the estimation to be before the meeting next time, so that I would know how much to schedule for the Sprint.Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0tag:blogger.com,1999:blog-6678855.post-81078360927490973312008-05-18T11:56:00.000-07:002008-05-18T12:00:10.857-07:00Fix : ERROR: While executing gem ... (Zlib::BufError)All you need to do is<br /><br /><blockquote>gem update --system</blockquote>Thank you <a href="http://dontrepeatyourself.wordpress.com/2007/05/14/zlibbuferror/"><span class="postedby">dontrepeatyourself</span></a><span class="filedto"> !!!<br /><br /><br /></span>Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com1tag:blogger.com,1999:blog-6678855.post-48734206106203170402008-02-24T14:21:00.000-08:002008-02-24T14:24:39.701-08:00Guidewire Development BlogI have developers from Guidewire customer commenting on my blog so I would like to mention that Guidewire now has its own development blog which I think you will find interesting.<br /><br /><a href="http://guidewiredevelopment.wordpress.com">http://guidewiredevelopment.wordpress.com</a><br /><br />Enjoy!Shanehttp://www.blogger.com/profile/18237393455554069484noreply@blogger.com0