tag:blogger.com,1999:blog-10340928042517789502024-03-05T21:24:44.618+01:00Fuzzzy blogA blog about Systems Development and other fuzzy stuff. Authored by a programmer/data analyst/concept developer named Roy Lachica.Unknownnoreply@blogger.comBlogger45125tag:blogger.com,1999:blog-1034092804251778950.post-49416720128163173082022-10-01T12:45:00.001+02:002022-10-01T12:45:26.271+02:00Trello or Jira for dev teams?<p>Should your development team use Trello or Jira for task management?</p><p><br /></p><h2>Benefits of Trello</h2><p></p><ul><li>Completely free.</li><li>Less overhead work for managing/administrating the boards/projects/sites.</li><li>Less time consuming for developers. (Less time needed to categorize stuff and update fields) (Rebuttal: at the expense of structure and reporting)</li><li><span style="color: #999999;">Ease of use - A simpler tool like Trello is easier to use for non-technical persons. (Rebuttal: People like stakeholders and others who are not really part of the team should not use the board as it is too technically detailed. Stakeholders should refer to the roadmap and status updates from PM/scrum master)</span></li><li><span style="color: #999999;">View access - Easier to give access to anyone who want to see what we are working on. (Rebuttal: People like stakeholders and others who are not really part of the team should not use the board as it is too detailed. Stakeholders should refer to the roadmap and status updates)</span></li><li><span style="color: #999999;">Create access - Easier to allow external users to post new issues. (Rebuttal: People like stakeholders and others who are not really part of the team should not create items directly for the team.)</span></li></ul><p></p><p><br /></p><h2>Benefits of Jira</h2><p></p><ul><li>More efficient handling of large backlogs with more analytical triage/selection.</li><li>Better overview and visibility of status and priority across projects (for everyone).</li><li>Avoid loss of information and duplicates as you can more easily find issues with search, filtering, categorization, tagging etc. Also save time finding issues. </li><li>Better plug-in strategy with more useful plugins.</li><li>More options for integrating with other project planning tools.</li><li>Support for external bug reporting interfaces - Jira has more options for APIs to allow external users to submit bugs and feedback via widgets or other external contact forms etc. and still preserve data quality. </li><li>Better overview of all my assigned tasks across all projects prioritized in one view.</li><li>Better support for grouping tasks together (related issues. sub issues, epics etc.)</li><li>Compliance - More ISO compliant. E.g. Better audit-logs etc.</li><li>More Agile - Better fit for supporting Scrum and KanBan dev processes. For example Jira supports Epics and Backlogs out of the box among many other things.</li><li>More structure to ensure consistent use across projects (leads to better reports and less confusion/noise). </li><li>Jira can be run on-premise (in case we in the future want even higher level of security or want to save money)</li><li>Jira has time tracking and estimation support (without having to install quirky plugins)</li><li>Professionalism - A more professional tool will inspire and strengthen the sense of professionalism and developer excellence. </li></ul><p></p><p> </p><h2>Conclusion</h2><p>Use Trello for non dev teams, small unstructured ad-hoc teams and short lived projects. Use Jira (or similar tools) if you are professional dev team. </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-72034198909868652492020-04-25T12:45:00.001+02:002020-04-25T12:45:07.248+02:00Guid or Int for database keys?Should I use Guid's or Integers as primary keys in my database?<br />
Well, it depends. Here's some simple thumb rules.<br />
<br />
<h3>
Use Guid when...</h3>
<br />
<ul>
<li>You have a system with a lot of data spanning multiple servers and databases. (Guids make it easier to merge data. You can partition data across servers).</li>
<li>You need to synchronise data across different systems (both ways).</li>
<li>You need a high level of security. (Less chance of someone getting access to something they shouldn't have by tweaking key parameters, doing brute force attacks etc.)</li>
<li>You are using some rally high velocity multi source threaded non-transactional database. (With Guids you can be sure entries are saved as unique)</li>
<li>You have high requirements around system quality (e.g. reliability and stability). With integers there's a greater chance of bugs. For example: <i>"Ops, that customer Id was actually a product Id"</i>. Some developer using our API got the data mixed up and created data inconsistencies. </li>
<li>You need to create an Id but not persist it until later. </li>
</ul>
<br />
<br />
<h3>
Use Int when...</h3>
<br />
<ul>
<li>You have small system and you want to be able to easily change keys during development. </li>
<li>Your database server has resource limitations etc. (Guids takes up 4 times more space). </li>
<li>You are just hacking together some hobby project and you don't want to spend time on making sure Guids are used in an optimal way.</li>
<li>You want to spend less time on developing a user-friendly system. You can display the key directly to users. (With Guids you can't expect them to remember or copy/paste Guids. With integers you get shorter Urls etc). </li>
<li>You have extreme performance requirements (and you don't really need Guids). </li>
</ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-38806179991663857032019-05-09T08:14:00.003+02:002019-05-10T22:20:07.775+02:0050 tactical and strategic blunders in the battle of Winterfell<br />
<div>
Yes, I know Game of Thrones is a fantasy drama television series. But still analysing battle tactics is a lot of fun.</div>
<div>
<br /></div>
<ol>
<li>Trebuchets (long distance catapults) placed in front of infantry (to be abandoned early in the battle).</li>
<li>Trebuchets or catapults placed outside the fortress rather than on higher ground to achieve longer distance and to protect the equipment.</li>
<li>Not employing more catapults that could be directed towards enemy hot spots. (could be operated by civilians)</li>
<li>Not using Trebuchets and catapults constantly to bombard enemy. </li>
<li>Not using archers extensively.</li>
<li>Not filling castle walls to the full with archers or other combatants, with backup forces.</li>
<li>Not ordering all humans to contribute in creating more trenches, spike obstacles etc. to gather stones for catapults and wall defences etc. The defenders had for weeks known the Night King was on his way. Better defences could been planned weeks in advance. </li>
<li>Not using dragons from the start for air raids. (While having a two-to-one air superiority)</li>
<li>Not weaponizing dragons. Dragons probably don't have unlimited fire breath. Could therefore also utilise weapons such as large nets or chains held between the two dragons used to swoop along the battle field to wipe out the dead. (Like fishing trawlers). </li>
<li>Not using dragons for high altitude bombing (out of range of ice javelins etc, before snowstorm)</li>
<li>Humans initiating the battle during night. Should have waited as long as possible until morning light. (The dead probably have better night vision)</li>
<li>Not heavily armouring Dothraki cavalry when used as a charging force. </li>
<li>Using Dothrakis in a frontal assault shock tactic (knowing this would not create any fear or confusion on this type of army).</li>
<li>Cavalry charging too far away from communication distance with commanders.</li>
<li>Dothraki cavalry not used on the flanks, where they would have space to manoeuvre. </li>
<li>Dothraki force attacking head on without any rear support.</li>
<li>Dothraki force charging straight into unknown territory. (poor sight, not knowing what awaited them)</li>
<li>The army of the dead not besieging the castle from a distance. Why hurry when you are already dead and don't need food. </li>
<li>Weak central command. Military leader Jon Snow not in control being on a dragon. </li>
<li>Few signals being used (flags and horns etc) to control the battle.</li>
<li>Tacticians like Tyrion Lannister hiding away in a crypt.</li>
<li>Commanders placed in the front of their forces exposed (Brienne, Jorah, Greyworm etc)</li>
<li>Not using flaming oil down the side of the castle walls. (if not effective against wights, it would at least provide more light)</li>
<li>No moat in front of castle wall.</li>
<li>Not placing as many as possible of the Winterfell fighters inside the castle.</li>
<li>Burning spikes placed behind army rather than in front. Infantry should have been placed behind burning spikes/trenches, picking off the undead that made it past. </li>
<li>Not using more than one line of spike trenches (obstacle perimeters).</li>
<li>Not using burning oil pits, pitfall traps etc.</li>
<li>Not using wall climbing deterrence devices to push climbers off side of wall.</li>
<li>Not creating bottleneck entrapment areas neither outside of castle or inside (Army of dead consist of very stupid fighters and could be funnelled into a passage where they could be picked off).</li>
<li>Not using ice dragon or catapults to drop diseased animals, corpses of plague victims or other contagious agents into the castle, then sit back and wait for humans to die of disease. (biological warfare)</li>
<li>Not taking into account strength and weaknesses of opponent. The dead don't have fear, you can't change their fighting morale, they don't get tired etc.</li>
<li>Not using guerrilla tactics before the battle. The wights are stupid and not very aware of their surroundings. Hit and run tactics could have been used over weeks leading up to the main battle. Dothrakis would be perfect for this. </li>
<li>Dothrakis not using bows or spears to fight the dead army from a distance. </li>
<li>Night King not situated far from the front line. He must have known that if he died all the other goons would be exterminated. </li>
<li>Not having better communications (horns, whistles etc) to gather and surround the Night King for a coordinated strike. </li>
<li>Poor planning. The battle plan seem to have been laid down in one evening. Should have spent more time also making a plan B, also exploring different scenarios, evaluating risks etc. </li>
<li>No plans for what to do when walls got breached.</li>
<li>Winterfell defenders not sharing knowledge about decapitating, using dragonglass, etc. to avoid newly dead being raised to fight again later on in the same battle for the other side. </li>
<li>Scouts not employed to gain intelligence on the attackers in the days before the battle. </li>
<li>Dragons not used to conduct reconnaissance of enemy lines.</li>
<li>No backup plans for lighting up the fire trenches.</li>
<li>Not firing arrows and spears or poking javelins at the undead on the other side of the burning trenches. </li>
<li>Not prioritizing locating and killing a Walker over a wight, and the Night King over a Walker.</li>
<li>Landing a dragon on the battlefield (to be overrun and held down by wights).</li>
<li>Not planning how to use special forces (such as Arya).</li>
<li>The dead not using anti-aircraft "artillery" more extensively to try kill dragons.</li>
<li>Not using snipers to fire Valyrian steel tipped arrows at Night King.</li>
<li>Not creating smoke above the castle to reduce sight for the ice dragon when attacking the castle.</li>
<li>Not creating trap rooms to be set on fire etc. (See also curtain walls and murder holes) Have enemy storm a hall then close off hall at both ends using iron fences that drop down from ceiling cutting off all exits. Then set fire.</li>
<li>Not sending woman, children and the old out of the castle to hide away far from the battle. This would leave warriors with more space to manoeuvre and would help avoid distractions. Would also be helpful in case of long sieges when food may run out.</li>
</ol>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-83424226056815493772019-02-21T07:13:00.001+01:002019-06-10T10:16:44.628+02:00User friendly error messages from APIsError messages from API’s are typically provided in three different ways:<br />
<ul>
<li>As part of the HTTP header using HTTP status code. </li>
<li>As part of the response body. </li>
<li>As a combination of the above, using a small subset of HTTP status codes with an emphasis on the response body as the main source of the error information. </li>
</ul>
I have encountered all patterns above of providing errors from APIs. Over time I have come to the conclusion that the best option is the last one, combining both an error response message object and HTTP status codes (with a strong emphasis on using the response body as the main source of the error and the HTTP status code more for technical system infrastructure related errors).<br />
<h2>
Example</h2>
HTTP/1.1 401 Unauthorized<br />
{<br />
"error": 567, //internal error code<br />
"message": "Invalid credentials",<br />
"description": "The provided authentication credentials were invalid." //what to do to fix it<br />
"infoUrl" : "https://wiki.yourwiki.com/how-to-deal-with-error-567" //optional<br />
"context" : "project: ABC123, project status: draft, panelist: 123456" //optional<br />
"status":"401" //same as http header status incase a proxy server has messed it up etc.<br />
"version": "10.2.0.0" //optional<br />
"correlationId" : "guid" //optional, used to track events across multiple remote systems<br />
}<br />
<div>
<br /></div>
<br />
Below are some benefits of providing an error response message object rather than providing HTTP status codes or other http headers alone.<br />
<h2>
From the point of view of the developer using the API </h2>
<ol>
<li>You will always know where to find the error (the response body. You can reuse same error handling code for all of the API). </li>
<li>Easier to see actual error when testing the API. (using tools like <a href="https://www.getpostman.com/">postman</a> you usually first look at the body response). </li>
<li>New developers using the API may not know where to find the detailed error message without reading the API docs, had the error message been rendered in some special header property. </li>
<li>Less chance of bugs. If you instead had to rely on HTTP status codes only, then the same HTTP codes would be reused for many error situations. </li>
<li>You can get more detailed and structured error info from the API that will save you time when debugging. </li>
<li>Can also be used by very inexperienced developers that don’t know how to check HTTP status code, or by developers that use outdated or poorly designed components that can't read the header status code. </li>
<li>In special performance optimisation situations you don’t have to read and parse response body. You can just get header status code. </li>
<li>HTTP status codes (3xx, 4xx and 5xx) are not useful codes or categorisations for the end users (human using your application). By having access to more meaningful error message objects you can more easily present meaningful errors to the end user, spending less time trying to map HTTP status codes to human readable error messages in the user interface.</li>
</ol>
<h2>
From the point of view of the developer creating the API </h2>
<ol>
<li>You save time not having to try to decide and pick the most meaningful HTTP status code. Business domain errors very often don’t map well to a HTTP status code. </li>
<li>By using both HTTP status codes and body JSON you can more easily split general technical errors from domain related errors. The HTTP status would mostly be set using <a href="https://www.codetinkerer.com/2015/12/04/choosing-an-http-status-code.html">this decision tree</a> and you can provide domain related error info in the body. </li>
<li>Some errors can’t even be meaningfully categorised with a HTTP status code. </li>
<li>In some special cases there might be too many different errors possible and there aren’t enough meaningful HTTP status codes, unless you define new HTTP status codes that are not in the <a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes">HTTP protocol</a>. </li>
<li>In some cases one request could lead to several errors and it would be difficult to squeeze those into one HTTP header error field and assigning it one HTTP status code. </li>
<li>Extensibility. Using the body you can have several properties more easily visible (in one JSON object response) allowing you to add more error properties such as ErrorCode and ErrorCodeCategory. This could be very useful for other systems (such as in a microservices environment) to automatically display client errors in certain ways or handle similar errors of same category in some way. You could also have Severity level etc. as a property. This property could be used to decide how it is logged at the API consumer, or how it is displayed on screen etc. A context property returning some state or additional info can be helpful if the error is being logged by the consuming system. (Will help cross system debugging) You could even provide a wiki-page-link etc. to read more about how to deal with the error. </li>
<li>Application monitoring. Some Application Monitoring (APM) systems will record all but status 2xx as an anomaly. If you instead are providing the error code as part of the message body you may avoid filling up logs with responses that are not really errors. For example: If you have an API for purchasing stuff there is going to be all kinds of business related error messages that are just expected errors. E.g. If a product is out of stock it's not really an error, but a negative purchase outcome that is expected from time to time. </li>
</ol>
<h2>
What others are doing</h2>
<h3>
GraphQL </h3>
<a href="https://facebook.github.io/graphql/June2018/#sec-Errors">https://facebook.github.io/graphql/June2018/#sec-Errors</a> (always returns http 200 for all errors)<br />
<br />
{<br />
"errors": [<br />
{<br />
"message": "Name for character with ID 1002 could not be fetched.",<br />
"locations": [ { "line": 6, "column": 7 } ],<br />
"path": [ "hero", "heroFriends", 1, "name" ],<br />
"extensions": {<br />
"code": "CAN_NOT_FETCH_BY_ID",<br />
"timestamp": "Fri Feb 9 14:33:09 UTC 2018"<br />
}<br />
}<br />
]<br />
}<br />
<h3>
ODATA</h3>
<a href="http://docs.oasis-open.org/odata/odata-json-format/v4.0/errata02/os/odata-json-format-v4.0-errata02-os-complete.html#_Toc403940655">http://docs.oasis-open.org/odata/odata-json-format/v4.0/errata02/os/odata-json-format-v4.0-errata02-os-complete.html#_Toc403940655</a> (uses http status codes 4xx and 5xx)<br />
<br />
{<br />
"error": {<br />
"code": "501",<br />
"message": "Unsupported functionality",<br />
"target": "query",<br />
"details": [<br />
{<br />
"code": "301",<br />
"target": "$search"<br />
"message": "$search query option not supported",<br />
}<br />
],<br />
"innererror": {<br />
"trace": [...],<br />
"context": {...}<br />
}<br />
}<br />
}<br />
<br />
<h3>
Json:api </h3>
<a href="https://jsonapi.org/examples/#error-objects-error-codes">https://jsonapi.org/examples/#error-objects-error-codes</a> (combines https status code and body response)<br />
<br />
HTTP 422 Unprocessable Entity<br />
{<br />
"jsonapi": { "version": "1.0" },<br />
"errors": [<br />
{<br />
"code": "123",<br />
"source": { "pointer": "/data/attributes/firstName" },<br />
"title": "Value is too short",<br />
"detail": "First name must contain at least three characters."<br />
},<br />
{<br />
"code": "225",<br />
"source": { "pointer": "/data/attributes/password" },<br />
"title": "Passwords must contain a letter, number, and punctuation character.",<br />
"detail": "The password provided is missing a punctuation character."<br />
},<br />
{<br />
"code": "226",<br />
"source": { "pointer": "/data/attributes/password" },<br />
"title": "Password and password confirmation do not match."<br />
}<br />
]<br />
}<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-9376468211287563342017-11-16T08:01:00.000+01:002017-11-16T08:07:39.823+01:00Setting up DomainKeys Identified Mail (DKIM) email authentication with .Net in 5 minutesDomainKeys Identified Mail (DKIM) allows e-mail senders to couple their domain name with an e-mail message, thus vouching for its authenticity.<br />
<br />
This is achieved by adding a digital signature to the e-mail message header.<br />
<br />
Heres how you can do it in .Net.<br />
<ol>
<li>Add the <a href="https://github.com/dmcgiv/DKIM.Net">DKIM.net</a> nuget package to your solution.<br /> </li>
<li>Create RSA a key pair at <a href="http://travistidwell.com/jsencrypt/demo/">http://travistidwell.com/jsencrypt/demo/</a><br /> </li>
<li>Add a TXT DNS record for your domain with <br />name/host: default._domainkey<br />value: k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg QCHhsB36ViuKvPHAgrbVC9MPr9DuquOIseApXB4kLVy/1Hw72Moeqsmyfl M9oXL81bXVpFIU/pBc3GJUL/Fp7Pgp5VTzheelQRfqlFqKL+bt6bTXA1gz1q IAICEctjbnLxzHGbnKiotVXycfckAki01WboyZbdr5wZ 1j6Otco7x9wIDAQAB <br />(without newlines copied from step 2)<br /> </li>
<li>Add a TXT DNS record for your domain with <br />name/host: _domainkey <br />value: o=~;r=mail@yourdomain.com<br /> </li>
<li>In code: </li>
</ol>
<code>
</code><br />
<div>
<code> var email = new MailMessage("mail@yourdomain.com",recipient);<br /> email.Subject = message.Subject;</code></div>
<code>
</code>
<br />
<div>
<code> email.Body = message.Body;</code></div>
<code>
</code>
<br />
<div>
<code> email.IsBodyHtml = true;</code></div>
<code>
</code>
<br />
<div>
<code> var mailClient = new SmtpClient(strSmtpServer, smtpServerPort) {</code></div>
<code>
</code>
<br />
<div>
<code> Credentials = new NetworkCredential(strSmtpServerLogin, strSmtpServerPwd)</code></div>
<code>
</code>
<div>
<code> };</code></div>
<code>
<div>
var privateKey = PrivateKeySigner.Create(@"-----BEGIN RSA PRIVATE KEY-----</div>
<div>
MIICXQIBAAKBgQCHhsB36ViuKvPHAgrbVC9MPr9DuquOIseApXB4kLVy/1Hw72Mo<br />
eqsmyflM9oXL81bXVpFIU/pBc3GJUL/Fp7Pgp5VTzheelQRfqlFqKL+bt6bTXA1g<br />
z1qIAICEctjbnLxzHGbnKiotVXycfckAki01WboyZbdr5wZ1j6Otco7x9wIDAQAB<br />
AoGAdj6f1v+FHBDluRCTIGIHEmL8xb8sx0qY/ilaRBcd+UPC3pA+16aPhbxbA0dj<br />
3VpmvmMNRyneAxUSTlhhubZkPacgX4h7p3B7ZOmFnzlbyENXsWcUJHGRTgt6c+0s<br />
PRfnCr0OH0TnSWunY8pQ3AKksXdvRD1Zm3lLytN0IpH2wgECQQDiyRmEHZbbBdBJ<br />
14YCkH2imGF/NFXazhLFBpgO0zzp3yMluQ+/cTeEZMWEFYSk1H5zwPBKkd3SD7e7<br />
H3zXa+03AkEAmPwe4qYqahet43t7UXSBUP7zYaY4k/8y0xqnUeFKp3TOJTyowIcl<br />
jBtDQnW5xFVPtbUVIqjx6HJqhhmuBtmBQQJABMPW7mi0v7taigKmRS2GBkGPYt3V<br />
o/hKeqtNzJnxoLRYh7VguFQHp5d6cvEEzXXNhl8abWatM3mzEZJyzA/vdwJBAJaO<br />
CBclUDh4dTiaHRJchacgQISpAKUlUO9QG7oI7V8/JGChAbH3ToxDiD2vfdIp4vf/<br />
7XzeprMLZqnyO8Gh7AECQQC5U/I+yCqZtcyFTuwJYTd+dROtR7mlEZDtR+W10ZsO<br />
luKz+8ZsoWLH4XdUWX0LRoam4dZ9PfM8uHGHBhpIY7rG<br />
-----END RSA PRIVATE KEY-----"); //with newlines and the RSA PRIVATE KEY header/footer</div>
<div>
<br /></div>
<div>
var domainKeySigner = new DomainKeySigner(privateKey, "yourdomain.com", "default",<br />
new string[] { "From", "To", "Subject" });</div>
<div>
email.DomainKeySign(domainKeySigner);</div>
<div>
<br /></div>
<div>
var dkimSigner = new DkimSigner(privateKey, "yourdomain.com", "default",<br />
new string[] { "From", "To", "Subject" });</div>
<div>
email.DkimSign(dkimSigner); </div>
<div>
<br /></div>
<div>
mailClient.SendMailAsync(email);<br />
<br />
<br /></div>
</code>
and that is it. Now start sending your emails. If you test sending to gmail hopefully you will no longer see the red questionmark to the left of the senders address.<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi24yypsVeCjVmlMmgaOCOtDRcYtcSULef3kO9S0nsCBt0vUC5OQuk33r9ntdVvUhGSpPiRsDZpgBcykR4ZJ8MI58Ch8amF04gscdpbTJXBHCAkvN1KUoK6wd_vTPtCpHSadq7vjMv-Zg/s1600/dkim.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="222" data-original-width="558" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi24yypsVeCjVmlMmgaOCOtDRcYtcSULef3kO9S0nsCBt0vUC5OQuk33r9ntdVvUhGSpPiRsDZpgBcykR4ZJ8MI58Ch8amF04gscdpbTJXBHCAkvN1KUoK6wd_vTPtCpHSadq7vjMv-Zg/s400/dkim.png" width="400" /></a></div>
<div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
This DKIM solution is implemented on <a href="http://gooddocus.com/">gooddocus.com</a>. </div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-48905413878736036372017-11-13T14:57:00.001+01:002017-11-13T14:57:50.712+01:00Benefits of using Wiki's over Office documents<br />
Many businesses around the world still use Microsoft Word, Open Office etc. to edit documents.<br />
<br />
Employees typically have Word docs on their computer and send the latest versions on e-mail when needing to share information contained in the document.<br />
<br />
<h3>
Disadvantages of traditional Office documents</h3>
<ul>
<li>Cumbersome for people who have previously received documents and now need to find that document by searching their e-mail inbox, local PC file-structure or a network file-share to find the right version. Usually you'll have to search multiple locations because you don't remember where the document is. </li>
<li>People have to make new requests for updated versions of the document.</li>
<li>The document author will have to send new versions or send it to new people who also want/should have access to the same information.</li>
<li>It is difficult to know if there is information about a topic because these documents are not searchable so you waste time figuring out if information is available somewhere. </li>
<li>Some people will end up doing wasted work because they don't know there is relevant and valuable information available that would affect your work. </li>
<li>Some people will make (costly) mistakes because they don't know that (critical) information is available. </li>
</ul>
<div>
<br /></div>
<h3>
Advantages of Wiki</h3>
<ul>
<li>Maintain a central content repository in one place. Easy and fast access. Everyone knows where to find information.</li>
<li>There's a search feature where you can quickly find what you are looking for (no need to look through a directory structure on your own PC etc.).</li>
<li>Supports collaboration. Several people can edit the document at the same time.</li>
<li>You can add hyperlinks to other wiki pages.</li>
<li>You get version history and rollback features.</li>
<li>You can comment on someone else's wiki documents.</li>
<li>You can get alerts when important / interesting documents are updated.</li>
<li>You strengthen innovation capacity in your organization by facilitating sharing of knowledge and ideas.</li>
<li>You contribute to an openness culture, which in turn increases employee satisfaction.</li>
</ul>
<br />
<br />
<h3>
When not to use a Wiki </h3>
<ul>
<li>Sensitive and secret information. </li>
<li>Documents to be printed that needs a special layout. </li>
<li>Documents such as contracts that are not to be modified.</li>
<li>Documents to be shared with external persons.</li>
</ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-61773977678221379822016-06-25T17:49:00.001+02:002017-09-23T11:07:46.569+02:0080 ways to become a 10x developerThe notion of a 10 times more productive developer has long been a controversial topic in the dev-world. Is it really possible for developer A to finish a product in 1/10th of the time developer B would use?<br />
<br />
I would say yes if the circumstances are right. Developer productivity, performance or efficiency is a fuzzy concept in the dev world. It is inherently hard to measure productivity because it relies so much on experience, knowledge and creativity. There are infinite ways to complete a piece of software. For comparison, lets take the job of building a house. In the construction engineering discipline there’s highly established practices for how to construct and assemble the pieces of the house. All the building blocks are standardized and well known. In the dev world we are often free to do whatever we like. We don’t rely on physical items with known tangible properties that need to be put together in a specific way. Instead everything is just lines upon lines of code. Everything is abstract and can be written in infinite ways as long as it compiles.<br />
<br />
The 10x developer is a misleading term as there is no agreed upon evaluation criteria and no established way of measuring it. Anyway, in this blog post I’ll list several ways I believe can propel you towards becoming 10x more productive. I am not saying I am a 10x developer but here are some ways I myself and others I have observed have become more productive.<br />
<ol>
<li>Improve your typing skills. Buy the <a href="http://www.daskeyboard.com/">Das Keyboard</a>, a completely blank keyboard with no letters.</li>
<li>Learn OS and IDE shortcuts so you don’t have to move the hand over to the mouse.</li>
<li>Get an overview and basic understanding of different tools and frameworks out there. This will help you choose the right tool for the job. </li>
<li>Learn about the pros and cons of Open Source and the different licensing models. Learn when to build it yourself and when not to. </li>
<li>Get deep knowledge in architecture, programming languages, algorithms, coding best practices, clean code, design patterns, agile methodologies, XP, unit testing and the other core things related to the art and craft of software development. </li>
<li>Improve your memory. If you can remember details you save time trying to look things up. Do memory exercises, learn recollection techniques etc.</li>
<li>Improve your cognition. If your brain can operate at a higher speed you will be able to learn faster and connect the dots faster making your productivity higher. Although you are born with a certain IQ, you can always maximize your cognitive potential. Exercise your brain and stay sharp by always challenging yourself.</li>
<li>Be flexible, open-minded and tolerant. If you are, you will be better liked and you’ll have a positive work environment. A good work environment gives you energy and you will boost your productivity. </li>
<li>Learn how to most efficiently use Find and Replace also with regex.</li>
<li>Remove repetitive work. An example of repetitive work is writing boilerplate code. Writing boiler place code does not make you a better programmer. You want to do things that serve multiple purposes. Use better tools, make code that writes itself, automate etc. </li>
<li>Work hard and show you have grit. Show that you are willing to get your hands dirty. Don’t shrug off tasks you think will be hard or boring. You do it knowing it has to be done in order to get on with the more fun work. If you constantly complain your way out of tasks that has to be done anyway you just kill productivity. Sacrifice yourself for the team and do the boring task. Over time it will pay off. Show-stoppers or impediments usually escalate. Over time more and more people get invovled in discussing how to deal with it, as time goes there'se more and more noise. All of it could perhaps be avoided if you just sat down at the outset and just fixed the darn issue.</li>
<li>Take care of your personal health. Developers who do not take care of their own health and wellbeing are at higher risk of decease. If two years from now you develop diabetes you will for sure be impacted and loose productivity. If you party getting blackout-drunk every week your health will decline and that will impact your ability to stay sharp and learn (see <a href="https://en.wikipedia.org/wiki/Lifelong_learning">life-long learning</a>).</li>
<li>Learn how to analyze stuff. If you can analyze complicated issues you will be better equipped to make better decisions. With better decisions you can avoid going down dead-end roads of development or you will more likely choose a route that will lead you faster to the goal. Learn how to use simple pros and cons lists, learn how to understand complexity. Learn how to decompose issues, view them from different angles, learn about <a href="https://en.wikipedia.org/wiki/System_dynamics">System Dynamics</a> and <a href="http://www.systemicleadershipinstitute.org/systemic-leadership/theories/basic-principles-of-systems-thinking-as-applied-to-management-and-leadership-2/">Systems Thinking</a>.</li>
<li>Learn all the code snippets / templates / macros that are available in your IDE.</li>
<li>Don’t use plain text editors over fully fledged IDE’s just to show off. (unless you are writing something that is not supported by your IDE) </li>
<li>Build understanding and empathy. If you don’t empathize with your team mates, your boss or your customers you are most likely going to be seen as egocentric, arrogant or distanced, which will create opposition or friction.</li>
<li>Memorize language and framework library syntax so you don’t have to google it every time you need to use some feature. </li>
<li>Have stability in your life. With predictability and routines you can better plan your day and devote time for learning. Know your values and stick to them. </li>
<li>Learn to write readable code. Learn all you can about <a href="https://martinfowler.com/tags/clean%20code.html">Clean Code</a>, <a href="https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)">SOLID principles</a> etc.</li>
<li>Have focus in your life. Don’t engage in everything that comes to your attention in the private life or at work. If you try to do everything you will be less productive because you waste time on all kinds of things that may not contribute to your long term goals.</li>
<li>Always learn. Get obsessed with reading and learning from videos. Coursera, PluralSight, Udemy, YouTube are you friends.</li>
<li>Have balance in your life. Don’t work insane hours. Have some fun. Live life. Balance in your life is important to preserve good health. Maintain a sustainable work pace. Knows how to not overwork to avoid and crash and burn.</li>
<li>Workout. Maintain a level of physical fitness. Going for a run will clear your mind and you’re head will be ready for more action. </li>
<li>Prioritize and set goals for learning and improving your skills.</li>
<li>Learn everywhere. Learn while on the treadmill. Learn by listening to podcasts in your car.</li>
<li>Know how to research and make good decisions.</li>
<li>Reinforce what you learn by trying it out in practice or by blogging about it, giving talks about it etc. Do <a href="http://codekata.com/">Coding Katas</a> or have pet projects where you practice your skills. </li>
<li>Stop wasting time. Of course you are not playing Pokémon Go or watching crap TV. Do you really need to watch season 20 of WhatEverSeries on HBO/Netflix? Don’t watch a movie unless you know it has 7+ stars on IMDB.</li>
<li>Invest in developer tools and other software for efficiency. </li>
<li>Invest in hardware such as monitors, a faster computer, a noiseless computer, good prescription glasses, good air-condition, an ergonomic desk and chair.</li>
<li>Internalize and reflect on what worked and what didn’t. Don’t just try and fail but understand why things failed. </li>
<li>Spend time on post-incident reviews. Do root cause analysis of failures to learn and prevent the thing from happening again.</li>
<li>Be curious and always try to understand how things are connected. This will help you understand how things lead to other things and you’ll get better at deciding what should be fixed right away so it don’t come back later with 10x the negative impact. (see technical debt)</li>
<li>Don’t be afraid to ask. Rather than spending days trying to figure out some technical issue on your own, ask a coworker who you think may know. Maybe you just overlooked something. Don’t be afraid to lose face. All in all you’ll excel faster if you let go of the fear to look bad when asking questions.</li>
<li>Learn how to write good code. Know how to avoid bugs that will come back to haunt you later and make you spend days trying to debug it.</li>
<li>Know what to document and not. Document things that you or the team will get back to many times and will save you time. Don’t document things that only create noise.</li>
<li>Spend time on reflection and to come up with the really good ideas. During a typical hectic day at work you may be in a multitasking act and react mode with little time for deep thinking. Find time at a less hectic day or during the weekend for lateral thinking.</li>
<li>Stay agile. Be aware of just how much to do e.g. features, documentation, communication etc. not wasting time on things that are not important or deliver value. </li>
<li>Improve your creativity. Learn how the creative process works. Know how to do brainstorming. Learn techniques such as the Six Thinking Hats technique.</li>
<li>Dear to try new things. Be open to trying new frameworks etc. (if analysis suggest there is value in using it). Sometimes it pays of a lot to replace some old buggy system with something new.</li>
<li>Know how to plan. Good planning goes hand in hand with good decision making. If the plans are bad you’re of course at higher risk of failure. Failures along the way leads to wasted time and less productivity. </li>
<li>Learn how to do requirements specifications. Understand business needs so you don’t start developing something that is not needed or wanted. If you have to scrap a module and start over because the customer rejected it on the grounds it was not what they wanted then you have just wasted a heck lot of time. </li>
<li>In your office room agree not to make phone calls at the desk unless you have to. Always go elsewhere when having a private call so you don’t distract the others. </li>
<li>Build up general knowledge on all aspects relevant to development. If you have some basic knowledge in all relevant areas you are less likely to make bad decisions and you don’t have to rely on others to cover all the things you don’t know you don’t know.</li>
<li>Learn to write readable code so you understand the code you wrote 6 months earlier.</li>
<li>Learn how to get into the zone. Find time to shut out everything so you can get into the zone or the flow. Close down the e-mail reader, social media sites etc. Turn off sounds and vibration on the phone. </li>
<li>Improve your communication skills. With bad communication skills you may miscommunicate which can lead to lots of wasted time. Miscommunications may even result in team misunderstandings and distrust that may lead to long lasting conflicts which of course will be a lot of wasted time and energy.</li>
<li>Unsubscribe to e-mail newsletter you rarely read.</li>
<li>Share knowledge with your team. Help make the team more effective. If the others are productive people you reduce the chance of being held back by someone who’s unproductive.</li>
<li>Only sit near people who you need to communicate with as part of daily work. If you sit near people you don’t work closely with you’ll find yourself distracted when they are on the phone or when someone comes over to their desk discussing things that are irrelevant for you.</li>
<li>Agree with your coworkers to always detail out meeting invitations. Have a clear agenda and purpose for a meeting well in advance. If you don’t people will come unprepared to the meeting and many meetings will be a waste.</li>
<li>Don’t have meetings unless it’s really needed. Read about good meeting best practices. But don’t take it too far. Meetings can be a good way to let people feel they are heard. If there are no channels for giving input or feedback some people will become dissatisfied. </li>
<li>Know when to outsource, when to hire, when to build or buy. </li>
<li>Be proactive. Sense and foresee things to engage in before it becomes an issue and a big waste of time for everyone.</li>
<li>Have an eye on details when programming. Ensure the small things don’t get overlooked.</li>
<li>See the big picture. Have an overview and total understanding of the things you are developing and why it’s developed.</li>
<li>Get involved in meetups, seminars, conferences etc.</li>
<li>Take courses.</li>
<li>Take a few breaks during the day to clear your head.</li>
<li>Read up on the latest in software engineering best practices on everything from bug tracking, agile methodologies, design patterns, continuous integration, unit testing, integration testing to application monitoring, code reviewing, scalability, cloud hosting, containers, databases, etc. etc.</li>
<li>Get deep understanding of the programming languages and frameworks you use.</li>
<li>Stay sober with a sharp mind. Limit alcohol intake. No drugs. Eat healthy and get a good night’s sleep. Don’t drink too much coffee too late in the day.</li>
<li>Be critical. Don’t take things for granted. Know when to ask critical questions like "What was the reasoning behind choosing this solution?" Asking questions brings new insights. </li>
<li>See challenges in a bigger perspective. Avoid getting completely bogged down in a detailed technical challenge. Rethink, think out of the box and make the problem disappear by seeing it in a completely new light. Instead of asking how can I solve this problem, ask instead is this really the problem, what other things could be solved at the same time if I expanded the scope and introduced more simple solution? </li>
<li>Work on projects that motive you. That usually means choosing to work at a place that can give you challenging and interesting tasks.</li>
<li>Don’t delay tasks. Tasks waiting to be done contribute to stress and extra work in the form of overhead. Typically you will regularly have to explain to the team why you’re not doing it and all this noise may even become more time-consuming than the actual time needed to complete the task. </li>
<li>Complete one thing at a time if you can. If you are multitasking and working on many tasks simultaneously during a day you’re not likely going to get into the flow where you can create elegant solutions.</li>
<li>Do the things with the most risk first so you can be confident that you’ll succeed with thing you’re working on. If you constantly worry that you may not make the deadline it will be a stress factor that may keep you out of zone.</li>
<li>Lean how to do Requirements gathering, making sure that the right questions get asked. Again it is all about making good decisions.</li>
<li>Know when to analyze and when to just go and prototype the darn thing. Avoid analysis paralysis but don’t just jump into the task without thinking if there are risks involved, if there are <a href="https://en.wikipedia.org/wiki/Path_dependence">path dependencies</a> etc. </li>
<li>Learn about the business you are in. If you are working as a programmer in bank then learn what you can about banking. Get domain knowledge. Of course you can't learn all there is about banking but sure you can learn about areas within banking that are closest to the system you are working on.</li>
<li>Write a ToDo list at the start of the day.</li>
<li>When debugging use mock data rather than debugging against a remote API or a big ass database table join to save time waiting for the response.</li>
<li>Be part of a great team. A team that stands together and fulfills each other will be stronger and will allow you to become more productive. There’s two ways to become part of a great team, either you switch job/department or you work with what you have and spend more time on recruitment, on knowledge transfer. Be inspiring and lead the way.</li>
<li>Be a team player. A team player creates a positive environment that over time creates synergy in that everyone wants to contribute. As everyone on the team is enthusiastic it creates a positive spiral of learning and achievement.</li>
<li>Make sure the compilation time, application startup time, debugging cycle time etc. is low so you don’t have to sit and wait doing nothing or even worse, you may be tempted to go on Facebook while you’re waiting. </li>
<li>Set up a proper dev, staging, QA, production environment.</li>
<li>Use sticky notes as reminders or as cheat sheets.</li>
<li>Close windows and tabs you are not using. They just contribute to noise and make it harder to switch between the tabs/windows you are actually using. They may also distract you and eat CPU/memory. </li>
<li>Understanding the <a href="https://en.wikipedia.org/wiki/Project_management_triangle">Project Management Diamond/triangle</a>. Learn the tradeoffs between cost, time and scope. Again it all comes down to making good decisions. Now you may say that it’s the manager’s job to make decisions. Eventually you will have to make some decisions yourself and you will also want to have your say in the decisions being made.</li>
<li>Be passionate about programming. If you’re not you are not likely to have the motivation and drive to keep learning every day. </li>
<li>Keep a notebook to log your work, scribble down ideas and to take notes. You will need it.</li>
<li>Get everyone in the office to agree to only disturb others when there is an urgent matter or the thing to discuss is too complicated, sensitive or risky to be described in an e-mail. Sending an instant message or going over to someone’s desk to ask something will take that person out of the flow. </li>
<li>Don’t listen to music at work. If you need to keep noise out use a noise cancelling headset with no sound. Music may be nice and make the workday more pleasant. My position is that music will lead to distractions. You will have control the audio player, change playlists, share songs with friends etc. It will take away focus when you really need to think super hard about something complicated. If you really want to be 10x then you will have to make sacrifices.</li>
<li>Anticipate changes. Always consider feature/change requests that are likely to come. Instead of implementing strictly what the requirements says, evaluate likely changes down the road. If the changes are easy to implement now and would be very difficult to implement later then make all the changes at once.</li>
<li>Use naming conventions. All too often I have seen noise and misunderstandings because of unclear, vague or incoherent naming. Stakeholders needs to spent time trying to agree on what to call things. <a href="https://en.wikipedia.org/wiki/Domain-driven_design">DDD</a> helps in this regard.</li>
<li>Understand Statistics and <a href="https://en.wikipedia.org/wiki/Cognitive_bias">cognitive biases</a>. This is important to be able to judge data and how you and others interpret those data, this again will make you a better decision maker. Poor decisions will take you down roads of wasteful development.</li>
</ol>
<br />
<br />
A 10x developer is one who is not just doing things the right way but more importantly doing the right things.<br />
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-85234237032710500032015-07-09T10:20:00.000+02:002015-08-11T09:38:54.658+02:00How to rate internal product quality during systems developmentThere are many ways to define and rate product quality. This product quality rating is based on typical product quality assessments for software products and in particular online software.<br />
This post was written for dev teams who do not have a dedicated QA manager or the like.<br />
<br />
<h4>
Why</h4>
So why should you do a product quality rating? It will give you an indication of how well the product is engineered in a more holistic perspective. Many will judge the quality of the product based on what end users say about the product. While end user feedback is a very important indicator of quality or value, the product may still have many issues underneath the covers that are just waiting to blow up and become a big issue for the user or other sides of the business.<br />
<br />
This product quality review helps to get a complete overview of the product and its strengths and weaknesses. It helps to plan ahead and reduce risk.<br />
<br />
<h4>
How</h4>
The rating can be conducted by the product development team, perhaps in collaboration with others such as internal users and other stakeholders. As several of these categories are only known to the dev-team this rating cannot be done by customers or other external stakeholders.<br />
<br />
A score from 0 to 10 can be given where 10 would be the score that the best product on the market would receive in that category.<br />
<br />
<h3>
Extensibility</h3>
Is the product considered to be extensible? Can it be enhanced with new capabilities or functionalities without hampering its existing functions?<br />
<br />
<h3>
Availability</h3>
Is it product ready for immediate use? Does it require a lot of configuration including technical setup? Is it difficult to get started with the product? Are there long start-up times?<br />
<br />
<h3>
Features</h3>
Features are the “bells and whistles” of products. How complete is the product? Compared to competitors how would you rate the feature-set in terms of user value? Are you missing important features? Are there many half-finished features?<br />
<br />
<h3>
Performance</h3>
Refers to throughput and latency. Can the system handle the user load? Is the system perceived as slow at times?<br />
<br />
<h3>
Accessibility</h3>
Is the system accessible for impaired/handicapped users?<br />
<br />
<h3>
Reliability</h3>
Does the product perform flawlessly under stated conditions for a long period of time?<br />
<br />
<h3>
Correctness / Conformance</h3>
Is it free from faults/bugs? Is it aligned with specifications? Does it conform to standards?<br />
<br />
<h3>
Efficiency</h3>
Does the product perform effectively without wasting resources?<br />
<br />
<h3>
Maintainability</h3>
Is it easy to maintain code?<br />
<br />
<h3>
Understandability</h3>
Is it easy to understand and grasp what the product is for? Does it seem too complex?<br />
<br />
<h3>
Usability</h3>
Is it easy to use and learn?<br />
<br />
<h3>
Supportability</h3>
Is it well documented? Is it easy to support?<br />
<br />
<h3>
Scalability</h3>
Does the product scale well and can it handle controlled increased load? Is it efficient when new resources are added?<br />
<br />
<h3>
Robustness</h3>
Is the product able to withstand harsh conditions and rough handling? It should be durable enough to endure erratic variations in stress as well as pressure that too with minimal damage or alteration to its functionality. Does it handle bad or corrupt data?<br />
<br />
<h3>
Security</h3>
Are there any likelihood of potential security breaches due to poor coding practices and architecture etc? Have you done penetration test or security audits? Do you have logging, exception handling etc.<br />
<br />
<h3>
Elegance</h3>
Is the product stylish, good looking, giving a good first impression?<br />
<br />
<br />
<br />
<h3>
Further reading</h3>
<a href="http://sloanreview.mit.edu/article/what-does-product-quality-really-mean/">http://sloanreview.mit.edu/article/what-does-product-quality-really-mean/</a><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-75435959747297408472015-03-08T10:05:00.000+01:002015-03-18T07:54:42.009+01:00Why testing tasks should be part of the task board when you don't have experienced testers<div class="MsoNormal">
Many <a href="http://www.mountaingoatsoftware.com/agile/scrum/team">Scrum teams</a> feel there's something not quite right about <a href="http://en.wikipedia.org/wiki/Software_testing">testing</a> and their use of a task board. In this blog post I'll go in-depth on the issue of having testing-related tasks or not on the task board. I have found that this is a typical question especially in beginner Scrum teams.<br />
<br /></div>
<div class="MsoNormal">
<h3>
Example Scrum team scenario</h3>
<div>
To keep this blog post relatively short I will focus on the following scenario:</div>
<ol>
<li>Automated testing code coverage is medium to low so there is an extra need for manual testing.</li>
<li>The product is relatively complicated with lots of intricate scenarios/settings to test.</li>
<li>The product is a <a href="http://en.wikipedia.org/wiki/Software_as_a_service">SaaS</a> with thousands of users.</li>
<li>You do not have dedicated testers but you have plenty of access to people outside the team that can help to carry out testing. </li>
<li>Testers are not experienced in testing. They know the product to be tested but are not super users. They prefer not to use developer oriented testing tools because they are not highly technical persons. </li>
<li>Testers outside the team come and go and they are quite busy so they need a simple way to carry out the tests without having to log in to a complicated testing suite. Because of the turnover you do not want to provide a lot of training for testers. </li>
<li>You do not have a test manager, QA lead etc.</li>
<li>Developers are also inexperienced testers and have limited knowledge about <a href="http://en.wikipedia.org/wiki/Quality_assurance">QA</a>.</li>
<li>Developers are writing the test scripts because the testers are not qualified to write high quality test cases. </li>
</ol>
<div>
This scenario may describe a team with a medium <a href="http://www.academia.edu/4197229/An_Agile_Maturity_Model_for_Software_Development_Organizations">Agile maturity level</a> so other more fundamental actions could also be needed such as QA coaching, adding QA related metrics etc. but we will focus on the question of testing tasks on the board.</div>
<br />
<h3>
What is testing anyway?</h3>
<span lang="EN-US">You should never rollout a feature/<a href="http://scrummethodology.com/scrum-user-stories/">User Story</a>/Product Backlog Item (PBI) without testing. Someone has to test it. </span>This might take the form of unit testing, acceptance testing, security/penetration testing, exploratory testing, regression testing, performance testing, load testing, code review, integration testing, web tests e.g. Selenium. <b>In addition to</b> local testing during development. Maybe you want to add UX user testing and maybe you even need to do some regulatory testing.<br />
<br />
<h3>
The purpose of the task board</h3>
Before we discuss if testing tasks should be on the board we should first do a recap of what a task board is for. The task board, as the name implies, is for tasks. The purpose of the task board is to keep track of tasks and create visibility to the team and other stakeholders. This helps the team make sure the right things are completed at the right time [4]. The three pillars of the <a href="http://en.wikipedia.org/wiki/Empirical_process_%28process_control_model%29">Empirical process</a> which Scrum and Agile is based upon is Visibility, Inspection and Adaption. Tasks on the task board enables visibility and transparency.<br />
<br />
Now, some teams try to cram more information onto the board by adding lanes for server environments or lanes such as "Ready for testing", "In testing", "Ready for staging" etc.<br />
The starter task board with the 3 lanes: "To do", "In progress/WIP/Doing" and "Done" is still the recommended basic setup [1],[2],[3],[4],[5],[6],[9]. Remember that the task board is primarily for tracking tasks.<br />
<br />
A task can be in progress, done etc. To say a task is in QA/staging or in testing does not make sense. A user story/feature can be in testing but a task is a piece of work to be done. You don't test a testing task. This inconsistency lies at the root of disagreements on how to visualize testing on the board.<br />
<h2>
Why not have explicit testing tasks on the board</h2>
Typical arguments for not having testing tasks for each story:<br />
<ul>
<li>It's extra work to add test-related tasks to each user story. Each user story will often have the same duplicated testing tasks. Seems like unnecessary extra work to add them for each story. </li>
<li>Testing is an integral part of development so we don't need tasks for it. It is part of the programming work. </li>
<li>More tasks means there will be more overhead needed to pass all the tasks through the lanes of the task board.</li>
<li>The board gets messy when we add tasks that are to be partially carried out by others not in the core team. We like to have full control of what all the tasks are and not have things that relate to other persons in there.</li>
<li>Testing is something that is done after we have deployed to the QA servers. Seems out of place and not logical to have them on the board. Testing is sort of another phase of the process and it seems illogical to have it alongside programming tasks. </li>
</ul>
</div>
<div class="MsoNormal">
Some of these arguments include faulty assumptions.<br />
<ul>
<li>"<i>The board gets messy when we add tasks that are to be carried out by others not in the core team</i>". This claim assumes that the team don't need to do anything related to testing. Someone has to write the test cases, make sure the test environment is testable, someone has to coordinate testing, make sure testing gets done, provide support for testers etc. There are also tests that only developers can do like performance testing.</li>
<li>"<i>Testing is sort of another phase</i>". According to Agile practices this is just wrong [7],[8],[10],[11]. This thinking leads some teams to add a testing lane to their board which again strengthens a view that testing is a phase in the sprint and so test-related tasks are not needed on the board. <br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxijv1F-zMFovHgXf7Bt3WJgitQ2mry3O0SYCxU8DJ8pl-IeCDJZzZ0hJHaOxc9_EtmlSfZUeoYKqNbcTkfMXGHbcf4yQ5nPODpuIFBKQYdQjHavI0h-0gyJk15FbBPS20vMdK5tA8fg/s1600/testing_with_test_lane.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxijv1F-zMFovHgXf7Bt3WJgitQ2mry3O0SYCxU8DJ8pl-IeCDJZzZ0hJHaOxc9_EtmlSfZUeoYKqNbcTkfMXGHbcf4yQ5nPODpuIFBKQYdQjHavI0h-0gyJk15FbBPS20vMdK5tA8fg/s1600/testing_with_test_lane.png" /></a></td></tr>
<tr><td class="tr-caption" style="font-size: 12.8000001907349px;"><i>Example task board with lane for testing</i></td></tr>
</tbody></table>
This can also have the effect that epics are not broken down into small enough user stories and tasks. Since it does not always make sense to have a task in testing you may end up having tasks that are actually user stories. When a task on the board is actually a user story it makes sense to have the "task" In testing. </li>
</ul>
<div>
<br /></div>
<i><span style="font-family: Georgia, Times New Roman, serif; font-size: large;">Testing is not a phase, but a way of life</span></i><br />
- <a href="http://testobsessed.com/2006/11/testing-not-a-phase-but-a-way-of-life/">Elisabeth Hendrickson</a><br />
<div>
<br /></div>
Ideally testing should be a collaborative effort between developers and testers going on in parallel [8],[10],[13],[14]. In our scenario this is difficult since there are no skilled testers so developers have to step up and write test cases, provide testing support and coordinate testing [11].<br />
<br />
In Scrum and Agile development we strive to complete one by one user story. Testing is of course part of that. One by one story is completed to reduce risk and to be able to deliver value increments.<br />
<br />
<h3>
Alternatives to testing tasks on the task board</h3>
<div>
Based on our scenario I have identified a few alternatives to having testing tasks.<br />
</div>
<div>
<table border="1" cellpadding="2" cellspacing="0"><tbody>
<tr><th>Alternative</th><th>Implication for test script writing</th><th>Implication on carrying out the tests</th></tr>
<tr><td>Developers write test specifications at the start of the sprint based on the requirements specifications, dev tasks, DOD and Acceptance Criteria.</td><td>You don't yet have a working feature so you will not be able to try it out and come up with all the test cases at the start. There will be changes underway so the test script will be outdated. To avoid rewriting the test cases or have to come back to it at a later time the developer will delay writing the test cases. Eventually the developer may forget to do it. </td><td>Poor test coverage and outdated test cases that cannot be carried out.<br />
Rush at the end of the sprint to get the test script together.</td></tr>
<tr><td>Developers update the test specification continuously as they go along.</td><td>Will be forgotten because the developer is in a coding mode and the team does not yet have a high quality focus.</td><td>The developer may forget to do testing tasks such as performance tests, integration tests, code reviews, security/penetration tests etc.<br />
Rush at the end of the sprint to get the test script together.</td></tr>
<tr><td>Developers write the tests when all dev tasks of a story are done.</td><td>Who is responsible? Several developers have worked on the user story. It is not clear who should write the test cases so it doesn't get done.</td><td>Rush at the end of the sprint to get the test script together.</td></tr>
<tr><td>Developers write test cases for each dev task.</td><td>Many tasks are not testable [12]. Often there are no relevant manual test cases to write and there are different types of testing needed of different tasks and so the developer would constantly need to think about testing. Not all developers care that much about quality.<br />
Also the test script needs to be organized into a readable non-overlapping set of test cases. You may not end up with a complete and easy to use test script just from piecing together tests from the individual dev tasks.<br />
There is no reminder or test task to check off as completed so the developer may forget about it or defer writing the test cases. </td><td>Missing test cases. Tests that are hard to understand. Overlapping tests.<br />
Rush at the end of the sprint to get the test script together.<br />
<br />
If you have a lane for testing this does not mean that tests will automatically be carried out. Because some tasks are testable and others not you don't get into a systematic process of writing test cases and eventually things are forgotten or delayed. Also there might not be a clear mapping between the dev task and its test cases so others will not know if the test cases are written or not. </td></tr>
<tr><td>Developers write the tests at day x into the sprint.</td><td>The developer will always want to complete as much features as possible to look good or because he don't like writing test specs.<br />
Quality is jeopardized because the developer rush to complete the test specification in order to be able to complete the testing before the sprint ends.<br />
This is not Agile.</td><td>Testing is postponed, it gets chunked up towards the end of the sprint. You may not be able to complete any stories at all because testing was halted for some reason. The feedback cycle lags behind so critical bugs found during testing could not be fixed in time before the sprint ended or the team have to work overtime, again.</td></tr>
<tr><td>Developers test by trying to break each other's code and find bugs.</td><td>In this case there is less need to write a test script. Although this may sound fun to developers this alternative ultimately depend on the QA maturity of the developers and the process. If developers are poor in testing they will find fewer bugs. </td><td>Without specific tasks with a timeslot developers may do a sloppy testing job especially if there are no guidelines from managers on expected quality levels or if there are no other incentives for finding bugs.</td></tr>
</tbody></table>
<br /></div>
<h4>
</h4>
Some readers might have noticed how central the test script has become in our scenario. Maybe you would like to suggest dropping test scripts all together and just end the discussion right here. Developers should be end to end developers and have the skills needed to test everything along the way as until the story is done [14]. In our scenario with a complicated product this is simply not an option because a test script is absolutely needed for QA to make sure edge cases are both identified and tested. Without a test script you get into a testing procrastination situation. You don't know where to even start testing and what has been tested. Systematic testing is needed in our scenario.<br />
<br />
<h3>
Typical problems in immature Scrum teams when not having testing tasks for each story</h3>
Developers usually don't like to do or prepare testing other than technical unit testing and performance tests so you may end up with poor tests and test scripts being ready too late. Developers love to code and develop stuff and often find test-related work boring.<br />
<br />
Typically the team will end up postponing testing as a bulk job to be done towards the end of the sprint [<a href="http://www.ambysoft.com/essays/agileTesting.html#ChallengesAdopting">7</a>]. As you don't have explicit tasks for writing test specs and the task of writing them is usually seen as boring work for developers they will tend to focus on development and postpone writing test scripts as long as they can. This means that they will usually start to work on another story before the first one has gone through testing. You are now in a situation where developers try to have all stories ready to be tested some time before the sprint ends so testers can take over and begin their work. This is what we would call mini-waterfall (not Agile).<br />
<br />
Another problem is responsibility. Who is responsible for writing the manual test scripts, the acceptance tests etc? Who is responsible for coordinating or doing the actual testing. If there's no assigned person you can bet it will be deferred or not done at all when the QA maturity level is low amongst developers.<br />
<br />
Another side-effect of not having testing tasks on the board is that some person will voluntarily or not take the role of writing the test specifications because that person know it is the only way it will be done. This person might be good at it and he might even like to do it. The problem here is that it creates a dependency. What happens if this person goes away on vacation or is busy doing other stuff for a period of time? The testing grinds to a halt or you have a severe drop in test coverage. <br />
<br /></div>
<h2>
<b><span lang="EN-US">Why have testing tasks as part of the task board</span></b></h2>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2M3cI4lvfQM5XbYRY51s_oBB5niDUm_84lva6zU1MBF2kfWl9cy_nsVocbD4dkm_iGqt3KxEGmwXU627J5fpSi23Z_95QkVeud95DRxWVffp-Nv3JaOYkpCObfhBZJUtiwvs58XdieA/s1600/testing_with_test_tasks.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2M3cI4lvfQM5XbYRY51s_oBB5niDUm_84lva6zU1MBF2kfWl9cy_nsVocbD4dkm_iGqt3KxEGmwXU627J5fpSi23Z_95QkVeud95DRxWVffp-Nv3JaOYkpCObfhBZJUtiwvs58XdieA/s1600/testing_with_test_tasks.png" /></a></td></tr>
<tr><td class="tr-caption" style="font-size: 12.8000001907349px;"><i>Example of Scrum board with testing tasks</i></td></tr>
</tbody></table>
<h3>
Better estimates</h3>
Time will go into writing test specs, so estimates for it should be registered somewhere. Time will be spent setting up the test environment, doing initial integration tests, regression tests etc. Time will go into fixing the bugs found during testing. <br />
<span lang="EN-US"><br /></span>
<span lang="EN-US">By using test-related tasks you can during Sprint planning have a more conscious discussion around what kind of testing is needed, how much time will be needed and how much extra time should be added for fixing bugs found during testing). </span>With explicit testing tasks you will be able to plan better and come up with better estimates.
<br />
<br />
<h3>
Increased Quality</h3>
Sometimes tests can only be done by developers. E.g. performance testing or testing that require specific tools e.g. testing infrastructure related stuff. By defining these tests as explicit you don't forget to do them and you have accountability. Everyone sees who is responsible and if it has been done or not. <br />
<br />
If you add test-related tasks during sprint planning you will have a slot to think about testing. You will be able to kick-off some thoughts about what needs to be tested, how thoroughly etc.<br />
<br />
If there's no defined task for writing the test script you might be pressured to hurry the job of writing the test cases because the burn-down chart will look bad if you spend too much time writing it. When there are no testing-related tasks on the board there are no estimates to burn. The developer might feel he look less productive than other developers who are working on defined dev tasks so the developer may want to just get the test cases done as quick as possible. Not thought through test cases = poor testing.<br />
<br />
If you have testing-related tasks on the board you will be reminded if there are some other types of testing missing.<br />
<br />
Who is responsible for updating the test scripts when a bug is found and there was no test to cover it? Without a person in charge of overseeing the testing of a user story this may very well be forgotten.<br />
<br />
<h3>
Reporting and status visibility</h3>
If you don't have a task for testing the user story you can't display the status of the testing work on the board. There is no way to see if the testing has started and how many hours remain etc. Testing-related work as any other task can have impediments. If you have test-related work on the board it's easier to have discussions about status and impediments.<br />
<br />
<div class="MsoNormal">
<h3>
Efficiency</h3>
In our scenario someone in the team has to coordinate or connect developers with testers. Testers will have questions for how to carry out some test task. There are usually questions such as; is it a bug or is it a known issue? A developer has to be available to answer questions such as why a test task is not testable. The correct conditions, for example the right data might not be present to be able to carry out the test. Without a explicit task for the responsibility of coordinating and supporting the testers the tests might very well stop without anyone knowing. You might have unclear communication lines and get extra noise in the team because people don't know who is responsible for overseeing the testing.<br />
<br />
Avoid duplicated work. If the developers test each other work it is still useful to have testing tasks so you know which developer is testing who's work.<br />
<br />
<h3>
Continuous improvement</h3>
Reducing waste is central to the Agile movement. If everything is visible you get a better overview of everything going on and how things depend on other things. With testing tasks you can more easily improve the entire process.<br />
<br />
Without tasks and responsibilities you don't have accountability. If the test script is bad and there are bugs because of poor tests we know who wrote the test spec and we can improve the process by talking to the responsible persons.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<h2>
<b><span lang="EN-US">References</span></b></h2>
</div>
<div class="MsoNormal">
<span lang="EN-US">[1] <a href="http://www.clemensreijnen.nl/post/2012/05/24/09-Getting-Testing-Done-in-the-Sprint-e28093-Test-Tasks-on-the-Board.aspx">http://www.clemensreijnen.nl/post/2012/05/24/09-Getting-Testing-Done-in-the-Sprint-e28093-Test-Tasks-on-the-Board.aspx</a><o:p></o:p></span><br />
[2] <a href="http://www.mountaingoatsoftware.com/agile/scrum/task-boards">http://www.mountaingoatsoftware.com/agile/scrum/task-boards</a><br />
[3] <a href="https://msdn.microsoft.com/en-us/library/jj161049.aspx">https://msdn.microsoft.com/en-us/library/jj161049.aspx</a><br />
[4] <a href="http://leankit.com/project-management/task-boards/">http://leankit.com/project-management/task-boards/</a></div>
<div class="MsoNormal">
<span lang="EN-US">[5] <a href="http://blogs.atlassian.com/2012/08/greenhopper-bonfire-agile-development-testing-awesomeness/">http://blogs.atlassian.com/2012/08/greenhopper-bonfire-agile-development-testing-awesomeness/</a></span><o:p></o:p></div>
<div class="MsoNormal">
[6] <a href="http://manifesto.co.uk/agile-concepts-scrum-task-board/">http://manifesto.co.uk/agile-concepts-scrum-task-board/</a></div>
<div class="MsoNormal">
[7] <a href="http://www.ambysoft.com/essays/agileTesting.html">http://www.ambysoft.com/essays/agileTesting.html</a><br />
[8] <a href="https://www.youtube.com/watch?v=bqrOnIECCSg">https://www.youtube.com/watch?v=bqrOnIECCSg</a><br />
[9] <a href="http://www.slideshare.net/mikedep01/building-scrum-boards-that-radiate-information-generic">http://www.slideshare.net/mikedep01/building-scrum-boards-that-radiate-information-generic</a><br />
[10] <a href="http://smartbear.com/all-resources/articles/what-is-agile-testing/">http://smartbear.com/all-resources/articles/what-is-agile-testing/</a><br />
[11] <a href="https://www.atlassian.com/software-testing">https://www.atlassian.com/software-testing</a><br />
[12] <a href="http://programmers.stackexchange.com/a/113837">http://programmers.stackexchange.com/a/113837</a><br />
[13] <a href="http://www.scaledagileframework.com/developers-and-testers/">http://www.scaledagileframework.com/developers-and-testers/</a><br />
[14] <a href="https://www.youtube.com/watch?v=yRP29wFqu20">https://www.youtube.com/watch?v=yRP29wFqu20</a><br />
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-54005914289058640242015-02-02T20:24:00.000+01:002015-02-02T20:38:45.840+01:00Fluid, Responsive and Adaptive VS Fixed layoutIn this blog post I present a way to decide on Fluid, Responsive and Adaptive VS Fixed layout. I have chosen to bulk Fluid, Responsive and Adaptive together because they are similar in that they adjust to the screen size, fixed layout does not. Fluid, Responsive and Adaptive layout are all different but for brevity I will call them Responsive below.<br />
<br />
Most old websites have a fixed layout so many developers who are in the situation of giving a facelift to a legacy website often have to decide between Responsive VS Fixed layout.<br />
<br />
The rise of Bootstrap and responsive layout with its extremely easy to use framework has certainly contributed to a many developers dropping their fixed layout.<br />
<br />
I have observed how many web developers have just jumped on the bandwagon and adopted Bootstrap because it is just so darn easy. As an engineer I feel that many blindly go for Bootstrap or similar framework without much thought.<br />
So below I give a more nuanced look into what to consider before redesigning an existing web application. The factors below have been picked especially for rich interactive social web applications rather than simple informational public homepages. I also assume you don't have unlimited resources so you are, as the rest of us, constrained to a limited development time.<br />
<h2>
Factors to consider</h2>
A - Esthetics.<br />
B - Speed of user interaction.<br />
C - Accessibility/ease of use.<br />
D - Development time.<br />
E - Screen size of users.<br />
F - User browser maximized or not.<br />
G - Mobile support.<br />
<br />
All projects are different so you have to decide which of these factors are more important to you.<br />
<br />
<b>A: Do you want our application to look perfect with less cost? </b><br />
It is easier to make the site look good with fixed layout because layout often breaks with fluid layout. Images that users add to content areas don’t wrap as they expect on other screens. Headings added by users don’t wrap how they like on other computers. Background images can look weird etc.<br />
If you have few resources and you want the app to look really good (on PC) you might want to steer towards fixed layout. <br />
<br />
<b>B: Do you have super users? </b><br />
How are users using the app? Are there mostly highly drilled users? Is it a Line of Business app where the business will measure the time users spend doing their work in the app? Do users have to be able to complete their tasks really quick?<br />
By using more screen real estate users can perform actions faster and find information faster without having to scroll, use paging or navigate.<br />
If you have requirements for being able to do lots of actions fast you may want to steer towards responsive layout since you are able to use more of the screen width.<br />
<br />
<b>C: Do you have to be particularly user friendly? </b><br />
Using more screen real estate will often lead to more “things” being visible on the screen. More things = higher cognitive load. For super users this is fine but for users who is not using the solution that often and for senior users this will reduce their user experience because they are simply overwhelmed by the content and options visible.<br />
So who are you targeting? old people, beginners, non-computer literates. <br />
Responsive design does not have to increase the amount of stuff on the screen but it usually does. A fixed layout is easier to learn as it always looks the same. If you by any chance did not maximize the browser window as you usually do you might get a different view than you are used to. For computer illiterate and infrequent users this can pose an issue. With a mobile first design approach, a max width and adaptive layout the UI can still look clean but this is not compatible with B above.<br />
If you have requirements for being very user friendly you may want to steer towards fixed layout.<br />
<br />
<b>D: How much time do you have?</b><br />
My initial starting point for this blog post was that you were about to decide to change from fixed to responsive layout so naturally you are in for more work if you decide to change. Also responsive layout requires more development and testing to check that it looks good on different screen sizes.<br />
If you have little time you may want to steer towards fixed layout.<br />
<br />
<b>E: What's the typical screen size of your users?</b><br />
If a significant percentage is using a screen that is smaller than the fixed layout width or they are using phones and tablets then you should definitely switch to responsive. If users are having a screen size that is smaller than our fixed layout it will cause bad horizontal scroll bars or zooming that makes it very cumbersome to hit buttons etc.<br />
<br />
<b>F: Do users have their browser maximized? </b><br />
Could for example be because users need to keep multiple windows side by side etc for example when they need to copy content from another window and into the app.<br />
In this case a responsive layout may work better.<br />
<br />
<b>G: Do you have to support mobile?</b><br />
This is usually the one biggest concern that will decide it all. Is it a strategic goal that the app work well on mobile? Do you have plans to develop a separate mobile web app or even native mobile app? For many it is just too resource demanding to develop a separate mobile/native app so in this case you would go with responsive layout.<br />
<br />
<br />
<h2>
What are others using </h2>
(Note that it is usually not a black or white choice. Most sites use a mix of techniques for example facebook is fixed but uses some adaptive techniques such as the chat and contacts feature on the right side)<br />
<br />
<h3>
Fluid/Adaptive/Responsive layout:</h3>
<ul>
<li>SharePoint</li>
<li>Jira (Confluence)</li>
</ul>
<h3>
Fixed layout:</h3>
<ul>
<li>LinkedIn</li>
<li>Facebook</li>
<li>Yammer</li>
<li>Podio</li>
</ul>
<br />
<h2>
<b>Side note</b></h2>
Why does Wikipedia have fluid layout? Because all you do there is read articles. Ease of reading is extremely important there. With fluid layout the user has full control of the readability (line length etc) by resizing the browser window and adjusting browser font size.<br />
<h2>
Further reading</h2>
<ul>
<li><a href="http://ux.stackexchange.com/questions/21/for-websites-is-it-better-to-have-a-variable-width-layout-or-a-fixed-width-layo">http://ux.stackexchange.com/questions/21/for-websites-is-it-better-to-have-a-variable-width-layout-or-a-fixed-width-layo</a></li>
<li><a href="http://www.smashingmagazine.com/2012/11/08/ux-design-qa-with-christian-holst/">http://www.smashingmagazine.com/2012/11/08/ux-design-qa-with-christian-holst/</a></li>
<li><a href="http://www.quora.com/Why-doesnt-Wikipedia-use-fixed-widths-for-layout">http://www.quora.com/Why-doesnt-Wikipedia-use-fixed-widths-for-layout</a></li>
</ul>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-38062715900237521422014-10-27T07:56:00.000+01:002014-11-04T18:00:33.234+01:00Why fixed length sprints are important in ScrumI have worked at several companies and on different projects doing <a href="http://en.wikipedia.org/wiki/Scrum_(software_development)">Scrum</a>. Some teams have been more disciplined than others in following the Scrum methodology.<br />
<br />
In a few of these Scrum teams we have not adhered to the rule of a fixed sprint length, and the experience with that has always been negative. In this blog post I list reasons why variable or flexible sprint length is a bad idea.<br />
<br />
Oh, and in case you wondered; fixed sprint length IS a well-documented best practice of Scrum [1], [2], [3], [4], [7], [8], [9].<br />
<blockquote class="tr_bq">
<i>Once a Sprint begins, its duration is fixed and cannot be shortened or lengthened</i> [1].</blockquote>
<blockquote class="tr_bq">
<i>Sprints best have consistent durations.... A new Sprint starts immediately after the conclusion of the previous Sprint</i> [1].</blockquote>
<br />
What typically happens in beginner Scrum teams or in teams where the Scrum master is busy doing other things than being the Scrum master is that they typically get into a situation where some stakeholder for example CTO, department manager or even the <a href="http://www.mountaingoatsoftware.com/agile/scrum/product-owner">PO</a> thinks it is a good idea to alter the length of the current sprint because that way you are able to finish a complete epic/module/product and have that released in one go.<br />
<br />
The big problem with this is you easily fall into a slippery slope. Since you have extended the sprint a few days why can't we just extend it another day, and another day.<br />
<br />
Another typical reason for not having a fixed sprint length is that resource availability will vary. So if there are vacations, bank days or you know some team members will be away you change the length of the sprint so that man-hours for each sprint stays about the same and you keep <a href="https://www.scrumalliance.org/community/articles/2014/february/velocity">velocity</a> the same.<br />
For example; your team may decide that a sprint is always 15 work days. In practice you will then end up with different sprint lengths because resources availability will vary from sprint to sprint. Most people don't schedule and plan their entire vacation in detail many months ahead. That means that you will never know the exact availability of your team resources in the future. Also,you can predict how long a person will be gone if he breaks his leg in a car accident, but you can never know if or when a person will be in an accident in the first place. My point is that you can never know in advance how many calender days will match a fixed set of work days if you have decided a sprint should be a specific number of work days. Instead you should aim for a fixed length in calendar weeks, not work days. Calendar weeks are predictable, work days are not. <br />
<br />
Here is the full list of why you should stick to a fixed length sprint:<br />
<br />
<h2>
<span style="font-weight: normal;">1. Improve coordination with the rest of the organization</span></h2>
It will be easier for everyone to know what kind of Sprint phase the team is in (e.g. planning, development, testing, reviewing). This predictability allows for better coordination and planning throughout the organization. The entire organization can sort of self-organize around this rhythm.<br />
<br />
It also helps you to steer expectations. With a fixed length sprint everyone (PO, management, customers, users, and other stakeholders) will know when they can expect new upgrades (incremental improvements). They will know that a new upgrade typically comes every 3 weeks (or whatever your sprint length is).<br />
<div>
<br /></div>
<h2>
<span style="font-weight: normal;">2. Save time planning</span></h2>
<div>
With a fixed sprint length you can schedule and make plans more easily. A sprint is always the same length, that's it. Now you can schedule <a href="http://www.scrumguides.org/scrum-guide.html#events">Scrum events</a> for the next year ahead and you can do it in one go. You will have less overhead in planning because you don't have to negotiate what should be the sprint length each time, you don't have to make complicated man-days calculations and you don't have to change all the following sprints because you change the length of the current sprint.<br />
<br /></div>
<div>
Since you can schedule meetings in advance, people can plan their appointments around the Sprint events, rather than sprints being tweaked to fit the calendar of key team members or stakeholders.</div>
<br />
<h2>
<span style="font-weight: normal;">3. Better quality</span></h2>
In general a fixed-length sprint will remove variability and this will lead to more predictability, stability, better flow, better and more sustainable work environment, less chaos. This of course leads to higher quality.<br />
<div>
<br /></div>
If you allow sprints to be shortened, say for example because the top management really want to have the next release earlier you not only loose rhythm but you will either have to work overtime, reduce quality, add more resources, or scope down the current sprint. If you scope down you waste resources and throw away planning/analysis that is already done and other work that has been started. If you decide not to scope down you are typically left with one option on such a short notice. You end up reducing quality for example by pressuring the testing to complete faster or by not letting developers do refactoring and other chores. If you decide to work overtime you still jeopardize quality since tired or pressured team members make more mistakes.<br />
<br />
<h2>
<span style="font-weight: normal;">4. More effective work with better flow</span></h2>
With fixed length sprints it is much easier to get into a flow of doing all the Scrum related events such as backlog grooming, retrospectives, sprint reviews. With a predictable schedule you don't have to think about these events. When is the next meeting, will there even be one? <br />
<br />
Without this fixed start and stop you may be tempted to move the start and stop date. You might even delay starting the next sprint long after the previous one ended. Beginner Scrum teams in this situation might not schedule the sprints for the months ahead but instead just start a new sprint when it makes sense. Before you know it you skip a retrospective and have to do sprint planning in the middle of a sprint. All this leads to more unpredictability, questions, chaos and less flow which eventually results in lower performance of the team.<br />
<br />
<h2>
<span style="font-weight: normal;">5. Improve estimates</span></h2>
If the sprint length varies from sprint to sprint, then the amount of work accomplished in each sprint tells you next to nothing about what to expect in future sprints. Comparing how well you did on estimation in different sprints will be more difficult if you change multiple parameters of the process.<br />
<br />
<h2>
<span style="font-weight: normal;">6. Enable continuous improvement </span></h2>
Sprints can more easily be compared. In Scrum we try to fix as many parameters as possible; Time, Quality, Resources are fixed but we change the scope or work from sprint to sprint. By reducing the complexity down to just one adjustable parameter (scope / backlog) it will be easier to have discussions around opportunities for improving the process. The more variables you change the more complex the dynamics of the process will be and it will be much more difficult to compare sprints to improve the process. If you change multiple parameters around each sprint, how are you going to know for sure what actually contributed to things going better or worse?<br />
<div>
<br /></div>
<h2>
<span style="font-weight: normal;">7. Improve ability to predict when future features will be released</span></h2>
The organization or customer will know how long it will take to get new releases out the door if suddenly a new feature absolutely has to be introduced as soon as possible. E.g. If the team is in the middle of a sprint and the sprint length is 3 weeks it will take about 5 weeks to see the newly requested feature in production. If the sprint length is variable it would be far less obvious when you could expect the new feature.<br />
<br />
For products planned several sprints down the road it would be even more unpredictable without a fixed length iteration.<br />
<br />
Velocity (the rate at which a team delivers stories from the product backlog) is useful in forecasting when capabilities can be deployed and available to end users. Without fixed-length sprints, any measure of “work accomplished” is useless in forecasting. Alternatively you will have to make adjustments in the calculations of velocity based on the sprint length. These sorts of calculations become a waste of time as they are hard to get exact and just add extra work to the Scrum master. You can never hope to be 100% precise on task estimates so Velocity will never be exact science anyway. By having fixed length sprints you reduce one source or error in calculating velocity. Keep it simple, stay lean and pragmatic. Aim for predictability and simplicity and forecasting will be easier and less time consuming.<br />
<br />
Sure there will always be holidays, sick days, etc. If a sprint has less resources you simply commit to less [5]. You calculate how many man hours is available and plan the scope accordingly. You may now say that this will affect velocity and number of storypoints delivered for these sprints will be lower. Yes and that is fine because you know the reason why. In the Velocity-over-time-graph you can just make a small note about vacation etc. when velocity had a dip. If you know most of the sprint is going to be all messed up because too many people are away you can also decide for the team to do something completely different. You could let developers take the sprint off doing courses, prototypes etc. <br />
<br />
<h2>
<span style="font-weight: normal;">8. Improve team motivation</span></h2>
Fixed length sprint helps the team to deliver continuously and provides a sense of accomplishment at the end of every sprint. The team also commit to a chunk of work at the start of the sprint. The team gets motivated to deliver as they themselves committed to doing the work.<br />
<br />
With fixed length sprints you have predictability and the team feels more at ease. People like to have routines and familiarity [5]. Fixed length sprints contribute to discipline, habits and traditions that creates team identity. "This is our team and this is how we do it." This again strengthens cohesion and team spirit, which is important for highly effective teams.<br />
<br />
If Scrum events falls on random days of the week every sprint then it is hard to build good habits.<br />
<br />
<h2>
<span style="font-weight: normal;">9. Accountability</span></h2>
<span style="font-weight: normal;">Fixed length sprints with reviews at the end of the sprint encourages the team to deliver on the sprint review. Without a fixed sprint calendar the chance of skipping reviews gets much bigger. Without this regular review delivery the team may procrastinate, get caught up in coding what is fun rather than sticking to the plan or get distracted by other things. Developers don't want to look bad so they will deliver when it is demo time.</span><br />
<h2>
<span style="font-weight: normal;">10. Better planning of backlog and roadmap</span></h2>
PO can better prioritize and split user stories now that meaningful data on velocity can be accumulated from sprint to sprint. PO can use this velocity as a guide to plan upcoming sprints.<br />
<br />
<h2>
<span style="font-weight: normal;">11. Essential for multi team synchronization and alignment</span></h2>
When you scale to multiple dev teams doing Scrum (co-located or not) contributing to the same solution or product, it is obvious that synchronizing the teams will be more effective [6].<br />
<br />
If the different teams operate with different Sprint lengths it goes without saying that the teams will not be in sync. <br />
<br />
<h2>
<span style="font-weight: normal;">
Conclusion</span></h2>
Scrum is all about delivering software in regular intervals to enable fast feedback and to get a effective cadence for the team.<br />
Variable Sprint lengths may seem like a good idea, especially in the short term, but in the long run it will be devastating to the progress of a team.<br />
<div>
<br /></div>
If you liked this blog post, you may also want to read <a href="http://www.samuelcclemens.com/2012/12/scrum-best-practices-choosing-the-right-sprint-length/">Scrum Best Practices: Choosing the Right Sprint Length</a>.<br />
<br />
<h2>
<span style="font-weight: normal;">References</span></h2>
[1] <a href="http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-US.pdf">http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-US.pdf</a><br />
[2] <a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches">http://www.infoq.com/minibooks/scrum-xp-from-the-trenches</a><br />
<div>
[3] <a href="http://www.agilitysw.com/blog/31-scrum-whys-fixed-length-sprints">http://www.agilitysw.com/blog/31-scrum-whys-fixed-length-sprints</a><br />
[4] <a href="http://books.google.no/books?id=3vGEcOfCkdwC">http://books.google.no/books?id=3vGEcOfCkdwC</a> (page 67) </div>
<div>
[5] <a href="http://whitewaterprojects.com/2010/12/07/2-models-to-address-the-holiday-sprints/">http://whitewaterprojects.com/2010/12/07/2-models-to-address-the-holiday-sprints/</a></div>
<div>
[6] <a href="http://scaledagileframework.com/sprint-execution/">http://scaledagileframework.com/sprint-execution/</a><br />
[7] <a href="http://www.agileadvice.com/2013/05/15/referenceinformation/the-rules-of-scrum-every-sprint-is-the-same-length">http://www.agileadvice.com/2013/05/15/referenceinformation/the-rules-of-scrum-every-sprint-is-the-same-length</a><br />
[8] <a href="http://blogs.telerik.com/agile-blog/posts/13-09-11/the-importance-of-timeboxing-and-iterations-for-agile-planning">http://blogs.telerik.com/agile-blog/posts/13-09-11/the-importance-of-timeboxing-and-iterations-for-agile-planning</a><br />
[9] <a href="https://www.scrumalliance.org/community/articles/2012/january/a-sprint-is-not-a-mini-waterfall">https://www.scrumalliance.org/community/articles/2012/january/a-sprint-is-not-a-mini-waterfall</a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-92201618496277214562014-09-14T12:36:00.001+02:002017-09-23T11:24:50.043+02:0040 most funny code comments everThese are borrowed from<br />
<a href="http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered">http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered</a> and
<a href="http://www.quora.com/Computer-Programming/What-are-some-of-the-funniest-comments-in-source-code">http://www.quora.com/Computer-Programming/What-are-some-of-the-funniest-comments-in-source-code</a><br />
<br />
<br />
<br />
<pre>Exception up = new Exception("Something is really wrong.");
throw up; //ha ha
//When I wrote this, only God and I understood what I was doing
//Now, God only knows
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>stop(); // Hammertime!
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre>// sometimes I believe compiler ignores all my comments
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>// I dedicate all this code, all my work, to my wife, Darlene, who will
// have to support me and our three children and the dog once it gets
// released into the public.
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>// somedev1 - 6/7/02 Adding temporary tracking of Login screen
// somedev2 - 5/22/07 Temporary my ass
</pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>// drunk, fix later
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre>// Magic. Do not touch.
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>#define TRUE FALSE
</pre>
<pre> </pre>
<pre> </pre>
<pre>//Happy debugging suckers
</pre>
<pre> </pre>
<pre> </pre>
<pre>// I'm sorry.
</pre>
<pre> </pre>
<pre> </pre>
<pre>return 1; # returns 1
</pre>
<pre> </pre>
<pre> </pre>
<pre>Catch (Exception e) {
//who cares?
}
</pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre> </pre>
<pre></pre>
<pre> </pre>
<pre>/*
* You may think you know what the following code does.
* But you dont. Trust me.
* Fiddle with it, and youll spend many a sleepless
* night cursing the moment you thought youd be clever
* enough to "optimize" the code below.
* Now close this file and go play with something else.
*/
</pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>try {
} finally { // should never happen
}
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre>const int TEN=10; // As if the value of 10 will fluctuate...
</pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre>//This code sucks, you know it and I know it.
</pre>
<pre> </pre>
<pre>//Move on and call me an idiot later.
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>double penetration; // ouch, no cumments needed
</pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre>/////////////////////////////////////// this is a well commented line
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>// I don't know why I need this, but it stops the people being upside-down
</pre>
<pre>x = -x;
</pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>// I am not sure if we need this, but too scared to delete.
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>doRun.run(); // ... "a doo run run".
</pre>
<pre> </pre>
<pre></pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre># To understand recursion, see the bottom of this file
At the bottom of the file:</pre>
<pre># To understand recursion, see the top of this file</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>// I am not responsible of this code.
</pre>
<pre> </pre>
<pre>// They made me write it, against my will.
</pre>
<pre> </pre>
<pre> </pre>
<pre>/* I did this the other way */
</pre>
<pre> </pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>/* Please work */
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>// no comments for you
</pre>
<pre> </pre>
<pre> </pre>
<pre>// it was hard to write
// so it should be hard to read
options.BatchSize = 300; //Madness? THIS IS SPARTA!
</pre>
<pre>// I have to find a better job
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre># code below replaces code above - any problems?
# yeah, it doesn't fucking work.
class Act //That's me!!!
{</pre>
<pre> ...
}
</pre>
<pre> </pre>
<pre> </pre>
<pre> </pre>
<pre>public boolean isDirty() {
//Why do you always go out and
return dirty;
}
Repeat
...
Until (JesusChristsReturn) ' Not sure
// Catching exceptions is for communists
// If this code works, it was written by Paul DiLascia. If not, I don't know
// who wrote it
//this formula is right, work out the math yourself if you don't believe me
// Comment this later
</pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre>/** Logger */
private Logger logger = Logger.getLogger();
// Remove this if you wanna be fired
# This is becoz you messed with me the other day
if current_admin.name == "#{my_x_employer}"
sleep(1000 * 3600)
end
# Linux Sex
$ date ; unzip ; strip ; touch ; grep ; finger ; mount ; fsck ; more ; yes ; umount ; sleep
// Peter wrote this, nobody knows what it does, don't change it!</pre>
<pre>
</pre>
<pre>
</pre>
<pre>}catch(Exception ex){</pre>
<pre> // Houston, we have a problem</pre>
<pre>}</pre>
<pre>
</pre>
<pre>
</pre>
<pre>// If I from the future read this I’ll back in time and kill myself.</pre>
<pre>
</pre>
<pre>
</pre>
<pre>// TODO: I believe the method (and all class in general)
// doesn’t make any sense at all, but I’m sleepy and
// it works fine</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>// A function that retrieves all females from the database
// for processing and display:
function getGirls() { //if only it were really that simple
</pre>
<pre>
</pre>
<pre>float boat; // must be a float, otherwise it sinks.</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>// I can’t divide with zero, so I have to divide with something very similar
result = number / 0.00000000000001.</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>// no comments for you
// it was hard to write
// so it should be hard to read</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
<pre>
</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-30451808888353606902014-05-23T07:30:00.000+02:002014-07-11T15:08:14.479+02:00Value cannot be null. Parameter name: s solutionI recently worked on a project where we were getting the error message below in our log files. This mysterious issue plagued us for weeks and we did not understand why we were getting the error and even how it impacted the user. We only knew that it would come in about 1 of 300 page views.<br />
<br />
We were using a custom <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.pagestatepersister.aspx">PageStatePersister</a> and saving Asp.Net Web Forms <a href="http://msdn.microsoft.com/en-us/library/ms972976.aspx">Viewstate</a> to a database. The error never showed up in the development environment.<br />
<br />
We tried all sorts of things to reproduce it and make it go away. After some time trying to reproduce the error we managed to reliably reproduce it locally by doing simultaneous page requests for different web pages. Any request type async/non-async, postback/non-postback would trigger it. For end users it would manifest itself as annoying glitches or hiccups with possible loss of input data.<br />
<br />
We finally managed to also locate the error after days of changing one by one line of code back to an older version.<br />
<br />
The error was caused by someone having redefined the <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.losformatter.aspx">LosFormatter</a> variable as static in our PageStatePersister.<br />
<br />
Changing the LosFormatter variable definition to non static immediately solved the problem and also improved performance.<br />
<br />
<pre>Exception type: System.ArgumentNullException
Value cannot be null.
Parameter name: s
at System.Web.UI.ObjectStateFormatter.DeserializeIndexedString(SerializerBinaryReader reader, Byte token)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
at System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream)
</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-40296504319604750962014-03-31T19:54:00.000+02:002014-04-16T22:48:39.018+02:00Dji Naza flyaway air crash investigationI love my <a href="http://en.wikipedia.org/wiki/Quadcopter">Quadcopter</a> but some weeks ago I started to loose control of the <a href="http://en.wikipedia.org/wiki/Multirotor">drone multicopter</a> for unexplainable reasons.<br />
<br />
<a href="http://www.dji.com/">Dji</a> has gotten a lot of complaints in the last 6 months from what is often called fly-aways or more humorously called the “Fly to China” feature, <span style="font-size: x-small;">(“Fly to home” is a highly regarded safety feature of the <a href="http://www.dji.com/product/naza-m-v2">Naza M flight controller</a>).</span><br />
<br />
Many of these fly aways are simply pilot errors. There are a lot of pilots out there that should not be flying UAV's in populated areas. Still, reports by <a href="http://www.rcgroups.com/forums/showpost.php?p=25631192&postcount=738">experts</a> are plentiful so the problem is real, and serious. A serious accident is bound to happen from a flyaway if the problem is not solved soon.<br />
Many quadcopter forums (such as <a href="http://www.rcgroups.com/forums/showthread.php?t=1919850">rcgroups</a>, <a href="http://www.djiguys.com/Forum/viewtopic.php?f=4&t=1846">djiguys</a>, <a href="http://www.ausrc.com/forum/showthread.php?48578-DJI-Phantom-flyaway">ausrc</a>, <a href="http://www.phantompilots.com/viewtopic.php?f=4&t=1401">phantompilots</a>, <a href="http://www.multirotorforums.com/showthread.php?13124-Naza-M-V2-Fly-away">multirotorsforum</a>, <a href="http://fpvlab.com/forums/showthread.php?26590-Naza-V2-Fly-Away">fpvlab</a>) have discussed the issue and there are <a href="https://www.youtube.com/results?search_query=flyaway+naza&sm=3">plenty of YouTube videos</a> documenting live flyaways. Even so, Dji seem to be unable to address the issue. They have posted a <a href="https://www.youtube.com/watch?v=2bxjL7wFyb8">video</a> with some tips and released a firmware upgrade but the problem remains.<br />
<br />
<b>If you have experienced a flyaway please join this survey:</b><br />
<a href="https://docs.google.com/forms/d/1rRrJAOqJ9r2ed9WBlmyXAqJXQKwIQD4kM2wAOKpBTHc">https://docs.google.com/forms/d/1rRrJAOqJ9r2ed9WBlmyXAqJXQKwIQD4kM2wAOKpBTHc</a><br />
<br />
Suggested solutions to the problem can be found all over the place. Here are some solutions found elsewhere (Not my recommendations, just added to show the variety of solution proposals from others):<br />
<ul>
<li>Don’t buy Dji products.</li>
<li>Don’t put it in GPS mode.</li>
<li>Put tape around the edge of the GPS.</li>
<li>Don’t fly when the sun is low in the horizon.</li>
<li>Don't fly too close to power lines and cell towers.</li>
<li>Reduce vibrations on the bird.</li>
<li></li>
<li>Adjust flight mode switch/FS setup (flight mode can jump back and forth due to the control PWM signal being right on the edge).</li>
<li>Make sure IOC mode is set up properly and not mistakenly activated/deactivated.</li>
<li>Check for loose double side tape on FC or GPS.</li>
<li>Replace the GPS/Mag if damaged in crash.</li>
<li>Remove FPV Vtx, it may interface with GPS signals.</li>
<li>Keep the compass/gps puck and cable away from power leads and battery.</li>
<li>Simple shielding on all NAZA inputs to protect data integrity.</li>
<li>Remove corrosion and oxidisation of pins and push-connectors.</li>
<li>Place Naza FC as close as possible to the center of gravity.</li>
<li>Power cycle after compass calibration.</li>
<li>Avoid large stick inputs.</li>
<li>Recalibrate the compass yet again.</li>
<li>Don’t fly when solar activity is high.</li>
<li>Make sure the ESCs travel midpoint is at 1520us. <a href="http://download.dji-innovations.com/downloads/nazam-v2/en/NAZA-M_Quick_Start_Guide_v1.20_en.pdf">Do not use 700us travel midpoint ESC</a>.</li>
</ul>
<br />
As you can see there are several suggestions for how to prevent flyaways, but no one seem to know exactly why it is happening in the first place. It might just be a combination of many things but I would still like to pinpoint the cause of this issue as I have experienced it myself and it is getting both dangerous and expensive.<br />
<br />
I am also open for suggestions for how to improve the questionnaire.<br />
<div>
<br /></div>
<div>
My first flyaway (450 quadcopter with gimbal gone haywire) can be seen at the end of this video.</div>
<br />
<iframe allowfullscreen="" frameborder="0" height="340" mozallowfullscreen="" src="//player.vimeo.com/video/83656260" webkitallowfullscreen="" width="600"></iframe><br />
<br />
How to <a href="https://www.youtube.com/watch?v=iW0hqzixwsk">gain control</a> if you experience a fly away.<br />
<br />
If you have started to experience flyaways you may try to debug the issue by buying the <a href="http://www.dji.com/product/iosd-mark-ii/feature">Dji iOSD module</a> to log data.<br />
Another approach is to try systematically changing one thing at a time (environmental condition, copter config, copter parts etc) and see if the fly-aways stop. During this testing create an anchor; a 2 meter long line attached to the ground and tied to the bottom center of your copter.<br />
<br />
You may also want to put your name and phone number on your multicopter in case of a flyaway or just not finding it after a crash.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1034092804251778950.post-35640728593203462732014-03-26T17:36:00.002+01:002014-04-03T15:40:31.052+02:00Benefits of a schema-less databaseA typical argument for choosing a <a href="http://en.wikipedia.org/wiki/NoSQL">NoSql database</a> (such as a <a href="http://en.wikipedia.org/wiki/Document-oriented_database">document store</a> or <a href="http://en.wikipedia.org/wiki/Graph_database">graph database</a>) over a relational database (such as MySql) is that NoSql databases are schemaless and that makes you more agile.<br />
<br />
So, what does this actually mean? What are the concrete benefits of being schema-less and how does it actually make you more agile as a developer or as an organization?<br />
<br />
In this context we use the term agile not strictly as in <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile software development</a> but more in term of just being faster, more flexible, nimble and adaptable to change. <br />
<br />
Here are some of the real world reasons why schemaless makes you more agile:<br />
<ul>
<li>When starting a new development project you don't need to spend the same amount of time on up-front design of the schema (which is likely to change several times anyway). Less need for planning -> more agile. </li>
<li>Once the NoSql is up and running the developer does not need to know about the database. No need to learn SQL or database specific stuff and tools. Less to know about. Less to learn for new developers -> faster development -> more agile.</li>
<li>The rigid schema of a relational database (RDBMS) means you have to absolutely follow the schema. It can be harder to push data into the DB as it has to perfectly fit the schema. Being able to add data directly without having to tweak it to match the schema can save you time-> more agile.</li>
<li>Minor changes to the model and you will have to change both your code and the schema in the DBMS. No schema -> don't have to make changes in two places -> Less time consuming -> more agile.</li>
<li>With a NoSql DB you have fewer ways to pull the data out -> fewer ways to shoot yourself in the foot -> less chance of being bogged down in problems later (e.g. as unforeseen intricate future queries starts to manifest themselves as performance issues) -> more agile.</li>
<li>Schema-less -> Less overhead for DB engine -> better performance and scalability -> Less overhead for developers related to scalability -> Fewer devopment obstacles -> more agile. </li>
<li>Changes to the DB schema will often break the solution for other developers and they have to keep updating the DB schema locally even if they are working on something completely unrelated. Syncing DB and code as you pull from your source code repository requires extra work and sometime even extra time trying to figure out why your solution don’t work after Git pull. No schema -> Fewer problems with code/schema not being in sync -> More agile development.</li>
<li>ALTER TABLE operations during deployment can be very heavy on the system and will usually result in downtime. Schema changes in general will break the system when code and schema is not in sync during deployment. No schema -> less downtime -> deploy whenever you like-> more agile.</li>
<li>Save time when the day comes when you have to denormalize tables because of performance issues. Less overhead related to schema -> more agile.</li>
<li>You don't have to deal with artificial link-tables (for many to many relations) because it is built into graph databases. -> fewer things to deal with -> easier to modify code/"schema" -> faster development -> more agile.</li>
<li>Eliminates the need for Database administrators or database experts -> fewer people involved and less waiting on experts -> more agile.</li>
<li>Less time needed to pick the right datatypes for new database columns -> save time -> more agile.</li>
<li>Schema-less -> better DB engine performance -> less chance of having to create separate systems to offload the DB because of heavy queries from big reports etc. -> less complicated system -> more agile. </li>
<li>Save time writing complex SQL joins -> more rapid development -> more agile.</li>
<li>Rolling back code doesn't necessarily break the App, you might just not get the data you expect. Easier to deploy/rollback without serious consequences -> more agile.</li>
<li>As more and more applications/systems use your RDBMS it is harder to change the schema because of dependencies. Change the schema and you might f* up some other system. With NoSql schema changes other systems might not get the expected data but the chance of runtime errors is less. No schema -> less worry about messing up for other systems -> more agile.</li>
</ul>
<div>
In this blog post I have covered only the benefits of schema-free. There are also drawbacks but for the sake of brevity it is not included here. Being super agile might not be the top prioritization for all organizations.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-50403117771595454552014-03-05T07:51:00.001+01:002014-03-05T08:16:38.698+01:00SPARQL and RDF introduction for technical personsThis is a quick introduction to <a href="http://en.wikipedia.org/wiki/SPARQL">SPARQL</a> and <a href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a> for developers. I believe SPARQL and RDF are such profound innovations that all IT-persons and developers should know about it. So here's me spreading the word.<br />
<br />
In this blog post I will show some examples of basic SPARQL queries, but first a short intro to RDF.<br />
<br />
Typical relational databases are organized into tables that look something like this:<br />
<br />
<div style="float: left; width: 300px;">
Table: Persons<br />
<table border="1" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Date of birth</th>
<th>Department Id</th>
</tr>
</thead>
<tbody>
<tr>
<td>2</td>
<td>Roy Lachica</td> <td>22.12.1975</td> <td>5</td>
</tr>
<tr>
<td>4</td>
<td>John Doe</td>
<td>3.4.1973</td>
<td>6</td>
</tr>
</tbody>
</table>
</div>
<div style="float: left; width: 300px;">
Table: Departments<br />
<table border="1" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>5</td>
<td>Development</td>
</tr>
<tr>
<td>6</td>
<td>Human relations</td>
</tr>
</tbody>
</table>
</div>
<div style="clear: both;">
</div>
<br />
<br />
In RDF this would be represented something like this:<br />
<table border="1" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th>subject</th>
<th>predicate</th>
<th>object</th>
</tr>
</thead>
<tbody>
<tr>
<td>http://vocab.org/ns/roy_lachica</td>
<td>http://schema.org/dateOfBirth</td>
<td>1975-12-22</td>
</tr>
<tr>
<td>http://vocab.org/ns/roy_lachica</td>
<td>http://ourCorpVocab.com/department</td>
<td>http://ourCorpVocab.com/dep/dev</td>
</tr>
<tr>
<td>http://vocab.org/ns/john_doe</td>
<td>http://schema.org/dateOfBirth</td>
<td>1973-4-3</td>
</tr>
<tr>
<td>http://vocab.org/ns/john_doe</td>
<td>http://ourCorpVocab.com/departmen</td>
<td>http://ourCorpVocab.com/dep/hr</td>
</tr>
</tbody>
</table>
<br />
This could also be represented as a node graph.<br />
In the example RDF data above we use <a href="http://en.wikipedia.org/wiki/Uniform_resource_identifier">URI</a>'s as identifiers instead of primary key ID columns that are used in relational databases. These URI's and their namespaces are predefined schemas typically defined by other organizations. This is where the big innovation lies.<br />
<br />
<h3>
The problem RDF solves </h3>
In the relational database example we have manually defined the schema our self. There is no way for others to know what the columns mean. Although you might guess from looking at the data. If we were to expose the data through a <a href="http://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> <a href="http://en.wikipedia.org/wiki/Application_programming_interface">API</a> there is no way for the API consumers to be sure what the data mean, unless they read the documentation. The API consumer will manually have to couple properties, parse and transform data. In short, they will have to make sense of data and its structure.<br />
<br />
<h3>
The innovation</h3>
In the triplestore (RDF database) you can put anything in, you can change the data to whatever you like. This will make you more agile. You are not restricted as in a relational database development stack where you would have to change all the above layers if you make a change in the schema.<br />
<br />
You also don't have to care about SQL and database engine quirks and performance issues when designing the schema. The extremely simple universal RDF model is a directed graph and you don't need to normalize, denormalize or setup indexes, keys, decide to use stored procedures or not etc. There is no notion of a NULL-value and this will reduce potential bugs.<br />
<br />
In RDF, anyone (also computers, not just humans) can make sense of the data, as long as you use known RDF schemas. These schemas are also called <a href="http://www.w3.org/standards/semanticweb/ontology">vocabularies</a> and <a href="http://semanticweb.org/wiki/Ontology">ontologies</a> (ontologies are just more advanced vocabularies). There are even some basic semantics inherent in RDF so for simple structures you might not even need to define or reuse a schema.<br />
The URI's tells us what schemas are used and the schema is not hard-coded into the database but instead openly defined. (A schema could also be company internal but that would sort of defeat the purpose of enabling a global database or <a href="http://www.ted.com/talks/tim_berners_lee_on_the_next_web">web of data</a> through connecting disparate data sources)<br />
<br />
<h3>
SPARQL examples</h3>
RDF <a href="http://en.wikipedia.org/wiki/Triplestore">triplestores</a> have SPARQL-endpoints for querying the data. Fortunately university of Mannheim have made such an endpoint openly available. This endpoint exposes a <a href="http://en.wikipedia.org/wiki/The_World_Factbook">CIA world factbook</a> example database.<br />
<br />
The endpoint is located at:<br />
<a href="http://wifo5-03.informatik.uni-mannheim.de/factbook/snorql/">http://wifo5-03.informatik.uni-mannheim.de/factbook/snorql/</a><br />
Feel free to check out the endpoint and click around.<br />
<br />
This endpoint (with a typical SPARQL user interface) lets you query the triplestore and return the results as JSON, XML or HTML for reading on screen.<br />
<br />
You may also type in a query directly in your browser address bar:<br />
<a href="http://wifo5-03.informatik.uni-mannheim.de/factbook/snorql/?query=SELECT+%3Fcountry+%3Fpopulation+%3Fgrowthrate+%3Fcapital_city+%3Farea%0D%0AWHERE+%7B%0D%0A%3Fx++factbook%3Aname+%3Fcountry+%3B%0D%0Afactbook%3Apopulation_total+%3Fpopulation+%3B%0D%0Afactbook%3Apopulationgrowthrate+%3Fgrowthrate+%3B%0D%0Afactbook%3Acapital_name+%3Fcapital_city+%3B%0D%0Afactbook%3Aarea_total+%3Farea+.%0D%0A%7D">http://wifo5-03.informatik.uni-mannheim.de/factbook/snorql/?query=SELECT+%3Fcountry+%3Fpopulation+%3Fgrowthrate+%3Fcapital_city+%3Farea%0D%0AWHERE+%7B%0D%0A%3Fx++factbook%3Aname+%3Fcountry+%3B%0D%0Afactbook%3Apopulation_total+%3Fpopulation+%3B%0D%0Afactbook%3Apopulationgrowthrate+%3Fgrowthrate+%3B%0D%0Afactbook%3Acapital_name+%3Fcapital_city+%3B%0D%0Afactbook%3Aarea_total+%3Farea+.%0D%0A%7D</a><br />
<br />
<br />
<h4>
Various SPARQL queries</h4>
Try copying these into the endpoint SPARQL textfield.<br />
<br />
<pre>SELECT * WHERE { ?s ?p ?o} limit 10</pre>
This will get the first triples (subject-object-predicate set).<br />
<br />
<br />
<pre>SELECT COUNT(*) { ?s ?p ?o }</pre>
Get number of triples in the database.<br />
<br />
<br />
<pre>SELECT (COUNT(*) AS ?triples_count) { ?s ?p ?o }</pre>
Same as above but with a name for the result, making the output more human readable.<br />
<br />
<br />
<pre>SELECT DISTINCT ?value WHERE { db:Algeria ?<http: climate="" factbook="" ns="" wifo5-04.informatik.uni-mannheim.de="">value ?o}</http:></pre>
Get all properties (the predicate part) of triples where Algeria is part of the triple.<br />
<br />
<br />
<pre>SELECT DISTINCT ?value WHERE { db:Algeria factbook:climate ?value }</pre>
Gets the climate in Algeria.<br />
<br />
<br />
<pre>SELECT DISTINCT *WHERE { db:Norway factbook:landboundary ?borderingcountry }
ORDER BY ?borderingcountry</pre>
Get the countries that border to Norway.<br />
<br />
<br />
<pre>SELECT DISTINCT ?country ?literacypercentage
WHERE {
?country factbook:literacy_totalpopulation ?literacypercentage .
FILTER ( ?literacypercentage > 70 )
}
order by desc(?literacypercentage)</pre>
Get all countries with a literacy percentage over 70.<br />
<br />
<br />
<pre>SELECT DISTINCT ?country ?literacypercentage ?populatoncount
WHERE {
?country factbook:literacy_totalpopulation ?literacypercentage .
?country factbook:population_total ?populatoncount
FILTER ( ?literacypercentage > 50 && ?populatoncount>5000000)
}
order by asc(?literacypercentage)</pre>
Get all countries with a literacy percentage over 50 and having a population count of more than 5 million. Sort results by countries with the lowest literacy on top.<br />
<br />
<br />
<pre>SELECT ?country ?population ?growthrate ?capital_city ?area
WHERE {
?x factbook:name ?country ;
factbook:population_total ?population ;
factbook:populationgrowthrate ?growthrate ;
factbook:capital_name ?capital_city ;
factbook:area_total ?area .
}</pre>
Get country name, population, growth rate, capital city and country area size of all countries.<br />
<br />
<br />
<br />
<h3>
Further reading</h3>
<a href="http://www.xml.com/pub/a/2007/03/14/a-relational-view-of-the-semantic-web.html">A Relational View of the Semantic Web</a><br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-3001539837000389752014-01-14T12:58:00.000+01:002015-06-03T19:53:03.309+02:00A simple requirements specification template for websitesIf you are about to develop or hire someone to develop a new website you will need to articulate a set of requirements or needs for your coming website. In this blog post I will present a simple check list / template that can be used as a starting point. For more advanced high end sites you should go with a more in-depth process but the questions below might help you get started.<br />
<br />
<h3>
Visitor features</h3>
What should the visitors be able to do on this website? What kind of user interactions will the site have? Most importantly answer why. This should all be defined based on a content strategy / information strategy etc. What about multi-language support on content and the editor interface? What about features such as: contacts, events, press releases, product catalogue, webshop, automatic creation of PDF's such as reports, image gallery, videos, FAQ, user comments, forum, blog, wiki. Will there be specific needs concerning advanced content and design such as storytelling, copywriting, art direction etc.<br />
<br />
<h3>
Administration features</h3>
How will the website content be updated? Will there be any particular process for adding and modifying content? How many persons will be doing it, how often? How computer literate is this person who will be updating the content? Will you need to manage an online community associated with the website? In that case you might need a community manager, moderator etc.<br />
<br />
<h3>
Future site upgrades</h3>
Is it important that future developments to the site can be done by most development shops/consultants? If so state a requirement to use a commonly known <a href="http://en.wikipedia.org/wiki/Content_management_system">CMS</a>. Do we need any service level agreements for system changes to the site? Do we need support for the content editors? Do we need technical documentation on how the site is built? If there is a lot of advanced customization this might be a good idea.<br />
<br />
<h3>
Scalability</h3>
Is it highly likely that the site will become very popular within a few years? If so consider SaaS, PaaS, cloud services etc. to help you cope with dynamic traffic demands. This is also relevant if you know the site will have extreme traffic spikes at specific times of the year.<br />
<br />
<h3>
Site structure and content</h3>
Create a hierarchical view of the pages that will be part of the site. This can simply be a document with level headings going from heading 1 to 4. You probably also want to provide multiple ways to your content by using tags or categories? Will there be user generated content and what is the extent? Will there be massive amounts of content? What is your unique selling proposition (<a href="http://www.entrepreneur.com/encyclopedia/unique-selling-proposition-usp">USP</a>)? How will your site stand out?<br />
<br />
<h3>
Logging and audit trail</h3>
Is it important to log things like who did what when with site content?<br />
<br />
<h3>
Key Performance Indicators </h3>
Will the persons responsible for the website be followed up on <a href="http://en.wikipedia.org/wiki/Performance_indicator">KPI</a>'s? E.g. maybe the web team is required to create a new post each week? or maybe there is a requirement that the site should have a certain number of visitors or be on a list of top sites within a specific category? <br />
<br />
<h3>
Visitor tracking and reporting</h3>
You probably need to visitor statistics. Is <a href="http://www.google.com/analytics/">Google Analytics</a> fine?<br />
<br />
<h3>
Search Engine Optimization (SEO)</h3>
How high are our ambitions when it comes to being found on and ranked high on search engines?<br />
<br />
<h3>
Accessibility</h3>
Should people with special needs be able to use the site? How much support should they get? Should they just be able to read it or should you provide good user experience for this group? Should blind people be able to use the site?<br />
Where should the site be available? What kind of devices? Old devices/browsers?<br />
<br />
<h3>
Style</h3>
What kind of look, mood, style do we want? How do want to be perceived? Our values and mission has to fit the style. What level of design excellence should we strive for? Is it important that the readers find the site really good looking and appealing?<br />
<br />
<h3>
Security</h3>
Do we need special considerations when it comes to security and permission control? Will different people need different access to some content? Will some editors need more permissions than others?<br />
Is it extremely important that the site is not hacked? Hackers typically break site and put advertising and malware on hacked websites.<br />
<br />
<h3>
Speed</h3>
Is it important that the site is fast to load? Do we need the site to scale? will there be millions of visitors and will the traffic grow?<br />
<br />
<h3>
Server location</h3>
What about hosting? How will the website be hosted? In your country? Maybe you have compliance rules to follow when it comes to where the server is located? Do we have environmental concerns? Some hosting providers are more environmental than others. If most of your users come from the other side of the world then consider a server location in that region.<br />
<br />
<h3>
Stability</h3>
Is it important that the site is available at specific times. Do we need disaster recovery and service continuity? Extra redundancy and backup plans in case of atomic bombs wiping out your country? a bit extreme there but you get the point.<br />
<br />
<h3>
Other requirements </h3>
Non functional and functional? Maybe we are required to use Open Source? Will there be a need for related services such as video editing, brand/identity design, design of advertisement banners. What about e-mail accounts?<br />
<br />
<h3>
Contract </h3>
Escrow? Budget? Time plan? Legal issues?<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-46068812553136348612013-07-27T23:49:00.000+02:002013-07-28T00:02:25.065+02:00The best way to conduct a retrospective meeting<a href="http://www.mountaingoatsoftware.com/scrum/sprint-retrospective/">Retrospective meetings</a> on <a href="http://en.wikipedia.org/wiki/Scrum_(software_development)">SCRUM</a> IT development projects are held at the end of the sprint (usually at 2, 3 or 4 week intervals). The purpose of this meeting is to collectively find out how the team can become better and more effective.<br />
<br />
If you are not doing SCRUM development projects you can still use this meeting style. It is all about learning and <a href="http://en.wikipedia.org/wiki/Continual_improvement_process">continuous improvements</a> so this should be relevant for any team (3-8 persons) that is working together over a long period of time, in any type of organization.<br />
<br />
Over the years I have been on many development projects and tried different approaches to the retrospective meeting. The following format and structure seem to work very well.<br />
<h2>
<b>Duration </b></h2>
2 hours. Usually you will see others saying 1 hour is enough. I think 1 hour can be a bit too short (if you are more than 4 persons) because then you don't really get the time to discuss and "analyze" issues.<br />
<h2>
<b>Roles</b></h2>
<h4>
<span style="font-weight: normal;">You will need one facilitator (In SCRUM this will be the Scrum master). The facilitator can simply be one of the team members.</span></h4>
<h2>
Who should attend?</h2>
The core team including designers and testers. Scrum master/project lead and product owner.<br />
<h2>
<b>Preparations</b></h2>
In your daily work keep a notebook at your desk. Immediately when you recognize a possible issue or idea suitable for the retrospective then write it down. Keep one page in your notebook dedicated to notes for the next retrospective. This way you avoid going to the retrospective meeting with a blank head. Even though the meeting is held every 2, 3 or 4 weeks it can be hard to remember things that happened during the sprint. <br />
<h2>
<b>The meeting</b></h2>
<h3>
<b>Timeline</b></h3>
The facilitator initiates the meeting and draws a timeline on a whiteboard. Indicate on the timeline the start date and end date of the sprint. Also put in the half sprint date on the middle of the timeline so it is easier to position <a href="http://en.wikipedia.org/wiki/Post-it_note">post-it notes</a> later.<br />
<br />
Each participant then writes down events that happened during the sprint. This should be limited to events that affected the team in some way. Each participant will sit around a table and try to come up with notes without looking on the notes of the others. Write with big letters so it is easy to read when it is put up on the whiteboard.<br />
<br />
Events should be relevant. Negative events that seem to be reoccurring should get extra attention. Other private stuff can often be left out. If for example you moved to a new apartment and had to take a day off and where distracted during the sprint, this will affect the team but there's no need to mention it here because there's probably nothing you or the team could do about it, and there's nothing the team can learn from it. <br />
<br />
Take turns and put up a post-it note for each (positive and negative) event. No need to discuss each post-it note here. Just be objective and concise. The post-its will make the next step much easier.<br />
<h3>
<b><br /></b></h3>
<h3>
<b>What went well and what went not so well</b></h3>
Now start a new round where each participant tries to come up with notes for things that did not go as smooth as it could. On a separate wall or area of the whiteboard take turn and present your note.<br />
<br />
The events in the previous step will help you remember things that did not go as well as it could. Each participant presents their note and how they experienced it. Do not make suggestions for solutions at this point and above all do not blame others.<br />
<br />
Remember that others may have experienced it totally different. The important point to make here is that all team members get to discuss and share their perspective. Typically you'll discuss it as a problem and what this problem leads to. How severe is the problem? Maybe you are the only one seeing the problem. In that case maybe you need to change your perception of the issue. <br />
<br />
Another important point to make here is that talking about things that did not work out very well can be difficult. It can even become uncomfortable or stressful. Now it's important that you act as a team and help each other. Be honest. We all have strengths and weaknesses. Also, think in systems. When someone messes up, it is usually the system that allows or encourages him or her to do so. Find the underlying causes. Here <a href="http://en.wikipedia.org/wiki/5_Whys">the 5 whys technique</a> can help to find the root cause of the problem. When a person does something he shouldn't then recognize that there is a weakness in the system. If someone made it happen, it might happen again. <a href="http://www.agilecoach.ca/2010/10/26/change-the-system-not-the-person/">Change the system, not the person</a>.<br />
<br />
Now take another round of post-it writing. This time it will be more positive and uplifting. Write down what went well. Here you can take the opportunity to pat your team members on the shoulder. If they took initiative to improve something but did not succeed you can still make a note on the effort. You an also brag about what you yourself did that you think worked out particularly well. Usually there's not much to discuss here but it is still important. Most people thrive when they get positive recognition from their peers.<br />
<h3>
<b><br /></b></h3>
<h3>
<b>Looking back to the previous retrospective meeting</b></h3>
The facilitator now put up the post-it's from the last retrospective on what to start doing, stop doing, and continue doing. In the previous meeting you made some suggestions for change. Now you can evaluate the changes that have been made since last time. Did you see any improvements? Has anything been done at all about the things you identified in the previous round? Sometimes people agree to make changes, but when you meet up at the next retrospective, nothing has changed. In this case you may want to evaluate your <a href="http://en.wikipedia.org/wiki/Incentive_program">incentive systems</a>. Boring tasks are often postponed when the reward seem low, intangible or distant.<br />
<h3>
<b><br /></b></h3>
<h3>
<b>Suggest changes</b></h3>
The facilitator draws 3 columns and adds post-it's from the last meeting. Based on what changes were made this sprint you can now suggest adjustments by coming up with ideas for what to start doing or stop doing. Combine this with solutions for the newly identified problems (what did not go so well). Each participant makes another round with post-it's:<br />
<ul>
<li>Stop doing</li>
<li>Continue doing</li>
<li>Start doing</li>
</ul>
This again is discussed in the group. If there is a consensus on a topic the post it will be transferred to the next retrospective. In many cases the stop, continue and start doing thing will be a bit vague. In that case you will need to make more concrete action points. Some of the items will be for the whole team or some of the team members to do. Other items may be for the organization to carry out. In the latter case it will be the responsibility of the scrummaster/project lead to see that it is actually carried out.<br />
<br />
Prioritize action points and follow up on them. Put them in your product backlog, to-do list, task tracking system, <a href="https://podio.com/">podio</a>, <a href="https://basecamp.com/">basecamp</a> or whatever you are using. The items may even be new innovative ideas to register in your idea management system. I happen to work for a company that is developing idea management software. Visit our website <a href="http://inductsoftware.com/">inductsoftware.com</a> for idea management software to improve your organization's innovation capacity.<br />
<br />
Learn more about retrospective meetings at the <a href="http://retrospectivewiki.org/index.php?title=Main_Page">Agile Retrospective Resource Wiki</a>.<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-65446920624204425882013-04-20T11:12:00.000+02:002015-10-08T09:19:54.742+02:0010 reasons to become a vegetarian, and the science to back it upWorking as a programmer is not really promoting good health, sitting in front of computers 10 hours a day often with work related stress. Since a kid I have had a condition of Atopic Dermatitis which comes with a weakened <a href="http://en.wikipedia.org/wiki/Immune_system">immune system</a>, so naturally I look for ways to strengthen my immune system.<br />
<br />
This year I have decided to become a <a href="http://en.wikipedia.org/wiki/Semi-vegetarianism">semi-vegetarian</a> in order to stay healthy. Becoming more vegetarian also has many other benefits so I have compiled a list of benefits to encourage others to also consider cutting down on <a href="http://en.wikipedia.org/wiki/Animal_source_foods">animal based foods</a>.<br />
<h2>
Reasons to become a vegetarian<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLvncNZ3HvG-_ae3PVMhcfECxt14CCL7J1zufGQta-AxbnahZLM4zCRSDG7F48OeXKR8m8AdtWnuL717XHw503xOQI7vCGr4vqKq0TES-89Nm0jjr1vGM7LzFcfuKpAIQKzg8gKZyc5A/s1600/Hrushikesh_kulkarni_vegetables.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLvncNZ3HvG-_ae3PVMhcfECxt14CCL7J1zufGQta-AxbnahZLM4zCRSDG7F48OeXKR8m8AdtWnuL717XHw503xOQI7vCGr4vqKq0TES-89Nm0jjr1vGM7LzFcfuKpAIQKzg8gKZyc5A/s200/Hrushikesh_kulkarni_vegetables.JPG" width="200" /></a></div>
</h2>
<ol>
<li>Better health.</li>
<li>Prevent cancer. </li>
<li>Weight control.</li>
<li>Healthy mind. </li>
<li>Save the environment.</li>
<li>Support sustainable development.</li>
<li>Ethics.</li>
<li>Reduce the effects of aging. </li>
<li>Save money.</li>
<li>Smart people tend to become vegetarians.</li>
</ol>
<h2>
Details</h2>
<h3>
1. Better health</h3>
The combined results from five studies in 1999 involving more than 76,000 people compared the incidence of disease among vegetarians to that of nonvegetarians with similar lifestyles. Mortality from heart disease was 24% lower in vegetarians than nonvegetarians [1].<br />
<br />
A number of environmental toxins build up in animal tissues and are found in meat. According to the <a href="http://www.fda.gov/">FDA</a>, studies suggest that exposure to dioxin-like compounds (<a href="http://en.wikipedia.org/wiki/Dioxins_and_dioxin-like_compounds">DLCs</a>) may lead to a variety of adverse health effects, including reproductive and developmental problems, cardiovascular disease, increased diabetes and increased cancer [2],[3].<br />
<br />
A 1985 Swedish study demonstrated that individuals with asthma practicing a vegan diet for a full year have a marked decrease in the need for medications [4].<br />
<br />
A vegetarian diet contains more antioxidants. Antioxidants mop up free radicals that cause <a href="http://en.wikipedia.org/wiki/Inflammation">chronic inflammation</a> [5],[6],[7].<br />
<br />
<a href="http://en.wikipedia.org/wiki/Gout">Gout </a>[8], <a href="http://en.wikipedia.org/wiki/Kidney_stone">kidney stones</a> [9] and other diseases are also associated with an animal based diet.<br />
<br />
Avoid consuming residues of antibiotics, veterinary drugs, heavy metals and other non-degrading toxins. According to an analysis of U.S. Food and Drug Administration data by the Johns Hopkins University’s Center for a Livable Future, 80% of all antibiotics sold in 2009 were for use on livestock and poultry [10].<br />
<br />
You seldom get sick from a vegetable but <a href="http://www.webmd.com/food-recipes/food-poisoning/default.htm">food poisoning</a> from Escherichia coli, Campylobacter, Salmonella etc in meat and seafood is not unusual [39].<br />
<br />
<h3>
2. Prevent cancer</h3>
Large studies in England and Germany have shown that vegetarians are about 40% less likely to develop cancer compared to meat-eaters [11][12].<br />
<br />
Vegetarians avoid animal fat linked to cancer and get abundant fiber, vitamins, and <a href="http://en.wikipedia.org/wiki/Phytochemical">phytochemicals</a> that help to prevent cancer. Vegetarians also have a higher level of white blood cells that attack cancer cells [13].<br />
<br />
Several studies published since 1990 indicate that cooking meat creates heterocyclic amines (HCAs) [14] which can cause cancer.<br />
<br />
Residues of <a href="http://www.cancer.ca/en/prevention-and-screening/be-aware/artificial-hormones/?region=on">artificial hormones</a> that are widely used to promote growth in beef cattle, dairy cows and sheep may increase the risk of breast, prostate and colorectal cancer in humans [15],[16].<br />
<br />
<h3>
3. Weight reduction</h3>
A study in 2009 found that vegetarians and vegans had body weights 3% to 20% lower than meat eaters [17].<br />
<br />
Cutting out red meat in general is associated with lower body weight [18],[19].<br />
<br />
<h3>
4. Healthy mind</h3>
Cholesterol is now linked to <a href="http://en.wikipedia.org/wiki/Alzheimer's_disease">Alzheimer’s decease</a> [20],[21]. Plants do not contain cholesterol.<br />
<br />
There is also a trend towards delayed onset of dementia in vegetarians [22].<br />
<br />
<h3>
5. Save the environment</h3>
In Latin America, 20 million hectares of tropical forest have been converted to cattle pasture since 1970. <a href="http://en.wikipedia.org/wiki/Deforestation">Deforestation</a> has had a devastating impact on plant and animal diversity in Latin America [23].<br />
<br />
Pound for pound, beef production generates greenhouse gases that contribute more than 57 times as much to global warming as do the gases emitted from producing potatoes [24].<br />
<br />
According to the United Nations Food and Agriculture Organization (FAO) there are 1.4 billion cattle and 1.1 billion sheep on the planet producing 37% of the total <a href="http://epa.gov/climatechange/ghgemissions/gases/ch4.html">methane generated by human activity</a>. Methane is 20 times more potent at trapping greenhouse gases than carbon dioxide [25].<br />
<br />
In a study in California from 2009 researchers found that a nonvegetarian diet required 2.9 times more water, 2.5 times more <a href="http://en.wikipedia.org/wiki/Primary_energy">primary energy</a>, 13 times more fertilizer, and 1.4 times more pesticides than a vegetarian diet [40].<br />
<br />
An assessment from 2002 in the Netherlands suggests that on average the complete <a href="https://en.wikipedia.org/wiki/Life-cycle_assessment">life cycle environmental impact</a> of nonvegetarian meals may be roughly a factor 1.5–2 higher than the effect of vegetarian meals in which meat has been replaced by vegetable protein [41]. A recent study in the Journal of Climatic Change from 2014 [42] came to just about the same conclusion.<br />
<br />
On average vegetarian diets have an environmental advantage but exceptions may occur. Long-distance air transport, deep-freezing, and some <a href="http://en.wikipedia.org/wiki/Horticulture">horticultural practices</a> may lead to environmental impacts exceeding those for locally produced organic meat. Keep in mind that on a large scale organic meat has higher carbon footprint as it requires more land which means less forest to bind carbon dioxide.<br />
<br />
<h3>
6. Supporting sustainable development</h3>
The rising animal based food intake is related to several global crises such <a href="https://en.wikipedia.org/wiki/Water_scarcity">water</a>, <a href="http://en.wikipedia.org/wiki/Global_warming">climate</a>, and <a href="http://en.wikipedia.org/wiki/World_energy_consumption">energy</a> [26].<br />
<br />
One pound of pork that provides between 1000 and 2000 calories takes 14,000 calories of energy to produce [27].<br />
<br />
Several places on the planet are experiencing a water shortage. The production of meat requires between six and twenty times more water than for cereals [28].<br />
<br />
The increasing global water crisis is already affecting some regions of the world (in 10-20 years the icecaps in the Himalayas will be gone, major source of water for India and China) [29].<br />
<br />
China and India are also booming economies, and their meat and dairy consumption has increased significantly in the last decades. In China the number of adults with more than 10% of their caloric intake from these animal foods increased with 17.6% from 2000 to 2006 [30].<br />
<br />
A growing human population is increasingly relying on unsustainable agricultural practices. As world population approaches nine billion, global food demand is expected to double in the next fifty years [31]. Because of the increased food demand, we as a species run the risk of depleting our natural resources and degrading the environment.<br />
<br />
<h3>
8. Ethics</h3>
Avoid the mass slaughtering of animals for your pleasure. 10 billion land animals were raised and killed for food in the United States in 2010 [32].<br />
<br />
Although direct measurement of subjective experiences or emotions in farm animals is not possible they do feel pain [33]. By reducing your meat intake you decrease the market demand for animal based food. Less demand means less need for factory farming which is often associated with animal cruelty [34].<br />
<br />
<h3>
9. Reduce the effects of aging </h3>
Evidence suggests that eating whole fruits, vegetables, and whole grains, all rich in networks of <a href="http://en.wikipedia.org/wiki/Antioxidant">antioxidants</a>, provides protection against many of these signs of aging [35].<br />
<br />
Antioxidant-rich foods seem to have a protective effect for the skin [36].<br />
<br />
<h3>
7. Save money</h3>
Reduce your future health care costs. The total annual US medical costs attributable to meat consumption have been estimated to something in the order of 30-60 billion $ [37].<br />
<br />
Vegetables can be stored longer before it has to be thrown away and it tends to cost less. Vegetarian meals at restaurants usually cost less than other meat dishes. <br />
<br />
<h3>
10. Smart people tend to become vegetarians</h3>
In a British study of more than 8,000 participants IQ was measured over a period of 20 years starting at age 10. The study showed that higher IQ had a strong correlation with being a vegetarian [38].<br />
<br />
If not science can convince you of cutting down on meat then maybe role models can. Albert Einstein, Sir Isaac Newton, Darwin, Pythagoras, Leonardo Da Vinci, Nikola Tesla and Thomas Edison were all vegetarians.<br />
<br />
<h3>
<span lang="EN-GB">11. (Bonus)
Build personal strength</span></h3>
<div class="MsoNormal">
<span lang="EN-GB">By cutting
down on meat you make a conscious choice. It shows that you care and are
willing to make sacrifices. This helps to build character. By
reducing your meat consumption you will not save the planet but you will improve your health, build </span><span lang="EN-GB">personal </span>integrity and strength, as well as <span lang="EN-GB">contributing to a better world for all</span>. </div>
<br />
<br />
<h2>
References</h2>
[1] Key TJ, Fraser GE, Thorogood M, Appleby PN, Beral V, Reeves G, Burr ML, Chang-Claude J, Frentzel-Beyme R, Kuzma JW, Mann J, McPherson K. (1999) Mortality in vegetarians and nonvegetarians: detailed findings from a collaborative analysis of 5 prospective studies. Am J Clin Nutr. 1999 Sep;70(3 Suppl):516S-524S. PubMed PMID: 10479225.<br />
<br />
[2] Questions and Answers About Dioxins, Interagency Working Group on Dioxin (representatives from the U.S. Environmental Protection Agency, Department of Health and Human Services, Department of Agriculture, Department of Veterans Affairs, Department of Commerce, Department of State, and the White House Office of Science and Technology Policy), October 2004.<br />
<br />
[3] U.S. EPA (Environmental Protection Agency). (2006) An inventory of sources and environmental releases of dioxin-like compounds in the United States for the years 1987, 1995, and 2000. National Center for Environmental Assessment, Washington, DC; EPA/600/P-03/002F. <a href="http://cfpub.epa.gov/ncea/cfm/recordisplay.cfm?deid=159286">http://cfpub.epa.gov/ncea/cfm/recordisplay.cfm?deid=159286</a><br />
<br />
[4] Lindahl O, Lindwall L, Spångberg A, Stenram A, Ockerman PA. (1985) Vegan regimen with reduced medication in the treatment of bronchial asthma. J Asthma. 1985;22(1):45-55. PubMed PMID: 4019393.<br />
<br />
[5] Bakker GC, van Erk MJ, Pellis L, Wopereis S, Rubingh CM, Cnubben NH, Kooistra T, van Ommen B, Hendriks HF. "An antiinflammatory dietary mix modulates inflammation and oxidative and metabolic stress in overweight men: a nutrigenomics approach." Am J Clin Nutr. 2010 Apr;91(4):1044-59.<br />
<br />
[6] Galland L. Diet and inflammation. Nutr Clin Pract. 2010 Dec;25(6):634-40. doi:<br />
10.1177/0884533610385703. Review. PubMed PMID: 21139128.<br />
<br />
[7] Masters RC, Liese AD, Haffner SM, Wagenknecht LE, Hanley AJ. Whole and refined grain intakes are related to inflammatory protein concentrations in human plasma. Journal of Nutrition (J Nutr). 2010 Mar;140(3):587-94. doi: 10.3945/jn.109.116640. Epub 2010 Jan 20. <a href="http://jn.nutrition.org/content/140/3/587.full">http://jn.nutrition.org/content/140/3/587.full</a><br />
<br />
[8] MayoClinic.com; Nutrition and Healthy Eating: Gout Diet; March 2010. <a href="http://www.mayoclinic.com/health/gout-diet/MY01137">http://www.mayoclinic.com/health/gout-diet/MY01137</a><br />
<div>
<br /></div>
<div>
[9] Kidney stones in adults. National Institute of Diabetes and Digestive and Kidney Diseases. <a href="http://kidney.niddk.nih.gov/kudiseases/pubs/stonesadults/index.htm">http://kidney.niddk.nih.gov/kudiseases/pubs/stonesadults/index.htm</a>. Accessed Apr. 18, 2013.<br />
<br />
[10] Johns Hopkins Center for a Livable Future, 2010. New FDA Numbers Reveal Food Animals Consume Lion’s Share of Antibiotics. December 23, 2010. <a href="http://www.livablefutureblog.com/2010/12/new-fda-numbers-reveal-food-animals-consume-lion%E2%80%99s-share-of-antibiotics/">http://www.livablefutureblog.com/2010/12/new-fda-numbers-reveal-food-animals-consume-lion%E2%80%99s-share-of-antibiotics/</a> Accessed Apr. 19, 2013</div>
<div>
<br /></div>
<div>
[11] Thorogood M, Mann J, Appleby P, McPherson K. Risk of death from cancer and ischaemic heart disease in meat and non-meat eaters. Br Med J. 1994;308:1667-1670.</div>
<div>
<br /></div>
<div>
[12] Chang-Claude J, Frentzel-Beyme R, Eilber U. Mortality patterns of German vegetarians after 11 years of follow-up. Epidemiology. 1992;3:395-401. </div>
<div>
<br /></div>
<div>
[13] Malter M, Schriever G, Eilber U. Natural killer cells, vitamins, and other blood components of vegetarian and omnivorous men. Nutr Cancer. 1989;12(3):271-8. PubMed PMID: 2771803.<br />
<br />
[14] Link, Lilli; Potter, J. (2004). "Raw versus cooked vegetables and cancer risk". Cancer Epidemiol Biomarkers Prev 13 (9): 1422–1435. PMID 15342442.<br />
<br />
[15] Yu H, Rohan T. 2000. Journal of the National Cancer Institute. Role of the Insulin-Like Growth Factor Family in Cancer Development and Progression. 92 (18): 1472-1489.</div>
<div>
<br /></div>
<div>
<div>
[16] Hansen M, Halloran, JM, Groth E III, and Lefferts L. (1997) Potential Public Health Impacts of the Use of Recombinant Bovine Somatotropin in Dairy Production. (Prepared for a Scientific Review by the Joint Expert Committee on Food Additives). Consumers Union. </div>
</div>
<div>
<br /></div>
<div>
[17] Rosell M, Appleby P, Spencer E, Key T. Weight gain over 5 years in 21 966 meat-eating, fish-eating, vegetarian, and vegan mean and women in EPIC-Oxford. International Journal of Obesity 2006;30:1389-96</div>
<div>
<br /></div>
<div>
[18] Phillips F, Hackett AF, Stratton G, and Billington D .Effect of changing to a self-selected vegetarian diet on anthropometric measurements in UK adults. Journal of Human Nutrition and Dietetics. 2004; 17(3):249-55.</div>
<div>
<br /></div>
<div>
[19] Rosell M, Appleby P, Spencer E, and Key T. Weight gain over 5 years in 21 966 meat-eating, fish-eating, vegetarian, and vegan men and women in EPIC-Oxford. International Journal of Obesity. 2006; 30(9):1389-96.</div>
<div>
<br /></div>
<div>
[20] Matsuzaki T, Sasaki K, Hata J, Hirakawa Y, Fujimi K, Ninomiya T, Suzuki SO, Kanba S, Kiyohara Y, Iwaki T. Association of Alzheimer disease pathology with abnormal lipid metabolism: the Hisayama Study. Neurology. 2011 Sep 13;77(11):1068-75. doi: 10.1212/WNL.0b013e31822e145d. PubMed PMID: 21911734.</div>
<div>
<br /></div>
<div>
[21] Antoneta Granic, Huntington Potter. Mitotic Spindle Defects and Chromosome Mis-Segregation Induced by LDL/Cholesterol—Implications for Niemann-Pick C1, Alzheimer’s Disease, and Atherosclerosis. PLoS ONE, 2013; 8 (4): e60718 DOI: 10.1371/journal.pone.0060718</div>
<div>
<br /></div>
<div>
[22] Giem P, Beeson WL, Fraser GE. The incidence of dementia and intake of animal products: preliminary findings from the Adventist Health Study. Neuroepidemiology. 1993;12(1):28-36. PubMed PMID: 8327020.</div>
<div>
<br /></div>
[23] Gussow JD. Ecology and vegetarian considerations: does environmental responsibility demand the elimination of livestock?. Am J Clin Nutr; 59(suppl): 1110S-6S. 0.<br />
<br />
[24] Fiala, N. (2009) How meat contributes to global warming: Producing beef for the table has a surprising environmental cost: it releases prodigious amounts of heat-trapping greenhouse gases. Scientific American Magazine, February.<br />
<br />
[25] Fao (Food and agriculture organization). 2011. FaoStat, <a href="http://faostat.fao.org/default.aspx">http://faostat.fao.org/default.aspx</a>.<br />
<br />
[26] Food and Agricultural Organization of the United Nations, Livestock's Long Shadow: Environmental Issues and Options. Rome, Italy Food and Agricultural Organization United Nations2007<br />
<br />
[27] Gussow JD. Ecology and vegetarian considerations: does environmental responsibility demand the elimination of livestock?. Am J Clin Nutr; 59(suppl): 1110S-6S. 0.<br />
<br />
[28] Agriculture, food and water. The world water development report (2003) Natural Resources Management and Environment Department, The United Nations Food and Agriculture Organization (FAO) <a href="http://www.fao.org/docrep/006/Y4683E/y4683e07.htm">http://www.fao.org/docrep/006/Y4683E/y4683e07.htm</a><br />
<br />
[29] Brown LR Plan B 3.0: Mobilizing to Save Civilization. 3rd ed. New York, NY WW Norton 2008.<br />
<br />
<div>
[30] Popkin BM. Will China's nutrition transition overwhelm its health care system and slow economic growth? Health Aff (Millwood). 2008 Jul-Aug;27(4):1064-76. doi: 10.1377/hlthaff.27.4.1064. Erratum in: Health Aff (Millwood). 2008 Sep-Oct;27(5):1485. PubMed PMID: 18607042; PubMed Central PMCID: PMC2447919.</div>
<br />
[31] Lean, Geoffrey, ed. Our Planet special edition: Agriculture and Economic Development. 2007, UNEP: 3-32.: www.unep.org.<br />
<br />
[32] USDA National Agricultural Statistics Service, “Livestock Slaughter 2010 Summary”, April 2011,<br />
<a href="http://usda01.library.cornell.edu/usda/nass/LiveSlauSu//2010s/2011/LiveSlauSu-04-25-2011.pdf">http://usda01.library.cornell.edu/usda/nass/LiveSlauSu//2010s/2011/LiveSlauSu-04-25-2011.pdf</a><br />
<br />
[33] Lynne U. Sneddon and Michael J. Gentle. (1998) Pain in Farm Animals. Roslin Institute, Workshop Series, Animal Welfare, Sustainable Animal Production. <a href="http://agriculture.de/acms1/conf6/ws5apain.htm?&xdocopen=0&xdoc=0,0,0,0,0,0,0#XDOC_01">http://agriculture.de/acms1/conf6/ws5apain.htm?&xdocopen=0&xdoc=0,0,0,0,0,0,0#XDOC_01</a><br />
<br />
[34] Rachel Mathews (2012) HUMANEWASHED: USDA Process Verified Program Misleads Consumers About Animal Welfare Marketing Claims, Animal Welfare Institute. <a href="http://awionline.org/sites/default/files/uploads/documents/fa-humanewashedreportonusdapvp.pdf">http://awionline.org/sites/default/files/uploads/documents/fa-humanewashedreportonusdapvp.pdf</a><br />
<br />
[35] Antioxidants: Beyond the Hype, Harvard School of Public Health Nutrition Source, <a href="http://www.hsph.harvard.edu/nutritionsource/antioxidants/">http://www.hsph.harvard.edu/nutritionsource/antioxidants/</a><br />
<br />
[36] What are the best foods for healthy skin? Lawrence E. Gibson, M.D. Mayo Foundation for Medical Education and Research. <a href="http://www.mayoclinic.com/health/healthy-skin/AN01863">http://www.mayoclinic.com/health/healthy-skin/AN01863</a><br />
<br />
[37] Barnard ND, Nicholson A, Howard JL. The medical costs attributable to meat consumption. Prev Med. 1995 Nov;24(6):646-55. Review. PubMed PMID: 8610089. <a href="http://www.ncbi.nlm.nih.gov/pubmed/8610089">http://www.ncbi.nlm.nih.gov/pubmed/8610089</a><br />
<br />
[38] Gale, C. R., Deary, I. J., Batty, G. D., & Schoon, I. (2007). IQ in childhood and vegetarianism in adulthood: 1970 British cohort study. BMJ, 334(7587), 245-248B, doi: 10.1136/bmj.39030.675069.55<br />
<br />
[39] World Health Organization (2010) General information related to microbiological risks in food. Food safety. <a href="http://www.who.int/foodsafety/micro/general/en/">http://www.who.int/foodsafety/micro/general/en/</a><br />
<br />
[40] Marlow HJ, Hayes WK, Soret S, Carter RL, Schwab ER, Sabaté J. Diet and the<br />
environment: does what you eat matter? Am J Clin Nutr. 2009<br />
May;89(5):1699S-1703S. doi: 10.3945/ajcn.2009.26736Z. Epub 2009 Apr 1. PubMed<br />
PMID: 19339399. <a href="http://www.ncbi.nlm.nih.gov/pubmed/19339399">http://www.ncbi.nlm.nih.gov/pubmed/19339399</a><br />
<br />
[41] Reijnders, L., and S. Soret, 2003: Quantification of the environmental impact of different dietary<br />
protein choices. Amer. J. Clin. Nutr., 78 (Suppl.), 664S–668S<br />
<a href="http://ajcn.nutrition.org/content/78/3/664S.full">http://ajcn.nutrition.org/content/78/3/664S.full</a><br />
<br />
[42] Scarborough, Peter, Appleby, Paul N., Mizdrak, Anja, Briggs, Adam D.M., Travis, Ruth C., Bradbury, Kathryn E., Key, Timothy J. 2014, Dietary greenhouse gas emissions of meat-eaters, fish-eaters, vegetarians and vegans in the UK, Journal of Climatic Change, 10.1007/s10584-014-1169-1, Springer Netherlands.<br />
<br />
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1034092804251778950.post-9200427538486676932013-03-13T21:23:00.000+01:002013-03-17T22:40:30.891+01:00Systems Thinking usage survey 2013 results<h2>
Background </h2>
In August 2010 Ilia Bider posted the following question on LinkedIn; “If System Thinking is such a good method (especially for solving poorly defined problems), why it is not that widespread?”<br />
<br />
Similar questions have been raised several times in the <a href="http://www.linkedin.com/groups?gid=2639211">Systems Thinking World group on LinkedIn</a>.<br />
<br />
In an attempt to move from talking in circles on this topic I developed a survey to get some data that could be used to analyse why Systems Thinking (ST) is not more widespread.<br />
<h2>
Summary of results</h2>
The table below shows the most common answers to the questions of why respondents were not learning more about ST and why they were not using ST more than they already were. These reasons can be seen as key obstacles to the wider adoption of ST. The sample size was 86.<br />
<br />
<table border="1">
<tbody>
<tr><td width="90">Group</td><td>Obstacles in learning about ST</td><td>Obstacles to the use of ST</td></tr>
<tr><td>Non-experts</td><td><ul>
<li>Don't have time.</li>
<li>Poor quality of learning material.</li>
<li>ST has no process or framework so it becomes too abstract and philosophical.</li>
<li>Difficult to understand.</li>
<li>Not convinced it is (more) effective.</li>
</ul>
</td><td><ul>
<li><b>The mainstream is overly focused on short term goals.</b> </li>
<li><b>Don’t know enough about ST. </b></li>
<li><b>Difficult to apply on real world problems.</b> </li>
<li>ST does not match how things are being done in the organization.</li>
<li>Task focus in organizations. No incentives or rewards for using ST. </li>
<li>People do not understand or see the value of ST presentations.</li>
<li>System thinkers do not want to impose their style of thinking on others.</li>
<li>ST is too vague. There are no fixed criteria you can use to tell if you are using it or not. </li>
<li>Managers are not interested in what the ST analysis show. </li>
<li>ST is abstract and ill-defined.</li>
</ul>
</td></tr>
<tr><td>Experts</td><td><ul>
<li>ST is not perceived by peers as professional. </li>
<li>There is no ST diploma or skill level to brag about.</li>
<li>Theoretical disagreements and change.</li>
</ul>
</td><td><ul>
<li>The mainstream is overly focused on short term goals. </li>
<li>Managers are not interested in what the ST analysis show.</li>
<li>System thinkers do not want to impose their style of thinking on others. </li>
<li>Hard to introduce ST because of the dominant linear way of thinking. </li>
<li>ST does not match how things are being done in the organization. </li>
<li>Difficult to communicate.</li>
</ul>
</td></tr>
</tbody></table>
<br />
The summary above is based on the most frequent answers (>10% of responders marked the same checkbox question) and issues that could be identified by grouping similar free text responses.
<br />
<br />
<h2>
Survey method
</h2>
The survey was carried out during February of 2013. We invited participants by using social media and by sending a broadcast e-mail to all members of the <a href="http://www.linkedin.com/groups?home=&gid=2639211&trk=anet_ug_hm&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1">Systems Thinking World LinkedIn group</a>. We encouraged only people who had been introduced to ST to participate.<br />
<br />
At the time of writing 89 responses had been registered. The survey can still be viewed at the following locations:<br />
<table border="1">
<tbody>
<tr><td>Survey form</td><td><a href="http://bit.ly/XPdc6f">http://bit.ly/XPdc6f </a></td></tr>
<tr><td>Automated visual summary </td><td><a href="http://bit.ly/YljT27">http://bit.ly/YljT27 </a></td></tr>
<tr><td>Raw data spread sheet of all responses </td><td><a href="http://bit.ly/Zk4XBE">http://bit.ly/Zk4XBE </a></td></tr>
</tbody></table>
<br />
In the survey we asked questions such as why they did not use ST more often and why they did not learn more about it. The survey did not cover the opposite aspects of why people were using it and why they wanted to learn about it. Our focus was on the obstacles and barriers to the wider adoption of ST.<br />
<br />
There are also topics that could be included but I did not think about during the design. One such topic is the fear of carreer suicide and the undermining of power-holders.<br />
<br />
There were both multiple choice answers and free text fields for respondents to fill out. Google forms were used as the survey engine.
<br />
<br />
<h2>
Issues with the survey design </h2>
The survey did not define ST or what was meant with using ST. This may have led to different interpretations of questions such as “Why do you not use it more often?”<br />
<br />
The definitions of what ST is and what it means to use ST are still heavily debated. It seems that some think of “using ST” as simply having a certain mind-set. Others see it more as using a diverse set of modes of thought and different systems related disciplines for analysis and synthesis, while others tend to see ST more along the lines of a methodology to be used in inquiry and problem solving. These different interpretations of ST have surely influenced what respondents answered on the question “How often do you use Systems Thinking?”<br />
<br />
The use of a Google form as a survey does not exactly meet the highest scientific standards but it was an easy way to get relatively good data.
<br />
<br />
<h2>
Grouping of results</h2>
We have divided all respondents (n=86) into two groups. We call these the “experts” and the “non-experts”. The reason for this separation is that the results from these two groups are quite different and it makes sense to divide into these two groups for later analysis. If we are to answer the question of why ST is not more widely adopted it is more interesting to look at answers from non-experts. The non-experts are those who adopt ST. The experts are instrumental in the adoption.
<br />
<br />
<table border="1">
<tbody>
<tr><td width="90">Group</td><td>Respondents</td><td>Description</td></tr>
<tr><td>Experts </td><td>46 </td><td>Respondents who say they contribute to the field…provide training etc <br />
AND
<br />
Respondents who say they have been following Systems Thinking and related topics for years...
</td></tr>
<tr><td>Non-experts</td><td>40 </td><td>All respondents – Experts.
<br />
<small>People who have no prior knowledge of ST have not been invited and included in the survey results. </small>
</td></tr>
<tr><td>Deleted </td><td>3 </td><td>Empty or invalid response data</td></tr>
<tr><td>Total </td><td>89 </td><td><br /></td></tr>
</tbody></table>
¨
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTEw_jlRuNiavT6YTK7gAwewCjbqcbpDlC_ota2XnBzxeugb6psuwCpwdOuK7sNGplP5AXmA0w_Nryf4ekro-Xetnl7NOWb3OkQGBkZHBozsPLj8PQVBth6T5ml46kzLRSXiK3lNM2GQ/s1600/expert_nonexpert_distribution.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTEw_jlRuNiavT6YTK7gAwewCjbqcbpDlC_ota2XnBzxeugb6psuwCpwdOuK7sNGplP5AXmA0w_Nryf4ekro-Xetnl7NOWb3OkQGBkZHBozsPLj8PQVBth6T5ml46kzLRSXiK3lNM2GQ/s1600/expert_nonexpert_distribution.gif" /></a></div>
<br />
<br />
<h2>
Survey results details </h2>
<h3>
Age profile of respondents
</h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Cuxv2gk8FAalH-T9joPeHopb5hW4JofA9mgIX4uVOeoTcbjfP0jeusRoM-n1sEG8XJwsKIChK8BMSg7Vauvwmk3AjUkrDZlm-BOTK99UqI8xLZDdR-BSYpbhye2n9ySAxOO43vx17g/s1600/age_distribution_nonexperts.gif" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Cuxv2gk8FAalH-T9joPeHopb5hW4JofA9mgIX4uVOeoTcbjfP0jeusRoM-n1sEG8XJwsKIChK8BMSg7Vauvwmk3AjUkrDZlm-BOTK99UqI8xLZDdR-BSYpbhye2n9ySAxOO43vx17g/s1600/age_distribution_nonexperts.gif" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfYM8Se9Q6MosUQC5H1heQGWmmMdGV7TTSRrTYF49vBSCz7NpR9ntutt3XPClNXDYLMd-bAV2areC9nnEQ2_v6w1Qd4k6M3fobn2rnaQjSPvQrRuIAAHN8kX0jUF2HddZK3d8hAsASQA/s1600/age_distribution_experts.gif" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfYM8Se9Q6MosUQC5H1heQGWmmMdGV7TTSRrTYF49vBSCz7NpR9ntutt3XPClNXDYLMd-bAV2areC9nnEQ2_v6w1Qd4k6M3fobn2rnaQjSPvQrRuIAAHN8kX0jUF2HddZK3d8hAsASQA/s1600/age_distribution_experts.gif" /></a>
<br />
<br />
<h3>
Stated frequency of the use of Systems Thinking</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhITkMP4utKgHf5jAjc1moy7VtZnRG5ZtJfVXCdeJVEU2hj7jMjctGo-KroJwLU0o56OQp4Uj4htS0GlY2jQQVlvZBlOj5XsGJIThgYlhF3q9wbMb6dnCvI8ilTHqw4akGnHKFEt_BG-A/s1600/how_often_used.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhITkMP4utKgHf5jAjc1moy7VtZnRG5ZtJfVXCdeJVEU2hj7jMjctGo-KroJwLU0o56OQp4Uj4htS0GlY2jQQVlvZBlOj5XsGJIThgYlhF3q9wbMb6dnCvI8ilTHqw4akGnHKFEt_BG-A/s1600/how_often_used.gif" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div style="clear: both;">
</div>
<h3>
Experts in response to “Why do you not use it more often?”
</h3>
<table border="1">
<tbody>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>The mainstream is overly focused on short
term goals, bottom line and quick wins.</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>9</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>18.4%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>Managers don’t care what my ST shows anyway. They only hear what they
want to hear</b></span></td>
<td align="right"><span lang="EN-GB"><b>5</b></span></td>
<td align="right"><span lang="EN-GB"><b>10.9%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I do not want to impose my style of thinking on others.</b></span></td>
<td align="right"><span lang="EN-GB"><b>5</b></span></td>
<td align="right" class="xl64"><span lang="EN-GB"><b>10.9%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST does not match how things are being done in my organization</span></td>
<td align="right"><span lang="EN-GB">4</span></td>
<td align="right" class="xl64"><span lang="EN-GB">8.7%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is not comprehensive/complete. I can only use it for parts of the
inquiry</span></td>
<td align="right"><span lang="EN-GB">3</span></td>
<td align="right" class="xl64"><span lang="EN-GB">6.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">People do not understand or see the value of my ST presentations</span></td>
<td align="right"><span lang="EN-GB">3</span></td>
<td align="right" class="xl64"><span lang="EN-GB">6.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I feel I don’t know enough about ST</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">You can’t measure its effect.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am rewarded for doing specialized tasks. Not for predicting the
future and pointing out how things may be connected.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am afraid that people will think I am crazy when I show them my
lengthy ST analysis.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is too vague. There are no fixed criteria you can use to tell if
you are using it or not.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I do not want to be looked on as the besserwisser.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl64"><span lang="EN-GB">4.3%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don’t want to think all day long. ST requires too much thinking.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl64"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am not convinced it provides added value for the problems I am
working on.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl64"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST requires a suspension of self-interest. I am not able to push my
interests.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl64"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don’t want to think all day long. ST requires too much thinking.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl64"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20" style="height: 15.0pt;"><span lang="EN-GB">I am just too impatient</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl63"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I find it difficult to apply on real world problems</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl63"><span lang="EN-GB">0%</span></td>
</tr>
</tbody></table>
<br />
32 (70%) of experts say they are using ST as much as they can when they come across situations that warrants its use.<br />
<br />
<h3>
Free text answers from experts on “Why do you not use it more often?” </h3>
<h4>
</h4>
<h4>
Hard to introduce ST because of the dominant linear way of thinking </h4>
<blockquote class="tr_bq">
“…the evaluation community is a tightly knit community that is immersed in the reductive, linear paragdigm – even if you were once part of that community – just talking about ST pushes you out into the periphery to a position of less power and legitimacy, even if you previously had more legitimacy with less professional experience.” </blockquote>
<blockquote class="tr_bq">
“I use it often. But I can say why people surrounding me don’t use it often. They think it’s abstract. It’s not solving problems the way they would like, because they are stuck with the linear model and can’t see the big picture. Not only they can’t see it, they don’t want to see it. Their daily life is based on linear assumptions, and the status quo is what they look for. They are wealthy Swiss people, and are not interested in changing anything around them. It’s understandable. Short term future is all what our brain seems to be programmed for. It needs effort to look further away. ST needs some effort before really grasping its concepts. People are too busy maintaining their achievements – both material and spiritual – to decide to look further away.” </blockquote>
<blockquote class="tr_bq">
“Audience thinks context is irrelevant and are confident in their assumptions, if they even know what they are.” </blockquote>
<blockquote class="tr_bq">
“Until the ‘T’ in ST is expanded to mean modes of thought other than the use Aristotelian logic and Cartesian assumption about the nature of the mind we will make no progress...”</blockquote>
<h4>
Difficult to communicate </h4>
<blockquote class="tr_bq">
“Other people don’t understand it easily and it can be hard to collaborate.”</blockquote>
<blockquote class="tr_bq">
“I use it regularly for my own work and personal life. However, I have trouble explaining it to others.”</blockquote>
<blockquote class="tr_bq">
“If others understood ST better, it would be easier to use more frequently.”</blockquote>
<blockquote class="tr_bq">
“Also, I find that the language of ST is often exclusionary. For our workshops, we've had to make the language of ST more relate-able to our audiences who come from all walks of life and have varying levels of education.” </blockquote>
<h4>
Not seen as important or significant</h4>
<blockquote class="tr_bq">
“Currently it is not a priority at my place of work.” </blockquote>
<blockquote class="tr_bq">
“Others discount its value, saying everything is connected to everything else, so what?“ </blockquote>
<h4>
Time consuming </h4>
<blockquote class="tr_bq">
“It is time consuming to use well. Others are impatient with process analysis.“</blockquote>
<blockquote class="tr_bq">
“Boundary issues are difficult to define.”</blockquote>
<br />
<h3>
Experts in response to “Why are you not learning more about Systems Thinking?”</h3>
<table border="1">
<tbody>
<tr height="20">
<td><span lang="EN-GB"><b>ST is not perceived by my peers as
professional</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>7</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>15.2%</b></span></td>
</tr>
<tr>
<td><span lang="EN-GB">It is difficult to learn about ST. Poor quality or ambiguous learning
material/courses.</span></td>
<td align="right"><span lang="EN-GB">4</span></td>
<td align="right" class="xl65"><span lang="EN-GB">8.7%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">There is no ST diploma or skill level I can brag about.</span></td>
<td align="right"><span lang="EN-GB">4</span></td>
<td align="right" class="xl65"><span lang="EN-GB">8.7%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't have time.</span></td>
<td align="right"><span lang="EN-GB">3</span></td>
<td align="right" class="xl65"><span lang="EN-GB">6.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am not convinced it is more effective than other ways of doing
inquiry.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't feel welcome in the ST community.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST has no process or framework so it becomes too abstract and
philosophical for my taste.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20" style="height: 15.0pt; mso-yfti-irow: 7;">
<td height="20" style="height: 15.0pt;"><span lang="EN-GB">I don't care about systems. I already have enough things to think
about.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am not convinced it is more effective</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I find ST difficult to understand.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't like the ST community.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is not sexy, cool or trendy. (Appealing)</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is boring.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I have little or no use for it.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
</tbody></table>
<br />
23 (50%) of experts say they are in the process of learning more about ST.<br />
<br />
<h3>
Free text answers from experts on “Why are you not learning more about Systems Thinking?” </h3>
<h4>
</h4>
<h4>
Theoretical disagreements and change </h4>
<blockquote class="tr_bq">
“Gets a bit atomistic with people proselytising their favourite words and models and flogging old horses with new names, loosing its pluralistic origins. On the other hand I am learning and advancing the thinking everyday, but it's not the be all and end all.”</blockquote>
<blockquote class="tr_bq">
“I had to create my own interdisciplinary PhD program (2001 to 2005) to learn about ST as part of a health policy and evaluation PhD. Luckily, I had access to some stars in the field - but even they argued with each other a lot, especially about how to use ST and complex systems theory in evaluation. That is continuing to be a big debate!” </blockquote>
<h4>
No community </h4>
<blockquote class="tr_bq">
“Before STW, there wasn't enough group support to motivate continued learned, even from my worldwide network of ST colleagues (who tend to be mere critics and non-joiners)” </blockquote>
<h4>
No best practices for teaching ST </h4>
<blockquote class="tr_bq">
“As a teacher, I find that really good introductory books for non-technical graduate students are rare and many consultants' books tend to be too expensive for use in only 1-2 class sessions within a course. Guidance how to teach ST to others has been difficult to locate. The ST community seems to be insular and focused on talking to each other and the ST past.”</blockquote>
<h4>
Not seen as important or significant by managers</h4>
<blockquote class="tr_bq">
“...no perceived value by the public. This leads mgmt to put roadblocks in the way and substitute bureaucracy like cmmi, agile, and just plan erroneous but popular approaches.“ </blockquote>
<h4>
Too academic </h4>
<blockquote class="tr_bq">
“I would like to say that I think ST has been marketed as a tool for academia, business management and maybe management of governmental agencies. I have done a lot of searching online and there are very few people (online at least) who are trying to give ST tools to non-academic, non-managerial people. I think this is a huge loss and keeps ST stuck in an ivory tower when it should be down on the ground helping with the daily chores. Linda Booth Sweeney is doing an incredible job, teaching children systems thinking...“</blockquote>
<br />
<h3>
Experts in response to “How often do you use Systems Thinking?”</h3>
<table border="1">
<tbody>
<tr height="20">
<td height="20"><span lang="EN-GB">Daily</span></td>
<td align="right" width="64"><span lang="EN-GB">38</span></td>
<td align="right" width="64"><span lang="EN-GB">82.6%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">Once a week</span></td>
<td align="right"><span lang="EN-GB">6</span></td>
<td align="right"><span lang="EN-GB">13.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">Once a month</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">Rarely or never</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">No answer</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right" class="xl65"><span lang="EN-GB">2.2%</span></td>
</tr>
</tbody></table>
<br />
<br />
<h3>
Non-experts in response to “Why do you not use it more often?”</h3>
<table border="1">
<tbody>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>The mainstream is overly focused on short term goals, bottom line and
quick wins.</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>16</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>40.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I feel I don't know enough about ST</b></span></td>
<td align="right"><span lang="EN-GB"><b>15</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>37.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I find it difficult to apply on real world problems.</b></span></td>
<td align="right"><span lang="EN-GB"><b>11</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>27.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I am rewarded for doing specialized tasks. Not for predicting the
future and pointing out how things may be connected.</b></span></td>
<td align="right"><span lang="EN-GB"><b>9</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>22.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>ST does not match how things are being done in my organization.</b></span></td>
<td align="right"><span lang="EN-GB"><b>8</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>20.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>People do not understand or see the value of my ST presentations.</b></span></td>
<td align="right"><span lang="EN-GB"><b>6</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>15.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I do not want to impose my style of thinking on others.</b></span></td>
<td align="right"><span lang="EN-GB"><b>5</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>12.5%</b></span></td>
</tr>
<tr height="20" style="height: 15.0pt; mso-yfti-irow: 8;">
<td height="20" style="height: 15.0pt;"><span lang="EN-GB"><b>ST is too vague. There are no fixed criteria you can use to tell if
you are using it or not.</b></span></td>
<td align="right"><span lang="EN-GB"><b>5</b></span></td>
<td align="right" class="xl66"><span lang="EN-GB"><b>12.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>Managers don't care what my ST shows anyway. They only hear what they
want to hear.</b></span></td>
<td align="right"><span lang="EN-GB"><b>4</b></span></td>
<td align="right"><span lang="EN-GB"><b>10.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am not convinced it provides added value for the problems I am
working on.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right" class="xl65"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I do not want to be looked on as the besserwisser.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is not comprehensive/complete. I can only use it for parts of the
inquiry.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't want to think all day long. ST requires too much thinking.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am just too impatient.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am afraid that people will think I am crazy when I show them my
lengthy ST analysis.</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I am just too impatient</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">You can't measure its effect.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST requires a suspension of self-interest. I am not able to push my
interests.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
</tbody></table>
<br />
30.0% (12/40) of non-experts say they are using ST as much as they can when they come across situations that warrants its use.<br />
<br />
<h3>
Free text answers from non-experts on “Why do you not use it more often?” </h3>
<h4>
</h4>
<h4>
Abstract, vague and ill-defined </h4>
<blockquote class="tr_bq">
“I find my peers surprisingly uninterested, i also find that, similar to sustainability, people have different interpretations and understandings of systems thinking…”</blockquote>
<blockquote class="tr_bq">
“The main reason is that few people are able to grasp it and fewer willing to apply their minds to it.” </blockquote>
<blockquote class="tr_bq">
“I remain to be convinced of the value and credibility of the approach” </blockquote>
<blockquote class="tr_bq">
“Seen as too complex.” </blockquote>
<h4>
Requires buy-in </h4>
<blockquote class="tr_bq">
“Requires a lot of trust that other people/parts of the Organization will buy-in to the approach over the medium to long term.”</blockquote>
<blockquote class="tr_bq">
“Lack of local movement that would give more reason for business to use ST.” </blockquote>
<br />
<h3>
Non-experts in response to “Why are you not learning more about Systems Thinking?”</h3>
<table border="1">
<tbody>
<tr height="20">
<td><span lang="EN-GB"><b>I don't have time</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>9</b></span></td>
<td align="right" width="64"><span lang="EN-GB"><b>22.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>It is difficult to learn about ST. Poor quality</b></span></td>
<td align="right"><span lang="EN-GB"><b>8</b></span></td>
<td align="right"><span lang="EN-GB"><b>20.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I find ST difficult to understand</b></span></td>
<td align="right"><span lang="EN-GB"><b>8</b></span></td>
<td align="right"><span lang="EN-GB"><b>20.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>ST has no process or framework so it becomes too abstract…</b></span></td>
<td align="right"><span lang="EN-GB"><b>6</b></span></td>
<td align="right"><span lang="EN-GB"><b>15.0%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB"><b>I am not convinced it is more effective than other ways of doing
inquiry.</b></span></td>
<td align="right"><span lang="EN-GB"><b>5</b></span></td>
<td align="right"><span lang="EN-GB"><b>12.5%</b></span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">There is no ST diploma or skill level I can brag about</span></td>
<td align="right"><span lang="EN-GB">2</span></td>
<td align="right"><span lang="EN-GB">5.0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I have little or no use for it.</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is not perceived by my peers as professional</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is not sexy, cool or trendy. (Appealing)</span></td>
<td align="right"><span lang="EN-GB">1</span></td>
<td align="right"><span lang="EN-GB">2.5%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't like the ST community.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">ST is boring.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't feel welcome in the ST community.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right" class="xl65"><span lang="EN-GB">0%</span></td>
</tr>
<tr height="20">
<td height="20"><span lang="EN-GB">I don't care about systems. I already have enough things to think
about.</span></td>
<td align="right"><span lang="EN-GB">0</span></td>
<td align="right"><span lang="EN-GB">0%</span></td>
</tr>
</tbody></table>
<br />
57.5% (23/40) of non-experts say they are in the process of learning more about ST.<br />
<br />
<h3>
Free text answers from non-experts on “Why are you not learning more about Systems Thinking?”</h3>
<h4>
</h4>
<h4>
Difficult to use </h4>
<blockquote class="tr_bq">
“It is difficult to start modeling and applying ST to own problem domain even I have read books and articles with clear and good examples.”</blockquote>
<blockquote class="tr_bq">
“Being reminded, or told, how ST could help with particular things I am working on. The provision of a resource that promised to be intellectually exciting and practically helpful might be a prompt. That would be something that explained the principles (and pointed to other sources where they already exist) but then had lots of examples of how you could use it practically in your day to day role as a manager, consultant or whatever.”</blockquote>
<blockquote class="tr_bq">
“I haven't seen practical examples of it being used successfully in everyday business affairs and am not sure what techniques to use when.” </blockquote>
<h4>
Not seen as important or significant </h4>
<blockquote class="tr_bq">
“…It is not that there are reasons not to (boring, not sexy etc.). It is more a question of if and when it rises high up enough the priority, or 'to do', list to actually get done. That's not quite the same as 'don't have time' - there is time, but there are many competing pressures for it.“ </blockquote>
<h4>
No authority on the common place to start learning </h4>
<blockquote class="tr_bq">
“I don't know how to start, what path to follow. How to pick materials to learn from.” </blockquote>
<blockquote class="tr_bq">
“I haven't found a way to actually learn ST. What I started to read wasn't appealing enough to dig into it all”.</blockquote>
<h4>
No community </h4>
<blockquote class="tr_bq">
“I think doing ST together with others (best: interdisciplinary) is a bigger learning experience than trying to figure things out alone. Finding others who are nearby, open and interested to do this together needs some time and luck :)” </blockquote>
<br />
<h3>
Non-experts in response to “How often do you use Systems Thinking?”</h3>
<table border="1">
<tbody>
<tr>
<td><span lang="EN-GB">Rarely or never</span></td>
<td align="right" width="64"><span lang="EN-GB">12</span></td>
<td align="right" width="64"><span lang="EN-GB">30.0%</span></td>
</tr>
<tr>
<td height="20"><span lang="EN-GB">Once a month</span></td>
<td align="right"><span lang="EN-GB">11</span></td>
<td align="right"><span lang="EN-GB">27.5%</span></td>
</tr>
<tr>
<td height="20"><span lang="EN-GB">Once a week</span></td>
<td align="right"><span lang="EN-GB">10</span></td>
<td align="right"><span lang="EN-GB">25.0%</span></td>
</tr>
<tr>
<td><span lang="EN-GB">Daily</span></td>
<td align="right"><span lang="EN-GB">6</span></td>
<td align="right" class="xl65"><span lang="EN-GB">15.0%</span></td>
</tr>
</tbody>
</table>
<br />
<br />
<h3>
Afterword</h3>
With this I hope the survey has given the ST community valuable data for further analysis.<br />
<br />
I hereby encourage you to use the data to come up with solutions to how we can make ST more widespread, as I strongly believe that an appreciation for Systems Thinking among the population would make the world a better place.
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-73529579319764365422012-09-02T14:17:00.000+02:002012-09-02T14:17:50.275+02:00Complex web pages have huge differences in rendering time in different browsersI recently had the task of optimizing HTML for a web application that was getting somewhat slow. <span style="background-color: white;">We were seeing big differences between browsers. Chrome seemed to be exceptionally fast. So I went ahead trying to reproduce this performance issue in order to decide where to go ahead with optimization. </span><br />
<br />
I knew that the web app had lots of nested divs with a lot of inline styling. I was curious to find out what performance penalties this had so I made this client side performance test.<br />
<br />
There's a lot of websites that talk about website optimization and they all say you should minimize the payload that has to go over the wire. I could not find much on the topic of speed when it comes to rendering large HTML documents.<br />
<br />
<b><span style="font-size: large;">Summary of results</span></b><br />
<div>
My tests show that large DOMs with many nested elements (in this case
7381 divs) can have a huge impact on client side performance. Compared to Chrome, IE9 spent 9-25 times longer rendering the exact same page. <br />
<br />
<span style="font-size: large;"><b>The tests</b></span></div>
<div>
I programmatically created 3 html documents; A, B and C. They all have nested divs and some styling. They look something like the grid below. It has 1 big square and inside this square there are 9 squares and inside this there are 9 squares and so on. It goes 4 levels deep <span style="background-color: white;">so there's a total of 7381 divs. Fairly simple HTML document but the DOM is relatively big.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzR1nCPwCkCLV1urAOkIm9a9dhyi8gNS-QyktAaXZ5pbgYPDdEUeSqYicaM9JaKrhsWaA0IC8vyBhgXUgQOy-F7_rnDSm2ttRcg5Ve_UjnTl2UXTYhyB6BBA7Yuodklo8p4BBd6ae0-Q/s1600/domtest_grid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzR1nCPwCkCLV1urAOkIm9a9dhyi8gNS-QyktAaXZ5pbgYPDdEUeSqYicaM9JaKrhsWaA0IC8vyBhgXUgQOy-F7_rnDSm2ttRcg5Ve_UjnTl2UXTYhyB6BBA7Yuodklo8p4BBd6ae0-Q/s320/domtest_grid.png" width="320" /></a></div>
<br />
<br />
Measurements where done using the HTML documents that are linked to blow. The server was located in the same country and the Internet connection where this was carried out was very good. The browser cache was unprimed. All the divs have fixed size so drawing the layout is pretty easy for the browser. There is no need to recalculate and re-position elements as the page is gradually received.<br />
<br />
<b>Test A </b><br />
This document has lots of duplicate inline styles just to create lots of bytesize. Each div looks something like this:<br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;"><span style="background-color: white;"><</span><span class="nodeTag " style="background-color: white;">div</span><span class="nodeAttr editGroup " style="background-color: white;"> <span class="nodeName editable ">id</span>="<span class="nodeValue editable ">d_34</span>"</span><span class="nodeAttr editGroup " style="background-color: white;"> <span class="nodeName editable ">style</span>="<span class="nodeValue editable ">width:34px; height:34px; float:left; dispaly:block; margin:0; padding:0; border:1px solid #FFFFFF; background-color:#bbb</span>"></span><span class="nodeBracket editable insertBefore " style="background-color: white;">...</span></span></blockquote>
<a href="http://roy.lachica.no/big_dom_performance_test/testA.html" target="_blank">Test A document</a> size is 1.1Mb<br />
<table border="1"><tbody>
<tr><td><br /></td><td>IE9</td><td>Chrome19</td><td>FF13</td></tr>
<tr><td>Typical time until received all bytes</td><td>390ms</td><td>330ms</td><td>339ms</td></tr>
<tr><td>Typical time until DomContentLoaded event fired </td><td>2,22s</td><td>411ms</td><td>1,33s</td></tr>
<tr><td>Typical time until OnLoad event fired</td><td>2,43s</td><td>408ms</td><td>1,34s</td></tr>
<tr><td>Time from all all bytes received to onLoad and <span style="background-color: white;">DomContentLoaded</span><span style="background-color: white;"> </span><span style="background-color: white;">event fired</span></td><td>2040ms</td><td>81ms</td><td>1001ms</td></tr>
</tbody></table>
<br />
<br />
<b>Test B </b><br />
This is just the same as A only with all the inline styles moved out to an external css file. Now each div looks like this:<br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;"><</span><span class="nodeAttr editGroup " style="background-color: white; font-family: 'Courier New', Courier, monospace;"><span class="nodeName editable ">id</span>="<span class="nodeValue editable ">d_34</span>" class="lvl2"></span><span class="nodeBracket editable insertBefore " style="background-color: white; font-family: 'Courier New', Courier, monospace;">...</span></blockquote>
<a href="http://roy.lachica.no/big_dom_performance_test/testB.html" target="_blank">Test B document</a> size is 237Kb with an additional 400b CSS file.<br />
<table border="1"><tbody>
<tr><td><br /></td><td>IE9</td><td>Chrome19</td><td>FF13</td></tr>
<tr><td>Typical time until received all bytes</td><td>187ms</td><td>178ms</td><td>195ms</td></tr>
<tr><td>Typical time until DomContentLoaded event fired </td><td>1,02s</td><td>227ms</td><td>366ms</td></tr>
<tr><td>Typical time until OnLoad event fired</td><td>1,18s</td><td>210ms</td><td>457ms</td></tr>
<tr><td>Time from all all bytes received to onLoad and <span style="background-color: white;">DomContentLoaded</span><span style="background-color: white;"> </span><span style="background-color: white;">event fired</span></td><td>993ms</td><td>49ms</td><td>262ms</td></tr>
</tbody></table>
<br />
<br /><b></b>
<b>
Test C</b><br />
This is without any styling at all. Each div looks like this:<br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;"><</span><span class="attribute-name" style="background-color: white; font-family: 'Courier New', Courier, monospace;">id</span><span style="background-color: white; font-family: 'Courier New', Courier, monospace;">="</span><span style="background-color: white; font-family: 'Courier New', Courier, monospace;">d_14</span><span style="background-color: white; font-family: 'Courier New', Courier, monospace;">">...</span><span style="background-color: white; font-family: 'Courier New', Courier, monospace;"> </span></blockquote>
<a href="http://roy.lachica.no/big_dom_performance_test/testC.html" target="_blank">Test C document</a> size is 179Kb.<br />
<table border="1"><tbody>
<tr><td><br /></td><td>IE9</td><td>Chrome19</td><td>FF13</td></tr>
<tr><td>Typical time until received all bytes</td><td>172ms</td><td>130ms</td><td>160ms</td></tr>
<tr><td>Typical time until DomContentLoaded event fired </td><td>468ms</td><td>175ms</td><td>170ms</td></tr>
<tr><td>Typical time until OnLoad event fired</td><td>590ms</td><td>140ms</td><td>253ms</td></tr>
<tr><td>Time from all all bytes received to onLoad and <span style="background-color: white;">DomContentLoaded</span><span style="background-color: white;"> </span><span style="background-color: white;">event fired</span>
</td><td>418ms</td><td>45ms</td><td>93ms</td></tr>
</tbody></table>
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span>
<br />
<b><br /></b>
<b>What does all this mean anyway</b><br />
From the numbers we see that when it comes to comparing browsers, Chrome outperforms the others. IE seems extremely slow when it comes to rendering this particular markup. Although IE9 is credited for being much faster than earlier versions, it is clearly far behind Chrome for this specific test. <br />
<br />
Chrome is particularly fast when it comes to rendering. It only uses about 50ms to render the page which consists of more than 7000 elements. Chrome is faster for all cases (with inline styles, with external css file or even without any styling at all).<br />
<br />
The test also confirms that avoiding inline styles on elements will increase performance considerably. The reason seem to be not just that there is fewer bytes to transfer but that it is easier for the browser to parse the document. <br />
<br />
Please note that our test is not representative for common web pages or for other web pages for that matter. Browsers use different algorithms and techniques for different operations such as receiving, parsing, calculating layout, drawing etc. <br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1034092804251778950.post-58419351109637400732012-08-18T21:45:00.000+02:002014-11-19T18:22:24.428+01:0050 reasons why I don't like SharePoint developmentI was introduced to SharePoint in 2001 when it was called SharePoint Portal Server 2001, codename Tahoe. From time to time I have been put on SharePoint projects but I never came to like it.<br />
<div>
I think I have worked on more than 10 SharePoint projects, some of them fairly big. The last time I used SharePoint was back in 2011 with SharePoint 2010.</div>
<div>
<br /></div>
<div>
This blog post is not intended as an evaluation of SharePoint with a socio-technical economic corporate or whatever perspective. SharePoint might, or might not, be a good choice for your development project. This post is Not about SharePoint as a viable product. This post is solely about what I think about SharePoint as a development platform.</div>
<div>
<br />
Please note that I am talking from my experience as a developer who happen to like simplicity, structure and who cares about usability. What you will find here is simply my personal view of SharePoint development. This is based on doing deep custom SharePoint development, not just configuring out-of-the-box SharePoint sites. Also note that this blog post was written before the release of SharePoint 2013.<br />
<br />
<b>Not just me being an old crank</b><br />
Even prominent people within the .Net community such as Carl Franklin and Richard Campbell openly say what they think of SharePoint. In <a href="http://www.dotnetrocks.com/default.aspx?showNum=734" target="_blank">.Net rocks podcast episode 734</a> Richard Campbell makes the following joke: "<a href="http://s3.amazonaws.com/dnr/dotnetrocks_0734_chris_sells.pdf" target="_blank">The thing about SharePoint is you start on having a problem you think you can solve with SharePoint and then you have two problems.</a>"<br />
<br />
Richard Campbell even goes as far as to say SharePoint makes you cry.<br />
<br />
You'll even find developers of SharePoint at Microsoft out right saying: "<a href="http://codebetter.com/jefferypalermo/2007/09/13/sharepoint-is-not-a-good-development-platform/#comment-1971" target="_blank">It is not, and never will be, a viable developer platform.</a>" <br />
<br /></div>
<div>
<b>The 50 reasons why I don't like SharePoint development and why I'll hopefully never do any more of it:</b></div>
<div>
<ol>
<li>SharePoint kills creativity with its configurations. Flicking on xml/xsl files is not very inspiring.</li>
<li>The backend user interface is mostly not very intuitive. I as a developer don't like to develop systems that suck.</li>
<li>SharePoint as a framework is too big and complex and you never get to feel that you master it all.</li>
<li>The product is pricy and too big so I can't use it for my private projects. That means I will not be able to reuse the skills on my hobby projects.</li>
<li>SharePoint experience has limited transfer value for other type of development projects. </li>
<li>There is usually IT politics involved since it's a big decision to start building the competence and infrastructure. With politics often follow dirty games, power struggles etc.</li>
<li>SharePoint requires lots of training and long-lasting changes in the behaviour of users. This means that you don't get to see the results of your work and how users actually end up using the system. By the time the use of the solution has stabilized you are long gone on other clients, other projects or have left the firm. </li>
<li>Once an organization and the development team has acquired SharePoint licences and competency they tend to reuse SharePoint on other IT projects where SharePoint is not the best fit. SharePoint often becomes <a href="http://www.networkworld.com/news/2010/012710-sharepoint-overkill.html" target="_blank">overkill </a>and results in very large development costs. You as the developer may end up having developed a system that is doomed to fail. </li>
<li>Organizations who have acquired SharePoint for their internal systems often want to reuse the platform for their public facing website to consolidate their infrastructure/licenses. It brings with it a large overhead and the public facing website becomes too complex to manage , maintain and evolve. You as a developer might get stuck doing boring support or very difficult maintenence.</li>
<li>Agile methods can become problematic. SharePoint content types cannot easily be changed once it's in production or even in testing environments. This means projects have to be fairly waterfallish.</li>
<li>Difficult to write unit tests. Poor separation of concerns.</li>
<li>SharePoint version 2010 does not support .Net framework 4.0.</li>
<li>The platform is resource demanding and becomes slow on your dev machine, especially if you have a VM setup.</li>
<li>Debugging is slow. Timeout occurs. When attaching the debugging you'll often hook on the wrong w3wp.exe.</li>
<li>Poor HTML rendered. Takes LOTS of time to customize rendering. </li>
<li>No Asp.Net MVC support (unless you are only using the SharePoint API) .</li>
<li>Heavy frontend html/js/css that runs slowly in the browser. </li>
<li>Lots of XSL files. I never liked XSLT.</li>
<li>Making control adapters is a headache, must deploy but then reactivate web app feature to deploy app_browsers file. compat.browser with control adapters debugging often don't work.</li>
<li>The ghosted/unghosted feature of content types is a big headache. </li>
<li>Some super users will have the rights to change contenttypes, delete site columns, delete or move lists. This is dangerous if you have custom backend code that uses these lists.</li>
<li>Very difficult to investigate content in the database when debugging.</li>
<li>Often you do not need workflow, content approval and document versioning etc. All these things make the solution more complex and you will have to remove or deactivate these things if you don't need them. Scripting removal/deactivation takes time.</li>
<li>Lots of things happening under the hood that is not documented very well. New developers, not familiar with SharePoint will often make bad choices that will be very hard to fix later.</li>
<li>SharePoint requires a lot of competency so you often have persons specializing i various SharePoint fields and often you'll have parts of the IT department that do SharePoint maintenance/operations tasks. This creates dependencies between people and you often get stuck waiting for other persons or departments to deploy or do other development tasks. If the required person or department is unavailable you are of course stuck and you look bad.</li>
<li>Memory leaks are easy to add (although there are tools to find them), App pools regularly crash.</li>
<li>Packaging and deployment is of course different from anything else. Additional competencies needed.</li>
<li>The sheer magnitude of the product is difficult for developers. You'll need different third party tools. All the knowledge required is overwhelming.</li>
<li>When the site goes down or suddenly become slow after an upgrade it is often very difficult to pin-point the error.</li>
<li>The log file (ULS) is always filled with a ton of entries and you have no idea what half of them are. The ULS log is typically 2000 lines long and the error messages are very bad.</li>
<li>The API returns data that are concatenated and needs to be parsed. </li>
<li>Has to run on Windows server. It can run on Windows 7 but not really straight forward to configure your local environment if your team has a good continuous integration setup. </li>
<li>Unpredictable system performance. When you have performance problems and investigate you will often not find the problem because there are just too many moving parts. Suddenly the performance is better. You look at automatic database tuning, at changes in content and changes settings/configurations. You look for memory leaks, do performance testing in the testing environment, restore different versions of the production database, you look at visitor statistics, web server logs, sql logs, application event logs, ULS logs, look at timer jobs, various manual jobs that can have been started, you look at users behaviour during the period, you check automated response testing like Gomez, what's hitting your site, crawlers, what content is being read, when is backup and indexing on the database running. Has the MOSS search crawler been running etc but the problem is often a mix of interrelated issues so it's hard to find by investigating sub systems one after the other.</li>
<li>SharePoint has too many configuration options. An example is regional settings on each site. You might get problems showing dates consistently and not understand why.</li>
<li>Lots of access control and post release configuration required. You'll have to determine what content types, site templates, page layouts, webparts should be allowed to use by who and where.</li>
<li>If you on a page want to hide fields that are empty or add some conditional formatting you'll have to create custom webparts or usercontrols. Webparts that should be hidden in special scenarios requires additional development.</li>
<li>Some out-of-the-box webparts (such as search) creates poor html which makes them harder to style and look a like on different browsers. </li>
<li>Since everything is customizable in SharePoint you end up with less user friendly dialogs. For example if you use a very simple page publishing workflow there are still going to be superfluous user interface elements and interactions that makes it messy for the user. </li>
<li>Ambiguous error messages.</li>
<li>In a script-it-all dev environment you often configure some part of the SharePoint solution and to test it you do a deploy of the entire site by building it from scratch or running some upgrade scripts. You find that the configuration you just wrote did not work for some reason. The scripts takes 20 minutes to run so you spend the rest of the day tweeking the configuration files to get it to work by running the deployment scripts over and over.</li>
<li>Setting up a sitedefinition always seems to be a problem. Settings up a new sitedefinition and configuring what features, page layouts, content types, master pages, welcome page should be used for a site seems like a straight forward job. But this for some reason always fails and you have to modify the configuration and redeploy and redeploy and redeploy until you get it right.</li>
<li>A single typo in a setup config file can destroy your site and will be hard to locate.</li>
<li>You are using a very large platform and you can't just copy one installation to a new site and start from there. </li>
<li>In most cases you will start by reconfiguring the site from scratch. So most of what you do is to write code or configurations to build and deploy your site instead of spending time developing cool features using cool code.</li>
<li>It is difficult to script everything. There are simply to many customizations and configurations that can be done. There is always some manual change that someone forgot to script. </li>
<li>Too many layers of development. In other projects you might just have to copy the entire site, make some adjustments in a few config files, then set up the database and you are good to go. But with SharePoint you will have to write code that builds the things that builds your solution (unless you are doing simple projects using the SharePoint designer). </li>
<li>The whole development process tends to get messy because things are just hard and complicated with SharePoint. </li>
<li>Creating Internet facing websites are difficult because the platform has a lot of overhead. Lots of effort to go around things, removing things and making the site more accessible and faster.</li>
<li>Because SharePoint development is so complex things very often takes more time than estimated so you miss deadlines or have to work overtime. </li>
<li>If you have a SharePoint project with high expectations on visual design, usability or accessibility then you will require designers with good knowledge of SharePoint. This can be hard to come by and/or will require excellent collaboration between developers and designers. Often challenging. </li>
<li>Microsoft usually makes big changes to SharePoint with each new version. If you have not followed best practices you are in for lots of work if you are upgrading in the future. What the best practices are takes time to learn.</li>
<li>The preferred way to store data in SharePoint is with SharePoint lists. If you do not use lists and instead go with separate databases you can end up with a fragmented solution with many databases (SharePoint warranty breach if you meddle with the internal SharePoint databases). If you use SharePoint lists you are likely to run in to issues with the abstraction layers and problems trying to put relational data in lists. </li>
</ol>
</div>
<div>
<b>Further reading</b></div>
<div>
<a href="http://www.cmswire.com/cms/information-management/the-art-of-sharepoint-success-10-reasons-why-sharepoint-projects-fail-012592.php">http://www.cmswire.com/cms/information-management/the-art-of-sharepoint-success-10-reasons-why-sharepoint-projects-fail-012592.php</a><br />
<a href="http://codebetter.com/jefferypalermo/2007/09/13/sharepoint-is-not-a-good-development-platform/">http://codebetter.com/jefferypalermo/2007/09/13/sharepoint-is-not-a-good-development-platform</a><br />
<br />
<br /></div>
Unknownnoreply@blogger.com23tag:blogger.com,1999:blog-1034092804251778950.post-12142012775315603682012-03-08T07:11:00.004+01:002012-07-04T13:57:40.156+02:00Native App or Web App for Mobile?Ok so here's yet another web page on the Native App vs. HTML debate.<br />
Too often I see people making snap decisions without a thorough analysis. So here's another of my blog posts where I attempt to cover all the various factors that should be considered when choosing between a native App or a web based mobile site.<br />
This was written for organisations that don't want to spend the money or time to develop both mobile web apps and native apps. You can of course make both native app and a html web app or mix the two using hybrid approaches such as <a href="http://phonegap.com/" target="_blank">Phone Gap</a> etc. You can also make dedicated web apps for dedicated platforms.<br />
<br />
In the listing below I assume you or your organisations have some experience with web development and you are just considering a native app vs. a general web app. You already have a website designed for desktop. <br />
<br />
<span style="font-size: large;"><b>When to go for a Native App</b></span><br />
<ul>
<li>Users use the app many times a day and need a fast way to start or switch to the app. </li>
<li>You have very high requirements on performance.</li>
<li>You have high requirements on usability.</li>
<li>Your app needs access to device specific hardware and API's such as notifications, calendar, volume controls etc.</li>
<li>You are willing to lose some users (unless you develop both html and native apps for iPhone, Android, Windows, Blackberry etc).</li>
<li>Your app doesn't need to or should not connect to the Internet.</li>
<li>You want to learn Objective-C or other native app programming languages. </li>
<li>Your business model fits well with the monetization model of the App Store, Android market etc. It may be easier to make money off native apps (people tend to pay for apps because it is convenient. It requires close to zero effort to buy an App) </li>
<li>You want yet another channel to be found. (e.g. App store) </li>
<li>You want to use the App in marketing. (Apps are more cool. Few people talk about mobile web apps. People talk about Apps.)</li>
<li>You don't want the clutter that comes with a browser (such as the address and navigation bar).</li>
<li>Native Apps usually work better or feel more stable when the Internet connection is poor. (E.g. when you are on the subway)</li>
<li>You need to hide your code from other developers. (You can't rip html, js and css from a native app)</li>
<li>A native app is usually more secure. (Less data traffic. Less chance of phishing attacks and exposing sensitive information)</li>
<li>You have content you do not want to be copied or ripped. </li>
</ul>
<b><span style="font-size: large;">When to choose a HTML Web App</span></b><br />
<ul>
<li>You need to push updates for the web app often and promptly (AppStore has a slow process)</li>
<li>You don't know who your users are and what devices they will be using. </li>
<li>Your users are coming from random places on the web.</li>
<li>You provide links to other websites. (navigation will feel more natural not having to jump in and out of web and native apps)</li>
<li>You don't know who is going to maintain the app. (If someone else is going to further develop it there is a bigger change that you find the required competence if you go with HTML) </li>
<li>You already have extensive web development knowledge.</li>
<li>You want custom design and branding. (On the web you can make it look however you like)</li>
<li>You want complete control of monetisation, including advertising.</li>
<li>You want to save time by reusing code between various web apps or projects and by reusing open source code and widgets such as sharing buttons, disqus etc.</li>
<li>You want the app to have a long life span. (You don't know what kind of devices and platforms will replace the current. You can be certain that the web will be around for many many years) </li>
<li>You don't want to spend the money (time) to learn and invest in native apps development. </li>
<li>There will be few users. (Little point investing in a new development environment if the App will have only 20 users)</li>
<li>A web app can more easily be used by the disabled (unless you develop a specialized native app targeted towards the disabled) </li>
<li>You want better analytics.</li>
<li>Faster time to market. You don't have time to wait until you have the capability to develop a native app (it might require learning, developing server integration. A web app can often be made with very little effort and can naturally evolve if you have more time later or find that the web app gets popular).</li>
<li>You know that a considerable number of users might not have mobiles that support native apps but might have older web browsers on their phones. </li>
<li>You want to support the development of the free open accessible non-proprietary web.</li>
<li>You don't like the political or socio-economic ramifications of walled gardens such as the App store. </li>
</ul>
<div>
This blog post was written in March 2012. If you are reading this in the future chances are that Web Apps have caught up with Native Apps one many of the their strong points because of HTML5.</div>Unknownnoreply@blogger.com8tag:blogger.com,1999:blog-1034092804251778950.post-23514727992410272622011-09-20T16:40:00.000+02:002013-04-09T07:44:18.494+02:00Experiences with Fuzzzy social bookmarking and ontology creation<a href="http://fuzzzy.com/">Fuzzzy.com</a> is a social bookmarking tool with a twist. It lets users add and share bookmarks but it also has a folktology (mix between folksonomy and ontology) where users can create tags that have meaningful relations between them. Some of the things you can do on fuzzzy.com is to create tags, create tags relations between tags. Vote on relations between tags and between bookmarks and tags. With this voting feature you over time evolve more relevant tag-bookmark and tag-tag relations. <br />
<br />
In this blog post I'll share some of my experiences with folktologies. Unfortunately I don't have an updated scientific study for the fuzzzy.com's folktology so you'll have to do with my personal observations. To learn more about fuzzzy.com and the folktology read my paper <a href="http://roy.lachica.no/docs/TMRA07-RoyLachica-Metadata-Creation-in-Socio-semantic-Tagging-Systems.pdf">Metadata Creation in Socio-semantic Tagging Systems: Towards Holistic Knowledge Creation and Interchange</a>.<br />
<br />
Folksonomies, as we have come to know them on many social media sites, let users create any tag. This tag becomes available to everyone else. An Ontology on the other hand is a set of concepts within a domain, and the relationships between those concepts. Ontologies are the backbone of the Semantic Web so Fuzzzy was a project to see if the imprecise folksonomies could be replaced with more semantic folktologies. Some of the problems with folksonomies are synonyms, ambiguous tags, overly personalised and inexact, homonyms, plural and singular forms, conjugated words and compound words etc [1]. While folksonomies work just fine for a blog, it does not scale as well if semantics is important. As the folksonomy grows it grows into a large flat list of tags where a large percentage of tags just don't make any sense. To fix this problem they usually just show the tags that are used most frequently. <br />
<br />
<b>How the folktology of fuzzzy.com was used</b><br />
A folktology seemed to be a smart use of <a href="http://en.wikipedia.org/wiki/Topic_Maps">Topic Maps</a>. The folktology was seen as a way to make tagging more semantic but here's what happened:<br />
<ul>
<li>Few users created relations between tags.</li>
<li>Few users assigned subject identifiers (needed to tell tags apart or if they represented the same thing) </li>
<li>Few users voted on relations between tags.</li>
<li>Few users voted on relations between tags and bookmarks.</li>
</ul>
<div>
Users did however use tags as if they were folksonomies. Users created both tags and bookmarks and added tags to bookmarks. Tags did have better quality [3] as users could edit tags and make them more consistent. Tags where more intuitive and made more sense when used on bookmarks. Common folksonomy problems such as synonyms, ambiguity, overly personalised, homonyms, plural and singular form tags etc were to a large degree weeded out.</div>
<div>
<br /></div>
I can only speculate on why the new way of using tags (Fuzzzy folktology) was not more adopted. Here's my personal hunches. I don't think there was a single reason but a mix:<br />
<ul>
<li>People did already have a fixed view on how tagging should work and did not care to learn about the other tag features. </li>
<li>People are in a hurry when tagging. They bookmark because thy don't have time to read the webpage. So its very important to be able to add bookmarks quickly and to assign tags just as quick.</li>
<li>Bookmarking is personal even if you use a social service. Every user has their own reasons for saving those particular bookmarks so he or she has no incentives to create an pretty shared ontology/tag network.</li>
<li>The rewards for creating tag to tag relations are perceived as low. Users don't see a direct value. With a built out folktology or semantic network, users can have more relevant bookmarks suggested to them. This is obviously a nice to have feature but it does not justify the work that goes into managing the folktology. </li>
<li>The advanced tagging features becomes overkill and a source for cognitive overload for regular web users.</li>
</ul>
These interpretations are based on typical use of the system. Analyzing this further we begin to see contours of some general underlying issues.<br />
<br />
<b>Problems with a folktology</b><br />
The social and semantic bookmarking service fuzzzy.com has a shared semantic tag set. This introduces several issues in comparison to plain and simple folksonomies. I summarize these issues as context and authority.<br />
<ul>
<li>Who gets to update the individual tags? A tag is shared and reused by all. If a person decides to create a tag, say “vintage furniture” and another person want to use the same tag but would rather have a different description for the tag, or maybe he thinks the tag should have a different name all together. (Language and vocabularies naturally evolve over time). Then what? Who gets to decide? The meaning of a tag all depends on the context of the person. His situation and background will decide what is meaningful to him. No two persons has the exact same context.</li>
<li>For tags to be semantically interoperable it needs to have an addressable identifier (a PSI in Topic Maps jargon) and a particular semiotic meaning attached to the tag. An authority or other entity must make sure the Id and the meaning of the tags are fairly stable. In an open web environment this is not trivial. </li>
<li>One persons definition of a term might be slightly different from the other person because they have different backgrounds. It would not be right to force them to use a definition that does not reflect how they see the world.</li>
<li>What if a tag name is to be changed because language is changing. If it is changed other users might not find what they are looking for. In this case one might present old tag names marked as deprecated etc but it still enforces a new world view onto users. In some cases (maybe on a corporate Intranet) this might be a good thing.</li>
<li>Who will garden and have the last say? What if a user want to delete a semantic tag he has created but this tag have been adopted and used by many other users?</li>
</ul>
Comparing folksonomies and folktologies are not straight forward. In general we can say that a folksonomy provide more serendipity and discovery and the folktology provides more semantics that can be used to provide more relevant or contextual aware content.<br />
<br />
<b>Conclusion</b><br />
An ontology is a generic, commonly agreed upon specification of a conceptualization of a domain [2]. This definition is not compatible with open online social web 2.0 environments where people do not have a shared understanding. This and the above mentioned issues suggest that a folktology such as on fuzzzy.com is best suited for personal use or for coherent teams that have large amount of bookmarks.<br />
<br />
To fix these folktology issues a solution could be to have personal topic maps which overlap with other users topics maps. For this to work with some degree of semanticity you could have subject identifiers for each node or deduce node similarity from looking at naming and nodes close by.<br />
<br />
<b>References</b><br />
<ul>
<li>[1] <a href="http://www.dlib.org/dlib/january06/guy/01guy.html">Folksonomies Tidying up Tags?</a></li>
<li>[2] <a href="http://semais.org/papers/Presentations/Paulheim.pdf">A Formal Ontology on User Interfaces – Yet Another User Interface Description Language?</a><br />
</li>
<li>[3] <a href="http://roy.lachica.no/docs/TMRA07-RoyLachica-Metadata-Creation-in-Socio-semantic-Tagging-Systems.pdf">Metadata Creation in Socio-semantic Tagging Systems: Towards Holistic Knowledge Creation and Interchange</a></li>
</ul>
Unknownnoreply@blogger.com16tag:blogger.com,1999:blog-1034092804251778950.post-63154804154496489092011-09-05T07:06:00.000+02:002011-09-05T07:12:46.153+02:00A Hebbian adaptive semantic triplestoreWhile reading the book; <a href="http://necsi.edu/publications/mtw/">Making Things Work: Solving Complex Problems in a Complex World</a> by Yaneer Bar-Yam and his chapter on networks and collective memory I got the idea to mix <a href="http://en.wikipedia.org/wiki/Hebbian">Hebbian theory</a> with <a href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a>. I have also played with similar thoughts before with Topic Maps technology in my research paper <a href="http://roy.lachica.no/docs/TMRA08-rl2.pdf">Quality, Relevance and Importance in Information Retrieval with Fuzzy Semantic Networks</a>. This time my thoughts were more on adaptive knowledge.<br />
<br />
<b>So here's my idea for a Hebbian triplestore</b><br />
Each triple in the triplestore database has an array of say up to 10 rows. Each array row has a datetime value. When a <a href="http://en.wikipedia.org/wiki/SPARQL">SPARQL</a> query is processed the current date is added to the array as a new row. The array acts a FIFO queue so the first date is removed if the array is full. Whenever more triples are added to the database it checks if the database is full. If it is full it will delete triples that are least used. Whenever the database is not in use it will perform routine checks to find out what triples are least used. The database could then be regularly fed with new triples and it would over time automatically adapt to the domain where it is being used (queried). So the Hebbian adaptive semantic triplestore is a knowledge store that evolves and becomes more relevant in the environment where it is being used.<br />
<br />
Another interesting feature of this triplestore is that it would know what triples are most used. Based on correlation of dates in arrays for triples it can suggest relevant or extended SPARQL queries. Unknownnoreply@blogger.com0