<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8266075840352282094</id><updated>2011-12-20T22:41:57.364+01:00</updated><category term='Business intelligence'/><category term='Distributed systems'/><category term='About'/><category term='Java'/><category term='Software engineering'/><title type='text'>Brain's Crust</title><subtitle type='html'>Just another mostly IT blog with some stuff that didn't fit in my brain !</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-4938649187806864957</id><published>2011-02-11T01:03:00.000+01:00</published><updated>2011-02-11T01:03:23.745+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Distributed systems'/><title type='text'>Offline web application</title><content type='html'>Some time ago I was thinking about the issues that envolve the modern trend of having all the applications online somewhere on the "net". GoogleDocs, Picasa, e-banking, online calendars and more seem to be the right way to go ... unless you find yourself somewhere without a reliable connection.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.apptius.com/DNN/Portals/0/Apptitude/synchronization.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.apptius.com/DNN/Portals/0/Apptitude/synchronization.png" width="266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One of the most powerfull buzzwords nowadays is "cloud computing" and the "everything-in-the-cloud" pattern. But I bet almost everyone has at least once been in a situation where he needed to work with his favourite web tool but he simply couldn't since he lacked a good quality connection. What then ? Wouldn't it be awesome if he could just use the tool localy and once connected synchronize the data without him even knowing ?&lt;br /&gt;&lt;br /&gt;There are several basic ways how to achieve the required behaviour. The modern one would be to use HTML5, but due to low browser support and the fact that many users/institutions use old versions of browsers this is not usually a good road to take. Another solution if you already have a fully functional web application is to deploy it on a localy installed application/web server and implementing the tier responsible for data synchronization. Last but not least interesting is the somehow forgotten solution of creating a desktop application (thick client) that uses the business logic stored on the server through some middleware technology (with delayed evaluation untill online) or SOAP.&lt;br /&gt;&lt;br /&gt;So I've started searching the web for some articles that cover the topic and here are some of the most interesting I've found:&lt;br /&gt;&lt;a href="http://today.java.net/pub/a/today/2007/01/16/synchronizing-web-client-database.html"&gt;Synchronizing a Web Client database (Google Calendar)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Operational_transformation"&gt;Operational transformation explained&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.webreference.com/authoring/languages/html/HTML5-Client-Side/"&gt;HTML5: Client-side Storage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.devx.com/wireless/Article/11398/1954"&gt;Making the Case for Local Database and Synchronization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the basic problems that we need to cover is the synchronization of databases and since "reinventing the wheel" is a commonly known anti-pattern I've searched for some tools that can do the job effectively:&lt;br /&gt;&lt;a href="http://symmetricds.codehaus.org/"&gt;SymetricDS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://opensource.replicator.daffodilsw.com/index.html"&gt;Daffodil Replicator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also there are some interesting frameworks and technologies that might come handy:&lt;br /&gt;&lt;a href="http://www.smartclient.com/technology/basics.jsp"&gt;SmartGWT and SmartClient Framework&lt;/a&gt;&lt;br /&gt;&lt;a href="http://javafx.com/"&gt;JavaFX&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-4938649187806864957?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/4938649187806864957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=4938649187806864957&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4938649187806864957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4938649187806864957'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2011/02/offline-web-application.html' title='Offline web application'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-613058043888548316</id><published>2010-11-28T02:46:00.000+01:00</published><updated>2010-11-28T02:46:34.803+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business intelligence'/><title type='text'>Business intelligence - concepts</title><content type='html'>Since the ancient times people knew the importance of knowledge. It is a well-known fact that information if used properly means power. Today we are overwhelmed by information. It is everywhere and we now posses the technology required to gather it. But to gain the hidden power we have to use some techniques to help us manage, understand and benefit from all the data we have. To properly use the information is essential for banks, insurance companies, medical facilities and many many others. The importance of managing information lead to the new IT science field called "business intelligence". In short it can be described as the way of gathering, analyzing and using information for business benefits (statistics, estimations).&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.businessintelligencebi.com/wp-content/uploads/2010/07/business-intelligence-space.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.businessintelligencebi.com/wp-content/uploads/2010/07/business-intelligence-space.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The first mention in technical literature about "business intelligence" comes from IBM in the 50's where it is described as the ability to perceive relations between presented data in a way that helps us achieve our goals through actions. The data is processed by a computer system, analyzed and the analysis results are passed to people that have the knowledge to use them for a specific benefit.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Today's understanding of BI is a little bit different but the main idea remains. It is more described as concepts and methods used to improve decision making based on data provided by systems managing and processing data. Since BI is a fast growing field there emerged numerous sub fields that although use different methods and algorithms have something in common. They all process data created at a different time, places, systems and for a different purpose. They all focus on "secondary data processing". A short list follows:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;data warehousing (gathering and storing&amp;nbsp;semantically similar data from different resources)&lt;/li&gt;&lt;li&gt;reporting (presenting analysis of data in an easy-2-understand manner)&lt;/li&gt;&lt;li&gt;OLAP (analytical online data processing)&lt;/li&gt;&lt;li&gt;EIS (executive information systems)&lt;/li&gt;&lt;li&gt;MIS (management information systems)&lt;/li&gt;&lt;li&gt;data mining (finding patterns and relations in potentially unrelated data)&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.e-biztechnologies.com/images/Data-Warehouse-Architecture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.e-biztechnologies.com/images/Data-Warehouse-Architecture.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Data is usually directly processed by the application that uses or generates it. The main purpose of data in these applications is usually only of supportive nature that matters only during the execution of a specific task but once the task is successfully done a big part of the data is of no use. This is called "primary data processing" and once it is done the data can be thrown away or stored in a sort of data archive where we have to ensure additional security. This was the main idea of using data in applications.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;But once the amount of data started to grow some people realized that by looking at the archived data they might discover some useful&amp;nbsp;information that was hidden before. The problem at that time was that the amount of data required to get relevant information out of it was bigger than the technology could handle and it kept growing. Luckily in the 90's the technology caught up and we finally got into our hands the resources to process and take advantage of all the gathered data. Investments came into the recycling of old data, purifying it and using it for business improvement.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;At first the same methods that were used for both primary and secondary data processing but it soon became clear that both approaches differ. The primary processing relied on transactions with the typical CRUD operations and main aim on maintaining the data consistent, secured and accessible at any time by multiple users. This is called OLTP (on-line transaction processing) and is typical for working with small amounts of data. Systems for secondary data processing don't typically require that amount of security and concurrency since they mostly only read data but in much more bigger chunks thus they require specific optimizations for these operations. The structure of the data also varies since primary data is application oriented (sales, finance, investments, etc.) but secondary data is more "object-centric" (customer, product) gathering similar data from several applications.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In the next article we will look a little bit closer on the approaches used to process such data.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-613058043888548316?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/613058043888548316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=613058043888548316&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/613058043888548316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/613058043888548316'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/11/business-intelligence-concepts.html' title='Business intelligence - concepts'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-3428121650159451899</id><published>2010-01-11T13:15:00.001+01:00</published><updated>2010-01-11T13:15:12.237+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 12 - Proposals and estimations</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;We discussed about the importance of communicating with the client and developing a software product. But we missed an important part which is: "How to get a contract ?". This feature requires loads of soft-skills, good reputation and even then don't expect crowds standing at your door that want to hire your services. And event after acquiring a client we need to make him "an offer he won't be able to resist" but that would of course bring us profit for that's what business is about. Creating time/costs estimates that can be fulfilled is essential as they are the first thing that every businessman looks at.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating offer&lt;/b&gt;&lt;br /&gt;When creating a offer to the client there are 2 situations that you can encounter. You're either creating an offer for a completely new product or your offer concerns the modification of an existing already developed one. Clients hire software developing companies for 2 basic reasons:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;they need to make modifications to the system that are too large or expensive in relation to time/money that they can't be part of the standard "system modification request" policy&lt;/li&gt;&lt;li&gt;they have an unmaintained product or they ended a contract with the original contractor&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;When creating an offer there are several steps that need to be taken (in order):&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;make a record about the new offer&lt;/li&gt;&lt;li&gt;declare responsibilities&lt;/li&gt;&lt;li&gt;create the offer&lt;/li&gt;&lt;li&gt;analyze and review the offer&lt;/li&gt;&lt;li&gt;describe the communication protocols that will be used&lt;/li&gt;&lt;li&gt;create estimates of the time/labor requirements&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.trigent.com/_media/images/swProductDevelopment.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://www.trigent.com/_media/images/swProductDevelopment.gif" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes offers can seem misleading when they don't include the ideas, materials and processes that were used for estimates generation. Businessmen don't usually conform to time/cost estimates at first if they are defined in longer time intervals or bigger sums. They have the feeling that things can always be done faster and cheaper and having the methodology and data used included in the offer helps convincing.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.dancingmango.com/interactions/img/proppyramid.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://www.dancingmango.com/interactions/img/proppyramid.gif" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The content of an offer should be understandable, clean and exact in such a way the client gets a first overview of what is it he'll be paying for. Everything that is not clearly defined might lead to potential future conflicts that are very bad for your reputation and if you don't want to loose the client also to an unpredicted increase in costs due to satisfying his need. As people tend to say: "The client is always right." The basic items that you should cover in your offer are:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;extent of work/project&lt;/li&gt;&lt;li&gt;labor required (ideally in "man-days")&lt;/li&gt;&lt;li&gt;deadlines/milestones&lt;/li&gt;&lt;li&gt;quality description&lt;/li&gt;&lt;li&gt;resource requirements&lt;/li&gt;&lt;li&gt;potential risks&lt;/li&gt;&lt;li&gt;marginal conditions&lt;/li&gt;&lt;li&gt;everything else to make the "people in charge" make adequate decisions&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;While establishing the project extents it is common to use structured and . Defining the extent of things we will implement (positive limits) and we won't (negative limits) is good to have for future negotiations on the price of &amp;nbsp;additional features and changes. You should always avoid abstract limitations and rather use some countable way of doing it (instead of "fast" use "server's response under 5s"). Try to be defensive in terms of not promising things you can't do but don't be too restrictive or you might not get the contract. Part of the positive limitation is a set of all the feature we ply to implement. To know the right balance is the know-how that only experience can give you. Nevertheless it's good to include clauses saying that some items on will be specified later on as part of specification/analysis. Resource requirements for development, documentation and things related to the construction process should be included for they are part of the overall costs. One crucial part of every offer is to declare some conditions that would apply to the client as the requirements for cooperation which is essential for every phase of the development process (requirements gathering, specification, user acceptance testing).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Estimates&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Everything around proposals, creating offers and attempting to convince the client you're the right one to get the contract is making correct assumptions about time, costs and resources required. That helps to intrigue the client and avoid problematic projects or those that are "out of our league". This quality is one of the basics of a good IT manager and having a pocket full of techniques and materials that help is key to success. There are some guidelines that can be found on the internet, also articles and discussions describing their experience is helpful but what helps the most is own experience and a history of previous project with all the project plans, analyses, resource management history, etc. Creating a summary after each project that would contain the system characteristics, time spend on various phases and activities, encountered problems and risks, time/cost summaries and everything you find useful will soon result in an essential knowledge base. This summary should be based mostly on measurements (time, size, effort, quality) and usually project management tools have mechanisms to support this which makes it really easy to do (BugZilla, Jira, SVNStat, etc). The estimates done in the initial phases of the project are very rough and they are modified during the various phases of the project or as reaction to an unpredicted event but keep in mind that for the client the estimations given in the offer are the ones that count the most so a common practice is to keep a time/cost reserve that can handle such situations.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.semantico.com/discovery-blog/wp-content/uploads/2009/06/Cone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="289" src="http://blogs.semantico.com/discovery-blog/wp-content/uploads/2009/06/Cone.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Creating an offer for the client is a complex process that needs the involvement of management as well as IT staff to create a realistic plan capable of successful completion. Correct estimates are what can help projects success of fail and measures need to take place to help create them. Having summaries of previous projects is the logical place where to start an archiving them is essential. Always remember that it's business and the main goal is to gain "profit" (cash, reputation, knowledge).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-3428121650159451899?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/3428121650159451899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=3428121650159451899&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/3428121650159451899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/3428121650159451899'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-12-proposals-and.html' title='Software engineering 12 - Proposals and estimations'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-5696906221835166480</id><published>2010-01-10T13:32:00.001+01:00</published><updated>2010-01-10T14:21:48.507+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 11 - Project management</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;Project management is not directly part of the essential parts of the software development process. Is is more of a supportive part for it helps coordinate and manage the rest of the software development phases which means you can live without it but it would take a huge amount of luck and self-discipline to succeed this way on larger projects.&lt;br /&gt;&lt;br /&gt;Project management is understood slightly different by various world class software companies:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;NASA &lt;/b&gt;(First begin by start planning the whole project and understand the problems, requirements and work that is about to be done. Technical approach needs to be defined by choosing an adequate life-time model, methods, activities and products. Then the project plan should be finished defining the relations with management, organization, estimates, time-planning. After that it's time for implementing the project plan and project management's role is to monitor, control and maintain the plan of software development. The last responsibility of project management is the projects closure after everything is done or when the project is canceled.)&lt;/li&gt;&lt;li&gt;&lt;b&gt;SYBASE &lt;/b&gt;(By Sybase the project management tasks are 3 consecutive actions. The project "initiation" which defines the problems and analyzes potential solutions. It is also responsible for creating a project plan. Then it is "execution" which aims at implementing the plan while monitoring and managing the overall progress. Finally there is "closeout" of the project.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.regclick.ca/shop/images/project-lifecycle.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.regclick.ca/shop/images/project-lifecycle.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software management program control&lt;/b&gt;&lt;br /&gt;This is an overall look at the requirements of&amp;nbsp;&lt;b&gt; &lt;/b&gt;project management as seen by some "best practices":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Software management planning should include&lt;/li&gt;&lt;ul&gt;&lt;li&gt;definitions of product goals (establish functionality, criteria of success)&lt;/li&gt;&lt;li&gt;how will the product be structured&lt;/li&gt;&lt;li&gt;project plan analysis and its testing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;time estimates for the project (schedules)&lt;/li&gt;&lt;li&gt;estimating costs ("costing the plan")&lt;/li&gt;&lt;li&gt;frequent plan revisions based on the environment changes&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Implementation of the plan&lt;/li&gt;&lt;li&gt;Methods for including changes into the plan and project&lt;/li&gt;&lt;li&gt;Methods for achieving project goals (resources, quality, etc.)&lt;/li&gt;&lt;li&gt;Coordination of the effort of various groups and individuals&lt;/li&gt;&lt;li&gt;Ensure adequate quality control mechanisms to assure the high quality of the product&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://geekandpoke.typepad.com/geekandpoke/images/2007/08/29/1021.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://geekandpoke.typepad.com/geekandpoke/images/2007/08/29/1021.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Project management is in essence strongly connected with all the various phases of the software development for it's the central management point (requirements, architecture, configuration management, engineering process, quality assurance).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Basic "howto"&lt;/b&gt;&lt;br /&gt;The basic point where to begin is establishing a project organization that should be absolutely clear. Absolutely essential is to understand "what is it we're going to do" to avoid problems with doing wrong things or the good things the wrong way. The key to successful project management is to decompose the whole work into small and compact units for it's way easier to make a time/cost estimate on a small problem than on the whole one. Also creating an analysis and resource estimation/planning is more easy on small pieces. After the decomposition we need to assign available resources to he various units or set an order in which resources will be assigned.&amp;nbsp; During the latter phases we need to have tools and mechanisms to monitor and measure progress, report and archive so we can react to situations when something goes not as planned and we have materials for further usage (future planning, etc.).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion (tips for manager)&lt;/b&gt;&lt;br /&gt;There are several hints for IT managers that can represent the whole idea behind a successfull project management:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you must create and then maintain a plan in advance for an adequate long time&lt;/li&gt;&lt;li&gt;you need to be clear about deadlines and 3rd party companies obligations&lt;/li&gt;&lt;li&gt;your employees need always to know what to do in the next few days/weeks so they can plan their time effectively&lt;/li&gt;&lt;li&gt;you need to pay attention to the effectivity of your employees and create a good working environment&lt;/li&gt;&lt;li&gt;you need to have everything well organized&lt;/li&gt;&lt;li&gt;you need to keep benchmarking the progress and keep the "economic" aspect in mind at all times&lt;/li&gt;&lt;li&gt;you need to understand the system, its complexity and be capable of making decisions when the client pushes you to a commitment of extent/deadlines&lt;/li&gt;&lt;li&gt;you have to keep in touch with the client, attend all meetings, keep detailed records of them and various discussions, hand over protocols, etc.&lt;/li&gt;&lt;li&gt;you need to keep an overview and index of all problems, potential risks and of course a proposal on their solution/elimination&lt;/li&gt;&lt;li&gt;most of all you must pay attention to whatever happens in the project and &lt;b&gt;keep track of the extent of the project&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/reading/SAFE_ProjectHandbook.pdf"&gt;SAFE Project Handbook&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Checklists and templates&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/checklists/CxCheck_MostCommonSchedRisks.txt"&gt;CxCheck_MostCommonSchedRisks.txt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/checklists/CxCheck_CompleteListOfSchedRisks.txt"&gt;CxCheck_CompleteListOfSchedRisks.txt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/templates/PDD.doc"&gt;PDD.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/templates/CxTemp_top10risks.doc"&gt;CxTemp_top10risks.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/templates/Risk_mgmt_plan_template.doc"&gt;Risk_mgmt_plan_template.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/templates/Status_Report.doc"&gt;Status_Report.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/project-management/templates/Status_Report_simple.doc"&gt;Status_Report_simple.doc&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-5696906221835166480?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/5696906221835166480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=5696906221835166480&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/5696906221835166480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/5696906221835166480'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-11-project.html' title='Software engineering 11 - Project management'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-4217368850977707638</id><published>2010-01-09T23:15:00.000+01:00</published><updated>2010-01-09T23:15:26.377+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 10 - Maintenance</title><content type='html'>&lt;b&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; font-weight: normal;"&gt;&lt;b&gt;Introduction&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;div&gt;Every software system an IT development company delivers is delivered in a state that should resemble the extent given by the contract the client and the supplier made (usually based on the requirements or specification). The system is then accepted by the client and being run in production fulfilling it's job. It is possible to assume that a product in regular usage contains only a small number of additional defects that were not yet discovered or unrepaired. Nevertheless applications created to order don't last the same their entire lifetime and new features are being desired. Small changes, errors that show themselves only after several months in production or when situation changes (more users/data to handle, changes in enterprise business process, etc.) lead to the need of the softwares evolution. Most of the times the "guys" that perform such actions are the developers of the original system for they possess the required knowledge base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;New releases&lt;/b&gt;&lt;/div&gt;&lt;div&gt;It is common that the company developing a product keeps involved even after the delivery of the final product by offering "maintenance services" to the product. Both parties, the developing company and the customer, benefit from such an arrangement for the customer can have changes done quite fast and the IT company has jobs for a small percent of its staff and money for low effort since they have everything ready (the environment, all the documents, knowledge, etc.). The most common scenario is that the IT company keeps continuously improving the product making regular releases of new versions (new features, requested changes) and some minor releases for requests of critical importance (bug/defect fixes, security vulnerabilities).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39064"&gt;ISO/IEC 14764&lt;/a&gt;&amp;nbsp;specifies 4 main types of maintenance:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Corrective (repairing found defects and bugs)&lt;/li&gt;&lt;li&gt;Adaptive (keep the software updated with the current environment/infrastructure)&lt;/li&gt;&lt;li&gt;Perfective (improve maintainability or performance)&lt;/li&gt;&lt;li&gt;Preventive (detection and repair of latent defects before they become serious defects)&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.nexsussolutions.com/images/img_software_maintenance.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.nexsussolutions.com/images/img_software_maintenance.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Maintenance as system development life-cycle&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Maintenance of a software product is very similar to the overall software development process with all its typical phases but on a minor scope. Every new request that is to be implemented can be looked at as an individual software project with the rest of the system being the platform where we want our new product to be integrated. It's simple as that and the same techniques and facts we mentioned in the previous articles apply. All the new requests need to be documented, analyzed, solutions designed, implemented and tested.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.vocw.edu.vn/content/m10073/latest/graphics2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://www.vocw.edu.vn/content/m10073/latest/graphics2.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Maintaining 3rd party product&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Sometimes an IT company is asked or obliged to maintain a product that is not of their making. Such situations usually come when you're hired instead of an another company that was a supplier for several years and your projects are tightly coupled with the current infrastructure (some companies are only specialized on maintenance but in some cases creating a whole new product might result more effective than maintaining the existing ones).&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In such cases it is essential to have:&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;a complete specification to estimate the extent of the work that is being asked from you&lt;/li&gt;&lt;li&gt;architecture and design documents which you can follow to keep a unified state of code/functionality&lt;/li&gt;&lt;li&gt;clearly defined practices and processes to follow&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;li style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;ul style="display: inline !important;"&gt;&lt;li style="display: inline !important;"&gt;Those are the minimum requirements without which you should really think about rebuilding everything from scratch otherwise you might spend horrendous amount of time and money by simply trying to understand the current system you're maintaining. Also be careful for the changes you're implementing as part of maintenance tend to silently break the architecture piece by piece.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;li style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Maintenance is a very effective process with quite exact estimates that client and developer can benefit from if the one providing maintenance is the same subject that created the maintained product. On the other hand for an external subject maintenance can become a nightmare if the product developers didn't follow the commonly used practices of software engineering (documentation, manageability of the whole project and all it's phases, etc.). While maintaining a product the focus is on quality and performance of all the various maintenance aspects and it's hard to keep it all organized. Also many people are not keen on maintenance since it doesn't involve too much creativity for the changes done to the product tend to be of more cosmetic nature. That might be the reasons why maintenance leads to a somehow slow destruction of all the nice software engineering practices that were done while the main development as many people to "delete what they don't understand", get fed up with the project or simply don't feel enthusiastic about it. Believe it or not but after several years of maintenance software usually looks completely different (even it's internals) that the original specified product. And worst of all the documentation of the changes rarely last more than a year.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.smud.org/en/residential/PublishingImages/before-after-v-pruning2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://www.smud.org/en/residential/PublishingImages/before-after-v-pruning2.gif" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-4217368850977707638?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/4217368850977707638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=4217368850977707638&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4217368850977707638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4217368850977707638'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-10-maintenance.html' title='Software engineering 10 - Maintenance'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-8208833399735844428</id><published>2010-01-09T16:54:00.000+01:00</published><updated>2010-01-09T16:54:33.472+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 09 - Development environment</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;Every software project that runs through the various phases of development requires a environment in which the development takes place. A well setup environment is one of the greatest factors that helps the project to success. As we could see on the LCO/LCA/IOC diagram environment setup is done at the very beginning of the project for it's the logical place where to start.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The basic objective of the development environment is to provide a platform where analysis and development can take part and which models the client's infrastructure where our final product will live for the rest of its lifetime. One might think that having one environment for development purposes is more than enough but they would be mistaken.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Motivation&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;The base motivation behind spending costs on establishing an development environment is the fact that the software product we're about to create will be used on a specific client's platform and will be integrated into his infrastructure. Usually simply developing at client's place is not an option for various reasons so we need to create a similar environment of our own where we'll be developing and testing the product. Also we need a place where we can present the final product to the client and where acceptance tests will take part before it goes to production. Having a single environment is not ideal for it can usually be used for only one phase (either development or testing, etc.) so the solution is obvious - create several environments with tasks attached so they server their purpose only. Some simple environments we might want to setup are:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;development environment (for development purposes, coding, prototyping)&lt;/li&gt;&lt;li&gt;integration environment (simulates client's infrastructure and helps in testing the integration of the product with other technologies/services)&lt;/li&gt;&lt;li&gt;testing environment (benchmarking, automated tests, regular builds and continual integration)&lt;/li&gt;&lt;li&gt;(pre)acceptance environment (acceptance testing, presenting to client/users)&lt;/li&gt;&lt;li&gt;production environment (final stage where we test the product in real action)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There is one part to the various environments people tend to forget and that's the social aspect of it. Part of every environment is having a comfortable working environment (furniture, privacy, space, good collective, team-building, etc.) and quality tools (hardware, literature, libraries, sets of 3rd party tools, automatization, etc.).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Continuous integration&lt;/b&gt;&lt;br /&gt;Continuous integration is a nice feature to have in your development environment for it saves quite a lot of time by automatically running builds of the product and test scenarios on them. Otherwise such actions need to be performed manually which costs your programmers/testers valuable time. The basic actions of continuous integration are building the product, running automated tests and scenarios and publishing the results. The results need to be of course revised by a human being but by means of automatic warnings on errors/bugs/non-standard situations the time required is minimal.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.methodsandtools.com/archive/CI1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://www.methodsandtools.com/archive/CI1.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;We should note that the environment should also have mechanisms for every possible/relevant configuration units, should support ways of creating backups and their restoring, maintain an index of all the software backups, should be able to provide smaller or bigger delivers of the product in development, define processes for installation, modification and accessing and ideally support techniques for auditing.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The importance of backuping can never be stressed enough for whenever shared data, repository, hardware or people get corrupt you can always rebuild the whole infrastructure from the backups in an economic way.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Build process&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;When establishing the build process for your software you should make sure he has the following capabilities for it's the regular builds you'll use to create a supply for your client and presentations (no non-IT guy will be pleased to know the installation requires several hours of shell configurations after which a BSOD appears):&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;create a supply (choose the finished and stable parts with potentially not all features that can work together on the targets environment)&lt;/li&gt;&lt;li&gt;install the supply (make sure it sets up all the necessary parts so that the system works)&lt;/li&gt;&lt;li&gt;create a supply for user/customer's installation (prepare the product in such way the client is able to install it)&lt;/li&gt;&lt;li&gt;deploy a complete product&lt;/li&gt;&lt;li&gt;repair a small bug/defect in a fast and economic way (sometimes "be bulletproof" meaning you needn't redeploy everything due to a small defect but rather be able to "patch" the already running system)&lt;/li&gt;&lt;li&gt;ability to work with different platforms and configurations (application servers, operating systems, database system, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;When developing a product for a client you should try the best you can to create an environment identical to the one your application will be running on. That way it's easier to test the product and also avoid unexpected defects caused by synchronization, resources or simply human factors. A daily build is nice to have for it helps monitor progress and testing. The supply system should be quite simple and as automatic as possible for it's nice to be able get everything running by 1 simple click. Finally backuping, logging and automatic reporting will save you quite some time when totally unexpected situations happen. Usage of advanced tools (Ant, CruiseControl, Hudson) should be part of your daily developers/IT managements life.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-8208833399735844428?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/8208833399735844428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=8208833399735844428&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/8208833399735844428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/8208833399735844428'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-09-development.html' title='Software engineering 09 - Development environment'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-6040849791229858517</id><published>2010-01-09T00:26:00.000+01:00</published><updated>2010-01-09T00:26:02.594+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 08 - Configuration management</title><content type='html'>&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;The topic of "configuration management" is closely related to &lt;a href="http://en.wikipedia.org/wiki/Supply_chain_management"&gt;SCM&lt;/a&gt; ("supply chain management") and its main goal is to systematically manage the configuration of a software product. The attempt of "configuration management" is to provide order and some rules that can ease coping with additional changes that might be required during various periods of the project lifetime and were not foreseen. One typical case is when clients realize that the software should have additional features or that it doesn't satisfy their needs. In such cases when changes in specification, design and implementation need to happen it is essential for both time, money and customers satisfaction to have a clearly defined process and means to perform such changes. A simple set of problems "configuration management" needs to handle is:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ensure audit of all part of the system or software product&lt;/li&gt;&lt;li&gt;ensure identification of all individual parts as well as the whole system&lt;/li&gt;&lt;li&gt;make sure that changes don't break the product itself&lt;/li&gt;&lt;li&gt;ensure a possibility of determining the state (past/present) of the products configuration&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;As for almost every aspect of software engineering there is also an ISO (&lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=16532&amp;amp;ICS1=35&amp;amp;ICS2=080"&gt;ISO 9000-3:1991&lt;/a&gt;) norm that describes the requirements in a more detailed and formal way:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;audit and identification of every single software item&lt;/li&gt;&lt;li&gt;audit and identification of the software product&lt;/li&gt;&lt;li&gt;provide data to generate and update every single version of the software product&lt;/li&gt;&lt;li&gt;ensure correctness of making changes to the product&lt;/li&gt;&lt;li&gt;provide report about the state of the configuration&lt;/li&gt;&lt;li&gt;updates of a given software item by more than 1 person&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Put in simple words what "configuration management" needs to provide is versioning of the product and a clean transparent process of making changes to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Versioning&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The basic way of assuring that we keep track of various changes to the software product is by keeping all the versions by some sort of backup after every change with a documentation describing the changes made. Of course backuping the whole system every time a change is made would be a very naive way of doing things so we need to decide which items of the software product we'll be version controlled and which not. Also we need to decide with those unversioned for we always require a way of knowing how did they change during time. The identification of the parts and the system is simply done by a timestamp or version ID every time a change is made. To avoid too much versions which would prove completely unmanageable we create a new version after a set of changes takes part.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having various versions of a software or its parts is time-saving for work can be done on different versions of the product at the same time without colliding. Also having the possibility of rollback to a concrete version has its benefits for test-driven programming has proven that sometimes it's way easier to restore a backuped version and re-implement from scratch the new functionality than having to debug it. Another great advantage of version control systems usage is that they were all created in such a way they allow better cooperation of people on the project with some techniques of minimizing or solving the typical conflicts of "2 people working on the same thing".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today versioning is easy-to-do for there are many well-tested version control systems that offer great functionality and are easy to use. Their usage has become an essential part of the development process and they are well integrated with other project management tools to help increase manageability and performance. One of the older ones were RCS (Revision control system) and CVS (Concurrent version system) which are nowadays considered a little bit obsolete. Still used among various mostly open-source projects is the popular SVN (Subversion) and some modern ones are Mercurial and GIT.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although version control systems have lots of common they can be separated into 2 basic categories based on the type of "repository" they work:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;centralized&lt;/li&gt;&lt;li&gt;distributed&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The centralized version control systems have a central repository where everything is stored. Each user has it's own local copy of the repository's content where he makes all the required changes and these are then uploaded to the centralized repository to the main branch where of course conflicts need to be resolved. These systems place emphasis on synchronization, tracking and backups. Whenever there is the need of trying something completely different the only way of doing sow without affecting the main branch is to create a separate single one but this is quite unpleasant for the longer the side-branch lives the more conflicts emerge and merging becomes very difficult to do.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://betterexplained.com/wp-content/uploads/version_control/distributed/centralized_example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://betterexplained.com/wp-content/uploads/version_control/distributed/centralized_example.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand the distributed version control systems are composed of various repositories owned by each user and sharing is done based on the principle of "web of trust". Changes are made by user to his own repository and others decide whose changes they want to download (the download of a change and its application are 2 separate operations). Nevertheless there is usually a central repository that gathers changes from other repositories. The emphasis here is on changes sharing.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://betterexplained.com/wp-content/uploads/version_control/distributed/distributed_example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://betterexplained.com/wp-content/uploads/version_control/distributed/distributed_example.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Management of SCR (system change requests)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Today there are no much project where the classic waterfall model of software development can be used for changes are an integral part of the process itself. It is clear then that we require some techniques and tools to handle the incoming changes in an elegant way. System change requests are one constant in the development and as such there should be absolutely clear what it's lifetime is. A simple illustration can be seen on the next picture.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.cordin8.com/cOrdin8WebSite/Images/ChangeRequestFlowv2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://www.cordin8.com/cOrdin8WebSite/Images/ChangeRequestFlowv2.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the very beginning there needs to be a need for change for making changes out of thin air makes no sense at all. The need for change needs to be described and of course identified so we can keep track of it. The request should contain an unique identifier, detailed description ideally with connection to specification and connection to the version in the version control system for every change is related to some. The request is analyzed and reviewed. Based on the evaluation it is either rejected in which case the requester should be informed or is approved. Approved requests are assigned to a software engineer, scheduled, implemented, tested and finally reviewed to make sure we satisfied the initial request.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For management of SCRs there are specialized ticket-based tools like Bugzilla, Trac, JIRA, etc. that are well established and commonly used which helps incorporate such feature into your software project management. Thanks to these systems you can not only benefit from easy management but it helps show statistics and reports of the amount of changes, their approval/rejection, etc. which can be used as one metric of determining the quality and overall management/development performance as well as it can be used for future analyses.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.nevermindthecynics.com/wp-content/uploads/2008/05/nmtc27_resized1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://www.nevermindthecynics.com/wp-content/uploads/2008/05/nmtc27_resized1.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Never underestimate the power of a clean and understandable SCM process. Version control of various software items as well as of the whole product will help you not only while development but also when you need to deploy the software to varying environments. Having the possibility of branching your product at development time is crucial for saving time while trying new ideas and merging things back together or reverting makes it extremely easy to manage even big projects. But as with anything remember the tools and techniques need to be used properly, otherwise they may cause more harm than benefits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/configuration-management/reading/LittleBookOfCM.pdf"&gt;Little Book of Configuration Management&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/configuration-management/reading/NASA_SwCMGuidebook.pdf"&gt;NASA Software Configuration Management Guidebook&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/configuration-management/reading/ESA_SwCMGuidebook.pdf"&gt;Guide to software configuration management&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Templates&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/configuration-management/templates/NASA_SwCMPlanTemplate.doc"&gt;NASA_SwCMPlanTemplate.doc&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-6040849791229858517?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/6040849791229858517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=6040849791229858517&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/6040849791229858517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/6040849791229858517'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-08-configuration.html' title='Software engineering 08 - Configuration management'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-1874324437825555323</id><published>2010-01-08T17:51:00.000+01:00</published><updated>2010-01-08T17:51:57.943+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 07 - Quality assurance</title><content type='html'>&lt;b&gt;What's QA ?&lt;/b&gt;&lt;br /&gt;&lt;div&gt;Quality assurance is a nice term in software engineering that many people use to impress but not all of them understand "what's under the hood" of it. Some confuse it with "quality", others suppose it's a synonym to "testing" or "validation and verification". Let's explore these terms a little.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Quality" is a typical buzz-word you'll hear on almost every management meeting and nobody ever takes some time thinking about it's background. People usually tend to take this as granted without thinking about what quality really means for that specific project. If we have a look at an official definition from &lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=15570"&gt;ISO 8402-1986&lt;/a&gt;&amp;nbsp;it is probable that we'll end up more confused than before. Here's the definition:&lt;br /&gt;&lt;/div&gt;&lt;i&gt;"QUALITY: The totality of features and characteristics of a product&amp;nbsp;or service that bear on its ability to meet stated or&amp;nbsp;implied needs."&lt;/i&gt;&lt;br /&gt;&lt;div&gt;Simply stated it says "to have a satisfied customer".&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://thingamy.typepad.com/photos/uncategorized/flowcompany2_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://thingamy.typepad.com/photos/uncategorized/flowcompany2_1.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Validation and verification" is a complex process or possibly a set of activities which's goal is to determine if a specific artifact or system component fulfills all the demands. Validation is usually related to specification as it's main purpose is to compare the specification and final product if they really match. Verification is a more detailed process that makes sure things have been done exactly the way they should have. Simply stated validation is "building the right thing" and verification "building it right". The relation of V&amp;amp;V to quality is simple for V&amp;amp;V is a method of determining and measuring quality.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Testing" was discussed in one of the previous articles so we should already a quite idea about how it fits into this whole "what is quality assurance problem". It is simply one of many ways of doing V&amp;amp;V. The results of testing are a clean metric about the quality rate of the product.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So "quality assurance" is a set of activities which's goal is to &lt;b&gt;ensure&lt;/b&gt; the quality of a product or service by systematic and trustworthy means. As stated by a known art critic John Rushkin: "Quality is never an accident; it's always the result of intelligent effort." Although it would be nice to be able to assure 100% functional and reliable product it is impossible to achieve. What we can do is by means of "quality assurance" make this somehow more probable.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Why bother with quality ?&lt;/b&gt;&lt;br /&gt;Simple answer: "Because quality matters." Quality assurance brings several important benefits to every project:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it's is economically effective (more than 50% of extra costs come from the fact of creating a bad-quality product and to repair defects found by customers)&lt;/li&gt;&lt;li&gt;it retains customers and improves profit&lt;/li&gt;&lt;li&gt;it's an advantage against your competitors&lt;/li&gt;&lt;li&gt;it is essential for your business to last&lt;/li&gt;&lt;li&gt;it improves your reputation even world-wide which helps establish yourself on international markets&lt;/li&gt;&lt;li&gt;it's "classy"&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A nice scheme that presents the benefits of quality assurance is the "Deming's chain reaction" scheme which puts into relation the quality, productivity, business success and new jobs providing.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.qualitydigest.com/IQedit/Images/Articles%20and%20Columns/July%2008/QI-0701Shermanfigure5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://www.qualitydigest.com/IQedit/Images/Articles%20and%20Columns/July%2008/QI-0701Shermanfigure5.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Achieving quality&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;To achieve quality the first thing you need to do is create and initiate an overall "quality program" which should define the policy of quality, establish a department responsible for quality assurance and of course have the management's blessing by showing quality is what they support and require. Then it's essential to create a plan (sometimes called "quality framework") to help the quality achievements. This plan need to take into account both cultural and technical aspects of assuring quality. It should count with:&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;a clean metric to measure achievements (of people, software, process, etc.)&lt;/li&gt;&lt;li&gt;establishing what is good/wrong/acceptable&lt;/li&gt;&lt;li&gt;what should we focus on&lt;/li&gt;&lt;li&gt;how to proceed&lt;/li&gt;&lt;li&gt;what should we require&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There are many standardized "quality assurance frameworks" that will help you but if you're not a big company then the investments into purchasing the framework might not prove that useful and we're not mentioning how overcomplicated some of them are (as many standards are). As a easy-to-follow model you can simply use the classical already mentioned "V-model".&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.stsc.hill.af.mil/CrossTalk/2007/04/0704Turner_Fig1b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://www.stsc.hill.af.mil/CrossTalk/2007/04/0704Turner_Fig1b.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;After every quality assurance plan and gaining its results there is the critically important part of analyzing all the results and behaving adequately. It is essential to be self-critic, regularly check and recheck the project, run quality audits and of course keep revising even the quality assurance plans for if we pass a bad plan it tells us nothing about the quality of the product or process.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Quality assurance is something that distinguishes amateur projects form real software engineering. It's main requirement is that it needs to be well planned in advance. It's nothing that will just miraculously appear out of thin air by simply testing your product. The whole process needs to be as pragmatic as possible and we need to think about quality on every level of the process from individuals to the organization as a whole. The most important part is to keep checking everything again and again which is usually the only viable way of assuring the quality of the product or process.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/reading/ESA_SwEngineeringStandards.txt"&gt;ESA Software Engineering Standards - Issue 2&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/reading/NASA_SwAssuranceGuidebook.txt"&gt;NASA Software Assurance Guidebook&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/reading/SPAWAR_SwQualityAssuranceProcess.doc"&gt;Software Quality Assurance Process&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/reading/NASA_FormalInspectionsGuidebook.txt"&gt;NASA Software Formal Inspections Guidebook&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/reading/NAHSyndrome.pdf"&gt;Overcoming the NAH Syndrome for Inspection Deployment&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Templates&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/quality-assurance/templates/SPAWAR_SQAPlanTemplate.doc"&gt;Software Quality Assurance Plan Template&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-1874324437825555323?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/1874324437825555323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=1874324437825555323&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/1874324437825555323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/1874324437825555323'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-07-quality.html' title='Software engineering 07 - Quality assurance'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-9122912766711665396</id><published>2010-01-08T13:52:00.000+01:00</published><updated>2010-01-08T13:52:36.256+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 06 - Documentation</title><content type='html'>&lt;b&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Importance&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Until now in the previous "software engineering" articles I tried to stress the relevance of many documents that should accompany every software project. We talked about specification, use cases, feature lists, design and system architecture documents, even the documentation of the source code. But why are these so important for the process of software creation ?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The basic answer is "People tend to forget, documents don't !". Whenever you write something down and keep it somewhere where it can be easily found when needed of course then it should never happen that you are uncertain about something you discussed earlier. Every solution, every decision that have been made are archived and no one can deny that. For some this might seem a problem for this fact applies to both sides, the developers as well as the clients and managers and to be honest sometimes people would like to leave some stuff hidden. Anyway in an ideal world that should never be the case.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The documentation is not only to be some sort of "memory" that is archived and mostly never looked at again but it's main advantage is that it helps in communication among various stakeholders. You needn't spend extent time explaining what it is you have in mind but you simply point your finger onto a paragraph in the document an everything is clear as sunshine. The problem is given, the context is known.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Of course the "archive" feature of documentation is handy for various reasons:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;it is the basic source of information for developers, system administrators and users&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;it helps in maintaining the product (in 2 years there will be almost no-one remembering what reasons lead to the current solution, what communication protocols among objects were used, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;it is essential for future planning, helps people learn from mistakes done in the past, is useful for time estimations&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Classification&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The documentation of the software engineering process can be divided into 2 basic categories based on the topics and aspects of the development process they cover:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Process documentation&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Product documentation&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The "process documentation" describes the whole process of development and maintenance of the software product. It should include plans, time schedules, milestone and task estimates, quality assurance documents, standards and best practices, all the important meetings and decisions, reports and many many more. To illustrate why are such documents useful imagine you are creating a time schedule with estimates for a new software product. If you've done a similar one in the past it is very likely that the time estimates will be quite similar hence it gives you a nice place where to start from. Reports can be used to determine if the estimations made at the beginning of the project matched the reality and the deadlines were met, the tasks difficulty was guessed properly, etc. On the other hand some of the process documentation is relevant only during the development and can be discarded after the project is finished (for example working papers meant for communication support between the management and developers like presentations, specific prototypes, etc.).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Product documentation is more user/developer related for its main purpose is to server as a manual of the system. There should be several types of product documentation based on the knowledge base of the potential reader. Also the techniques used should vary based on that. For unexperienced users the documentation should be as simple as possible with lots of screenshots, detailed examples of usage and scenarios that help them understand the most basic features of the product. Experienced users on the other hand usually tend to have a feature/function list with all their capabilities and usage description. We should also distinguish various documents based on the users role for an end-user should have a different documentation&amp;nbsp;(usage manual, feature list)&amp;nbsp;than an administrator (installation and maintenance guide) or developer (API description, design description, communication protocols).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;A typical user documentation is composed of:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;introductory manual&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;functional description&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;system reference manual&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;system installation document&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;system administrators' manual&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;A typical system documentation is composed of:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;system requirements and description of their reason&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;specification&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;architecture and design&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;source code and comments&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;validation documents (test plans, test scenarios, reports, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;maintenance documents (known bugs, infrastructure requirements and dependence, influence on rest of the system, etc)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Requirements and form&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The basic requirement for documentation is keeping its consistency during the whole lifetime of a software product for it's one of the basic representations of the system. Although various documents describe the system from various points of view it is essential to keep them all in consistent state (design should reflect requirements, code should reflect design, tests should reflect requirements, etc.) otherwise they wont play their role right and on large software products this can have a significantly deteriorating effect.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The documentation tends to grow off limits so using a good management policies is key to success. To help keep the management under control consider the following:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;use an unified and ideally standardized template system&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;unified language (same naming conventions, names for modules/objects, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;logical document structure&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;a clearly defined place and means of storing documents&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;use automatic generation tools (in-code documentation extractors (Doxygen), full-text indexing tools, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;create a "navigation central point" (possibly web page, CMS or &amp;nbsp;a wiki-like system)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;As for the documents structure it doesn't really matter which technique or tool you'll use (MS Office, PDF, UML diagrams, emails, issue tracking systems, database tables, etc.). What matters is to create a basic set of rules at the beginning of the development process and them enforce their following. A typical document structure depends on the content but here are some basic stuff that you should include into your documents:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;project identification&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;document identification&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;author, certifier&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;document type&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;version, version history and changes description&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;distribution list&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;confidentiality level&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;abstract and keywords&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;copyright&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;list of notions and abbreviations&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;table of contents&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;index&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Having documentation costs time and money but it's benefits outweigh. Another thing is that it is not sufficient to have documentation but it's also essential to have it well organized so whenever you need to find something you know exactly where to look. Practice shows that in a lot of IT companies documentation tended to be something of very low importance but since we're living in times when products change quite often knowing what is it we've done months ago proves to be more than effective from both, time and money, points of view.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/documentation/reading/NASA_SwDocumentationStandard.pdf"&gt;NASA Software Documentation Standard&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-9122912766711665396?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/9122912766711665396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=9122912766711665396&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/9122912766711665396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/9122912766711665396'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-06-documentation.html' title='Software engineering 06 - Documentation'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-9036346171209043080</id><published>2010-01-07T19:54:00.001+01:00</published><updated>2010-01-07T20:01:38.394+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 05 - Testing</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Software testing is a complex set of actions with one main goal which is establishing a belief that the software does only things it is meant to do. This is not it's only function but the most important one. Testing is of course also used for evaluating the performance of the software, its functionality, helps in verification of the system if it achieves the requested or at least acceptable results, etc. It is also essential for code analysis with the attempt to find all weak or buggy spots, potential future problems of bottlenecks. Also helps sell the product for a software that is proven to be 99.9% tested is more likely to be sold than the one without testing.&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The importance and reason for testing has changed dramatically during time for in 1960s tests we used mostly for demonstration purposes. Their goal was to show the client what the software is capable of. Soon developers realized (possibly because some of the demonstrations didn't end as expected -&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=RgriTO8UHvs"&gt;Bill Gates' BSOD&lt;/a&gt;) &amp;nbsp;that testing can provide them with a way of finding defects in the software that were later debugged. Since 1990s the usage of testing is mostly prevention for as mentioned several times the earlier we discover a defect in the software the less money it costs to repair it. Although a defect is not always that critical it needs to be resolved.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://livedev.org/files/bug-feature-mid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://livedev.org/files/bug-feature-mid.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Testing is a complex process that is not related only to code but also to all the aspects of software creation. Design assumptions and interconnection of objects needs to be tested as well as the GUI design/prototypes, functionality and specification (by reviews to verify we are really doing what the client asks).&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Testing&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Every single test should have one single objective that should be as specific as possible. In case we need to test 2 or more similar objectives then it is usually better to create individual tests or a parametrized test. Complex tests can be composed of several simpler ones by creating advanced test plans and scenarios.&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The testing of a software is somehow tricky because to test a software in a way to assure its quality we usually require loads of tests and some advanced management is required. For this purposes we should always have a "test plan" that describes which parts of the system will/won't be tested, how will the tests be conducted (what tools and methods will be used), who is going to be in charge for the tests (setting up responsibilities).&amp;nbsp;&amp;nbsp;Each test consists of 3 basic parts:&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;execution (prepare the software for testing, setup context, etc.)&lt;/li&gt;&lt;li&gt;testing (run the test)&lt;/li&gt;&lt;li&gt;evaluation (gather statistics and inform about the success/failure of the test)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Every test or a set of tests should be associated to a "test case" which describes the conditions that determine if the test passed or failed. This is quite critical for every test should attempt to cover all the possible contexts and act accordingly. This is a common place for mistakes for every assumption about an impossible case that certainly will never happen needs to be based on some invariants that usually come from the design and implementation of the overall system. So a tip is to "never make assumptions about anything and if we want to do them make damn sure they are right and wont change in time".&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Basic principles&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When testing a software we should try to keep in mind the following simple facts:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;there is no such thing as "complete testing"&lt;/li&gt;&lt;li&gt;to create a test requires experience and creativity&lt;/li&gt;&lt;li&gt;testing is driven by potential risks (more important parts should be more tested)&lt;/li&gt;&lt;li&gt;tests are based on the analysis, design and specification&lt;/li&gt;&lt;li&gt;tests require time, money and motivation&lt;/li&gt;&lt;li&gt;tests should be prepared and run at the right time&lt;/li&gt;&lt;li&gt;keeping track of statistics and code coverage is as important as testing itself&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The tests and their creation can be divided into 2 simple groups based on the knowledge base of the subject in charge of the creation. On one hand we have tests created by people that understand the software and are quite familiar with the implementation and how thing really work inside. This is called "white-box testing" and is usually done by developers themselves at the time of the implementation as part of the debugging process just to test if the piece of code they just wrote does what is supposed to do. The other approach is called "black-box testing" and logically it's the exact opposite. The test designer knows nothing about the code internals and all he knows is the interface and what it's functionality ought to be based on the specifications or application design. This sort of testing is usually done by professional testers, users or by other developers and is better in a way that the tester can't make any assumptions based on the implementation. One great benefit over "white-box testing" is that implementation changes don't break the test if the interface remains the same which is a useful feature.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As mentioned in the facts about testing one crucial aspect is the exact timing of tests meaning good time planning is essential for the tests to play they part in the overall process so we can benefit from these. Simply said if we start testing late then there's quite a big chance we won't test the software properly mostly due to time pressure because deadlines need to be fulfilled. On the other hand if we start testing too early there is a possibility we'll be testing an unfinished and unstable piece of software which would result in a waste of time, money and testers work. To know when to test what part is some sort of magic and a sign of a good and experienced IT manager but a nice hint is the "V-model".&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://sdm.mit.edu/NEWS_ARTICLES/SDM_KEIO/v_model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://sdm.mit.edu/NEWS_ARTICLES/SDM_KEIO/v_model.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To avoid problems with test planning we need to remember that tests are created and performed by humans which means that no tests can be absolute, no good testing can be done without adequate resources. Good testing requires excellent cooperation between testers, developers and most of all management. A common mistake is the belief that testers are the ones responsible for the quality of the product. This is not really true for they are usually under pressure from the management that schedules test runs and deliveries without taking into account the real-life project limitations. Also lots of companies don't really invest into qualifying testers or they rate their performance by the number of "bugs" they found which leads to their focus on small and not-critical problems just to earn enough points. Another bad testing practice is limiting tests to a specific area of interest (specification based testing, function testing, etc.) or by exactly specifying which atomic parts to test and how leaving little space for testers creativity. Over-detailed tests cause lots of trouble too for they are hard to maintain and usually redundant which leads to too long test runs.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another thing that should be taken into consideration are the mentioned resources that management needs to provide for the testing to have effect. To create an adequate estimate is also a great problem and sometimes people tend to under or over estimate these. As an example there have been quite a lot of studies with similar results that say that the amount of users testing an application is related to the quality of the testing and that to have more than 5 users test your product is unnecessary for it doesn't provide such extra benefits.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.useit.com/alertbox/20000319-user-testing-diminshing-returns-curve.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://www.useit.com/alertbox/20000319-user-testing-diminshing-returns-curve.gif" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Basic testing strategies&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is not easy to create a universal guideline for creating test plans and making thus testing effective independent on the type or extent of a project. This is probably the reason why are experienced IT managers so important for this is some sort of magic that requires lots of experience on various projects. Anyway there are some tips that might be a nice to follow for starters:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Begin with the basic tests.&lt;/b&gt;&amp;nbsp;Test with values you know shouldn't break anything just to verify everything does what it should. Most software products work for quite some time without breaking anything and Windows users are used to restart the service from time to time. Anyway you can blame Windows if thats your softwares main platform.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Test slightly everything first.&lt;/b&gt;&amp;nbsp;You should always run some preliminary tests first to make sure the whole system works as expected most of the time. If it does there is just a slim chance there's something wrong with the design which are the worst problems to solve.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Run complex and detailed tests as soon as possible.&lt;/b&gt;&amp;nbsp;If the software passed all the basic tests it's the right time to start testing in a more aggressive fashion. Create detailed tests based on the simple ones, create complex testing scenarios with contexts that are not so likely to happen. This usually discovers small implementation mistakes, bugs and possible weak points of your software.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Modify test boundaries.&lt;/b&gt;&amp;nbsp;After some time the amount of tests is more than overwhelming and their execution takes quite a lot of time. Also there probably is quite a lot of redundance for many complex tests do the same job as the a set of simpler ones. The elimination of unnecessary tests will improve the situation significantly.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Exploratory testing.&lt;/b&gt;&amp;nbsp;The most useful testing advice is to keep creating new tests all the time. A nice practice is let every developer create a new test or a set of tests on weekly basis. That way we can discover forgotten untested places.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Reporting&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Testing would be almost useless without reports that record the test results as well as all the defects software has. These reports should have a standardized form which can be easily achieved by the usage of a bug-tracking system (BugZilla, Trac). The basic and simple rule is that every issue should be reported and ideally traceable by connecting it to the version of code currently tested. The issue needs to be reported in such a way that enables others to reconstruct and simulate it and most of all repair it. This can be achieved by appending logs, scenarios, detailed results, etc. Also a note describing it's relevance and effect it has on the system is advisable.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Automating tests and regression testing&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ever since testing became an integral part of software development people though of ways how to make the testing process automatic for several reasons. First people needn't to run the tests by hand every time something changed, tests could be reused and of course test runs could be planned in advance for times when the system was not overused. Today regression tests (running old test scenarios on new versions of code) is one of the basic ways to determine new changes are consistent with the rest of the system. This leads to the principles of "continuous integration" (smoke testing), configuration testing on various software/hardware, stress and load testing, etc. Some specialized tools can be used (for example Hudson) to do the job.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Testing helps create a good and high-quality product if the resources are provided. Many people think of testing as an easy click-and-see job for they don't see the experience and creativity required. Also it is important to attempt to have a high "test code coverage" (some norms require a percentage) but we need to keep in ming there is no such thing as 100% test coverage for we may never know what can happen and we usually don't test the platform and tools we use. Anyway even the testing software we use might be buggy!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/reading/HardSwTesting.pdf"&gt;What Is Software Testing? And Why Is It So Hard?&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/reading/LittleBookOfTesting_VolumeI.pdf"&gt;Little Book of Testing - Volume I&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/reading/LittleBookOfTesting_VolumeII.pdf"&gt;Little Book of Testing - Volume II&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/reading/SPAWAR_SwTestPlanGuidebook.doc"&gt;Software Test Planning and Management Guide&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Checklists and templates&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/checklists/CxCheck_TestPlan.pdf"&gt;CxCheck_TestPlan.pdf&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/CxTemp_TestPlan.doc"&gt;CxTemp_TestPlan.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/IEEE_TestPlanTemplate.pdf"&gt;IEEE_TestPlanTemplate.pdf&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/MIL-STD-498_SwTestDescriptionTemplate.doc"&gt;MIL-STD-498_SwTestDescriptionTemplate.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/MIL-STD-498_SwTestPlanTemplate.doc"&gt;MIL-STD-498_SwTestPlanTemplate.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/MIL-STD-498_SwTestReportTemplate.doc"&gt;MIL-STD-498_SwTestReportTemplate.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/SPAWAR_SwTestPlanTemplate.doc"&gt;SPAWAR_SwTestPlanTemplate.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/testing/templates/SPAWAR_SwTestReportTemplate.doc"&gt;SPAWAR_SwTestReportTemplate.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-9036346171209043080?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/9036346171209043080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=9036346171209043080&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/9036346171209043080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/9036346171209043080'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-05-testing.html' title='Software engineering 05 - Testing'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-8817240943852391988</id><published>2010-01-07T17:26:00.000+01:00</published><updated>2010-01-07T17:26:23.776+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 04 - Construction</title><content type='html'>&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Finally we got to the part that for most of the managers and clients is what IT is supposed to do which is the construction of the software product they are paying for. The development process can live without detailed specifications, designs and advanced analysis but without several hundred/thousand lines of working code no software can be produced - it's simple as that. This is probably the reason why this phase is the place where the majority of the investments and costs is located. Some of the modern agile methodologies of software development, for example the well-known "extreme programming", believe that most of the design and analysis can be done while implementing the system (which is the parallel development principle we described in the previous articles) and that is what is usually done nowadays, although it definitely depends on the system we are creating for a complex software with reliability as its main concern will require more thinking than a simple web presentation.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Lines of code as main metric&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;It is always an issue to determine the metrics to monitor the progress of a software construction. The most common one is the number of lines of code a person/team has done in a period of time. Of course this is relative for the quality matters a lot but by "pair programming" or "collective code ownership" practices we can diminish bad code and hence use this simple metric as a nice overview. But there is one basic thing we need to keep in mind that is related to the estimates we proposed in the specification/design phases for it is proven that the amount of new code decreases in a logarithmic fashion as can be seen on the following picture.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://objectlabkit.sourceforge.net/statsvn/loc_small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://objectlabkit.sourceforge.net/statsvn/loc_small.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Similar statistics follow almost every project. In the first phase of the development it's an explosion of new code for we start (usually) from scratch and when using modern programming languages about a 50% portion of code is of supportive/platform dependent nature. After some time we have the working corpse of our new system and we start making adjustments, modifications, add-ons and debugging which takes lots of time but on small portions of code. Keeping this in mind is crucial for a lot of people believe that if at the beginning of the project the rate of new code is 1000 lines/week then if this number falls dramatically it is a signal that overall workers performance is diminishing.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Implementing rules&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The implementation part as being the phase where everything is physically made needs to be effective, quite fast and most of all high-quality. Clean and understandable code might even fulfill the same job as the design documents and architecture description. It's the heart of the system and if done badly there's nothing that can save the project, except for new reimplementation based on design of course. A complete and comprehensive list of methods, tips and guidelines can be found in Steve Mcconnells book "Code Complete" which should be a bible for every software developer, but here are some of the basic rules you might want to follow:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;start coding only when it's absolutely clear "what to do" and "how"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;always follow the architecture and design&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;use "the best tool available" that can handle the job&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;use "the best solutions available" (frameworks, libraries, design patterns, best common practices, 3rd party software)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;know the basic concepts of software construction&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;write tests to verify your code&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;use syntax checkers, static code analysis tools to find bugs and mistakes in advance&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;maintain the code by versioning, documentation&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;document "WHY" and not "WHAT" for that should be clear from the context&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;at all costs avoid quick and simple partial solutions with the intention to repair them later for you'll probably never will ("TODO,FIXME" comments are almost always left untouched due to time pressure)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;understand the "business" behind the software for if you don't share the client's point of view you have almost no chance of satisfying his needs&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Model/Domain/Test driven development&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;There are several basic approaches to software construction which differ mainly by their point of view on the overall construction process and the units that the system is composed of. The more traditional one is the "model driven development" while the new and sort of still experimental ones are "domain driven development" and "test driven development".&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The "model driven development" suggests creating abstractions that model concrete real concepts than the computer/algorithmic ones meaning the models represent a real-life object/service/situation more than some computer specific issues/techniques. That way it's easier to design them and see the various interactions among each module and somehow hides the technical stuff under a nice cover of abstraction. This approach also encourages reusability of already implemented models and their composition into new products. This leads to money saves in the future as some commonly used real-life models are implemented once and then reused for later projects. To benefit from such development we clearly need to have the models implemented as independently as possible and as specific as the real-life stuff they model.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Similar but a little bit different is the approach of "domain driven development" which is based on 2 basic premises:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;complex domain designs should be based on a model&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;for most software projects, the primary focus should be on the domain and domain logic (as opposed to the particular technology used to implement the system)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The slight difference here is that we don't focus on individual independent models that we later combine into the final product but we create models related to the problem specifically. In simple words it's about mapping business domain concepts into software artifacts. It's more of an addition and perfection of the plain model driven development and as such all the benefits stay.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;One particularly interesting approach is the one of "test driven development" which looks at the implementation process in a different way. It's main idea is that developers should first create the tests for the small pieces of software they are creating thus preparing some quality expectations and then implement the piece while continuously testing each version against the tests. This approach has several benefits like the need of developers to think about the software as the user would, creates a well tested software and help assure the overall quality of the product. Also it takes advantage of the premise that small pieces of code are better tested and that debugging is more expensive than simply reverting to the previous working version. The increased costs for loads of tests, the main argument against, is somehow pointless because some tests we would have to do anyway. Nevertheless this approach is more useful for small projects or projects composed of many individual parts that needn't large complex full functional tests to determine success. Also note that many tests are created by developers themselves and they usually make some assumptions about the test context which might create untested holes - so don't believe that test driven development assures quality by itself.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.theserverside.net/tt/cartoons/10000Lines/10000Lines.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://www.theserverside.net/tt/cartoons/10000Lines/10000Lines.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Documentation, versioning and refactoring&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;When concerning the software construction there are several things developers ought to do. Apart from the typically administrative ones like setting up means and forms of communication, create code style rules and prepare tools to enforce them, set the basic rules for typical practices, establish naming conventions, etc., there are 3 basic matters we should always keep in mind.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Documentation is the basic and probably most useful one. Having good documentation helps reduce costs and most of all helps manage problem situations (change of assignee, bug detection/elimination, problem solving, logical errors, etc.). The paradigm of "self-documenting code" is the basics. Good clean code and understandable naming conventions are essential and with additional information from the design papers are developers strongest weapon when dealing with problems. There is no need to document every single step for the code itself serves as the main source of information but describing functionality, pre/post conditions and invariants of larger function blocks is never a bad thing.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Code versioning is also one of the techniques that helps solve possible problems as well as its benefit for cooperation among developers. It does not only document changes but allow a quick and simple mechanism to rollback to a specific version if for example changes in design need to be made rather than reimplementing from the actual state.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Least but not last is refactoring which can simply be described as code cleanup. It should be done after a block large enough or module has been completed and properly tested. It involves removal of unnecessary or dead blocks of code, some style standardizations, possibly some performance tuning and other more of aesthetic tasks that don't affect the external functional behavior.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Attempt to create a clean and well documented code that strictly follows the already prepared design. Don't implement design changes directly but make sure you modify the architecture design documents so that they reflect the implementation and vice versa. And most of all "Write code for people, not for the machines !".&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://www.stevemcconnell.com/ieeesoftware/bp.htm"&gt;"Best Practices" Columns by Steve McConnell&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Checklists&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_Conditionals.txt"&gt;CxCheck_Conditionals.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_ConstructingRoutine.txt"&gt;CxCheck_ConstructingRoutine.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_ControlStructureIssues.txt"&gt;CxCheck_ControlStructureIssues.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_DataCreation.txt"&gt;CxCheck_DataCreation.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_DocumentingCode.txt"&gt;CxCheck_DocumentingCode.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_HighQualityModules.txt"&gt;CxCheck_HighQualityModules.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_HighQualityRoutines.txt"&gt;CxCheck_HighQualityRoutines.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_Layout.txt"&gt;CxCheck_Layout.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_Loops.txt"&gt;CxCheck_Loops.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_NamingData.txt"&gt;CxCheck_NamingData.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_OrganizingCode.txt"&gt;CxCheck_OrganizingCode.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_UnusualControlStructures.txt"&gt;CxCheck_UnusualControlStructures.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/construction/checklists/CxCheck_UsingData.txt"&gt;CxCheck_UsingData.txt&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-8817240943852391988?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/8817240943852391988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=8817240943852391988&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/8817240943852391988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/8817240943852391988'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-04-construction.html' title='Software engineering 04 - Construction'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-5501320100308727094</id><published>2010-01-07T00:12:00.002+01:00</published><updated>2010-01-07T12:59:43.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 03 - Architecture and Design</title><content type='html'>&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;b&gt;In&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;troduction&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;The creation of the architecture and design is almost as important as other parts of a software engineering process. It's hard to believe that in many IT companies only a smart portion of time and money is assigned to architecture design. This aspect might come from the fact that the client usually thinks that from the specification and requirements it is absolutely clear what the design of the application should look like. The fact is that the specification tells only "what is it we want" and the design should provide us with a specific manual on "with what technical tools and principles we achieve that". This is essential for understanding for all the main stakeholders because some might think the architecture design is just a duplicate of the specification project so in simple words "doing the same thing we've already done".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It's not a standstill&lt;/b&gt;&lt;br /&gt;The design takes approximately the same amount of time and money as does the specification and someone might think that all the team forces deal with this phase while no "concrete" work is done. As shown on the well-known diagram of the software creation this is not true.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;The creation of the architecture and design requires a very good knowledge base, advanced software engineering and programming skills, overall IT knowledge and most of all experience. We usually have only some such people in the team and while this subset creates the design other work can be done simultaneously. Such actions could be:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;learning the technologies that will be used for the implementation, special courses and training&lt;/li&gt;&lt;li&gt;getting to know the clients infrastructure&lt;/li&gt;&lt;li&gt;prepare the development platform for the implementation (version control system, test and production servers, software for additional functionality, etc.)&lt;/li&gt;&lt;li&gt;prototyping of the already done designs and verifying their correctness&lt;/li&gt;&lt;li&gt;start implementations of already designed parts&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Basic concepts&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Creating a software project design is one of the more complicated phases of the software creation process and it is not easy to give specific guidelines that would give instantaneous success. There are 5 basic design concepts that everyone should keep in mind when designing a modern application:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;decomposition&lt;/b&gt;&amp;nbsp;(split the application into small individual modules that have a clear set of responsibilities and are more or less logically independent on each another)&lt;/li&gt;&lt;li&gt;&lt;b&gt;abstraction&lt;/b&gt;&amp;nbsp;(attempt to identify common properties and functionality for some of the decomposed system parts)&lt;/li&gt;&lt;li&gt;&lt;b&gt;encapsulation&lt;/b&gt;&amp;nbsp;(make a difference between objects structure and behavior, protect internal parts from the outer elements)&lt;/li&gt;&lt;li&gt;&lt;b&gt;cohesion&lt;/b&gt;&amp;nbsp;("high", the amount of responsibilities an independent module fulfills, we try to make it as highest as possible in which case the module can take care of all it's functionality by himself)&lt;/li&gt;&lt;li&gt;&lt;b&gt;coupling&lt;/b&gt;&amp;nbsp;("low", metric to determine the dependency between various modules, we try to make it as low as possible in which case objects are more independent)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The concepts above can be easily achieved by the usage of some "modern" programming techniques like object-oriented programming. OOP became popular in the 90' and was considered the solution to all the common design, maintainability and reusability problems mostly thanks to the nowadays overestimated object inheritance. This concept was seen as the greatest benefit of OOP but during time became too abused and nowadays is considered more of bad practice for whenever we use complex inheritance schemes we limit our possibilities to make additional changes without the need to modify the architecture. Programmers recommend to use object composition instead and many frameworks attempt to encourage that. One great example from the Java world is the Spring Framework or EJB with its object injection.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Design patterns&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When speaking about OOP we have to mention the concept of existing design patterns. These are universal platform independent patterns that are meant to solve many of the common design issues. The knowledge of some of the basic ones is essential for creating a good, reliable architecture. On the other hand the misuse can result in more and complex future problems or useless extra implementation. One example for all is the notorious "singleton" which is one of the worst possible design patterns but also one of the most used ones. It's main disadvantage is the fact that it somehow supplies the same functionality as a global variable, keeps it's state throughout the whole run of the application and creates quite tight coupling among objects.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Stakeholders and how they see it&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There exist various points of view at the design process per stakeholder and what it should concern. If we divide the stakeholders into several categories we can identify some basic concerns:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;customer&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;schedule and budget estimation&lt;/li&gt;&lt;li&gt;feasibility and risk management&lt;/li&gt;&lt;li&gt;requirements traceability&lt;/li&gt;&lt;li&gt;progress tracing&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;user&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;consistency with requirements and usage scenarios&lt;/li&gt;&lt;li&gt;future requirement growth accommodation&lt;/li&gt;&lt;li&gt;performance&lt;/li&gt;&lt;li&gt;reliability&lt;/li&gt;&lt;li&gt;interoperability&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;architect and system engineer&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;requirements traceability&lt;/li&gt;&lt;li&gt;support of tradeoff analyses&lt;/li&gt;&lt;li&gt;completeness&lt;/li&gt;&lt;li&gt;consistency of architecture&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;developer&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;sufficient detail for design&lt;/li&gt;&lt;li&gt;reference for selecting/assembling components&lt;/li&gt;&lt;li&gt;maintain interoperability with existing systems&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;maintainer&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;guidance on software modification&lt;/li&gt;&lt;li&gt;guidance on architecture evolution&lt;/li&gt;&lt;li&gt;maintain interoperability with existing systems&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Another way of showing the various views on the design process is the "4+1 view model" which shows 4 basic views that are interconnected among themselves and by use-cases and scenarios. Logical view is end-users view and is mostly concerned with pure functionality. The development view is programmers view and its mostly concerned with the whole software management. The process view is integrators point of view and its main concern is scalability and performance. The last view is physical view which is the view of system engineers who are concerned with topology and communications.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/f/f2/4%2B1_Architectural_View_Model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://upload.wikimedia.org/wikipedia/commons/f/f2/4%2B1_Architectural_View_Model.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Integration&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One very important part of the design which is usually neglected is the important integration of the new product with the rest of the clients system in such a way these can cooperate and take advantage of each others features. There are many ways on how to implement such integration but one of the most common are file transfer, shared databases, remote procedure calls or messaging.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Documents&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The whole design should be also well documented in an understandable form. The product of this phase should be a complete manual that can be handled to a team of coders and if followed it should give exactly the required final product. This document should also be verified and confirmed by the client. Of course some might object that by preparing such a detailed document there is the risk that the client will take our results and find some other subject to implement it. The only motivation for such an act might be the attempt to lower costs but real-life experience shows this usually comes at the cost of lower quality of the final product for the new team doesn't have the experience gained while gathering requirements, specifying the software and design creation.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The design is not something that should be taken likely as it can prevent re-implementations, gives the developers and coders an approximately exact overview about the software and can significantly reduce costs. Although it really depends on the scope of the project for creating detailed design and architecture for small projects might be a waste of time since they need to have some formal style. As for some good practices that we might want to keep in mind:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Program to interface, not implementation !&lt;/li&gt;&lt;li&gt;Favor object composition over inheritance.&lt;/li&gt;&lt;li&gt;Avoid using singletons.&lt;/li&gt;&lt;li&gt;Think twice, program once !&lt;/li&gt;&lt;li&gt;&lt;a href="http://media.pragprog.com/articles/may_04_oo1.pdf"&gt;Keep it DRY, shy and tell the other guy !&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.cs.cmu.edu/afs/cs/project/vit/ftp/pdf/intro_softarch.pdf"&gt;An Introduction to Software Architecture&lt;/a&gt;&lt;br /&gt;&lt;a href="http://campus.hesge.ch/Daehne/2006-2007/Module625/Algo/01-Article%20original%20de%20Parnas.pdf"&gt;On the Criteria To Be Used in Decomposing Systems into Modules&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.win.tue.nl/~mchaudro/sa2004/Kruchten4+1.pdf"&gt;Architectural Blueprints - The “4+1” View Model of SW Architecture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Checklists and templates&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/checklists/CxCheck_SwArchitecture.txt"&gt;CxCheck_SwArchitecture.txt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/checklists/CxCheck_HighLevelDesign.txt"&gt;CxCheck_HighLevelDesign.txt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/checklists/CxCheck_HighQualityModules.txt"&gt;CxCheck_HighQualityModules.txt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/SwDesignSpec.doc"&gt;SwDesignSpec.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/MIL-STD-498_InterfaceReqsSpecification.doc"&gt;MIL-STD-498_InterfaceReqsSpecification.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/MIL-STD-498_InterfaceDesignDescrption.doc"&gt;MIL-STD-498_InterfaceDesignDescrption.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/MIL-STD-498_SwDesignDescription.doc"&gt;MIL-STD-498_SwDesignDescription.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/MIL-STD-498_SysSubsysSpecification.doc"&gt;MIL-STD-498_SysSubsysSpecification.doc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/architecture-design/templates/MIL-STD-498_SysSubsysDesignDescription.doc"&gt;MIL-STD-498_SysSubsysDesignDescription.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-5501320100308727094?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/5501320100308727094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=5501320100308727094&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/5501320100308727094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/5501320100308727094'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-03-architecture.html' title='Software engineering 03 - Architecture and Design'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-3725115218992465498</id><published>2010-01-06T12:00:00.003+01:00</published><updated>2010-01-06T12:18:59.534+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 02 - Requirements</title><content type='html'>&lt;span style="font-size: x-large;"&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;Why are they so important&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Requirements are one of the basics of software engineering. There have been many projects that failed due to the bad understanding about what were the requirements for the software and many other cost much more for the simple reason of constant requirement modifications during development. To realize what the exact requirements are in the beginning of the project is essential for it is proven that changes to projects cost lots more in the later phases than in the early ones.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.hartnall.com/wp-content/uploads/2009/02/agile.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.hartnall.com/wp-content/uploads/2009/02/agile.jpg" width="229" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As can be seen on the graph if we have the requirements wrong then it is far cheaper to realize the defects soon for the changing a list of "what to do" on paper is quite cheap while doing such changes to a fully operational system will take several man-days to fulfill.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Overview&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Requirements gathering is quite a complex process that most of all requires good social skills. It's not a "once-per-project" phase but it happens throughout the whole lifetime of a software on different levels of formality. The whole process can be divided into four categories of actions:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Elicitation (meetings, dealings, user observation, documents creation and marking ups, etc.)&lt;/li&gt;&lt;li&gt;Analysis (brainstorming, debates, group-thinking, etc.)&lt;/li&gt;&lt;li&gt;Specification (problems decomposition, documents creation, establishing processes, notations, etc.)&lt;/li&gt;&lt;li&gt;Verification (meetings, presentations, dealings about the extents of projects, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It usually follows the easy pattern of first meeting the client and debate about his idea of requirements. Everything should be recorded as it is later used among the developers for brainstorming and analysis. The results of these collective meetings is put onto paper in a standardized form and with some additional information is presented back to the client to determine his satisfaction.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although this process seems easy and straightforward there are quite a lot of things that can go wrong. For many IT people the communication with a client is a nightmare mostly because the clients describe things from the users point of view without any technical specifications. IT people on the other hand tend to be too specific and overwhelm everyone with their technical knowledge. Where this leads is the feeling that both parties know their goals and feel satisfied after the meeting but in a couple of weeks realize the product doesn't look the what they intended.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://linkegypt.com/blog/wp-content/uploads/2008/03/Software-Development-Software-Development-software_development11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://linkegypt.com/blog/wp-content/uploads/2008/03/Software-Development-Software-Development-software_development11.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To avoid this problem it is good to keep detailed records or summaries about every meeting and let all the parties confirm those for example by signatures. That way whenever a misunderstanding occurs both sides can avoid discussions about "whose fault it was". This leads to the need of being exact as possible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Extent of requirements&lt;/b&gt;&lt;br /&gt;There are many discussions among the various software engineers about what should be part of a projects requirements and how detailed the information needs to be to achieve the best results possible. The answer is pretty simple: &lt;i&gt;"Requirements should cover all the obligations."&lt;/i&gt;&amp;nbsp;In short the result of requirements gathering should be a comprehensive list of features and stuff we as developers are obliged to incorporate into the final product. But there is a small drawback caused by the different understanding of this list between the developers and the client. Time has proved that:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The client requests to have &lt;b&gt;everything&lt;/b&gt;&amp;nbsp;which we &lt;b&gt;didn't explicitly reject&lt;/b&gt;&lt;/li&gt;&lt;li&gt;The developers provide &lt;b&gt;only&lt;/b&gt;&amp;nbsp;what is &lt;b&gt;explicitly specified&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;These two points of view usually don't exactly overlap and there is some "grey zone" between them that can be a place for future problems. The goal of an appropriate requirements gathering using some standardized processes is to erase the difference between the clients and the developers view.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The whole picture&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Requirements gathering is part of the initial phase of every project iteration for before we do something we need to know what is it we want. It is said that the requirements form about 10-30% of the overall project costs and time depending on the complexity of the project. Also as mentioned above there is a clear correlation between the time at which requirement changes occur and the costs it takes to implement them. In modern software engineering it is common to start working at architecture design and implementation while the requirements are not fully specified. This saves costs and most of all speeds up the overall development process if done correctly. Of course this applies only to parts of the system we suppose the client is satisfied with and which won't change dramatically while specifying the requirements.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://csse.usc.edu/csse/research/CORADMO/iterationsfull.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The overall software process usually has 3 main milestones which are quite related to requirements gathering as can be seen on the graph above:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;LCO &lt;/b&gt;(life cycle objective)&lt;/li&gt;&lt;li&gt;&lt;b&gt;LCA&lt;/b&gt;&amp;nbsp;(life cycle assessment)&lt;/li&gt;&lt;li&gt;&lt;b&gt;IOC &lt;/b&gt;(initial operational capability)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Techniques&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many ways of gathering requirements and the set of suitable techniques differs from project to project. These include specification documents, checklists, GUI prototyping, templates, UML, use cases, user stories, polls and questionnaires, etc. But there are some guidelines that if followed can make the requirements gathering efficient and maintainable.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;use structured text for better orientation&lt;/li&gt;&lt;li&gt;make sure you communicate with the right stakeholder (client, person responsible)&lt;/li&gt;&lt;li&gt;keep in touch with the client as much as possible&lt;/li&gt;&lt;li&gt;don't let the form overshadow the content&lt;/li&gt;&lt;li&gt;keep the content complex but understandable&lt;/li&gt;&lt;li&gt;all requirements are essential, don't forget about some&lt;/li&gt;&lt;li&gt;remember that there is no "right" way of doing this&lt;/li&gt;&lt;li&gt;&lt;b&gt;always&lt;/b&gt;&amp;nbsp;learn from previous mistakes and don't let overconfidence cloud your mind&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Articles &amp;amp; Books&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id="goog_1262770776414"&gt;&lt;/span&gt;&lt;span id="goog_1262770776415"&gt;&lt;/span&gt;&lt;a href="http://www.processimpact.com/articles/telepathy.html"&gt;When Telepathy Won’t Do: Requirements Engineering Key Practices&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.processimpact.com/articles/reqtraps.html"&gt;Karl Wiegers Describes 10 Requirements Traps to Avoid&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/reading/WritingEffectiveSRS.pdf"&gt;Writing Effective Natural Language Requirements Specifications&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/reading/BeCarefulWithUseCases.pdf"&gt;Be Careful With “Use Cases”&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://yourdon.com/strucanalysis/wiki/"&gt;Just Enough Structured Analysis&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Checklists&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/checklists/CxCheck_Requirementst.txt"&gt;CxCheck_Requirementst.txt&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/checklists/Requirements_review_checklist.doc"&gt;Requirements_review_checklist.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/checklists/Use_case_checklist.doc"&gt;Use_case_checklist.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/checklists/Impact_analysis_checklist.doc"&gt;Impact_analysis_checklist.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Templates&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/templates/srs_template.doc"&gt;srs_template.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/templates/use_case_template.doc"&gt;use_case_template.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/templates/vision_and_scope_template.doc"&gt;vision_and_scope_template.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/templates/SAFE_BusinessRequirements.doc"&gt;SAFE_BusinessRequirements.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.profinit.eu/uploads/souvisejici-obsah/dokumenty/cz/academy/sweng-materialy/requirements/templates/SAFE_SystemRequirements.doc"&gt;SAFE_SystemRequirements.doc&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-3725115218992465498?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/3725115218992465498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=3725115218992465498&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/3725115218992465498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/3725115218992465498'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering-02-requirements.html' title='Software engineering 02 - Requirements'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-4645520086183497256</id><published>2010-01-05T22:11:00.004+01:00</published><updated>2010-01-06T12:09:37.429+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software engineering'/><title type='text'>Software engineering 01 - Introduction</title><content type='html'>I recently realized there is a deep hole in the knowledge of software engineering among programmers mostly due to the natural nature of these people to be sort of antisocial. Usually programmers tend to underestimate the customers needs and for those starting in the business it takes several falls to realize they have to change their habits a little bit to everyones satisfaction.&lt;br /&gt;&lt;br /&gt;Also a lot of managers and people using IT services don't usually have a good understanding about the process required for creating a good and reliable product that will all the "buzz-word" features managers so much like (good design, great performance, fast &amp;amp; cheap to create, etc.).&lt;br /&gt;&lt;br /&gt;In the next series of articles I would like to present all the main points that need (or should be) taken into consideration when creating a software product. The intention of the articles is to present the overall basics to IT and non-IT people from both views to help these two camps understand each others priorities, needs and problems.&lt;br /&gt;&lt;br /&gt;I have spent a few years in a software company that sort of ignored many of the nowadays common software engineering practices mostly due to really bad communication between the IT department and the management so at some points I might not be that objective but I promise I'll try to keep those at a minimum. As for sources that helped me create these articles I mostly used courses from "The Faculty of Mathematics and Physics, Charles University in Prague" where I'm recently studying for my computer science degree ("Software engineering for real-life" by Tomáš Krátký,&amp;nbsp;&lt;a href="http://profinit.eu/"&gt;Profinit&lt;/a&gt;, "Best programming practices" by Lubomír Bulej and "Tools for development and monitoring of software" by Tomáš Kalibera). Another great sources are the wonderful book "Code Complete" by Steve Mcconnell, "The Art of Unix Programming" by&amp;nbsp;Eric Steven Raymond and of course the ultimate sources "Wikipedia" and "&lt;a href="http://www.computer.org/portal/web/swebok"&gt;Swebok&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;In the series I would like to take a look into the following topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Requirements (the importance of knowing what the client wants us to do)&lt;/li&gt;&lt;li&gt;Software architecture (how should we think about the design)&lt;/li&gt;&lt;li&gt;Construction (lots of good code is not everything)&lt;/li&gt;&lt;li&gt;Testing (howto make sure we provide a "bulletproof" product)&lt;/li&gt;&lt;li&gt;Quality assurance (quality is what matters)&lt;/li&gt;&lt;li&gt;Configuration management (when clients realize they wanted more than they told us)&lt;/li&gt;&lt;li&gt;Development environment (development and production do really differ)&lt;/li&gt;&lt;li&gt;Maintenance (howto get quite a lot of money without too much work)&lt;/li&gt;&lt;li&gt;Project management (it's all about business)&lt;/li&gt;&lt;li&gt;Estimations and proposals (how do we know we are payed enough)&lt;/li&gt;&lt;li&gt;Improvements (what can we do to make it even nicer)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I will try to follow the "&lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt;" principle throughout the articles to make things as clear as possible but since I'm not a writer, more of a shy computer guy, feel free to append questions and other comments and I will try to answer them as soon as I'll have time to do so.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, once upon a time ...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-4645520086183497256?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/4645520086183497256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=4645520086183497256&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4645520086183497256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/4645520086183497256'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/software-engineering.html' title='Software engineering 01 - Introduction'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-1320189659456584641</id><published>2010-01-04T15:59:00.002+01:00</published><updated>2010-01-06T12:09:49.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Spring Framework</title><content type='html'>&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;It has been some time since me and my coworkers thought about developing web applications in Java. It was no coincidence that at the same time we came across the Spring Framework which according to many users provides more efficient development, lowers costs and takes great advantage of code reusability. At that time we were uncertain about the claims for it was well known that SpringFramework is a great tool but in the wrong hands can deal quite a lot of damage.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;We discussed various pros/cons of different tools for Java-based web applications, mostly JSF (Java Server Faces) and the famous SpringFramework (including Spring Web-Flow), and realized there are not so many things you can do that can't be done in the other. The amount of coding also didn't vary so much so where are these claimed Spring's benefits ?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;As I can tell, its main power relies in the fact that this framework has been created with the "all-for-testing" paradigm in mind which leads to applicantions that are easily tested (mostly due to Spring's IOC which helps you create different test scenarios without the need to modify the source code).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;There are a lot of objections against the usage of SpringFramework and its mostly up to the developer if he chooses to use Spring. Some people are frustraded by the blotted XML configurations which need some special tools to maintain on really big projects, others hate the IOC for itself because it removes one of Javas core features - strong typing (the type control is run at runtime).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;My conclussion is as follows:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;If you plan to create a quite small blog-like web application SpringFramework (and possibly Java) is too big and too complex for the job. You should use the framework on really big enterprise projects where you need excessive testing capabilities, when you will plan to reuse many of the components and modules that form your application and your development team has more than 1 developer. It's mostly a way of using EJB in a more reusable fashion with quite a long learning curve to take real advantage of whatever Spring Framework provides for your applications. One great advantage is that you are free to combine Spring with other technologies and use only the part you need.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;Some additional information about SpringFramework can be found here:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;a href="http://www.springsource.org/"&gt;Spring main page &amp;nbsp; - http://www.springsource.org/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;a href="http://www.roseindia.net/spring/"&gt;Spring tutorial &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- http://www.roseindia.net/spring/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;a href="http://www.ibm.com/developerworks/web/library/wa-spring1/"&gt;IBM Spring tutorial - http://www.ibm.com/developerworks/web/library/wa-spring1/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-1320189659456584641?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://brainscrust.blogspot.com/feeds/1320189659456584641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8266075840352282094&amp;postID=1320189659456584641&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/1320189659456584641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/1320189659456584641'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2010/01/spring-framework.html' title='Spring Framework'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8266075840352282094.post-342452044934378282</id><published>2009-12-10T15:56:00.001+01:00</published><updated>2010-01-09T00:31:41.238+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='About'/><title type='text'>Just another Blog on the horizon</title><content type='html'>The situation about blogs is getting calmer that a year ago and I decided the time has come for me to join this "blogger" community. I'm not a writer so please don't expect any novels or heart-breaking stories. The aim of this blog is simply to store some interesting stuff that's in my mind and I wouldn't want to loose.&lt;br /&gt;&lt;div&gt;If by any chance you find something of some interest in any post please feel free to do whatever you want with it. I'm no copyright moron so this whole blog and its content should be following the &lt;a href="http://sam.zoy.org/wtfpl/"&gt;WTFPL&lt;/a&gt; licence.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is likely there will be more IT stuff than any other since I'm a computer sciences student at Charles University in Prague (Czech Republic) so take that in consideration if you came here in search of some crappy videos or jokes (although I'm not suggesting you won't find any here).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, that's it ... the first entry.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;howg&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8266075840352282094-342452044934378282?l=brainscrust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/342452044934378282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8266075840352282094/posts/default/342452044934378282'/><link rel='alternate' type='text/html' href='http://brainscrust.blogspot.com/2009/12/just-another-blog-on-horizon.html' title='Just another Blog on the horizon'/><author><name>Tomáš Janků</name><uri>https://profiles.google.com/102456572479220987931</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V8xU10_jToE/AAAAAAAAAAI/AAAAAAAAAdE/OIh_v09GZ18/s512-c/photo.jpg'/></author></entry></feed>
