<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-16995319</id><updated>2009-02-21T17:15:37.370+08:00</updated><title type='text'>Study blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16995319.post-114524978129630274</id><published>2006-04-17T12:48:00.000+08:00</published><updated>2006-04-17T12:56:21.306+08:00</updated><title type='text'>Why do software projects fail so often?</title><content type='html'>&lt;h1&gt;&lt;strong&gt;Why Do Software Projects Fail?  &lt;/strong&gt; &lt;/h1&gt;       &lt;p&gt;“What are the chances that this project will succeed…?” &lt;/p&gt;       &lt;p&gt;For most companies and entrepreneurs starting on a new software project, this is one of the first questions that are considered. Unfortunately, the question is a very relevant one. Studies conducted by major research groups show that 50% of software projects fail today. &lt;/p&gt;       &lt;p&gt;Why do software projects fail? Are there preventive measures to avoid  software project failure? &lt;/p&gt;       &lt;p align="left"&gt; A recent research project at 'The Standish Group' has identified reasons for software project failure. Lets have a look at the results of the research project. &lt;/p&gt;       &lt;p align="left"&gt;For purposes of the study, projects were classified into three resolution types – Resolution Type 1 or project success, Resolution Type 2 or project challenged and Resolution Type 3 or project impaired. &lt;/p&gt;       &lt;h2 align="left"&gt; &lt;strong&gt;Resolution Type 1 or project success&lt;/strong&gt;:&lt;/h2&gt;       &lt;p align="left"&gt;        The software project is completed on-time and on-budget, with all features and functions as initially specified.&lt;/p&gt;       &lt;p align="left"&gt; Among the Project Success Factors, it was noted that ' Clear Statement of Requirements' was ranked third in importance for the success of a project, after User Involvement and Executive management Support. &lt;/p&gt;       &lt;h2 align="left"&gt;&lt;strong&gt;Resolution Type 2 or project challenged:&lt;/strong&gt; &lt;/h2&gt;       &lt;p align="left"&gt;The software project is completed and operational but over-budget, over the time estimate, and offers fewer features and functions than originally specified. &lt;/p&gt;       &lt;p align="left"&gt;'Incomplete Requirements and Specifications' was cited as the second main reason for exceeding the budget and time &lt;/p&gt;       &lt;h2 align="left"&gt;  Resolution Type 3 or project impaired: &lt;/h2&gt;       &lt;p align="left"&gt;The software project is canceled at some point during the development cycle. Here again, Incomplete Requirements was the main reason cited for the failure of the software project. &lt;/p&gt;       &lt;p align="left"&gt;Overall, the success rate was only 16.2%. Challenged projects accounted for 52.7%, and impaired (canceled) for 31.1%. &lt;/p&gt;       &lt;p align="left"&gt; The table below lists the criteria for software project success in order of importance.&lt;br /&gt;      &lt;/p&gt;       &lt;table align="center" bgcolor="#000000" border="0" cellpadding="2" cellspacing="1" width="100%"&gt;         &lt;tbody&gt;&lt;tr class="articles" bgcolor="#ffffff"&gt;           &lt;td align="center"&gt;&lt;strong class="articles"&gt; SUCCESS CRITERIA &lt;/strong&gt;&lt;/td&gt;           &lt;td align="center"&gt;&lt;strong class="articles"&gt; POINTS &lt;/strong&gt;&lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;1.&lt;/span&gt; User Involvement &lt;/td&gt;           &lt;td align="center"&gt; 19 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;2.&lt;/span&gt; Executive Management Support &lt;/td&gt;           &lt;td align="center"&gt; 16 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles" bgcolor="#ffffff"&gt;           &lt;td&gt;&lt;strong class="articles"&gt; &lt;span class="style6"&gt;3&lt;/span&gt;. Clear Statement of Requirements &lt;/strong&gt;&lt;/td&gt;           &lt;td align="center"&gt;&lt;strong class="articles"&gt; 15 &lt;/strong&gt;&lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;4&lt;/span&gt;. Proper Planning &lt;/td&gt;           &lt;td align="center"&gt; 11 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;5&lt;/span&gt;. Realistic Expectations &lt;/td&gt;           &lt;td align="center"&gt; 10 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;6&lt;/span&gt;. Smaller Project Milestones &lt;/td&gt;           &lt;td align="center"&gt; 9 &lt;/td&gt;          &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;7.&lt;/span&gt; Competent Staff &lt;/td&gt;           &lt;td align="center"&gt; 8 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;8.&lt;/span&gt; Ownership &lt;/td&gt;           &lt;td align="center"&gt; 6 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;9.&lt;/span&gt; Clear Vision &amp; Objectives &lt;/td&gt;           &lt;td align="center"&gt; 3 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; &lt;span class="style6"&gt;10&lt;/span&gt;. Hard-Working, Focused Staff &lt;/td&gt;           &lt;td align="center"&gt; 3 &lt;/td&gt;         &lt;/tr&gt;         &lt;tr class="articles01" bgcolor="#ffffff"&gt;           &lt;td&gt; TOTAL &lt;/td&gt;           &lt;td align="center"&gt; 100 &lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;       &lt;p&gt;&lt;br /&gt;The chart clearly shows that 3 major factors greatly influence the success of a project - User Involvement, Executive Management Support and Clear Statement of Requirements.&lt;br /&gt;  Out of these, “&lt;strong&gt;Clear Statement of Requirements&lt;/strong&gt;” scores 15 points and is one among the top 3 reasons for the success or failure of a Software Project. It is clear therefore that Requirement Definition is a crucial step in Software Development. Read about our &lt;a href="http://www.outsource2india.com/software/RequirementAnalysis.asp"&gt;Requirement Analysis process &lt;/a&gt;here. &lt;/p&gt;       &lt;h2&gt;&lt;strong&gt; Requirements Evolution &lt;/strong&gt;&lt;/h2&gt; Requirements &amp;amp; Analysis is one of the most important and often most neglected activities of the software development life cycle. A good requirements model fosters communication between the business and IT by enabling them to share a common vision of the system’s solution prior to implementation. This will ensure that the system meets the business needs, can be delivered on time, and have the level of quality and flexibility to easily accommodate future business needs. &lt;h2&gt;Requirement Capture and Analysis - The Difference &lt;/h2&gt;       &lt;table bgcolor="#cccccc" border="0" cellpadding="2" cellspacing="1" width="100%"&gt;         &lt;tbody&gt;&lt;tr bgcolor="#ffffff"&gt;           &lt;td align="center"&gt; Requirements &lt;/td&gt;           &lt;td align="center"&gt;Analysis&lt;/td&gt;         &lt;/tr&gt;         &lt;tr bgcolor="#ffffff"&gt;           &lt;td valign="top"&gt;&lt;ul&gt;&lt;li&gt; To determine what needs to be built&lt;/li&gt;&lt;li&gt; To understand users and their potential usage of the system. &lt;/li&gt;&lt;li&gt;To determine what users want to have built. &lt;/li&gt;&lt;/ul&gt;           &lt;/td&gt;           &lt;td valign="top"&gt;&lt;ul&gt;&lt;li&gt; To describe what the customer requires &lt;/li&gt;&lt;li&gt;To understand what will be built&lt;/li&gt;&lt;li&gt; To understand why it should be built&lt;/li&gt;&lt;li&gt; To determine how much it is likely to cost. (estimation)&lt;/li&gt;&lt;li&gt; To determine the order in which should be built (prioritization)&lt;/li&gt;&lt;li&gt; To understand the system itself and explore the details of the problem domain&lt;/li&gt;&lt;li&gt; To understand how it will be built&lt;/li&gt;&lt;li&gt; To identify and translate business goals and needs into system features, and use them to derive both functional and nonfunctional (technical) system requirements&lt;/li&gt;&lt;li&gt;To ensure that it represents the middle ground between &lt;strong&gt;requirements&lt;/strong&gt; and &lt;strong&gt;design&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; To define a set of requirements that can be validated&lt;/li&gt;&lt;li&gt;To establish a basis for the creation of a software design &lt;/li&gt;&lt;/ul&gt;           &lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;       &lt;p&gt; &lt;/p&gt;       &lt;p&gt;&lt;strong&gt;How can we ensure that we have specified a system that properly meets the customer’s needs and satisfies the customer’s expectations? &lt;/strong&gt;&lt;/p&gt;       &lt;p&gt; There is no foolproof answer to this difficult question, but a solid requirements engineering process is the best solution we currently have. &lt;/p&gt;       &lt;p&gt; Requirements engineering provides the appropriate mechanism for understanding what the customer wants, analyzing needs, assessing feasibility, negotiating a reasonable solution, specifying the solution unambiguously, validating the specification and managing requirements as they are transformed into an operational system. The requirements engineering process can be described in five distinct steps-&lt;/p&gt;       &lt;ul&gt;&lt;li&gt; Requirements Elicitation &lt;/li&gt;&lt;li&gt; Requirements Analysis and negotiation &lt;/li&gt;&lt;li&gt; Requirements Specification &lt;/li&gt;&lt;li&gt; System modeling &lt;/li&gt;&lt;li&gt; Requirements Validation &lt;/li&gt;&lt;li&gt; Requirements Management &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-114524978129630274?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524978129630274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524978129630274'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2006/04/why-do-software-projects-fail-so-often.html' title='Why do software projects fail so often?'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-114524929289351636</id><published>2006-04-17T12:47:00.000+08:00</published><updated>2006-04-17T12:48:21.756+08:00</updated><title type='text'>What is test-driven development?</title><content type='html'>&lt;p&gt;&lt;b&gt;Test-Driven Development&lt;/b&gt; (TDD) is a &lt;a href="http://en.wikipedia.org/wiki/Computer_programming" title="Computer programming"&gt;computer programming&lt;/a&gt; technique that involves writing &lt;a href="http://en.wikipedia.org/wiki/Test_case" title="Test case"&gt;test cases&lt;/a&gt; first and then implementing the code necessary to pass the tests. The goal of test-driven development is to achieve rapid feedback and implements the "illustrate the main line" approach to constructing a program. This technique is heavily emphasized in &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming" title="Extreme Programming"&gt;Extreme Programming&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Practitioners emphasize that test-driven development is primarily a &lt;a href="http://en.wikipedia.org/wiki/Software_engineering" title="Software engineering"&gt;method of designing software&lt;/a&gt;, not just a method of testing. The method is also used for removal of &lt;a href="http://en.wikipedia.org/wiki/Software_bug" title="Software bug"&gt;software defects&lt;/a&gt;.&lt;/p&gt; &lt;table id="toc" class="toc" summary="Contents"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;div id="toctitle"&gt; &lt;h2&gt;Contents&lt;/h2&gt;  &lt;span class="toctoggle"&gt;[&lt;a href="javascript:toggleToc%28%29" class="internal" id="togglelink"&gt;hide&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt; &lt;ul&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Requirements"&gt;&lt;span class="tocnumber"&gt;1&lt;/span&gt; &lt;span class="toctext"&gt;Requirements&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Test-Driven_Development_Cycle"&gt;&lt;span class="tocnumber"&gt;2&lt;/span&gt; &lt;span class="toctext"&gt;Test-Driven Development Cycle&lt;/span&gt;&lt;/a&gt; &lt;ul&gt;&lt;li class="toclevel-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#1._Write_the_test"&gt;&lt;span class="tocnumber"&gt;2.1&lt;/span&gt; &lt;span class="toctext"&gt;1. Write the test&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#2._Write_the_code"&gt;&lt;span class="tocnumber"&gt;2.2&lt;/span&gt; &lt;span class="toctext"&gt;2. Write the code&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#3._Run_the_automated_tests"&gt;&lt;span class="tocnumber"&gt;2.3&lt;/span&gt; &lt;span class="toctext"&gt;3. Run the automated tests&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#4._Refactor"&gt;&lt;span class="tocnumber"&gt;2.4&lt;/span&gt; &lt;span class="toctext"&gt;4. Refactor&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#5._Repeat"&gt;&lt;span class="tocnumber"&gt;2.5&lt;/span&gt; &lt;span class="toctext"&gt;5. Repeat&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Differing_styles"&gt;&lt;span class="tocnumber"&gt;3&lt;/span&gt; &lt;span class="toctext"&gt;Differing styles&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Benefits"&gt;&lt;span class="tocnumber"&gt;4&lt;/span&gt; &lt;span class="toctext"&gt;Benefits&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#Limitations"&gt;&lt;span class="tocnumber"&gt;5&lt;/span&gt; &lt;span class="toctext"&gt;Limitations&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#See_also"&gt;&lt;span class="tocnumber"&gt;6&lt;/span&gt; &lt;span class="toctext"&gt;See also&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development#External_links"&gt;&lt;span class="tocnumber"&gt;7&lt;/span&gt; &lt;span class="toctext"&gt;External links&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;script type="text/javascript"&gt; //&lt;![CDATA[  if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); }  //]]&gt; &lt;/script&gt;&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=1" title="Edit section: Requirements"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Requirements" id="Requirements"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Requirements&lt;/h2&gt; &lt;p&gt;For test-driven development to work, the system must be flexible enough to allow for &lt;a href="http://en.wikipedia.org/wiki/Automated_testing" title="Automated testing"&gt;automated testing&lt;/a&gt; of code, using test cases that return a simple true or false evaluation of correctness. These properties allow for rapid feedback of correctness and design. Unit testing frameworks such as &lt;a href="http://en.wikipedia.org/wiki/JUnit" title="JUnit"&gt;JUnit&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/NUnit" title="NUnit"&gt;NUnit&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/w/index.php?title=CPPUnit&amp;action=edit" class="new" title="CPPUnit"&gt;CPPUnit&lt;/a&gt; provide a mechanism for managing and running sets of automated test cases.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=2" title="Edit section: Test-Driven Development Cycle"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Test-Driven_Development_Cycle" id="Test-Driven_Development_Cycle"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Test-Driven Development Cycle&lt;/h2&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=3" title="Edit section: 1. Write the test"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="1._Write_the_test"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;1. Write the test&lt;/h3&gt; &lt;p&gt;It begins with writing a test. In order to write a test, the developer must understand the specification and the requirements clearly. This is accomplished through &lt;a href="http://en.wikipedia.org/wiki/Use_case" title="Use case"&gt;use cases&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/User_story" title="User story"&gt;user stories&lt;/a&gt;. The design document covers all the test scenarios and exception conditions.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=4" title="Edit section: 2. Write the code"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="2._Write_the_code"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;2. Write the code&lt;/h3&gt; &lt;p&gt;The next step is to make the test pass by writing the code. This step forces the programmer to take the perspective of a client by seeing the code through its interfaces. This is the design driven part of test-driven development. As part of test calibration, your code should fail the test meaningfully the first time around.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=5" title="Edit section: 3. Run the automated tests"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="3._Run_the_automated_tests"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;3. Run the automated tests&lt;/h3&gt; &lt;p&gt;The next step is to run the automated test cases and observe if they pass or fail. If they pass, the programmer can be more confident that the code meets the test cases as written. If there are failures, the code did not meet the test cases..&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=6" title="Edit section: 4. Refactor"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="4._Refactor"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;4. Refactor&lt;/h3&gt; &lt;p&gt;The final step is the &lt;a href="http://en.wikipedia.org/wiki/Refactoring" title="Refactoring"&gt;refactoring&lt;/a&gt; step and any code clean-up necessary will occur here. The test cases are then re-run and observed.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=7" title="Edit section: 5. Repeat"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="5._Repeat"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;5. Repeat&lt;/h3&gt; &lt;p&gt;The cycle will then repeat itself and start with either adding additional functionality or fixing any errors.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=8" title="Edit section: Differing styles"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Differing_styles" id="Differing_styles"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Differing styles&lt;/h2&gt; &lt;p&gt;There are various ways one can go about using test-driven development and the most common one is based on the principles of "Keep It Simple, Stupid" (&lt;a href="http://en.wikipedia.org/wiki/KISS_principle" title="KISS principle"&gt;KISS&lt;/a&gt;) and "You Ain't Gonna Need It" (&lt;a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It" title="You Ain't Gonna Need It"&gt;YAGNI&lt;/a&gt;). This style focuses on writing only the code necessary to pass the tests. Design and property principles are cast aside in the name of simplicity and speed. Therefore, any rule can be violated as long as the tests will pass. This can be unsettling for many at first but it will allow the programmer to focus only on what is important. However, the programmer must pay a bigger fee in the &lt;a href="http://en.wikipedia.org/wiki/Refactoring" title="Refactoring"&gt;refactoring&lt;/a&gt; step of the cycle since the code must be cleaned up to a reasonable level at this point before the cycle can restart.&lt;/p&gt; &lt;p&gt;Another variation of test-driven development requires the programmer to first fail the test cases. The idea is to ensure that the testcase really works and can catch an error. Once this is shown, the normal cycle will commence. This is one of the more popular variations and has been coined the "Test-Driven Development Mantra", known as red/green/refactor where red means &lt;i&gt;fail&lt;/i&gt; and green is &lt;i&gt;pass&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;A third variation combines the first and second steps listed above. In this manner, the code is written inline and debugged as a part of the test. At this stage, the test will be very large, but will complete correctly and the test logic will contain the eventual program code. Then the actual program code is moved to the code tree using a "extract method" &lt;a href="http://en.wikipedia.org/wiki/Refactoring" title="Refactoring"&gt;refactoring&lt;/a&gt; with a destination in the actual code tree. In this step, the test becomes substantially smaller, and the pre-tested method is created in the code tree. If this style is used with a code coverage tool, the final step is to ensure that the tests sufficiently exercise the code to achieve the code coverage desired by engineering management.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=9" title="Edit section: Benefits"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Benefits" id="Benefits"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Benefits&lt;/h2&gt; &lt;p&gt;Despite the initial requirements, test-driven development can provide great value to building software better and faster. It offers more than just simple validation of correctness, but can also drive the design of a program. By focusing on the test cases first, one must imagine how the functionality will be used by clients (in this case, the test cases). Therefore, the programmer is only concerned with the interface and not the implementation. This benefit is complementary to &lt;a href="http://en.wikipedia.org/wiki/Design_by_Contract" title="Design by Contract"&gt;Design by Contract&lt;/a&gt; as approaches it through test cases rather than mathematical assertions.&lt;/p&gt; &lt;p&gt;The power test-driven development offers is the ability to take small steps when required. It allows a programmer to focus on the task at hand and often the first goal is to make the test pass. Exceptional cases and error handling are not considered initially. These extraneous circumstances are implemented after the main functionality has been achieved. Another advantage is that test-driven development, when used properly, ensures that all written code is covered by a test. This can give the programmer a greater level of trust in the code.&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Test-driven_development&amp;action=edit&amp;amp;section=10" title="Edit section: Limitations"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Limitations" id="Limitations"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Limitations&lt;/h2&gt; &lt;p&gt;Test-driven development cannot work in an environment where &lt;a href="http://en.wikipedia.org/wiki/Automated_testing" title="Automated testing"&gt;automated testing&lt;/a&gt; is not feasible. The technique is immature and faces a variety of problems in the following areas:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface" title="Graphical user interface"&gt;Graphical user interfaces&lt;/a&gt; (GUIs)—although there are proposed partial solutions&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Distributed_object" title="Distributed object"&gt;Distributed objects&lt;/a&gt; (although &lt;a href="http://en.wikipedia.org/wiki/Mock_object" title="Mock object"&gt;mock objects&lt;/a&gt; can help)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Database_schema" title="Database schema"&gt;Database schema&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Compilers and Interpreters from BNF to production quality implementation&lt;/li&gt;&lt;li&gt;Some &lt;a href="http://en.wikipedia.org/wiki/Artificial_intelligence" title="Artificial intelligence"&gt;artificial intelligence&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Pattern_recognition" title="Pattern recognition"&gt;pattern recognition&lt;/a&gt; algorithms&lt;/li&gt;&lt;li&gt;Some &lt;a href="http://en.wikipedia.org/wiki/Genetic_algorithms" title="Genetic algorithms"&gt;genetic algorithms&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;It is also important to note that test-driven development only proves correctness of design and functionality according to the test cases written. An incorrect testcase that does not meet the specifications will produce incorrect code. Therefore, the emphasis on correctness and design has shifted to writing test cases since they are the drivers. As a result, test-driven development is only as good as the tests are.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Source : http://en.wikipedia.org/wiki/Test-driven_development&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-114524929289351636?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524929289351636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524929289351636'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2006/04/what-is-test-driven-development.html' title='What is test-driven development?'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-114524671733491503</id><published>2006-04-17T11:50:00.000+08:00</published><updated>2006-04-17T12:42:34.856+08:00</updated><title type='text'>Stuff that lets agile software developers show off what they believe in</title><content type='html'>&lt;h1 class="firstHeading"&gt;&lt;span style="font-size:85%;"&gt;Those are from wikipedia&lt;/span&gt;&lt;br /&gt;&lt;/h1&gt;&lt;h1 class="firstHeading"&gt;You Ain't Gonna Need It&lt;/h1&gt;       &lt;h3 id="siteSub"&gt;From Wikipedia, the free encyclopedia&lt;/h3&gt;    &lt;div id="contentSub"&gt;(Redirected from &lt;a href="http://en.wikipedia.org/w/index.php?title=YAGNI&amp;redirect=no" title="YAGNI"&gt;YAGNI&lt;/a&gt;)&lt;/div&gt;          &lt;div id="jump-to-nav"&gt;Jump to: &lt;a href="http://en.wikipedia.org/wiki/YAGNI#column-one"&gt;navigation&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/YAGNI#searchInput"&gt;search&lt;/a&gt;&lt;/div&gt;   &lt;!-- start content --&gt;    &lt;p&gt;In &lt;a href="http://en.wikipedia.org/wiki/Software_engineering" title="Software engineering"&gt;software engineering&lt;/a&gt;, &lt;b&gt;YAGNI&lt;/b&gt;, short for 'You Ain't Gonna Need It', is a reminder for programmers that one should never add functionality until it is necessary. The temptation to write code that is not necessary at the moment, but is perceived to be necessary in the future, has some overlooked disadvantages:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Delays what the programmer was originally working on.&lt;/li&gt;&lt;li&gt;There is a chance that the requirements for the software will change and the functionality will become either different or unneeded. By applying the YAGNI principle, the programmer has not wasted time in adding the redundant functionality and no longer has to waste additional time debugging the code. The code is also less cluttered as a result.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h1 class="firstHeading"&gt;Refactoring&lt;/h1&gt;       &lt;h3 id="siteSub"&gt;From Wikipedia, the free encyclopedia&lt;/h3&gt;              &lt;div id="jump-to-nav"&gt;Jump to: &lt;a href="http://en.wikipedia.org/wiki/Refactoring#column-one"&gt;navigation&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Refactoring#searchInput"&gt;search&lt;/a&gt;&lt;/div&gt;   &lt;!-- start content --&gt;    &lt;dl&gt;&lt;dd&gt;&lt;i&gt;For refactoring Wikipedia content, please see &lt;a href="http://en.wikipedia.org/wiki/Refactoring#Refactoring_other_text" title="Refactoring"&gt;&lt;b&gt;Refactoring other text&lt;/b&gt;&lt;/a&gt; (below)&lt;/i&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;p&gt;&lt;br /&gt;&lt;b&gt;Refactoring&lt;/b&gt; is the process of &lt;a href="http://en.wikipedia.org/wiki/Rewriting" title="Rewriting"&gt;rewriting&lt;/a&gt; a computer program or other material to improve its structure or &lt;a href="http://en.wikipedia.org/wiki/Readability" title="Readability"&gt;readability&lt;/a&gt;, while explicitly keeping its &lt;a href="http://en.wikipedia.org/wiki/Meaning" title="Meaning"&gt;meaning&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Behavior" title="Behavior"&gt;behavior&lt;/a&gt;.&lt;/p&gt; &lt;table id="toc" class="toc" summary="Contents"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;div id="toctitle"&gt; &lt;h2&gt;Contents&lt;/h2&gt;  &lt;span class="toctoggle"&gt;[&lt;a href="javascript:toggleToc%28%29" class="internal" id="togglelink"&gt;hide&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt; &lt;ul&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#Refactoring_code"&gt;&lt;span class="tocnumber"&gt;1&lt;/span&gt; &lt;span class="toctext"&gt;Refactoring code&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#Common_refactorings"&gt;&lt;span class="tocnumber"&gt;2&lt;/span&gt; &lt;span class="toctext"&gt;Common refactorings&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#Forth"&gt;&lt;span class="tocnumber"&gt;3&lt;/span&gt; &lt;span class="toctext"&gt;Forth&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#Refactoring_other_text"&gt;&lt;span class="tocnumber"&gt;4&lt;/span&gt; &lt;span class="toctext"&gt;Refactoring other text&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#Etymology"&gt;&lt;span class="tocnumber"&gt;5&lt;/span&gt; &lt;span class="toctext"&gt;Etymology&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#References"&gt;&lt;span class="tocnumber"&gt;6&lt;/span&gt; &lt;span class="toctext"&gt;References&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#See_also"&gt;&lt;span class="tocnumber"&gt;7&lt;/span&gt; &lt;span class="toctext"&gt;See also&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li class="toclevel-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring#External_links"&gt;&lt;span class="tocnumber"&gt;8&lt;/span&gt; &lt;span class="toctext"&gt;External links&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;script type="text/javascript"&gt; //&lt;![CDATA[  if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); }  //]]&gt; &lt;/script&gt;&lt;/p&gt; &lt;div class="editsection" style="float: right; margin-left: 5px;"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=Refactoring&amp;action=edit&amp;amp;section=1" title="Edit section: Refactoring code"&gt;edit&lt;/a&gt;]&lt;/div&gt; &lt;p&gt;&lt;a name="Refactoring_code" id="Refactoring_code"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Refactoring code&lt;/h2&gt; &lt;p&gt;In &lt;a href="http://en.wikipedia.org/wiki/Software_engineering" title="Software engineering"&gt;software engineering&lt;/a&gt;, the term &lt;i&gt;refactoring&lt;/i&gt; means modifying &lt;a href="http://en.wikipedia.org/wiki/Source_code" title="Source code"&gt;source code&lt;/a&gt; without changing its external behavior, and is sometimes informally referred to as "cleaning it up". In &lt;a href="http://en.wikipedia.org/wiki/Extreme_programming" title="Extreme programming"&gt;extreme programming&lt;/a&gt; and other &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development" title="Agile software development"&gt;agile methodologies&lt;/a&gt; refactoring is an integral part of the &lt;a href="http://en.wikipedia.org/wiki/Software_development_cycle" title="Software development cycle"&gt;software development cycle&lt;/a&gt;: developers alternate between adding new tests and functionality and refactoring the code to improve its internal consistency and clarity. Automated unit &lt;a href="http://en.wikipedia.org/wiki/Software_testing" title="Software testing"&gt;testing&lt;/a&gt; ensures that refactoring does not make the code stop working.&lt;/p&gt; &lt;p&gt;Refactoring does not fix &lt;a href="http://en.wikipedia.org/wiki/Computer_bug" title="Computer bug"&gt;bugs&lt;/a&gt; or add new &lt;a href="http://en.wikipedia.org/wiki/Functionality" title="Functionality"&gt;functionality&lt;/a&gt;. Rather it is designed to improve the &lt;a href="http://en.wikipedia.org/wiki/Understandability" title="Understandability"&gt;understandability&lt;/a&gt; of the code or change its &lt;a href="http://en.wikipedia.org/wiki/Structure" title="Structure"&gt;structure&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Design" title="Design"&gt;design&lt;/a&gt;, and remove &lt;a href="http://en.wikipedia.org/wiki/Dead_code" title="Dead code"&gt;dead code&lt;/a&gt;, to make it easier for human maintenance in the future. In particular, adding new behavior to a program might be difficult with the program's given structure, so a developer might refactor it first to make it easy, and then add the new behavior.&lt;/p&gt; &lt;p&gt;An example of a trivial refactoring is to change a variable name into something more meaningful, such as from a single letter 'i' to 'interestRate'. A more complex refactoring is to turn the code within an if block into a &lt;a href="http://en.wikipedia.org/wiki/Subroutine" title="Subroutine"&gt;subroutine&lt;/a&gt;. An even more complex refactoring is to replace an &lt;code&gt;if&lt;/code&gt; &lt;a href="http://en.wikipedia.org/wiki/Conditional" title="Conditional"&gt;conditional&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29" title="Polymorphism (computer science)"&gt;polymorphism&lt;/a&gt;. While "cleaning up" code has happened for decades, the key insight in refactoring is to intentionally "clean up" code separately from adding new functionality, using a known catalogue of common useful refactoring methods, and then separately testing the code (knowing that any behavioral changes indicate a bug). The new aspect is explicitly wanting to improve an existing design without altering its intent or behavior.&lt;/p&gt; &lt;p&gt;The term is by analogy with the &lt;a href="http://en.wikipedia.org/wiki/Factorization" title="Factorization"&gt;factorization&lt;/a&gt; of &lt;a href="http://en.wikipedia.org/wiki/Number" title="Number"&gt;numbers&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Polynomial" title="Polynomial"&gt;polynomials&lt;/a&gt;. For example, &lt;i&gt;x&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt; − 1 can be factored as (&lt;i&gt;x&lt;/i&gt; + 1)(&lt;i&gt;x&lt;/i&gt; − 1), revealing an internal structure that was previously not visible (such as the two roots at −1 and +1). Similarly, in software refactoring, the change in visible structure can often reveal the "hidden" internal structure of the original code.&lt;/p&gt; &lt;p&gt;Refactoring is done as a separate step, to simplify testing. At the end of the refactoring, any change in behavior is clearly a &lt;a href="http://en.wikipedia.org/wiki/Computer_bug" title="Computer bug"&gt;bug&lt;/a&gt; and can be fixed separately from the problem of &lt;a href="http://en.wikipedia.org/wiki/Debugging" title="Debugging"&gt;debugging&lt;/a&gt; the new behavior.&lt;/p&gt; &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Martin_Fowler" title="Martin Fowler"&gt;Martin Fowler&lt;/a&gt;'s book &lt;i&gt;Refactoring&lt;/i&gt; is the classic reference. Although refactoring code has been done informally for years, &lt;a href="http://en.wikipedia.org/wiki/William_Opdyke" title="William Opdyke"&gt;William Opdyke&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/1993" title="1993"&gt;1993&lt;/a&gt; PhD dissertation &lt;a href="http://martinfowler.com/bliki/EtymologyOfRefactoring.html" class="external autonumber" title="http://martinfowler.com/bliki/EtymologyOfRefactoring.html"&gt;[1]&lt;/a&gt; is the first known paper to specifically examine refactoring. All of these resources provide a &lt;a href="http://en.wikipedia.org/w/index.php?title=Catalog_of_common_methods_for_refactoring&amp;action=edit" class="new" title="Catalog of common methods for refactoring"&gt;catalog of common methods for refactoring&lt;/a&gt;; a refactoring method has a &lt;a href="http://en.wikipedia.org/wiki/Description" title="Description"&gt;description&lt;/a&gt; of how to apply the &lt;a href="http://en.wikipedia.org/wiki/Method" title="Method"&gt;method&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Indicator" title="Indicator"&gt;indicators&lt;/a&gt; for when you should (or should not) apply the method.&lt;/p&gt; &lt;p&gt;Refactoring is thought by many to be an important &lt;a href="http://en.wikipedia.org/wiki/Concept" title="Concept"&gt;concept&lt;/a&gt;. It has been named as &lt;a href="http://www.dwheeler.com/innovation/innovation.html" class="external text" title="http://www.dwheeler.com/innovation/innovation.html"&gt;one of the most important software innovations&lt;/a&gt; by author and commentator &lt;a href="http://en.wikipedia.org/wiki/David_A._Wheeler" title="David A. Wheeler"&gt;David A. Wheeler&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-114524671733491503?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524671733491503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/114524671733491503'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2006/04/stuff-that-lets-agile-software.html' title='Stuff that lets agile software developers show off what they believe in'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-113992176951477436</id><published>2006-02-14T20:25:00.000+08:00</published><updated>2006-04-17T12:42:56.456+08:00</updated><title type='text'>Software quality: What makes a program code good?</title><content type='html'>1. Readability - If the program codes are easy to read / understand&lt;br /&gt;2. Appropriate  comment  should be included in the program code&lt;br /&gt;3. Documentation - Stated how those object models are transformed into the program code&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-113992176951477436?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113992176951477436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113992176951477436'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2006/02/software-quality-what-makes-program.html' title='Software quality: What makes a program code good?'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-113991994831768505</id><published>2006-02-14T20:14:00.000+08:00</published><updated>2006-04-17T12:40:34.756+08:00</updated><title type='text'>Software Design Paterns: How much do you understand?</title><content type='html'>I think the design patterns that I really understand are:&lt;br /&gt;adapter,  observer&lt;br /&gt;&lt;br /&gt;Other design  patterns  are  too far  away  from  me  until  I  really  need to  develop  a software system which could be benefited from applying the patterns.&lt;br /&gt;&lt;br /&gt;From my understanding, design patterns are some sort of template , or a methodologies, that software developer can follow in order to make the software development easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-113991994831768505?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/113991994831768505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=113991994831768505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113991994831768505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113991994831768505'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2006/02/software-design-paterns-how-much-do.html' title='Software Design Paterns: How much do you understand?'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-113249776596758584</id><published>2005-11-20T22:35:00.000+08:00</published><updated>2005-11-20T22:44:54.026+08:00</updated><title type='text'>Software Engineering Cert. Programs</title><content type='html'>From the CSDP program we can see that there are three areas which are not covered in our textbook.&lt;br /&gt;&lt;br /&gt;1. Professionalism and Engineering Economics&lt;br /&gt;2. Software Maintenance&lt;br /&gt;3. Software Quality&lt;br /&gt;&lt;br /&gt;Hope that I can find out more about this topic later when I have time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-113249776596758584?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113249776596758584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113249776596758584'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/11/software-engineering-cert-programs.html' title='Software Engineering Cert. Programs'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-113073903573294874</id><published>2005-10-31T14:07:00.000+08:00</published><updated>2005-10-31T14:10:35.743+08:00</updated><title type='text'>UML Tools</title><content type='html'>I have try Poseidon for UML Community Edition, Omondo EclipseUML Free Edition in our MT365 Lab session and Visual Paradigm for UML Community Edition at home.  Among these three UML tools I will choose VP as my first choice and I will share my findings below.&lt;br /&gt;&lt;br /&gt;I evaluate those three UML tools in two aspects.&lt;br /&gt;First, ease of installation.&lt;br /&gt;Poseidon is the most easiest to install.  No activation key is needed.  VP is a little bit complicated since the Community Edition needs an activation key.  EclipseUML is the most complicated one to install within these three UML tools since it need to install a plug-in separately.&lt;br /&gt;Second, ease of use.&lt;br /&gt;&lt;br /&gt;I evaluate the ease of use of these three UML tools by doing the lab exercise.  VP is my favorite in this aspect since the tools provided in the application is very straight forward.  Several linkage nodes on each item are very well organized. I can complete the lab exercise very quick by using VP.  Followed by Poseidon, the user interface is also very easy to understand but it is a little bit trouble to model the aggregation and multiplicity.  It provide detailed setting when doing making the diagrams.  EclipseUML is the most difficult to use UML tools for the first-time-user like me since I spent almost double of time to find out how to draw a simple use case diagram.&lt;br /&gt;Finally, I will choose Visual Paradigm as my favorite UML tools among these three choices since it is easy to use and can create a quite good looking diagram.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-113073903573294874?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/113073903573294874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=113073903573294874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113073903573294874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/113073903573294874'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/10/uml-tools.html' title='UML Tools'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112979105751874060</id><published>2005-10-20T14:33:00.000+08:00</published><updated>2005-10-20T14:50:57.523+08:00</updated><title type='text'>The Java Tutorial</title><content type='html'>&lt;a href="http://java.sun.com/docs/books/tutorial/index.html"&gt;The Java Tutorial&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112979105751874060?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112979105751874060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112979105751874060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112979105751874060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112979105751874060'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/10/java-tutorial.html' title='The Java Tutorial'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112978995827469846</id><published>2005-10-20T14:31:00.000+08:00</published><updated>2005-10-20T14:32:38.280+08:00</updated><title type='text'>Good UML book</title><content type='html'>&lt;a href="http://proquest.safaribooksonline.com/?x=1&amp;mode=toc&amp;amp;sortKey=title&amp;sortOrder=asc&amp;amp;view=&amp;xmlid=0-321-19368-7&amp;amp;k=10&amp;g=&amp;amp;catid=itbooks.prog.uml&amp;s=1&amp;amp;b=1&amp;f=1&amp;amp;t=1&amp;c=1&amp;amp;u=1&amp;r=&amp;amp;o=1&amp;n=1&amp;amp;d=1&amp;p=1&amp;amp;a=0"&gt;UML Distilled 3rd. ed.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112978995827469846?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112978995827469846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112978995827469846' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112978995827469846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112978995827469846'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/10/good-uml-book.html' title='Good UML book'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112887384856112649</id><published>2005-10-09T23:48:00.000+08:00</published><updated>2005-10-10T00:04:08.570+08:00</updated><title type='text'>My opinions on Software Engineering Skills</title><content type='html'>After two weeks of study on Software Engineering, the following is my understanding on what basic skills do software engineer need.&lt;br /&gt;&lt;br /&gt;We need to know what activities involved in the software engineering development process before we point out what basic skills do software engineers need.&lt;br /&gt;&lt;br /&gt;By starting a project, requirement elicitation is the first stage that a software engineer has to face. In order get the job well done, this person needs:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Good communication/presentation skill&lt;/strong&gt; – He need to know the problem of the current system of the client. After analysis, he needs to present a series of use case, use case diagrams and system model to illustrate his findings and application domain to the client. Also, he needs to present his idea to his colleagues.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Open mind and efficient learner&lt;/strong&gt; – The project may involve knowledge that the software engineer had never learn before so that he may need to get the idea of the client’s routine job.&lt;br /&gt;&lt;br /&gt;After requirement elicitation, the person in charge of the project needs to analyse the information that he acquired in order to produce a system model. In order to do so, this person needs:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. Good analytical skill&lt;/strong&gt; – He need to transform the information acquired into a easy-to-read model in order to present to the client.&lt;br /&gt;&lt;br /&gt;When the system model is accepted by the client, it is necessary to define the design goals of the project and the solution domain as well. In this stage he needs:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Familiar with software development tools&lt;/strong&gt; – When allocating resources to the project, he needs to estimate how much recourses are required. This requires certain level of skill on software development tools involved.&lt;br /&gt;&lt;br /&gt;During the implementation stage of software engineering, the project leader needs:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Certain knowledge of programming language&lt;/strong&gt; – Since this would help him to communicate better with those programmer and able to set a reasonable milestone for them.&lt;br /&gt;&lt;br /&gt;Overall, the software engineer need:&lt;br /&gt;&lt;strong&gt;6. Background knowledge of legal document&lt;/strong&gt; – Since environment is changing, the project leader need to compose legal document, like contract or agreements, in order to protect any parties in the project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7. Good at time management&lt;/strong&gt; – Every project has a deadline to meet. The ultimate goal of a software engineer is to submit a high quality system in limited time and resource.&lt;br /&gt;&lt;br /&gt;I am looking forward to acquiring knowledge as much as possible from Steven but it is more realistic to set handling UML and Patterns as the first step.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112887384856112649?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112887384856112649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112887384856112649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112887384856112649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112887384856112649'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/10/my-opinions-on-software-engineering.html' title='My opinions on Software Engineering Skills'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112858335487711401</id><published>2005-10-06T15:21:00.000+08:00</published><updated>2005-10-09T15:59:49.533+08:00</updated><title type='text'>what is web 2.0</title><content type='html'>&lt;a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html"&gt;Web2.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112858335487711401?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112858335487711401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112858335487711401' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112858335487711401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112858335487711401'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/10/what-is-web-20.html' title='what is web 2.0'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112797669432495385</id><published>2005-09-29T14:49:00.000+08:00</published><updated>2005-10-09T16:00:43.763+08:00</updated><title type='text'>Why software fails</title><content type='html'>&lt;a href="http://www.stevenchoy.com/wordpress/why-software-projects-fail-so-often/#more-218"&gt;Why software fails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112797669432495385?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112797669432495385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112797669432495385' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112797669432495385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112797669432495385'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/09/why-software-fails.html' title='Why software fails'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112745766300602992</id><published>2005-09-23T14:28:00.000+08:00</published><updated>2005-09-23T14:45:02.526+08:00</updated><title type='text'>serching free blog service with trackback function</title><content type='html'>Typhoon signal 1 is still hoisting.&lt;br /&gt;&lt;br /&gt;I have visit LiveJournal and TypePad to see if these two web log server support trackback function that Steven illustrated yesterday in the PC lab. He spent pretty much time to explain that "awsome" feature that I don't want his effort to be wasted :p In fact, I found that TypePad is a $ earning site that provide no free lunch while the free services by LiveJournal are very limited. I didn't reg. any of this two since I don't want to confuse myself with different blogs of myself.&lt;br /&gt;I will keep searching free blog service that support the t-back :p function these few days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112745766300602992?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112745766300602992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112745766300602992' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112745766300602992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112745766300602992'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/09/serching-free-blog-service-with.html' title='serching free blog service with trackback function'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112737210717513620</id><published>2005-09-22T14:47:00.000+08:00</published><updated>2005-09-22T14:55:07.176+08:00</updated><title type='text'>What have learn in SW Eng. today</title><content type='html'>This is the first SW Eng. tut and the blogging topic is very intersting.  I will utilize web log more efficiently in the future. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112737210717513620?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112737210717513620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112737210717513620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112737210717513620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112737210717513620'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/09/what-have-learn-in-sw-eng-today.html' title='What have learn in SW Eng. today'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16995319.post-112737024033034481</id><published>2005-09-22T14:23:00.000+08:00</published><updated>2005-09-22T14:24:00.333+08:00</updated><title type='text'>test</title><content type='html'>testing&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16995319-112737024033034481?l=andrewyiu.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewyiu.blogspot.com/feeds/112737024033034481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16995319&amp;postID=112737024033034481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112737024033034481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16995319/posts/default/112737024033034481'/><link rel='alternate' type='text/html' href='http://andrewyiu.blogspot.com/2005/09/test.html' title='test'/><author><name>Andrew@OU</name><uri>http://www.blogger.com/profile/16994237257911246298</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07553686240822498672'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>