<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4438809425494504865</id><updated>2012-01-20T06:09:00.326+01:00</updated><category term='childhood'/><category term='BASIC'/><category term='Unit testing'/><category term='virtualization'/><category term='education'/><category term='Mocking'/><category term='password change'/><category term='Software Engineering'/><category term='MVC'/><category term='Software Development Culture'/><category term='Selenium'/><category term='IT PRO'/><category term='UI Testing'/><category term='Distributed teams'/><category term='nunit'/><category term='Oracle'/><category term='Watin'/><category term='Eduaction'/><category term='ASP.NET'/><category term='Istra'/><category term='Web Development'/><category term='family'/><category term='Conference'/><category term='brownfield development'/><category term='Presentation'/><category term='Faking'/><category term='Documentation'/><category term='Managment'/><category term='Coding Dojo'/><category term='IT Showoff 2010'/><category term='OpenCoffe'/><category term='Googling'/><category term='MySQL'/><category term='patterns'/><category term='best practices'/><category term='UML'/><category term='Teams'/><category term='Stored Procedures'/><category term='Croatia'/><category term='Java'/><category term='Fun'/><category term='Workplace'/><category term='Zend Studio'/><category term='PHP'/><category term='Overtime'/><category term='arhitecture'/><category term='Agile'/><category term='Database'/><category term='Commodore 64'/><category term='Eclipse'/><category term='Umag'/><category term='HTML'/><category term='Scrum'/><category term='OOP'/><category term='Deadline sprints'/><category term='T-SQL'/><category term='SVN'/><category term='Business meetings'/><category term='.NET'/><title type='text'>My Life As a Developer</title><subtitle type='html'>About me and my life being and working as a software developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>64</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7093722387450624117</id><published>2012-01-12T08:41:00.001+01:00</published><updated>2012-01-12T12:44:34.920+01:00</updated><title type='text'>Another year has passed away</title><content type='html'>&lt;br /&gt;&lt;div class="MsoNormal"&gt;Today is my 31st birthday and exactly one year we havestarted our current project. We are nearing its first major release and areworking around the clock to finish it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;In the last year I’ve gotten some experience in largeproject running with a geographically distributed and culturally diverse team.I’ve also learned some valuable lessons regarding the art and craft of softwareengineering:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Write technical documentation as often aspossible as short and concise as possible, it will save your ass often as notwhen you least expect it&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;You have always the time to unit test andrefactor your code, it will save your ass down the line&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Be open and clear of your expectations, expectto repeat them often and follow back on each critical item&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Love your testers, respect your testers, theyare your most valued and greatest assets which make your life easier and makethe project better&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Know your architecture, plan your architecture,and expect to repeatedly repeat it to others in the team&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -18pt;"&gt;Trust your project manager, he will make yourlife also easier and will make the project better if you let him&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -18pt;"&gt;Trust your team, grow your team , only then yourjob will get tolerable&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Expect to iterate often and always on each itemof your daily job&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;People forget, people are people and aren’tperfect&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&lt;span style="font-family: Symbol;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Trust, respect, understanding go a long waytowards a completed project&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -18pt;"&gt;Discuss issues not people or span wars&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast" style="mso-list: l1 level1 lfo1; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;There is one valuable lessons which I got to understand:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;If someone is a value waste on your project andcontinuously responds negatively to feedback and&amp;nbsp;doesn't&amp;nbsp;grow cut him usswiftly as you would an intruder in your home threatening you and your family becausethat person is doing right that to your project, your team and your self&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;And finally:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo2; text-indent: -18.0pt;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="text-indent: -18pt;"&gt;Time is your most valued commodity, spend itwell, manage it well.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;Find time to read, experiment and learn. Toremain effective you must grow even under the most greatest pressure and timeconstraints.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol; text-indent: -18pt;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="text-indent: -18pt;"&gt;In time of greatest stress and overworking findtime to be with your family because they are your most greatest ally in the faceof adversity and your most greatest support mechanism, if you turn your back onthem they will turn on you.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo2; text-indent: -18.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7093722387450624117?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7093722387450624117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2012/01/another-year-has-pas-away.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7093722387450624117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7093722387450624117'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2012/01/another-year-has-pas-away.html' title='Another year has passed away'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1701897620214739238</id><published>2011-12-14T21:41:00.002+01:00</published><updated>2011-12-16T23:12:29.563+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Coding Dojo Pula "Agile Architecture" Retrospective</title><content type='html'>This was the first time I held the same talk&amp;nbsp;consecutively&amp;nbsp;in two different group. Today I held the "Agile Architecture" talk on the monthly&lt;a href="http://codingdojopula.github.com/" target="_blank"&gt; Coding Dojo Pula&lt;/a&gt; meetup. There was really quite a crowd, eight ten people, all professionals who started asking questions and discussing topics from the start.&lt;br /&gt;I really like when there is an active discussion during a presentation.&lt;br /&gt;From this presentation and the one before I've learned some lessons which I think are worth&amp;nbsp;noting:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stories and concrete examples are worth more then bullet points&lt;/li&gt;&lt;li&gt;Break things into multiple slides with real world examples for each slide&lt;/li&gt;&lt;li&gt;Be funny and open, use&amp;nbsp;allegories&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A couple of slides which I think are the most fun and&amp;nbsp;illustrate&amp;nbsp;the point:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-4NBQrk7UAjM/TukJOEjc6ZI/AAAAAAAACeU/h1gs8RKixwg/s1600/nikola_stjelja_agile_architecture_jeetkunedo_principles_of_software_documentation_writing.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-4NBQrk7UAjM/TukJOEjc6ZI/AAAAAAAACeU/h1gs8RKixwg/s320/nikola_stjelja_agile_architecture_jeetkunedo_principles_of_software_documentation_writing.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ak72wRdhZJo/TukJfE8f_ZI/AAAAAAAACec/9WCUc6-iyys/s1600/nikola_stjelja_agile_architecture_wwii_dday_normandy_principles_of_software_planning.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://2.bp.blogspot.com/-Ak72wRdhZJo/TukJfE8f_ZI/AAAAAAAACec/9WCUc6-iyys/s320/nikola_stjelja_agile_architecture_wwii_dday_normandy_principles_of_software_planning.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only thing I'm sad that no one from the local university deigned to show. Either the talk was to complex or people didn't bother. Really a shame, since we put a lot of effort into marketing the thing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Probably need to&amp;nbsp;schedule&amp;nbsp;somewhere a more basic, begginer level talk.&lt;br /&gt;&lt;br /&gt;EDIT 16.12.2011&lt;br /&gt;Andrej Pintar sent a few of his photos he made at the talk. I'm adding them here to show the mood of the place which really great. On the first photo, on the left me is my colleague from Novatec Dejan Dragaš.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HlW0glqQH9I/TuvB9IDKDOI/AAAAAAAACes/FoNIQg3Wc_E/s1600/IMG_8211.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-HlW0glqQH9I/TuvB9IDKDOI/AAAAAAAACes/FoNIQg3Wc_E/s320/IMG_8211.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-evr3-Ey_WA8/TuvCIf1jM8I/AAAAAAAACe0/AyQNa65gOZg/s1600/IMG_8213.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-evr3-Ey_WA8/TuvCIf1jM8I/AAAAAAAACe0/AyQNa65gOZg/s320/IMG_8213.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1701897620214739238?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1701897620214739238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/12/coding-dojo-pula-agile-architecture.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1701897620214739238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1701897620214739238'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/12/coding-dojo-pula-agile-architecture.html' title='Coding Dojo Pula &quot;Agile Architecture&quot; Retrospective'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-4NBQrk7UAjM/TukJOEjc6ZI/AAAAAAAACeU/h1gs8RKixwg/s72-c/nikola_stjelja_agile_architecture_jeetkunedo_principles_of_software_documentation_writing.PNG' height='72' width='72'/><thr:total>1</thr:total><georss:featurename>Flaciusova, 52100, Pula, Croatia</georss:featurename><georss:point>44.8697193 13.8414046</georss:point><georss:box>44.8247058 13.762440600000001 44.9147328 13.9203686</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2752726662440863204</id><published>2011-12-06T20:58:00.001+01:00</published><updated>2011-12-14T21:26:43.889+01:00</updated><title type='text'>13 IT PRO Agile Architecture Feedback</title><content type='html'>Wow, the "Agile Architecture" talk I held for the &lt;a href="http://www.mscommunity.hr/Event/Detail/3de35727-167d-4bde-ad90-ac7fd70942c6" target="_blank"&gt;13th IT PRO&lt;/a&gt; community meeting in Pula went really well. There were around eight people from all walks (some developers, some IT guys and some unaffiliated students) . The talk lasted around an hour and a half with some talk in the between. For half an hour after the talk we had a discussion around the topic.&lt;br /&gt;It was really&amp;nbsp;wonderful. I got a chance to talk about a topic I really like and meet some new people. To boot I was invited to repeat the same talk on the monthly &lt;a href="http://codingdojopula.github.com/" target="_blank"&gt;Coding Dojo (Pula)&lt;/a&gt; event which will be held on &amp;nbsp;December 14th at 18.30 in the Hacklab club in Rojc.&lt;br /&gt;Some images from the event courtesy of Viktor Ezgeta.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-udmK2Jj0Ayo/TukGdjEB1DI/AAAAAAAACeA/l4xA68KnXG0/s1600/IMG_7371+%25281%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-udmK2Jj0Ayo/TukGdjEB1DI/AAAAAAAACeA/l4xA68KnXG0/s320/IMG_7371+%25281%2529.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eAbXJCSok1U/TukGeiipEII/AAAAAAAACeI/rmp9epWJ2wg/s1600/IMG_7372.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-eAbXJCSok1U/TukGeiipEII/AAAAAAAACeI/rmp9epWJ2wg/s320/IMG_7372.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I would also give thaks to the prof. dr. sc Vanja Bevanda from the University of Pula which kindly encouraged some of her students to attend the talk. I'm really glad I could talk to the student population of Pula and would like really to have more students on my talks.&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2752726662440863204?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2752726662440863204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/12/13-it-pro-agile-architecture-feedback.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2752726662440863204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2752726662440863204'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/12/13-it-pro-agile-architecture-feedback.html' title='13 IT PRO Agile Architecture Feedback'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-udmK2Jj0Ayo/TukGdjEB1DI/AAAAAAAACeA/l4xA68KnXG0/s72-c/IMG_7371+%25281%2529.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4472566624411072093</id><published>2011-11-24T22:47:00.001+01:00</published><updated>2011-11-24T23:26:21.475+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Agile Architecture</title><content type='html'>There are two core principles to architecture in an agile&amp;nbsp;environment&amp;nbsp;which worked for me real good :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Document only small slices of the system one at a time at the time you need them&lt;/li&gt;&lt;li&gt;Be as specific as you need without going into too much details&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A typical business system, one that is software intensive, is a really big and complex. When developing one such system it is&amp;nbsp;impossible&amp;nbsp;to document everything at once. What I do is to create a general corner stone&amp;nbsp;architectural&amp;nbsp;specification that defines the core architectural areas and principles of the system, a reference&amp;nbsp;architecture&amp;nbsp;around everything will be build and then create a series of small architecture documents (Architectural Notes or Memos) which are slices of architecture targeted at a specific system view or functionality which is developed for a first type. Architecture is a generalized specialization so such documents must convein all the information one needs to implement the designed&amp;nbsp;architecture&amp;nbsp;but not specialized too much in order prevent the multiple variants the same architectural areas can have.&amp;nbsp;&lt;/div&gt;&lt;div&gt;It is important not to design to early , but at just the right time. The goal is reduce the amount of time passed between the design creation and the implementation and to focus the architectural effort on the architecture which is need right at this moment of the currently developed sprint.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Designing and documenting and architecture slice is one part of the whole problem, even when you create such a design at the right time with the right amount of detail the majority of the subsequent effort is spent communicating and&amp;nbsp;reviewing&amp;nbsp;the architectural implementation. If the implementation part is done by the architect and the senior team (such as the core of the system) a significant part of the architects effort is spent disemminating&amp;nbsp;through&amp;nbsp;the development team (or teams) the culture and the ideas required by the architecture design.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Software is plastic, and programming is flexible. Event the most pure architecture can be twisted,&amp;nbsp;scratched&amp;nbsp;and mutated in something&amp;nbsp;recognizable. The best way to insure an architecture to survive is to set up much of its essence in code and build tools which&amp;nbsp;guide&amp;nbsp;the developer down to a certain way of solving problems (which has its own problems , which is why architecture should be&amp;nbsp;approached&amp;nbsp;slice by slice and nothing is one hundred percent fixed in stone and unchangeable) and to integrate its core principles&amp;nbsp;into&amp;nbsp;the development culture of the development team which will ensure it gets adopted by every new team member.&lt;/div&gt;&lt;div&gt;Lots of teams make use of the shared tribal team identity as the only reference how things should be done by the project. This practice is spurned by software engineers, and with good&amp;nbsp;reason,&amp;nbsp;because&amp;nbsp;software cannot be developed with tribal memory and shared culture alone, documentation must exists, tests and build tools must exists in order too&amp;nbsp;enhance&amp;nbsp;the human falabilities to which we all are&amp;nbsp;susceptible&amp;nbsp;: short memory,&amp;nbsp;illness, death,&amp;nbsp;holidays&amp;nbsp;and leaving for a better&amp;nbsp;opportunity. In its essence agile development values people over processes and interaction over rules, it doesn't mean no documentation or processes should be in place. We all are humans, and by definition fallible. Agile architecture should strive to reduce the human error by documenting and the essence of small specific slice of the system such as : grid architecture, background process architecture, form&amp;nbsp;architecture, repository architecture, commenting system architecture etc.&lt;/div&gt;&lt;div&gt;Short is better for software developers, people will more eagerly read a ten page document then a one&amp;nbsp;hundred&amp;nbsp;page document. They will read it more often and learn more from it. It is also really easy to communicate a short document then a large one. Also, less errors are introduced in a short design then in a large one.&lt;/div&gt;&lt;div&gt;The agile manifesto reads as follows:&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-center;"&gt;Individuals and interactions&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;over processes and tools&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;Working software&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;over comprehensive documentation&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;Customer collaboration&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;over contract negotiation&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;Responding to change&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: -webkit-center;"&gt;over following a plan&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-center;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-center;"&gt;The agile manifesto clearly indicates that things on the left are more valuable then things on the right, but things on the right have a value. They are second to the things on the left, people have more value to software development over processes and tools, working software is king over documentation. But a balance must be made, without a documentation who will understand what is being developed? Without a set of class diagrams that show the core architecture for a subsystem from top to down and text describing it who will understand the code without someone guiding him through?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-center;"&gt;Each day when I start my work I say to my self :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-center;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Your job is to enable other people to do their job better&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I'm a technician and my focus is technology and the development team that works with it. I'm a software engineer by trade and a craftsman by soul and I really think only three things are important in software development:&lt;/div&gt;&lt;div style="text-align: center;"&gt;working software, people and communication&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;For me agile architecture is that which maximizes those three things.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4472566624411072093?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4472566624411072093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/agile-architecture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4472566624411072093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4472566624411072093'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/agile-architecture.html' title='Agile Architecture'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>Pula, Croatia</georss:featurename><georss:point>44.8697193 13.8414046</georss:point><georss:box>44.7796923 13.6834761 44.9597463 13.999333100000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-361064343781768716</id><published>2011-11-23T21:42:00.001+01:00</published><updated>2011-11-24T22:44:04.223+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='IT PRO'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>13th IT PRO Meetup: Agile Architecture</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://mscommunityhr.blob.core.windows.net/groups-logo/logo_7bfae0b5-1d3d-4e65-ae84-f43530be4be3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://mscommunityhr.blob.core.windows.net/groups-logo/logo_7bfae0b5-1d3d-4e65-ae84-f43530be4be3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;On Monday 29th 2011 at 19.00 o'clock I will hold a talk for the IT PRO User group on the topic of Agile Architecture. This is something I'm&amp;nbsp; very hot for right now since I get to practice it for the last six months on a very large project with a geographically distributed team.&lt;br /&gt;I will focus on my experiences and what worked best and what didn't in order to present a practical take on the topic.&lt;br /&gt;You can register for the event &lt;a href="http://www.mscommunity.hr/Event/Detail/3de35727-167d-4bde-ad90-ac7fd70942c6" target="_blank"&gt;here &lt;/a&gt;, there are only twenty free slots for the talk so please hurry if you want to hear me speak. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-361064343781768716?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/361064343781768716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/on-monday-28th-2011-at-19.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/361064343781768716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/361064343781768716'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/on-monday-28th-2011-at-19.html' title='13th IT PRO Meetup: Agile Architecture'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>Gajeva, Pula, Croatia</georss:featurename><georss:point>44.86292246992775 13.844195008277893</georss:point><georss:box>44.86257096992775 13.843578008277893 44.863273969927754 13.844812008277893</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3302884661209204800</id><published>2011-11-09T22:57:00.000+01:00</published><updated>2011-11-09T22:57:22.047+01:00</updated><title type='text'>ARM Assembly Language</title><content type='html'>I've started reading a great book about the ARM assembly programming language. The book can be found on-line &lt;a href="http://www.peter-cockerell.net/aalp/"&gt;here&lt;/a&gt;&amp;nbsp;and is a web copy of the same book published in 1987.&lt;br /&gt;Why I'm reading this twenty year old book for an assembly no sane .NET or PHP developer heard about (sure someone did, but the meat and bone of the developer population I mingle in cerentanly didn't hear about it)? The reason is really simple.&lt;br /&gt;I need to learn ARM assembly programming so I can understand the code written in my Operating Systems handbook of the undergraduate Computer Science course I enrolled this year. The book is full with ARM assembly examples how different parts of a system function and I really need to know ARM syntax to fully understand the problem space. The book is of course the venerable "&lt;a href="http://www.skriptarnica.hr/opis.aspx?proizvodID=9789531976107"&gt;Operacijski sustavi&lt;/a&gt;" handbook from FER (2011 edition).&lt;br /&gt;It is not a bed book, but its thick with text which sometimes isn't written well (I'm a published fiction author translated in four languages and published on three continents so I know when something isn't written well, mark me) and requires two readings to understand the rich and very complex sentence structure which could be written more simply if the author actually cared about the reader.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3302884661209204800?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3302884661209204800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/arm-assembly-language.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3302884661209204800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3302884661209204800'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/11/arm-assembly-language.html' title='ARM Assembly Language'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4631306733231649788</id><published>2011-10-22T22:50:00.000+02:00</published><updated>2011-10-22T22:50:56.675+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Overtime'/><title type='text'>Overtime, dear overtime</title><content type='html'>Everybody knows that gut wrenching feeling a person feels when he or she is told to work some overtime, expeciality if its for an undefined period of time. You, me , everyone had that feeling at some point or other. Overtime is often, and justly, negatively perceived in our industry. Yeah, you ship the product on time the client is happy, the management is happy, all those nifty forms and grids are visible and working (sort of) and the load of defects and technical debts lurking underneath are just ready to pup some one sits the next day on the product to test it.&lt;br /&gt;&lt;div&gt;I'm working on a large project. And I had to do large amount of overtime on it. The deal was that the majority was applied voluntary during the time the majority of the team (around eight people) were working normal hours. And I felt really great about that. I had time to refactor several times the code a wrote (I was working on the core of the middle tier system so my refactoring paid several time since we had afterwards a really small amout of defects on the core of the system) , I created Architectural Notes for system features I wouldn't have the time to do during my regular hours, I wrote unit tests and developed system features which were badly needed on the project and I grew and improved my self, the project grow and my company grew and it was all voluntary on my own time and my own&amp;nbsp;schedule. I had time for my regular job, my family and my voluntary overtime.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4631306733231649788?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4631306733231649788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/10/overtime-dear-overtime.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4631306733231649788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4631306733231649788'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/10/overtime-dear-overtime.html' title='Overtime, dear overtime'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3994974485116612014</id><published>2011-10-19T22:51:00.000+02:00</published><updated>2011-10-19T22:51:08.993+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Chicken and Pigs, a chicken perspective</title><content type='html'>&lt;div style="background-color: transparent;"&gt;&lt;span id="internal-source-marker_0.9227247766684741" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I was reading the Scrum guide earlier today and I've read the "Chicken and pig" story. I wasn't a new story for me since I've read it a few years earlier when I first encountered Scrum (I'm just refreshing my memory). For a long time since that first reading I tought and talked about as envisioning my self in the role of the Pig, as someone who is commented to the project and how I should not allow chickens to dictate the way the project is developed (to some degree, even chickens have their powers to make things happen). But what if I'm the chicken on some project? How should I behave?&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I think respect is the most important thing. When I'm a chicken I should respect the Pigs work and try to help them in the way they will let me without causing problems for them now or down the road. It is easy for chickens to say things, but is hard pigs to live with them.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3994974485116612014?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3994974485116612014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/10/chicken-and-pigs-chicken-perspective.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3994974485116612014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3994974485116612014'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/10/chicken-and-pigs-chicken-perspective.html' title='Chicken and Pigs, a chicken perspective'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6250043778162672773</id><published>2011-09-29T12:32:00.001+02:00</published><updated>2011-09-29T12:33:20.386+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='password change'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='SVN'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend Studio'/><title type='text'>How to change SVN password in Zend Studio or Eclipse</title><content type='html'>The intertnet is full of blog posts how to change the SVN password in Eclipse or Zend Studio. Unfortunatelly nothing I found on the interet worked. I've deleted the eclipse .keyring file and deleted the svn.auth folder.&lt;br /&gt;Suprisingly the solution is really simple:&lt;br /&gt;&lt;br /&gt;1. Change the perspective to "SVN Repository Explorer".&lt;br /&gt;2. On the repository list right-click on the repository and then click on "Location properties..."&lt;br /&gt;&lt;br /&gt;Thats it!&lt;br /&gt;&lt;br /&gt;A dialog will popup, and right on the first popup you can change your SVN username/password combo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6250043778162672773?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6250043778162672773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/09/how-to-change-svn-password-in-zend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6250043778162672773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6250043778162672773'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/09/how-to-change-svn-password-in-zend.html' title='How to change SVN password in Zend Studio or Eclipse'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1039123921969941592</id><published>2011-07-16T18:13:00.000+02:00</published><updated>2011-07-16T18:13:05.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Distributed teams'/><title type='text'>Working with a distributed team</title><content type='html'>I'm currently working as a technical lead on project with a distributed team. It is not the first time I'm working with a distributed team, but it is a the first time the team is so big. We currently have people working in five cities&amp;nbsp;across&amp;nbsp;three countries :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Labin, Croatia&lt;/li&gt;&lt;li&gt;Pula, Croatia&lt;/li&gt;&lt;li&gt;Slavonski brod, Croatia&lt;/li&gt;&lt;li&gt;Beograd, Serbia&lt;/li&gt;&lt;li&gt;Skoplje, Macedonia&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;You'd think it would be hard to work with such a distributed team, which totals up to ten involved people but it is not.&amp;nbsp;&lt;/div&gt;&lt;div&gt;I really takes a lot of communication, some organization and proper tools. The two basic tools are :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Skype&lt;/li&gt;&lt;li&gt;Teamveiwer&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There are two types of skype communication : written and verbal. The written communication is for large meetings and team notices. We have created a team chat where all team&amp;nbsp;members&amp;nbsp;can share information and where all the big meetings occur.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The most important meeting is the daily standup which is done exclusively in written form and can be done in under ten minutes. The trick is for each participant to write her daily report five minutes before the meeting (which is at 9.00 o'clock each day). The report is written using this format:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;YESTERDAY:&lt;/div&gt;&lt;div&gt;- #1 thing done yesterday&lt;/div&gt;&lt;div&gt;- #2 thing done yesterday&lt;/div&gt;&lt;div&gt;- #3 thing done yesterday&lt;/div&gt;&lt;div&gt;etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TODAY:&lt;/div&gt;&lt;div&gt;- #1 thing will do today&lt;/div&gt;&lt;div&gt;- #2 thing&amp;nbsp;will do today&lt;/div&gt;&lt;div&gt;- #3 thing&amp;nbsp;will do today&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ISSUES:&lt;/div&gt;&lt;div&gt;- issue #1&lt;/div&gt;&lt;div&gt;- issue #2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This enables us to track the project progress, to catch early important issues and problems. The team&amp;nbsp;stand-up&amp;nbsp;is usually followed by an hour and a half of one on one vocal meetings where those daily issues are addressed and solved or kicked up the ladder.&lt;/div&gt;&lt;div&gt;Team&amp;nbsp;viewer&amp;nbsp;is another great tool, it works both on windows and linux (which is great since we have both in our team) and enables one or more people to virtually sit at the same machine and work&amp;nbsp;which&amp;nbsp;is great for doing problem solving, peer reviews and distributed pair programming.&lt;/div&gt;&lt;div&gt;One great tool I discovered is the Architectual memo or note, which is a sketch with UML diagrams and some text describing a&amp;nbsp;architectural&amp;nbsp;solution of a part of the application (Grid system, Form system,&amp;nbsp;auto-complete&amp;nbsp;system etc). It takes me about and hour or two to write once I get the idea right and then I can send it to a team mate discuss it with her and then watch it being built.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1039123921969941592?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1039123921969941592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/07/working-with-distributed-team.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1039123921969941592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1039123921969941592'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/07/working-with-distributed-team.html' title='Working with a distributed team'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1443277174964207564</id><published>2011-03-03T22:51:00.000+01:00</published><updated>2011-03-03T22:51:01.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>Night time shadows on open sand</title><content type='html'>I feel as in a sex fevered pipe dream of polarized dragons chasing mind shadows across a digital horizont of&amp;nbsp;conflicting&amp;nbsp;diagrams and clashing systems.&lt;br /&gt;My mind is playing depth perception dreams on me. Hand quivering,&amp;nbsp;extended&amp;nbsp;forwards, I cannot grasp what is in&amp;nbsp;from&amp;nbsp;of me. It is as if its beyond and the&amp;nbsp;across&amp;nbsp;my terrestrial self at the same time, as if it started leaving in an non-euclidean&amp;nbsp;space time&amp;nbsp;continuum, where regular rules of out earthly domain do not matter as innocence proves nothing in a gaming future of constant,&amp;nbsp;hateful&amp;nbsp;warfare.&lt;br /&gt;It is the day of surprises and ending and endless driving&amp;nbsp;across&amp;nbsp;the bare Istrian wasteland of rolling hills and&amp;nbsp;idyllic, void filled, villages and townships.&lt;br /&gt;After&amp;nbsp;two hundred&amp;nbsp;and some kilometers I can proudly and tiredly say that I had three presentations today in two different counties in two different regions and two different towns.&lt;br /&gt;The first two were an introduction in Functional testing of web applications with Selenium 1.0 and a sneak peak of the web driver run Selenium 2.0 (which I wrote in Java on Ubuntu). The second was a more advanced presentation of the same topic where I've generated .NET unit test form Selenium IDE and then executed them inside&amp;nbsp;MonoDevelop&amp;nbsp;again on Ubuntu with NUnit and the test worked. Yey me.&lt;br /&gt;The third presentation was the most taxing of all. In Rijeka for the monthly SQL/Dev user group meeting at the Maritime University of Rijeka I've held an&amp;nbsp;introductory&amp;nbsp;session about WCF RIA Services. In all I think the sessions went well. I've made some mistakes with my slides which I will correct for next time and the low point was my virtual machine which literally broke and wouldn't function right so my code example didn't really show in good light.&lt;br /&gt;There was around twenty people in the room and I had a really good time. I've held a mixed presentation where I talked from slide and draw ad hoc UML diagrams on a chalkboard with sliding panels. I've talked with the audience and there was really a lot of questions which I really liked.&lt;br /&gt;Latter we went to an old fashioned, communist style, drinking place where we had a blast talking with each other.&lt;br /&gt;So long my dear fellows, sleep awaits my tired, tired mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1443277174964207564?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1443277174964207564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/03/night-time-shadows-on-open-sand.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1443277174964207564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1443277174964207564'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/03/night-time-shadows-on-open-sand.html' title='Night time shadows on open sand'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3007784792876205685</id><published>2011-02-20T12:43:00.000+01:00</published><updated>2011-02-20T12:43:09.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>So long .NET</title><content type='html'>Its been a long time since I've written something here. A lot has changed since my last post. It was generally personal stuff that occupied my mind during that time. Business wise nothing new on the horizon.&lt;br /&gt;I've started learning Java again. It is a long time dream of mine to be a Java developer and since I'm about making significant changes in my life I decided to follow my dream.&lt;br /&gt;.NET is a great and cool platform. The IDE is fantastic and the speed the framework &amp;nbsp;is progressing is astounding with the barrage of cool stuff is overwhelming. Recently I've learned WPF, Silverlight, RIA Services and Entity Framework. All cool stuff. But what always bugged my Mikes software it is that you need a whole lot of cash to develop and deploy your solution.&lt;br /&gt;I've always been an open source enthusiast. The ability to develop software with free tools always sided good with my 'have not' upbringing.&lt;br /&gt;So I started relearning Java. And its is progressing really smooth for now since the syntax is so similar to .NET.&lt;br /&gt;On the other note I will conduct a RIA Services for begginers presentation in Rijeka (Pomorski fakultet) on the March 3rd at 17.45.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3007784792876205685?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3007784792876205685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/02/so-long-net.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3007784792876205685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3007784792876205685'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2011/02/so-long-net.html' title='So long .NET'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8330395109622863478</id><published>2010-11-02T21:51:00.000+01:00</published><updated>2010-11-02T21:51:28.143+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>Project learning and Book learning smackdown.</title><content type='html'>During my carreer as a developer I came to realize the learning benefits one gets from doing projects, e.g. solving real life project and the benefits one gets from applying structured learning practices when learning a topic.&lt;br /&gt;Let me explain how I learn first.&lt;br /&gt;Generally once or twice a year I make a sorted list of technologies or topics I'm interested in learning. The topics are sorted by priority and how hard are they to learn. And then I start learning those technologies by moving from he the first item on the list to the last.&lt;br /&gt;When I've picked up a technology to learn I usually by a book or two about it and then I start reading the book while sitting on my computer and working all code examples. This takes a lot of time since I work full time and also have a family but it gives me hand on experience with all aspects of a technology. Unfortunatelly this only gives me some experience, not true proficiency. True proficiency comes form working six months or more in a technology solving real life problems and learning how the technology works in the field, what are its problems and what are the best patters for its utilization.&lt;br /&gt;Projects are really good at being proficient with common tasks in a technology, but do not delve deep in all use cases and technological aspectes of a specific software solution being applied. In some cases I relied only on my project learning to get a grasp on a technology and came completely stack when faced with something new and different for which I didn't have the necessary theoretical background which I would had if I took the time to learn the technology properly.&lt;br /&gt;With book learning I get a real good foundation in a technology but lots of it I don't get to use during the technology life time, so the learning effort is kinda wasted since I don't get to use directly that knowledge practically. On the other side the wide knowledge base usually gets me pretty fast out of tight spots others find impossible to surpass.&lt;br /&gt;In my opinion in order to be a good sofware developer one must do both types of learning :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project learning , learning a technology by doing a project in it.&lt;/li&gt;&lt;li&gt;Book learning, learning a technology by following a structured learning mechanism such as a book or reference manual.&lt;/li&gt;&lt;/ul&gt;The real trick is to find a balance between both.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8330395109622863478?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8330395109622863478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/11/project-learning-and-book-learning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8330395109622863478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8330395109622863478'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/11/project-learning-and-book-learning.html' title='Project learning and Book learning smackdown.'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8874703837096834798</id><published>2010-10-31T12:37:00.000+01:00</published><updated>2010-10-31T12:37:18.698+01:00</updated><title type='text'>Model/UI Model/UI Controler javascript patter in short</title><content type='html'>I've watched today an interesting presentation about functional design patters and I wanted to share it with you my dear and loved reader. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/Functional-Design-Patterns"&gt;http://www.infoq.com/presentations/Functional-Design-Patterns&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Functional programming and functional languages started interesting my from the moment I grokked Javascript. Javascript is an interesting language that blends, in my opinion, good sides from both the object oriented paradigm and the functional paradigm.&lt;br /&gt;&lt;br /&gt;Lets face it. Javascript is used mostly for dynamic GUI's on the web and on the mobile platform. User interface events are behavior(action oriented) and the functional style of programming can be very useful in such and environment with some good speed gains. But also the DOM or the UI is an object rich environment , full of entities, relations and etc. Not to mention custom POJSO's (Plain Old Javascript&amp;nbsp; Object) indicating&amp;nbsp; varius states our screen can take or coordinating the behavior of other objects in the same screen.&lt;br /&gt;&lt;br /&gt;I generally do something like this. First I define my screen entities, those objects that correspond to specific entities which live happily on my screen:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;function Person(name, age, sex)&lt;br /&gt;{&lt;br /&gt;  this.Name = name;&lt;br /&gt;  this.Age = age;&lt;br /&gt;  this.Sex = sex;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will then link those two entities to corresponding UIEntities. UIEntities are those POJSO's that group a set of DOMElements and coordinate their UI logic in respect to the current state of the associated Entity object. &lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;function PersonUIModel(element,person)&lt;br /&gt;{&lt;br /&gt;    this.Element= element;&lt;br /&gt;    this.Name = this.Element.find("input.person-name");&lt;br /&gt;    this.Age = this.Element.find("input.person-age");&lt;br /&gt;    this.Person = person&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;PersonUI.prototype = {&lt;br /&gt;  validateRequired:function(textBox)&lt;br /&gt;  {&lt;br /&gt;      if (textBox.val()=="")&lt;br /&gt;      {&lt;br /&gt;         textBox.css('border','1px solid red');&lt;br /&gt;         return false;&lt;br /&gt;      }&lt;br /&gt;     &lt;br /&gt;      textBox.css('border','');&lt;br /&gt;      return true;    &lt;br /&gt;  },&lt;br /&gt;&lt;br /&gt;  Bind:function()&lt;br /&gt;  {&lt;br /&gt;     var object = this;&lt;br /&gt;     //Populate values&lt;br /&gt;     object.Name.val(object.Person.Name);&lt;br /&gt;     object.Age.val(object.Person.Age);&lt;br /&gt;     &lt;br /&gt;     //Bind events&lt;br /&gt;     object.Name.change(function(e){&lt;br /&gt;        if (!object.validateRequired(object.Name)) return;&lt;br /&gt;        object.Person.Name = object.Name.val();&lt;br /&gt;     });&lt;br /&gt;     &lt;br /&gt;     object.Age.change(function(e){&lt;br /&gt;        if (!object.validateRequired(object.Age)) return;&lt;br /&gt;        object.Person.Age= object.Age.val();&lt;br /&gt;     });&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The previous code piece needs some explanations. First for everything UI related I use &lt;a href="http://www.jquery.com/"&gt;JQuery&lt;/a&gt;, so all examples here that touch the DOM will make use of its innate capabilities. &lt;br /&gt;The constructor of the PersonUIModel object gets two values an JQuery object named Element which corresponds to the actual HTML rendered with the page and attached to the PersonUIModel for controlling. The second argument is the actual Person entity binded to the HTML through the PersonUIModel object. &lt;br /&gt;For ease of use I've extracted the two actual controls I'll need in separate fields of the PersonUIModel object. &lt;br /&gt;The Bind method is used to start the actual two-way databinding between the Person entity and the HTML associated with the PersonUIModel object. Nothing fancy here except for two things. &lt;br /&gt;Just on the start of the Bind method the this indentifier is associated with the object variable. This is done because of the change handlers latter in the code the context of their anonymous methods relies on the PersonUIModel object. If I would make a call like this in the Age.change event handler :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;this.Age.change(function(e){&lt;br /&gt;        if (!this.validateRequired(this.Age)) return;&lt;br /&gt;        this.Person.Age= this.Age.val();&lt;br /&gt;     });&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I would receive a nice, fat, juicy error indicating the the validateRequired function doesn't exits on the DOMElement. The 'this' inside the event handler actually points to the textbox associated with the Person.Age property (not the JQuery object but the actual DOMElement). But with the power of closures I magically convert my PersonUIModel 'this' to object (or any other variable name) and everything is fine).&lt;br /&gt;The PersonUIModel objects binds to a html code like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class='person'&amp;gt;&lt;br /&gt;Name: &amp;lt;input class='person-name' type='text' /&amp;gt;&lt;br /&gt;Age: &amp;lt;input class='person-age' type='text' /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now we are left with the question who creates the PersonUIModel instance and binds it to a Person instance and the related HTML code. This is the role of the PeopleUIControler a specific class that coordinates the lifecycle of PersonUIModels. &lt;br /&gt;The PeopleUIControler has the following roles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finding or creating the appropriate DOMElements on the Screen.&lt;/li&gt;&lt;li&gt; Loading and Saving Person models.&lt;/li&gt;&lt;li&gt;Binding Person models to DOMElements through PersonUIModel instances.&lt;/li&gt;&lt;/ul&gt;This means the the Person model is totally decoupled from the UI in which it is located. The PersonUIModel knows only of its little piece of HTML code and its Person model and nothing else. This means that the PersonUIModel doesn't know about other PersonUIModel's on the screen nor does it have any impact on the HTML outside its little realm.&lt;br /&gt;&lt;br /&gt;The PeopleUIControler will look like this:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;function PeopleUIControler()&lt;br /&gt;{&lt;br /&gt;      this.People = [];&lt;br /&gt;      this.PeopleUI = [];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;PeopleUIControler.prototype = {&lt;br /&gt;  btnSave: null,&lt;br /&gt;  btnLoad: null,&lt;br /&gt;  pnlPeople: null,&lt;br /&gt;  Load:function(){&lt;br /&gt;      //Ajax loading ... loads a bunch of Person entities&lt;br /&gt;      this.People = bunchOfPersonEntitesLoadedThroughAjax;&lt;br /&gt;  },&lt;br /&gt;&lt;br /&gt;  Save: function(){&lt;br /&gt;     for(var i=0;i &amp;lt; this.People.length;i++)&lt;br /&gt;     {&lt;br /&gt;         var person = this.People[i];&lt;br /&gt;         //Save the person through AJAX&lt;br /&gt;         //....&lt;br /&gt;     }&lt;br /&gt;  },&lt;br /&gt;  Bind:function(){&lt;br /&gt;     var object = this;&lt;br /&gt;&lt;br /&gt;     this.pnlPeople=$('.panel-people');&lt;br /&gt;&lt;br /&gt;     this.btnSave=$('.person-save');&lt;br /&gt;     this.btnSave.click(function(e){&lt;br /&gt;        object.Save();&lt;br /&gt;     });&lt;br /&gt;&lt;br /&gt;     this.btnLoad=$('.person-load');&lt;br /&gt;     this.btnLoad.click(function(e){&lt;br /&gt;        object.Load();&lt;br /&gt;     });&lt;br /&gt;&lt;br /&gt;    //Load entities synchronously (just for the sake of the argument)&lt;br /&gt;    this.Load();&lt;br /&gt;&lt;br /&gt;    var html="&amp;lt;div class='person'&amp;gt;&lt;br /&gt;Name: &amp;lt;input class='person-name' type='text' /&amp;gt;&lt;br /&gt;Age: &amp;lt;input class='person-age' type='text' /&amp;gt;&amp;lt;/div&amp;gt;";&lt;br /&gt;&lt;br /&gt;    for(var i=0;i &amp;lt; this.People.length;++){&lt;br /&gt;      var personUI = new PersonUI($(html), this.People[i]);&lt;br /&gt;      personUI.Bind();&lt;br /&gt;      this.PeopleUI.push(personUI);&lt;br /&gt;&lt;br /&gt;      this.pnlPeople.append(personUI.Element);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The code for the PeopleUIControler is similar to that of the PersonUIModel. The controled has two methods Load and Save for loading and saving Person entities to a permanent source and a Bind method which binds all elements.  The PeopleUIControler ties it self to an html structure that sports a panel for PersonUIModels and two buttons one for loading and saving. When first loading PersonUIModels each model is binded to a generated piece of html and then the same html is appended to the PeopleUIControler panel. The final html code used by the PeopleUIControler would look like this: &lt;code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class='panel-people'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;button class='person-save'&amp;gt;Save&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;button&amp;gtload&amp;lt;="" &amp;lt;="" button&amp;gt;="" class="person-load" div&amp;gt;=""&amp;gt;&amp;lt;/button&amp;gt&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8874703837096834798?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.infoq.com/presentations/Functional-Design-Patterns' title='Model/UI Model/UI Controler javascript patter in short'/><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8874703837096834798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/10/modelui-modelui-controler-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8874703837096834798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8874703837096834798'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/10/modelui-modelui-controler-javascript.html' title='Model/UI Model/UI Controler javascript patter in short'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1908602642562171988</id><published>2010-10-24T16:33:00.000+02:00</published><updated>2010-10-24T16:33:41.243+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Went to Zagreb and maybe lived to tell the tale</title><content type='html'>I went to Zagreb today with my colleague&lt;a href="http://www.hudosvibe.net/"&gt; Hrvoje Hudoletnjak&lt;/a&gt; to the monthly &lt;a href="http://www.webug.com.hr/"&gt;WebUG&lt;/a&gt; meeting. There were two topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lightswitch by Gjuro Kladarić, FFZG&lt;/li&gt;&lt;li&gt; Hybrid Mobile Applications by Matija Šmalcelj, Pet minuta &lt;/li&gt;&lt;/ul&gt;I was really excited to go there. It was an opportunity to learn and to network with some like minded people over the mountain (Istra where I live is separated from the rest of Croatia by a mountain named Učka).&amp;nbsp; &lt;br /&gt;What I was looking for is more Lightswitch education. I just started some Silverlight development my self and the idea of Lightswitch intrigued me. There are a lot of applications being developed in pure code today which could just easily be developed by a Lightswitch-like tool.&lt;br /&gt;&lt;br /&gt;In my opinion developers tend to be to high horse about development practices and techniques. The majority thinks if something wasn't developed in pure code, using the hottest techniques and frameworks its something to keep quiet at leat or at worst to be ashamed of.&lt;br /&gt;&lt;br /&gt;Latter experience taught me some lessons. For the majority of LOB applications nobody really cares how we do it except us. Now, I'm of the opinion that we should care how we do what we do. But I also think that we can do a good job by not being such asses about the way we do things regularly. For somethings there is no need for unit tests, for somethings database design is just enough. Not to mention that not everything needs to be a three layer architecture and that some forms with code behind and a data store are the proper solution for some LOB applications.&lt;br /&gt;&lt;br /&gt;The Lightswitch presentation was purposefully short.&amp;nbsp; It reminded me about Microsoft Access and my faith in the tool just sunk. It seems it wasn't really what I hoped it would be. The presenter repeatedly pointed out that this tools isn't for the regular developer but for fairly advanced administration personel. Ok. I can achieve more with Drupal, CCK and Views.&lt;br /&gt;&lt;br /&gt;The second presentation, about Hybrid Mobile Applications was really interesting. The presenter works in a company specialized in social networks and mobile applications and he illustrated the business case for developing Hybrid Mobile Applications, e.g. web applications written for webKit and run inside a native wrapper in order to give an illusion of a native iPhone or Android app.&lt;br /&gt;&lt;br /&gt;Whats the deal here? If you want to write a cross platform mobile app you need to write a separate implementation for each platform. One in objective-c for iPhone, one in Java for Android and so on. With Hybrid Mobile applications you just write (or take an open source one) native wrapper e.g. an application that internatlly starts the browser as a control and that resizes its self that all browser specific features are hidden from the screen thus leaving the page content. The real application is written using webkits HTML5 capabilities CSS3 animations, Javascript local storage, geolocation etc.&lt;br /&gt;&lt;br /&gt;The application runs inside a single html page and the entire source code is shipped as single build with the wrapper thus by just changing the wrapper one can ship the same code on any native mobile application. The best thing is that the user doesn't know he is using a web application.&lt;br /&gt;&lt;br /&gt;The most important thing&amp;nbsp; is to develop the application with no connectivity in mind, which is really easy by the existence of the local storage api that gives to the developer a full fledged relational database to use.&lt;br /&gt;&lt;br /&gt;The development is really cheap also. The developer needs a webkit browser (Google Chrome or Safari) an IDE (Eclipse comes to mind) and a couple of mobile frameworks to ease the development effort.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Here are a couple of links given by the presenter:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jqtouch.com/"&gt;http://jqtouch.com/&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sencha.com/products/touch/"&gt;http://www.sencha.com/products/touch/&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jquerymobile.com/"&gt;http://jquerymobile.com/&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cubiq.org/iscroll"&gt;http://cubiq.org/iscroll&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://code.google.com/p/geo-location-javascript/"&gt;http://code.google.com/p/geo-location-javascript/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.phonegap.com/"&gt;http://www.phonegap.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.appcelerator.com/"&gt;http://www.appcelerator.com/&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;The presentation gave me a couple of ideas about some project I might do:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A mobile Mantis Bug Tracker interface&lt;/li&gt;&lt;li&gt; Hmm thats all just one ... :(&lt;/li&gt;&lt;/ul&gt;Of course I still have some learning to do about WPF 4&amp;nbsp; and MongoDb. I will wait till I learn those with other activities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1908602642562171988?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1908602642562171988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/10/went-to-zagreb-and-maybe-lived-to-tell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1908602642562171988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1908602642562171988'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/10/went-to-zagreb-and-maybe-lived-to-tell.html' title='Went to Zagreb and maybe lived to tell the tale'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5897670905236713506</id><published>2010-09-29T07:59:00.002+02:00</published><updated>2010-09-29T20:51:11.831+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>I'm too old for this</title><content type='html'>I worry to much I'm going to wash out due to my age. I'm currently, at the glorious time of writing this post twenty nine years old and by the Lords grace I'm not a year older. And I worry I'm to old for this job. This makes me really unhappy since I have a small boy and I wonder how I'm going to provide for him since I'm no good at anything else (well I'm mediocre at a lots of things, but that is nor here nor there so we are not going event to discuss it) and this is all I have for now.&lt;br /&gt;I don't know a lot of developers older then me, a few older then forty and none older then fifty. I really do not know what is my future career plan. I generally planned to gradually move to an architecture design position, since I'm naturally inclined to it and its not a development heavy thing. As I grow older, and as people grow older, we cannot learn as easily and as much as we could before. New technologies emerge and if you want to stay in this job&amp;nbsp; you need to spend extra time learning them at your own. But later I just can't mange to force my self to find the computer time for it. Sure I read books and blogs, and pay really carefully to code examples for technologies I'm intereseted. Curretnly I'm reading &lt;a href="http://www.amazon.com/WPF-4-Unleashed-Adam-Nathan/dp/0672331195/ref=sr_1_1?s=gateway&amp;amp;ie=UTF8&amp;amp;qid=1285740148&amp;amp;sr=8-1"&gt;WPF 4 Unleashed&lt;/a&gt; by Adam Nathan and &lt;a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1285740208&amp;amp;sr=8-2-spell"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; by Martin Folwer, plus I've read the entire MongoDB on-line documentation. But reading is not enough, you got to feel the code bellow your fingers. You just got to. And I really don't to much.&lt;br /&gt;During my holidays I was to washed out to do anything and I told my self its OK you need to rest. But when I got back to work it continued. Sure I started some small coding on the side for learning purpose, I started reading books and blogs and watching presentations but thats just not enough without coding.&lt;br /&gt;What is going on with me you wander. I think a description of my life after work is in order. When I'm finished working I'm with my family helping with the kid, doing house chores the whole nine yards. I put the kid to the bed and around ten o'clock in the evening I'm done with everything. I then go to eat my dinner (yeah I know its kinda late for that, but thats life) take a shower and I'm free to do as I like. I so want to do some coding but when I just think of sitting in from of my computer, my internal will power just crumbles. So I just watch a TV show or read a book. Very depressing, and very unhappy like for me. And then I start to wonder, this is my age doing this to me. Before I didn't have problems with this. Before I could do this all night old. I'm twentynine years old and I can't muster the will power to do this everynight, whats going to happen in ten or twenty years. How I'm going to learn Java or Erlang, or any other technology I'm going to need?&lt;br /&gt;I just don't know and I'm really not happy about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5897670905236713506?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5897670905236713506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/im-to-old-for-this.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5897670905236713506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5897670905236713506'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/im-to-old-for-this.html' title='I&apos;m too old for this'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7635103133305934022</id><published>2010-09-28T11:28:00.000+02:00</published><updated>2010-09-28T11:28:48.244+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business meetings'/><category scheme='http://www.blogger.com/atom/ns#' term='UI Testing'/><title type='text'>The shock of it all</title><content type='html'>Once upon a time when I was 'yay' high (shows to his head, indicating it was very recent) I started writing Selenium tests to test the UI compoenents of my ASP.NET application. As you may know ASP.NET screens are notoriusly not easy to test, expecially if you are lazy (side note: you can extract much of you ASP.NET server side logic in separate classes whithout ties to the ASP.NET application service suing the Class Method pattern.) and the only think a poor developer can do in order to test them (I'm not going into the not testing it at all option or just 'my clicks are enough attitude') is to write some good old UI automation tests.&lt;br /&gt;There is nothing wrong with UI automation tests, mind you, I think they are greate since you are sure you've tested the final integration of your product as shown to the user. What I find appaling is the customers reaction of seeing such tests executed.&lt;br /&gt;Let me tell you - and no, pleas, do not hold your breath - they are blowed away. Amazed. Shocked to the core how good they are. Screens flying, textboxes filled, data showed in grids, filtered and etc. The whole UI testing nine yards. And they want more, they want to start using that in their own projects. It is a presentation ass kicker.&lt;br /&gt;And then we start our fivehundred or more unit-test/functional test suite that executes under a couple of minutes testing almost everything in the application and they are emotionally dead as fish. Oh , its nice can we talk about deadline issues now, please? Right.&lt;br /&gt;I have nothing more to say. I'm appaled. Well, I was anyhow when I was 'yay' high (shows to his head, indicating it was very recent).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7635103133305934022?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7635103133305934022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/shock-of-it-all.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7635103133305934022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7635103133305934022'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/shock-of-it-all.html' title='The shock of it all'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3036748071112167261</id><published>2010-09-27T12:37:00.000+02:00</published><updated>2010-09-27T12:37:56.927+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Mocking'/><title type='text'>Mocking real outside dependencies</title><content type='html'>In a project a while back I realized something about mocking and unit testing. In that project I tried mocking every dependency a object could have. The result was that I could write unit-tests for those objects really fast, and that I could verfy their logic very easily. That was all in the spirit of unit testing.&lt;br /&gt;But something kept me nagging, I though that I wasn't getting enough values from my unit tests. Then I started doing functional tests on my services. Nothing was mocked, since the goal was to test the entire stack. Soon as I wrote a couple of tests defects in my code bellow started poping up. I fixed them and felt really good.&lt;br /&gt;I though back what started me thinking that mocking everything was such a good idea. Well I worked on project where my front end integrated with a web services middle tier and I spend countless hours overtime detecting problems that originated from those services while my code worked fine. I wanted to isolate that &lt;b&gt;big&amp;nbsp; &lt;/b&gt;outside dependency so that horrible story would not repeat again. &lt;br /&gt;True to my self I just went to the extreme side and mocked everything. Now, if i change the behavior of one class I will not see what other classes are also affected by the change until I go directly to those classes and change the expected behavior of my changed class mock. This is a problem I have no intention to repeat again.&lt;br /&gt;My new golden rule is : "Nikola, mock only&amp;nbsp; &lt;b&gt;real outside dependencies &lt;/b&gt;like web services, databases and the like not your core system objects. It will make you happy."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3036748071112167261?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3036748071112167261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/mocking-real-outside-dependencies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3036748071112167261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3036748071112167261'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/mocking-real-outside-dependencies.html' title='Mocking real outside dependencies'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2866070770718959611</id><published>2010-09-16T19:28:00.048+02:00</published><updated>2010-09-24T08:31:10.174+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><title type='text'>Unit Test pattern: Define once, recreate every time</title><content type='html'>"Define once, recreate every time" is a unit-testing design pattern where all outside dependencies and their default return values of the class being tested are defined once, and then recreated every time a different test is started.&lt;br /&gt;&lt;br /&gt;When unit-testing classes which have a complex dependency matrix we use faking a lot. We create fake objects, mock or stubs, we define their behavior in respect to the needs of the test. We need to do that for every test. Sure when a common pattern emerges, we create helper methods in order to remove duplicate code. Sometimes we need to have a lot of these helper methods, sometimes we need none and are happy to create are dependencies manually inside each test method.&lt;br /&gt;When unit testing objects those outside dependencies are not really important. How they behave is not important. What is important is how our logic of the class being tested behaves based on the conditions we set for it. &lt;br /&gt;The main proposition of the "Define once, recreate every time" unit-test pattern is that when defining each dependency there is some common code which needs to be written only once, and there is also a common behavioral state which also needs to be defined only once. &lt;br /&gt;In this pattern &lt;u&gt;all dependencies&lt;/u&gt; and their &lt;u&gt;return values&lt;/u&gt; are defined as common members of the test fixture, e.g. testing class. Those dependencies are created each time a new before a test is being run in the &lt;a href="http://nunit.org/index.php?p=setup&amp;r=2.2.10"&gt;SetUp&lt;/a&gt; method of the test fixture. This will ensure that each test, no matter the order its run, will have a clean default state upon which to make its assertions. &lt;br /&gt;If a tests needs to make changes to result values or how a mock will behave with a given set of parameters it can modify those dependencies freely without worrying of breaking some future tests since the default state will be reset each time before each test is run.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4uzlKD92WwA/TJxFl4haBaI/AAAAAAAACV4/PZ71X6UwMUA/s1600/DefineOnceRecreateEveryTime.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://4.bp.blogspot.com/_4uzlKD92WwA/TJxFl4haBaI/AAAAAAAACV4/PZ71X6UwMUA/s400/DefineOnceRecreateEveryTime.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5520363760379364770" /&gt;&lt;/a&gt;&lt;br /&gt;In this example we have the following classes and interfaces:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Database&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IAccountDataService&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AccountDataService&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IAccountRepository&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AccountRepository&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IAccount&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Account&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AccountRepositoryTest&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The following code example will use these technologies:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/vcsharp/default.aspx"&gt;.NET C#&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://structuremap.github.com/structuremap/index.html"&gt;StructureMap&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Database&lt;/b&gt;. This is the relational, key value, or some other data store where our application permanently stores its data. We really do not want to include it in our tests. It will slow them down, we need to insert and clean up dummy data. It is a lot of work for which we may not have enough resources.&lt;br /&gt;In our case in the database we have the following table:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE Account &lt;br /&gt;(&lt;br /&gt; Id INT PRIMARY KEY NOT NULL,&lt;br /&gt; Name Varchar(256) NOT NULL,&lt;br /&gt; Amount Decimal(10,2) NULL&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Account table is used for storing data about our &lt;i&gt;IAccount&lt;/i&gt; entity which is going to be used all during this example.&lt;br /&gt;&lt;b&gt;IAccountDataService&lt;/b&gt; and &lt;b&gt;AccountDataService&lt;/b&gt;. The &lt;i&gt;IAccountDataService&lt;/i&gt; is the interface we call upon in the rest of the application to store and read data about an &lt;i&gt;IAccount&lt;/i&gt; entity from the permanent data storage. The &lt;i&gt;AccountDataService&lt;/i&gt; is the concrete realization of the interface that actually gets to go to the database and retrieve the data requested by someone else. We use and interface here in conjunction with an &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;Inversion of Control&lt;/a&gt; container in order to be able to mock the &lt;i&gt;AccountDataService&lt;/i&gt; class in unit test for those classes of which this class is a dependency since we really do not want to test the &lt;i&gt;AccountDataService&lt;/i&gt; class nor do we want to hit the database.&lt;br /&gt;The &lt;i&gt;IAccountDataService&lt;/i&gt; would be placed in a separate library, whose only task would be the direct communication with the database. The library will make use of primary types as parameters (integers, string , booleans etc. ) and &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx"&gt;DataTable&lt;/a&gt; as result types in order to abstract the data access layers from the domain library of the application. This will give us several benefits. For one we can safely replace the permanent data source for something else, another database or web service and our contract would not change since would still returns &lt;i&gt;DataTable&lt;/i&gt; and receive primary types as values. It also leaves the data access layer blissfully ignorant about our domain layer and the business logic it implements. Our data access layer does one thing and one thing only it reads and saves data as requested without thinking it at all.  &lt;br /&gt;The &lt;i&gt;AccountDataService&lt;/i&gt; class has the following methods:&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;   public DataTable Get(int accountId)&lt;br /&gt;   {&lt;br /&gt;       //.. sql retrieval code here&lt;br /&gt;       DataTable result = new DataTable();&lt;br /&gt;       result.Columns.Add("Id",typeof(int));&lt;br /&gt;       result.Columns.Add("Name",typeof(string));&lt;br /&gt;       result.Columns.Add("Amount",typeof(decimal));&lt;br /&gt; &lt;br /&gt;       //.. get the DataReader&lt;br /&gt;       while(reader.Read()) //This will execute only once&lt;br /&gt;       {&lt;br /&gt;            DataRow row = result.NewRow();&lt;br /&gt;            row["Id"]=reader["Id"];&lt;br /&gt;            row["Name"]=reader["Name"];&lt;br /&gt;            row["Amount"]=reader["Amount"];&lt;br /&gt;            result.Rows.Add(row);&lt;br /&gt;       }       &lt;br /&gt;&lt;br /&gt;       return result;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;Get(int):DataTable&lt;/i&gt; methods has the task of going to the database and retrieving the data needed to fill a specific entity based on its id. &lt;br /&gt;&lt;b&gt;IAccount&lt;/b&gt; and &lt;b&gt;Account&lt;/b&gt;. &lt;i&gt;IAccount&lt;/i&gt; is our interface for out business entity Account. It may or may not have some business logic in it. As our system will grow it will surely start to have some logic so it is good to prepare it for being mocked in tests. &lt;br /&gt;&lt;pre &gt;&lt;br /&gt;   public DataTable Save(int id, decimal amount, string name)&lt;br /&gt;   {&lt;br /&gt;      //.. insert or update logic here&lt;br /&gt;      DataTable result = new DataTable(); &lt;br /&gt;      result.Columns.Add("Id",typeof(int));&lt;br /&gt;      result.Columns.Add("Name",typeof(string));&lt;br /&gt;      result.Columns.Add("Amount",typeof(decimal));&lt;br /&gt;&lt;br /&gt;      DataRow row = result.NewRow();&lt;br /&gt;      //in case of a insert the intial value is 0, &lt;br /&gt;      //but now is the LAST_INSERT_ID of the database&lt;br /&gt;      row["Id"] = id ; &lt;br /&gt;      row["Name"] = name;&lt;br /&gt;      row["Amount"] = amount;&lt;br /&gt;      result.Rows.Add(row);&lt;br /&gt;  &lt;br /&gt;      return result;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;Save(int, float, string):DataTable&lt;/i&gt; method has the task of inserting or updating a single Account record in the database. The save method will be determined by the id parameter of the method. If its values is zero it will be an insert operation, if its something else it will be and update operation. In case of an insert the method will retrieve also the new id of the record and return it in the &lt;i&gt;DataTable&lt;/i&gt; containing the newly updated record. &lt;br /&gt;&lt;b&gt;IAccountRepository&lt;/b&gt; and &lt;b&gt;AccountRepository&lt;/b&gt;. This is our domain repository class for the &lt;i&gt;IAccount&lt;/i&gt; entity. It handles all logic related to the reading and saving of a &lt;i&gt;IAccount&lt;/i&gt; entity. This is also our class being tested. It has two dependencies. One is the &lt;i&gt;IAccountDataService&lt;/i&gt; from which it gets the raw data it needs to make &lt;i&gt;IAccount&lt;/i&gt; objects, and the other is the &lt;i&gt;IAccount&lt;/i&gt; entity which is passed as argument to it or is returned by it. Both dependencies come to the &lt;i&gt;AccountRepository&lt;/i&gt; object through the Inversion of Control container.&lt;br /&gt;The &lt;i&gt;IAccountRepository&lt;/i&gt; is located in the same layer as the &lt;i&gt;IAccount&lt;/i&gt; entity. Given its dependency to the &lt;i&gt;IAccoundDataService&lt;/i&gt; object it doesn't have to worry about the specifics of how the &lt;i&gt;IAccount&lt;/i&gt; entity is saved or retrieved. Its only goal is to worry about the business logic of saving and retrieving the &lt;i&gt;IAccount&lt;/i&gt; entity. In case of a future development where the &lt;i&gt;IAccount&lt;/i&gt; entity will store and retrieve a part of its data structure from somewhere else, e.g. a file saved to the disk it will be the job of the &lt;i&gt;IAccountRepository&lt;/i&gt; to coordinate those sets of operations also. &lt;br /&gt;Another good thing of this structure is that the &lt;i&gt;IAccountRepository&lt;/i&gt; object is the only interaction point between the data layer of the application and the domain layer. Which means that the entire domain layer is oblivious how the &lt;i&gt;IAccount &lt;/i&gt;object is stored. This will enable us during integration testing to switch the permanent storage to another one, if possibly, memory based like &lt;a href="http://www.sqlite.org/"&gt;Sqlite&lt;/a&gt; or just plain objects.&lt;br /&gt;The &lt;i&gt;AccountRepository&lt;/i&gt; class looks like this:&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;public class AccountRepository:IAccountRepository&lt;br /&gt;{&lt;br /&gt;   private IAccountDataService accountDataService = null;&lt;br /&gt;   &lt;br /&gt;   public AccountRepository()&lt;br /&gt;   {&lt;br /&gt;       accountDataService = ObjectFactory.GetInstance&lt;IAccountDataService&gt;();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private IAccount mapDataRow(DataRow row)&lt;br /&gt;   {&lt;br /&gt;       IAccount account = ObjectFactory.Get&lt;IAccount&gt;();&lt;br /&gt;       account.Id = row.Field&lt;int&gt;("Id");&lt;br /&gt;       account.Name = row.Field&lt;string&gt;("Name");&lt;br /&gt;       account.Amount = row.Field&lt;decimal&gt;("Amount");&lt;br /&gt;&lt;br /&gt;       return account;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;IAccountDataService&lt;/i&gt; is a private field of the class. It makes senses since it is used by the most of the methods contained in the &lt;i&gt;AccountRepository&lt;/i&gt; class. The specific instance of the &lt;i&gt;IAccountDataService&lt;/i&gt; used is instantiated in the constructor of the class using the StructureMap inversion of control container. We are working here with interfaces, so during testing we can and will replace the default instance of the &lt;i&gt;IAccountDataService&lt;/i&gt; with a fake one for our testing purposes.&lt;br /&gt;The &lt;i&gt;mapDataRow(Row):IAccount&lt;/i&gt; method is used through the class to map a &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datarow.aspx"&gt;DataRow&lt;/a&gt; returned by the &lt;i&gt;IAccountDataService&lt;/i&gt; to an &lt;i&gt;IAccount&lt;/i&gt; instance. &lt;br /&gt;The &lt;i&gt;AccountRepository&lt;/i&gt; class has the following methods:&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;public void Get(int accoundId)&lt;br /&gt;{&lt;br /&gt;   DataTable table= accountDataService.Get(accountId);&lt;br /&gt;   &lt;br /&gt;   if (table.Rows.Count == 0 ) return null;&lt;br /&gt;&lt;br /&gt;   DataRow row = table.Rows[0];&lt;br /&gt;   &lt;br /&gt;   IAccount account = mapDataRow(row);&lt;br /&gt;&lt;br /&gt;   return account;&lt;br /&gt;   &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;Get(int):IAccount&lt;/i&gt; method is very simple. It calls to the &lt;i&gt;IAccountDataService&lt;/i&gt; instance with an integer parameter and transforms the returned data into a &lt;i&gt;IAccount&lt;/i&gt; entity if possible. Since we are requesting a entity with a specific id the &lt;i&gt;IAccoundDataService&lt;/i&gt; will not return more then one row. In case the &lt;i&gt;IAccount&lt;/i&gt; row wasn't found with the given id the Get method will return a null value for higher layers to handle as appropriate.&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;public void Save(IAccount account)&lt;br /&gt;{&lt;br /&gt;   if (account == null)&lt;br /&gt;   {&lt;br /&gt;      throw new ArgumentNullException("IAccount cannot be null.");&lt;br /&gt;   } &lt;br /&gt;&lt;br /&gt;   var table = accountDataTable.Save(account.Id, &lt;br /&gt;                                     account.Amount, &lt;br /&gt;                                     account.Name);&lt;br /&gt;&lt;br /&gt;   if (table.Rows.Count==0)&lt;br /&gt;   {&lt;br /&gt;      throw new ApplicationException("No data returned by the data service.");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   DataRow row = table.Rows[0];&lt;br /&gt;&lt;br /&gt;   account = mapDataRow(row);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;Save(IAccount):void&lt;/i&gt; method saves an &lt;i&gt;IAccount&lt;/i&gt; instance and then returns a completely filled &lt;i&gt;IAccount&lt;/i&gt; instance by reference, e.g. in case of a new &lt;i&gt;IAccount&lt;/i&gt; instance the Id property has a value of 0 and is replaced after the Save operation by the newly assigned Id property. &lt;br /&gt;The Save method makes a few checks to make sure everything is all right. First it checks if the &lt;i&gt;IAccount&lt;/i&gt; entity is null, in which case it breaks the method execution by throwing an &lt;i&gt;ArgumentNullException&lt;/i&gt;. The second check is related to the result returned by the &lt;i&gt;IAccountDataService&lt;/i&gt; Save method. If the result returned zero row it throws yet another exception relating to a possible data service error.&lt;br /&gt;&lt;b&gt;IAccount&lt;/b&gt; and &lt;b&gt;Account&lt;/b&gt;. In this example the &lt;i&gt;IAccount&lt;/i&gt; entity servers primarily as a data holder holding data to and from the permanent storage mechanism. As the business domain grows it will also grow with the addition of new fields and domain logic methods. In order to handle this future complexity we used the &lt;i&gt;IAccount&lt;/i&gt; interface to facilitate its mocking. Also, to be in sync with the letter of the pattern we are going to mock it also, as it is , besides it being only a collection of three properties. A dependency is a dependency, and the smallest of mistakes can throws us on a wild goose chase in a wrong class searching for bugs that originated somewhere else.&lt;br /&gt;&lt;b&gt;AccountRepositoryTest&lt;/b&gt; is our unit-testing fixture for the &lt;i&gt;AccountRepositoryClass&lt;/i&gt;. Its basic structure is this:&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;public class AccountRepositoryTest&lt;br /&gt;{&lt;br /&gt;   ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Before we start writing test we need to identify what our dependencies are and what result they will generally provide for us. &lt;br /&gt;The &lt;i&gt;AccountRepository&lt;/i&gt; class has two dependencies as specified above. The first is the &lt;i&gt;IAccountDataService&lt;/i&gt; interface and the second is the &lt;i&gt;IAccount&lt;/i&gt; entity. We should not worry about it right now. A simple mocked object with automatic property handling will do. The &lt;i&gt;IAccountDataService&lt;/i&gt; instance in its both methods it returns a &lt;i&gt;DataTable&lt;/i&gt; object, this is our result. Both dependencies and the &lt;i&gt;DataTable&lt;/i&gt; result need to be defined in advance.&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;public class AccountRepositoryTest&lt;br /&gt;{&lt;br /&gt;   private Mock&lt;IAccountDataService&gt; accountDataServiceMock = null;&lt;br /&gt;   private DataTable dataTable = null;&lt;br /&gt;   private DataRow firstRow = null;&lt;br /&gt;   &lt;br /&gt;   private Mock&lt;IAccount&gt; accountMock = null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We have create a mock object for the &lt;i&gt;IAccountDataService&lt;/i&gt; and its result a &lt;i&gt;DataTable&lt;/i&gt; and a &lt;i&gt;DataRow&lt;/i&gt; object. We have made the &lt;i&gt;DataRow&lt;/i&gt; object &lt;i&gt;firstRow&lt;/i&gt; available as a private field of the test class since there exits a possibility that in some test we may need to change the data returned by the data row, and calling a direct reference is the easiest way of doing it.&lt;br /&gt;Each dependency and its results need to be instantiated to a clean, default state before each test is run thus preventing one test to influence another by modifying the shared dependencies and results. This is done by using the SetUp method of the unit-testing method. This method is execute every time before a test is run.&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;[SetUp]&lt;br /&gt;public void SetUp()&lt;br /&gt;{&lt;br /&gt;    dataTable = new DataTable();&lt;br /&gt;    dataTable.Columns.Add("Id",typeof(int));&lt;br /&gt;    dataTable.Columns.Add("Name",typeof(string));&lt;br /&gt;    dataTable.Columns.Add("Amount",typeof(decimal));&lt;br /&gt;&lt;br /&gt;    firstRow = dataTable.NewRow();&lt;br /&gt;    firstRow["Id"] = 1;&lt;br /&gt;    firstRow["Name"] = "Marko Horvat";&lt;br /&gt;    firstRow["Amount"] = 44.00;&lt;br /&gt;&lt;br /&gt;    accountDataServiceMock = new Mock&lt;IAccountDataService&gt;();&lt;br /&gt;    &lt;br /&gt;    accountMock = new Mock&lt;IAccount&gt;();&lt;br /&gt;    accountMock.SetupAllProperties();&lt;br /&gt;&lt;br /&gt;    accountMock.Object.Id = 1;&lt;br /&gt;    accountMock.Object.Name = "Marko Horvat";&lt;br /&gt;    accountMock.Object.Amount= 44.00;&lt;br /&gt;&lt;br /&gt;    ObjectFactory.Initialize(x =&gt; {&lt;br /&gt;      x.For&lt;IAccountDataService&gt;().Use(accountDataServiceMock.Object);&lt;br /&gt;      x.For&lt;IAccount&gt;().Use(accountMock.Object);&lt;br /&gt;     &lt;br /&gt; &lt;br /&gt;    });&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, we are sure that on every test run we are going to have a clean slate in respect to our dependencies and result values. It is important to note the last code block in the SetUp method. This is a StructureMap initialization pattern where we tell the IoC container which instances to bind when a client piece of code requests a specific type, e.g &lt;i&gt;IAccountDataService&lt;/i&gt;. This piece of functionality enables us to embed our fake dependencies in our real class without changing its structure and behavior.&lt;br /&gt;Lets us now write some tests and see how this works in real life:&lt;br /&gt;&lt;pre code="brush: csharp"&gt;&lt;br /&gt;public void Save_ProperParameters_AccountSaved()&lt;br /&gt;{&lt;br /&gt;   accountDataServiceMock.Setup&lt;DataTable&gt;( x =&gt; x.Save(It.IsAny&lt;int&gt;(),  &lt;br /&gt;                                                 It.IsAny&lt;string&gt;(), &lt;br /&gt;                                                 It.IsAny&lt;Decimal&gt;()))&lt;br /&gt;                          .Returns(dataTable);&lt;br /&gt;&lt;br /&gt;   var instance = new AccountRepository();&lt;br /&gt;   var result = instance.Save(accountMock.Object);&lt;br /&gt;&lt;br /&gt;   Assert.IsNotNull(result);&lt;br /&gt;   Assert.AreEqual(result.Id, accountMock.Object.Id); // 1&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is a test written using the "Define once, recreate every time" pattern. On the start of the test we define the expected behavior of our dependency fake. We tell it that regardless of the input parameters to return the &lt;i&gt;dataTable&lt;/i&gt; result we have defined previously. Then we create an instance of the &lt;i&gt;AccountRepository&lt;/i&gt; class and with it we executed its Save method using the &lt;i&gt;accountMock&lt;/i&gt; member as a parameter.   &lt;br /&gt;Now lets write another test, this time we will check the behavior of the Save method in case there are errors:&lt;br /&gt;&lt;pre &gt;&lt;br /&gt;[Test]&lt;br /&gt;public void Save_ErrorRaised_ThrowsExceptions()&lt;br /&gt;{&lt;br /&gt;    accountDataServiceMock.Setup&lt;DataTable&gt;(x =&gt; x.Save(It.IsAny&lt;int&gt;(), &lt;br /&gt;                                                 It.IsAny&lt;string&gt;(), &lt;br /&gt;                                                 It.IsAny&lt;Decimal&gt;()))&lt;br /&gt;                           .Returns(new DataTable());&lt;br /&gt;&lt;br /&gt;    var instance = new AccountRepository();&lt;br /&gt;    &lt;br /&gt;    Assert.Throws&lt;ArgumentNullException&gt;( () =&gt; instance.Save(null));&lt;br /&gt;&lt;br /&gt;    Assert.Throws&lt;ApplicationException&gt;( () =&gt; instance.Save(accountMock.Object));&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this test I needed a different behavior from the Save method. I knew it was a new clean instance, for which no behavior was defined so I freely defined a new behavior for the fake. The following two assertions were simple enough. First I sent a null as the &lt;i&gt;IAccount&lt;/i&gt; parameter in order to check if the Save method correctly threw the&lt;i&gt;ArgumentNullException&lt;/i&gt;, and then I checked that if the Save method of the &lt;i&gt;IAccountDataSource&lt;/i&gt; returned an empty data source if the repository code correctly threw the &lt;i&gt;ApplicationException&lt;/i&gt;. This was possible courtesy of the &lt;i&gt;accountDataSourceMock&lt;/i&gt; object.&lt;br /&gt;The "Define once, recreate every time" unit testing pattern offers the following benefits:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Simplifies unit test writing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Increases test writing speed&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reduces the chances of one test modifying the results of another test&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2866070770718959611?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2866070770718959611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/unit-test-pattern-define-once-recreate.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2866070770718959611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2866070770718959611'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/unit-test-pattern-define-once-recreate.html' title='Unit Test pattern: Define once, recreate every time'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4uzlKD92WwA/TJxFl4haBaI/AAAAAAAACV4/PZ71X6UwMUA/s72-c/DefineOnceRecreateEveryTime.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5884992194998836589</id><published>2010-09-15T14:27:00.002+02:00</published><updated>2010-09-15T14:31:08.541+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>What should I learn next</title><content type='html'>My wife is a real help to me. Her current contribution is her opinion about my learning schedule for the next six months.&lt;br /&gt;I laid down some choices, what issues are concerning me about each choice and in what order I would like to learn them.&lt;br /&gt;The candidates were:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Oracle&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MongoDb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WPF 4&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;The winners were WPF 4 and MongoDB. WPF 4 will became my new build, virtual machine startup reading and MongoDB will became my evening exercises technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5884992194998836589?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5884992194998836589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/my-wife-is-real-help-to-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5884992194998836589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5884992194998836589'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/my-wife-is-real-help-to-me.html' title='What should I learn next'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5120275312898647446</id><published>2010-09-13T10:18:00.004+02:00</published><updated>2010-09-13T10:28:13.797+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='nunit'/><title type='text'>Lets ignore them, will ya!</title><content type='html'>Once upon a time, on a project far away a young group of engineers dutifully wrote unit tests for almost everything on the project. The project also had some really tricky integration points with other systems. And those integration points were faulty, and those tests broke. So out team of heroes dutifully applied the &lt;em&gt;&lt;a href='http://www.nunit.org/index.php?p=ignore&amp;r=2.5.7'&gt;Ignore&lt;/a&gt;&lt;/em&gt; tag to those tests covering those integration points which were faulty until they were fixed by their respective teams.&lt;br /&gt;And so the gates of Ignorance were opened, and upon the project a beast was unleashed and its name was laziness since every set of tests which was difficult to fix or it required a fair amount of time to fix the defects it exposed was dutifully sent to the forges of Ignorance by the &lt;em&gt;&lt;a href='http://www.nunit.org/index.php?p=ignore&amp;r=2.5.7'&gt;Ignore&lt;/a&gt;&lt;/em&gt; attribute.&lt;br /&gt;A man arose from the ranks. He thought him self a leader, a thinker and said no more in his head. Nobody heard him, yet, for he was wise in marking his words right and waiting for the right moment to utter those life changing words. &lt;br /&gt;And so we waited, to see what will become of the project and the stalwart team of young engineers doing their best to test what was easy, and to forget what was hard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5120275312898647446?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5120275312898647446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/lets-ignore-them-will-ya.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5120275312898647446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5120275312898647446'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/lets-ignore-them-will-ya.html' title='Lets ignore them, will ya!'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8822649914204430390</id><published>2010-09-12T11:27:00.002+02:00</published><updated>2010-09-12T12:56:13.158+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Nine to five</title><content type='html'>It took me a while to make my self see and surrender to the fact that not all people I work, I've worked and will work with me in the future, have accepted The Life, or the way of a software engineer or craftsman. &lt;br /&gt;Oh, how I've grown wiser and older. I just might grow a beard and be a guru of some sorts. Certainly there is a niche I can squeeze in a pretend to know what I'm talking about. &lt;br /&gt;But alas, I didn't grow wiser just battered down by the entropy that is the , oh so typical , human philosophy of working from nine to five and then at five o' one forgetting that work even exists.&lt;br /&gt;Well I can understand that. Work is work, and it isn't the whole life. But for the way of a software engineer or craftsman isn't just work , the daily grudge of projects, meetings, coding and testing the constant battle of will and code and the requirements that just won't fit into the application mold. It is just not.&lt;br /&gt;For me it is something different, something more. A thing to be proud of , something to leave for posterity. Is the way of living where you read, learn, exercise your self and improve your self. Year after, year continuously. And the work is the place where you apply your skills, your learning, your spirit into something tangible, something you can be proud of, an achievement.&lt;br /&gt;Am I , or people like me, better then the rest. I think not. We are just different. I often found that people with the nine to five mentality are predictable, they approach each problem in a similar fashion, they apply the same solutions every time, day after day, application after application. On the other hand, the same errors are repeated, the same problems occur nothing is improved until pressure is applied from the outside, or if not they succumb to the technology wave, left behind with outdated knowledge and if something doesn't come by, a new project or a new job where the can learn new skills in a nine to five way they are really frakked up. &lt;br /&gt;This is what scares me the most, as a developer, to let my self loose, to relax and to in a matter of years outdated, jobless, and skill less. &lt;br /&gt;We work in teams. We seldom do any work alone. Teams can be organized differently, they can work differently. But one constant remains often, in teams there are some people that want to improve them self and the the work they are doing and those who just can't see the need to bother to do so.&lt;br /&gt;For this was an enormous amount of stress, battling such teammates day after day until it downed me. I can't change them. I can't force them. I just can behave with my code, my tasks the way I think is right and if they'll follow me the batter or if not I will refactor their code or leave it as is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8822649914204430390?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8822649914204430390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/nine-to-five.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8822649914204430390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8822649914204430390'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/nine-to-five.html' title='Nine to five'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7956298022702006519</id><published>2010-09-10T08:49:00.002+02:00</published><updated>2010-09-10T09:00:24.444+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Faking'/><title type='text'>To fake or not to fake</title><content type='html'>To fake , or not to fake that is the problem now. This is something I just realized after writting around two hundred tests that rely on completely faked dependencies, and around seventy which do not fake nothing. Those non-faking unit tests are those written for the lowest layer of the applicattion, the data access code which tests how my data retrieval code works with a real database with only the data faked. Those tests sometime rely on each other since sometimes one stored procedure or view is used by multiple different sources. And if I change one multiple tests will fall indicating to me or my team where we need to apply out changes also.&lt;br /&gt;But on a faked enviroment, where all dependencies are faked if we change the logic in one dependency and write tests that pass for it we must manually go and look through the code and to find all the places where that dependency is used in order to update it to the newest state of the application. Why? If I didn't change the structure of the dependency or the type of results it returns the tests that use a fake of the dependency will pass since those logic changes will not automatically propagate to those fakes (mocks or stubs it is irrelevant which in this case).&lt;br /&gt;No that is why I push for functional and acceptance tests in order to test the complete stack from ground up without mocking, but still those tests are often left aside since people who have written unit tests have decided that they are unnecessary duplication or effort, or worse botch them in such a was that those tests do not return any meaningful data to us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7956298022702006519?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7956298022702006519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/to-fake-or-not-to-fake.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7956298022702006519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7956298022702006519'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/to-fake-or-not-to-fake.html' title='To fake or not to fake'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-278639582662007047</id><published>2010-09-08T05:35:00.003+02:00</published><updated>2010-09-08T05:50:23.519+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><title type='text'>How much granularity is enough?</title><content type='html'>I worked sometime ago on a small/medium sized ERP project. Once again it was a ASP.NET web application. &lt;br /&gt;In order to write a feature the following steps must had to be taken:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Write a stored procedure, or two&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For each procedure write a method in the related data service in the data access layer of the application&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For each method in the underlying data access service write one or more methods in one or more repository objects in the logic layer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write one or more entities, value objects and aggregates related to the procedure written.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For each function write a method in the appropriate object service on top of the logic layer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On the front end write a service facade for collecting errors and results from the logic service, once again is a one to one mapping (I used the &lt;a href="http://msdn.microsoft.com/en-us/library/9a4kyhcx.aspx"&gt;ObjectDataSource control&lt;/a&gt; extensively in this project and we had a centralized message collecting system).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write the functionality on the screen.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;When looked from a theoretical aspect each step made sense. A clear separation of concerns, each object doing its small thing etc. But during the implementation I just often found my self wondering &lt;i&gt;Why am I doing this? Each object has only a small variation from the object bellow. Isn't this to much granular?&lt;/i&gt;.&lt;br /&gt;It sure made writing tests easier, since the logic in each object wasn't very complicated so the corresponding tests were easier to write and were written much faster, especially on upper layers where I made extensive use of the &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; mocking framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-278639582662007047?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/278639582662007047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/how-much-granularity-is-enough.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/278639582662007047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/278639582662007047'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/how-much-granularity-is-enough.html' title='How much granularity is enough?'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6422433311107776409</id><published>2010-09-07T00:41:00.002+02:00</published><updated>2010-09-07T00:48:47.092+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><title type='text'>Just unit test?</title><content type='html'>I just realized something today. Something deep, and profound and totally astonishing . Well, for me anyway. I realized that maybe, just maybe doing unit tests on project is enough. On most projects I have an influence on I strive to have functional and integration tests besides regular unit test. I just feel is best to cover each layer of the application in one fell swoop with functional tests or acceptance test (it depends really how you do them) with a good coverage of unit test for each object separately.&lt;br /&gt;Today I've done a lot of unit tests. I worked late, and I've done a lot of coding. For class I've done I wrote unit test. And with those tests I covered a lot of functionality of the application. When I reached the user interface there wasn't much to test, everything worked fine since I got the majority of the defects with unit tests on the lower layers.&lt;br /&gt;It seems strange to me since we do tests in complete isolation from each other, so no outside dependencies between tests are allowed. Everything is mocked. But with a real fine granularity of objects for a specific functionality it is possible in my opinion to just have unit tests and cover the majority of the expected functionality of the application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6422433311107776409?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6422433311107776409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/just-unit-test.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6422433311107776409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6422433311107776409'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/just-unit-test.html' title='Just unit test?'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8903635158731916761</id><published>2010-09-03T15:29:00.004+02:00</published><updated>2010-09-03T15:53:47.824+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><title type='text'>How to cranck unit tests under pressure, and not feeling dirty at the same time</title><content type='html'>It's called doing the right thing. &lt;br /&gt;Well thats what I tell my self it is. When I read "Extreme programming Explained" by Kent Beck I read about a story of his about a project where he introduced extreme programming as a development process. The project went well until the deadline got really close and wished he could just throw XP from the window, hack the project together and completed the project in time to collect a big, fat, juicy bonus. He addmitted he panicked, and then calmed him self down when a colleague told him that nothing really changed, that they should plan for the last two weeks of the project as it were an ordinary iteration, and execute it as such with unit testing and everything.&lt;br /&gt;Now I was in a pinch some time ago. Not something unusual, per self, it seems there is not enough time to ever do a project. The project was then involved was in development for some time, and the deadline of the clients patience got really closer as each week passed. &lt;br /&gt;It was a good project, I've architected it and technically oversaw the development for much of its life time as I was in parallel involved in other enterprises. It got a stable architecture, which followed closely my plan, it got unit tests, inversion of control, mocking ,functional tests and a set of Selenium based acceptance tests. &lt;br /&gt;I event wrote a set of QUnit (a javascript unit testing framework) test for the Javascript classes we used on the project. &lt;br /&gt;The problem was that the we got a week left and still a lot of stuff to do if wanted to do it right, before the final client presentation. Like writing tests, logging code etc. &lt;br /&gt;The pressure started to mount, just finish those damned screens everybody yelled (not really but my minds plays such beautiful tricks on me). Just get it done, write those pesky tests later. &lt;br /&gt;The problem was I was feeling really good about the projects, the tests were written quickly and were really useful to ferret defects and I really didn't want to abandon all those three hundred plus tests to entropy and mocking disregard. &lt;br /&gt;What I decided to do is to change my unit testing strategy:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Test only logic heavy code. If a method has an if, switch or any other control structure I would test it in respect to the general expected behavior which could result from those control structures.&lt;/li&gt;&lt;li&gt;Change focus from data to processes. I left trying to set replicas of real world data, and instead used generic values like "1" for ints and "Any" for strings. This left me with more time and didn't stress my mind to try to figure out real, representative , data sets.&lt;/li&gt;&lt;li&gt;Tell your self is good to copy paste (for now). I had tests which were five to seven lines long each. They all had 30%-40% of the same code base. What I originally do I refactor out the common code in a private method and reduce my overall tests size. The downside of this it takes time do do it. Time which I really didn't have. So I copy pasted.&lt;/li&gt;&lt;li&gt;In a object stack which covers a specific functionality (e.g. GetAllAccounts) do not retest the same functionality on each step, but instead focus really closely to the task of each object in the stack. For example I would focus really hard on querying and inserting data from the permanent storage in the Data Layer of the application, and focus on data transformation and repository logic in the middle tier of the application. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;It kinda worked. I cranked a lot of more code this way and found a lot of defects. I wouldn't suggest it as a unit testing strategy for everyday situations but it kinda works when under pressure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8903635158731916761?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8903635158731916761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/how-to-cranck-unit-tests-under-pressure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8903635158731916761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8903635158731916761'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/how-to-cranck-unit-tests-under-pressure.html' title='How to cranck unit tests under pressure, and not feeling dirty at the same time'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7452643675909153181</id><published>2010-09-01T09:05:00.002+02:00</published><updated>2010-09-01T09:14:52.441+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Oh, my learning muse</title><content type='html'>I didn't write in four months now. It didn't seem to matter, nothing did which was related to my work. What happened to me?&lt;br /&gt;Well, I've been pushing my self for the last three years very hard. Learning, working and applying my self in order to grow, learn and advance as a software engineer. And then I crashed, emotionally and physically. I become cranky , tired and frustrated. &lt;br /&gt;I started then working from home, so I didn't have to drive for two hours a day on really low grade roads. I saw more of my family, and I was more rested.&lt;br /&gt;One thing led to another, I started to shift my priorities to my son and wife. I started spending more time with them, going out to play by the sea, watching movies reading books, going out. Just living my life.&lt;br /&gt;What was not right, was the nagging feeling that something was not right. A sick rotten feeling that I was leaving out something vital and important to me. My learning and education. My personal growth as a professional. &lt;br /&gt;It got to the point that I felt my brain rot from not use. And I didn't like it. So I started learning again, "Patterns of Enterprise Application Architecture" by Martin Fowler, and "WPF Unleashed 4" by Adam Nathan. The former as my regular reading and the latter as my computer time in the evening and weekends reading. &lt;br /&gt;I feel more right now. I guess. I don't spend as much time at the computer cranking code and learning new stuff as I would like. &lt;br /&gt;Every time I can sit at my machine and learn , it seems it is ten in the evening and I'm to tired, my head hurts and I just want to unwind. It is really hard to keep up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7452643675909153181?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7452643675909153181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/oh-my-learning-muse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7452643675909153181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7452643675909153181'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/09/oh-my-learning-muse.html' title='Oh, my learning muse'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8428748043231727142</id><published>2010-04-12T22:22:00.002+02:00</published><updated>2010-04-12T22:35:56.956+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>5th WebUG meeting report</title><content type='html'>On the 8th of April 2010 I held a talk on the topic of "Software Engineering" at the 5th Web user group meeting which was a SQL/DEV user group meeting (since Windays 2010 are coming soon). The talk was held in the Microsoft offices on the top of business building in Zagreb in the Dante conference room.&lt;br /&gt;The presentation went well. I was really nervous beforehand. I thought that there is for sure someone in the audience who will spot an error and point it out. Well no one did , or if he did he didn't point it out loud. &lt;br /&gt;There were some technical difficulties at the beginning. The network was hard to get and the camera crew didn't come so the talk wasn't recorded. Bummer.&lt;br /&gt;Everything else went just fine. The talk was well received by the audience, people came to me afterwards to congratulate me or to talk about some finer point in private.&lt;br /&gt;The hosts were gracious enough to accommodate my special dietary habits so they ordered a vegetarian lasagna for me during the networking part of the event. Everybody else got "čevape" which went away pretty fast.&lt;br /&gt;All in all it was a nice event. I meet some good people and I hope to have a chance to present again on a future WebUG meeting.&lt;br /&gt;Here are some photos taken from the talk:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4uzlKD92WwA/S8OD7XJw9xI/AAAAAAAACE8/RsaKgCX2Rfc/s1600/IMG_0730.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_4uzlKD92WwA/S8OD7XJw9xI/AAAAAAAACE8/RsaKgCX2Rfc/s320/IMG_0730.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5459352229153666834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4uzlKD92WwA/S8OD66_DI5I/AAAAAAAACE0/559yLrHDEV4/s1600/IMG_0727.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_4uzlKD92WwA/S8OD66_DI5I/AAAAAAAACE0/559yLrHDEV4/s320/IMG_0727.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5459352221592527762" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8428748043231727142?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8428748043231727142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/04/5th-webug-meeting-report.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8428748043231727142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8428748043231727142'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/04/5th-webug-meeting-report.html' title='5th WebUG meeting report'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4uzlKD92WwA/S8OD7XJw9xI/AAAAAAAACE8/RsaKgCX2Rfc/s72-c/IMG_0730.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8845388951467910420</id><published>2010-04-03T19:00:00.002+02:00</published><updated>2010-04-03T19:02:57.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>WebUG Presentation: Software Engineering</title><content type='html'>Next week on the 8th of April 2010 I will present on the monthly Web User Group meeting in Zagreb, at the Microsoft Croatia offices on the topic of Software Engineering.&lt;br /&gt;Software Engineering is something very dear to me. It is also a very hard topic to condense in an one hour presentation. &lt;br /&gt;For those who want to attend you can find more here &lt;a href="http://www.webug.com.hr/" target="_blank"&gt;http://www.webug.com.hr/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8845388951467910420?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8845388951467910420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/04/webug-presentation-software-engineering.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8845388951467910420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8845388951467910420'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/04/webug-presentation-software-engineering.html' title='WebUG Presentation: Software Engineering'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2050050032056136669</id><published>2010-03-18T07:19:00.005+01:00</published><updated>2010-03-18T10:44:02.924+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Key principles of software architecture</title><content type='html'>Software architecture is the first and most important design step of software development project where are defined and indentified the key components of a product encompassing the logical structure of the product being built, the technologies used and how they are used and the definition of the key processes handled by the system both business and technological. &lt;br /&gt;&lt;br /&gt;Software architecture is software design , but not all software design is software architecture. Architecture implies a high level overview of things. It set the boundaries and key guidelines of the development effort without going into a detailed specification of each implemented use case on the technological or business level. &lt;br /&gt;&lt;br /&gt;Every developed system has an architecture. Most software architectures are incidental, matters of accident and small decisions made by different people at different times without accord or shared vision. &lt;br /&gt;&lt;br /&gt;Software architecture is both easy and hard. It is easy because it doesn't get into every detail of the system being built, that is for the detailed design effort it is hard because it requires an encompassing vision of each key element of a system and the capability to set it in clear, concise and understandable writing. &lt;br /&gt;&lt;br /&gt;As the product changes the architecture will change. Decisions are being made by each key stroke, by each library reference and each guideline not met - no matter how small or temporary. &lt;br /&gt;&lt;br /&gt;The software architecture document must be therefore written in a short and concise way with pictures describing each key section of it in order to facilitate rapid understanding and ease of maintenance.&lt;br /&gt;&lt;br /&gt;There are muliple way of doing software architecture. A good , and free book published by Microsofts Patterns and Practices covers all aspects of it, the &lt;a href="http://msdn.microsoft.com/en-us/library/dd673617.aspx" target="_blank"&gt;Microsoft Application Architecture Guide, 2nd Edition&lt;/a&gt;. I would recommend it to everyone.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4uzlKD92WwA/S6H1MyBioiI/AAAAAAAACEs/4hNR767k6-s/s1600-h/HLA.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="http://1.bp.blogspot.com/_4uzlKD92WwA/S6H1MyBioiI/AAAAAAAACEs/4hNR767k6-s/s320/HLA.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449906624030482978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style='text-align:center;font-size:small'&gt;A dummy high-level model for a HRM system&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When I approach and design a high level architecture document I generally cover the following sections:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Project overview&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Project goals&lt;/li&gt;&lt;br /&gt;&lt;li&gt;High level architecture diagram&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technology platform&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technology platform - process and techniques used for specific problems&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Key processes covered by the product&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Other&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Project overview.&lt;/span&gt; A short overview of the project, usually a project sales pitch describing what is the project, who is the client and what the project is really about. I do not go into great details since there are other documents which are generally built to elaborate on the topic further.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Project goals.&lt;/span&gt; Or the project high level requirements are the handful of key things the project must be able to accomplish. This is the basis on which the architecture is being designed on. The architecture must be able to fully satisfy these , generally around five, requirements in order to be successful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;High level architecture diagram.&lt;/span&gt; The highlevel architecture diagram is the corner stone of the document. This is actually the picture or the sets of pictures most architectural discussions are done between engineers and which will set the broad strokes of the project. The key goal of the high level diagram is to set the relationships and communication channels between each compoment of a system. It can be done by using a block diagram with squares and arrows indicating componets (applications, modules, databases and etc. ) or it can be done by using UML's component diagrams.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Technology platform.&lt;/span&gt; A list of technologies used for the product organized in logical sections describing the goals and reasons for the usage of the technology. It is important to correlate the chosen technologies interdependencies, e.g. all the technologies must work well together and if not the risks must be identified, documented and review by all the architectural key stakeholders of the project. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Technology platform - process and techniques used for specific problems.&lt;/span&gt; Description of key usages of each technology. Most modern technologies used for the development of modern systems and products can be used in several ways, buy applying several techniques at ones disposal. For example one can rely heavily on the ObjectDataSource object in ASP.NET for all grid operations or could choose to manually bind data or just to build a normal HTML table with data into it. This important for a data heavy application where data will be often presented in a tabular fashion and this will be the main way a user will interact with the system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Key processes covered by the product.&lt;/span&gt; This correlates directly with the high level requirements set for the product, e.g. the project goals and other critical issues which can applied to the entire product and are critical for its proper functioning. Here we could specify how the system reporting solution will work, how the system will interact with other key systems ( for example with an old dos accounting application critical to the client who can only write to the file system plain text files), how the authentication and authorization system will work , how will the caching solution work etc. Apart from the high level diagram this is the most critical part of the architecture and more so for the client. Often to support a specific process implementation an &lt;a href="http://www.agile-architecting.com/Architecture%20Spikes.pdf" target="_blank"&gt;architectural spike&lt;/a&gt; will be developed to prove and disprove a point to the key architectural stakeholders.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Other.&lt;/span&gt; Architecture is for the most part a technical discipline done for the product development team. It is purposefully ten thousand feet up from the detailed specification of the product in other to cover, restrict and keep up with the full product life cycle. Each product is a separate beast with its issues and pitfalls, risks and challenges and there a myriad characteristic who could be added to the software architecture for a specific project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2050050032056136669?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2050050032056136669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/03/key-principles-of-software-architecture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2050050032056136669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2050050032056136669'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/03/key-principles-of-software-architecture.html' title='Key principles of software architecture'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4uzlKD92WwA/S6H1MyBioiI/AAAAAAAACEs/4hNR767k6-s/s72-c/HLA.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2202734696309253107</id><published>2010-02-25T21:54:00.003+01:00</published><updated>2010-02-25T21:57:24.065+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>My presentation of the fourth MSCOmmunity Istra</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4uzlKD92WwA/S4bj-h3D51I/AAAAAAAACEA/F2s4o1FFNOE/s1600-h/IT+PRO+(2).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_4uzlKD92WwA/S4bj-h3D51I/AAAAAAAACEA/F2s4o1FFNOE/s320/IT+PRO+(2).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5442287863104530258" /&gt;&lt;/a&gt;&lt;br /&gt;Last Tuesday I presented at the fourth Microsoft Community Istra meeting in Pula at the Student MMC club. I was the sole presenter due to the fact that my colleague Hrvoje couldn't make it. &lt;br /&gt;I presented on the topic of UML. The presentation consisted of a short introdcution to UML, its origins and uses and then I covered the basics of Class, Package, Activity and Sequence diagrams.&lt;br /&gt;I think the presentation went rather well. I wasn't nervous, the crowd was developers mostly and the ambient suited me just fine (dark, dunk walls, underground bar on the back and you female students searching for a higher insight in life, back room poker and a whole day on going LAN party in the next room).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4uzlKD92WwA/S4bj-ZONn3I/AAAAAAAACD4/sLg7aRVnA5U/s1600-h/IT+PRO+(1).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_4uzlKD92WwA/S4bj-ZONn3I/AAAAAAAACD4/sLg7aRVnA5U/s320/IT+PRO+(1).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5442287860785717106" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2202734696309253107?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2202734696309253107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/02/my-presentation-of-fourth-mscommunity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2202734696309253107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2202734696309253107'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/02/my-presentation-of-fourth-mscommunity.html' title='My presentation of the fourth MSCOmmunity Istra'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4uzlKD92WwA/S4bj-h3D51I/AAAAAAAACEA/F2s4o1FFNOE/s72-c/IT+PRO+(2).jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3063862765395552899</id><published>2010-02-12T13:27:00.000+01:00</published><updated>2010-02-12T13:28:18.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT Showoff 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Conference'/><title type='text'>IT Showoff Zagreb</title><content type='html'>Winter came to Istra. Once again the snow fell and the cold came. In Labin, where I work at six a.m. the temperature was bellow zero. And today is the day I'm travelling to Zagreb to the IT showoff conference. &lt;br /&gt;I took the company car, my trusted GPS, a two cd podcast collection and on I went. In Rijeka I picked my colleague and friend Hrvoje Hudoletnjak, who will sit on the evening panel “Web framework show down” at the conference. &lt;br /&gt;And today we went. &lt;br /&gt;As the trip progressed the temperature got progressively worse. Bellow zero, bellow five – oh my god please do not look at the thermometer. The snow, let me tell you about the snow. The highway was deep covered in it. On some parts only one way was opened on each side. The snow was stacked up taller then me, and I’m tall.&lt;br /&gt;But, thanks to my superb driving skills and to a little bit of help from the window unfreezing spray we made it to FER where the conference is being held. &lt;br /&gt;Luck was still on our side. We found a free parking space really fast and really close to the university. &lt;br /&gt;A small part of the university was reserved for the conference. When Hrvoje and I arrived there we where greeted by a long waiting line of people waiting to be registered. &lt;br /&gt;The registration proceeded pretty smoothly. The conference boast with pretty looking hostesses ( a bit sexist , but you know) and it proved true. The girls were pretty and competent and Hrvoje and I were registered quickly. &lt;br /&gt;I got a cd, a pool and a conference program. Well, so much for smack. But it is a free conference. I’m not going to complain. &lt;br /&gt;The conference is organized in two university auditoriums and a hall. The hall is where to social aspect of the conference is being held. Lost of drinks and pretzels are served there as nourishment which is cool.&lt;br /&gt;Of the two tracks I attended the right , “development” track. And I was astounded by the quality of content and presenters. They were really good, fun, instructive and furthermore they freely gave promotional t-shirts to those who asked questions, which in three instances was me. &lt;br /&gt;Yep, I won three t-shirts which of course I will give to my beautiful wife. She is already an Ubuntu user. She looks really nice in geek-wear.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3063862765395552899?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3063862765395552899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/02/it-showoff-zagreb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3063862765395552899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3063862765395552899'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/02/it-showoff-zagreb.html' title='IT Showoff Zagreb'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5990569430385827100</id><published>2010-01-30T21:53:00.005+01:00</published><updated>2010-01-30T22:01:26.552+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>After all is done, the enemy comes to pick the honored fallen bodies</title><content type='html'>This week I presented on the two events announced on my previous post. Both were real amazing and great opportunity for me to meet new people and practice my presenting skills (which really needed practice).&lt;br /&gt;The first was the MS Community meeting held on the 26th of January in the Konoba “Idila” in Rakovi near Baderna. For those of you who aren’t from these parts a “konoba” is a local tavern type. If you ever played Dungeons and Dragons or watched a fantasy movie it is the place where the shady old man gives you the quest of your life time (or week in case of my gaming group back at college). It was a real nice place. Cold, dark and mysterious where the mysteries of the Windows XP mode of Windows 7 and the arts of Unit-testing were explained in a dark , dunk room, lit only by the ancient fire place in the center of the dining, drinking, area. The walls were of made of hand chipped stones, rugged and hard, cold from the outside winter.&lt;br /&gt;A place was cleared for us. Twenty chairs, a table and a presentation pod. The ceiling was short, wooden planks running back and forth. I was afraid I was going to hurt my head. I’m tall you see. But no such issues were encountered. &lt;br /&gt;&lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;key=30824344&amp;goback=.hom&amp;trk=NUS_STAT-updtr"&gt;Viktor Ezgeta&lt;/a&gt;, presented first on the Windows XP mode in Windows 7. He started first with several slides showing the basics of the Windows XP mode and then continued on a live presentation. Viktor is a fun presenter to have, and it showed in this presentation also.  I think everyone got the point there. No missing content for Viktor.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4uzlKD92WwA/S2ScyyWKXtI/AAAAAAAACDg/Gc_FktgxmMY/s1600-h/IMG_3246.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_4uzlKD92WwA/S2ScyyWKXtI/AAAAAAAACDg/Gc_FktgxmMY/s320/IMG_3246.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432639446837780178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4uzlKD92WwA/S2SdFGKEibI/AAAAAAAACDo/_lJXtg7O_z8/s1600-h/IMG_3248.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_4uzlKD92WwA/S2SdFGKEibI/AAAAAAAACDo/_lJXtg7O_z8/s320/IMG_3248.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432639761393420722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I continued next with my habitual “Unit-Testing: A grease monkey introduction” presentation. It took me longer than agreed but no one objected (well my wife number one had several well meaning objections on my presentational style, which isn’t unusual given her background in journalism and her current work as a researcher in communicology). It went well. I first presented on unit-testing theory and then I showed how unit-testing is done in practice with NUnit.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4uzlKD92WwA/S2SdTfopr4I/AAAAAAAACDw/bJKGMiB1CyM/s1600-h/IMG_3249.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/_4uzlKD92WwA/S2SdTfopr4I/AAAAAAAACDw/bJKGMiB1CyM/s320/IMG_3249.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432640008750739330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Afterwards it was the social hour of the evening. We all gathered around an old wooden table, really nice, really cool and rustic and the food was served. Fuži with wild animal meat, and njoki with lambs meat. Of course I got my vegetarian meal which was really nice and animal friendly.&lt;br /&gt;The food was good and so was the talk. As a result me and my colleague &lt;a href="http://www.hudosvibe.net/"&gt;Hrvoje Hudoletnjak&lt;/a&gt; will present on the next Microsoft user community meeting which will be held in Pula on the 23rd of February 2010. &lt;br /&gt;The second event I present on was the recruitment run held by &lt;a href="http://www.novatec.hr"&gt;Novatec New Technologies&lt;/a&gt; ( the company I work for) and &lt;a href="http://www.systec-automation.com"&gt;Systec Automation&lt;/a&gt; (the parent company I work for ) in Osijek at the &lt;a href="http://www.etfos.hr/?pocetna=0&amp;d=309&amp;key=studenti"&gt;Faculty of Electrical Engineering&lt;/a&gt; as part of our new campaign of opening Novatec and Systec offices in Osijek. I presented with a colleague. He covered the Systec side of the presentation and I covered Novatec and the recruitment process.&lt;br /&gt;The presentation was held in the new faculty campus which previously was one of the Osijek’s military bases. The base itself is very ominous, during the opening days of the last war the enemy held the base and opened fire on the city from there and the city hospital which is just on the other side of the street. &lt;br /&gt;It is nice to see such a building disbanded from military use and converted to something which will benefit so many people. &lt;br /&gt;The presentation hall was full with students. Some had to event stand, such was the interest. We really got their attention, so I’m sure many will apply for the position. &lt;br /&gt;Osijek is wonderful city. It was my first time there. I have some friends living there, but haven’t had the time to meet with them. I took a short walk through the city the first night I was there and was impressed with its architecture, the Drava river and parks. The people are really nice and friendly, and didn’t hesitate with instructions where to go when I asked them to. I would really like to go back there and see more of the city, its museums, its bars and theaters (well I am the guy who listens to baroque music when programming, really no surprises there).&lt;br /&gt;In short, I think , both events were a real success and I really hope to present some more in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5990569430385827100?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5990569430385827100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/01/after-all-is-done-enemy-comes-to-pick.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5990569430385827100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5990569430385827100'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/01/after-all-is-done-enemy-comes-to-pick.html' title='After all is done, the enemy comes to pick the honored fallen bodies'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4uzlKD92WwA/S2ScyyWKXtI/AAAAAAAACDg/Gc_FktgxmMY/s72-c/IMG_3246.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2165509530933218235</id><published>2010-01-22T22:41:00.003+01:00</published><updated>2010-01-22T22:44:37.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>Events, events, events</title><content type='html'>Well, its conference time in Croatia this time of year. First , there was the second Web User Group meeting a Microsoft Croatia which I attended with two of my colleagues . You can watch the live stream &lt;a href="http://www.webug.com.hr/201001/"&gt;here  &lt;/a&gt;. It was the first WebUG meeting I attended and I was dazzled by the quality of organization , the presentation and the amount of benefits I got just by attending there (lower cost for attending several local conferences and of course the lower early entry cost for the &lt;a href="www.developerbootcamp.com"&gt;Developer Bootcamp&lt;/a&gt;). &lt;br /&gt;The presentation which I attended was titled “User experience on the web” by Vibor Cipan of &lt;a href="http://www.fatdux.com/"&gt;FatDUX&lt;/a&gt;. The presentation was interesting, educational and all in all a good experience for me.&lt;br /&gt;The pizza afterwards was great too.&lt;br /&gt;There are two events I plan, wish to attend to. The first is the &lt;a href="http://www.itshowoff.com/"&gt;IT Show off&lt;/a&gt; conference  which will be held on the 12th of February this year in Zagreb which is a free one day developer conference and the second is the above mentioned Developers Bootcamp. &lt;br /&gt;I will held two presentations next week. The first will be held on Friday 29th of January at the &lt;a href="http://www.etfos.hr/?pocetna=0&amp;d=309&amp;key=studenti"&gt;Osijek Faculty of Electrical Engineering&lt;/a&gt; where I will present the company I work at &lt;a href="www.novatec.hr"&gt;Novatec New Technologies&lt;/a&gt;  and our software engineering process. Attendance is of course free.&lt;br /&gt;The second will be held on Tuesday 26th of January in the Tavern Idila in Rakovac near Baderna. I will be the second presenter. The first will be Viktor Ezgeta with “Windows XP mod of Windows 7”. I will present my usual introduction to unit –testing presentation. It will cover the basic unit-testing theory and practice by showing how to use NUnit for unit-testing .NET applications.&lt;br /&gt;For the grand finale, I’m announcing my to WinDays 2010 presentation proposals:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;F# : an introduction and,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Domain – driven design in .NET with Visual Studio 2010 modeling projects.&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I hope one of the two is taken.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2165509530933218235?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2165509530933218235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/01/events-events-events.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2165509530933218235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2165509530933218235'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2010/01/events-events-events.html' title='Events, events, events'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4891420322450678559</id><published>2009-12-22T07:45:00.002+01:00</published><updated>2009-12-22T07:50:13.046+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><title type='text'>14. SQL &amp; Developers Users Group meeting in Rijeka</title><content type='html'>I've recently held a presentation on the 14. SQL &amp; Developers Users Group meeting in Rijeka on the 10th of December 2009 on the topic of unit testing. &lt;br /&gt;Due to the fact that I was the only presenter I had the opportunity to present two talks, one on the theoretical side of unit testing and the other on more practical approaches. &lt;br /&gt;Both talks were successful. The attendees were a mixed bag of old hands and newbees wanting to learn about the topic and art of unit testing. The crowd was small, but that suited me fine since we could talk and explore topics of interests freely. &lt;br /&gt;It was an interesting event for me. I learned a lot about presenting, a skill I have yet to master fully and the attendees later told me that they learned a lot from it which was as good a praise as I needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4891420322450678559?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4891420322450678559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/12/14-sql-developers-users-group-meeting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4891420322450678559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4891420322450678559'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/12/14-sql-developers-users-group-meeting.html' title='14. SQL &amp; Developers Users Group meeting in Rijeka'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3675501778322841920</id><published>2009-10-29T09:11:00.006+01:00</published><updated>2009-10-29T09:48:50.060+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Documentation'/><title type='text'>Code Documentation</title><content type='html'>Code documentation is the application documentation written directly in the source code of the application. Code documentation is used to document the application API in order to increase developer code understanding and discoverability, to reduce the time needed to implement a particular feature using prebuild components and to decrease the defect rate of defects caused by the lack of proper component understanding.&lt;br /&gt;&lt;br /&gt;Code documentation is written before each package, class, property and method name in the source code using a specific syntax which makes use of automatic code documentation tools possible. The syntax for code documentation varies from language to language. It is well supported in most IDEs for most of the mainstream development languages.&lt;br /&gt;&lt;br /&gt;There are two distinct benefits when using code documentation with automatic tooling support. &lt;br /&gt;&lt;br /&gt;First for IDEs that support code completion (intellisense in Visual Studio) the IDE will automatically parse the code documentation of the piece of the code the developer is currently writing and it will present it to the developer as she is typing the code , this informing him of the intended use of the component being used.&lt;br /&gt;&lt;br /&gt;Second tools exist that can create a proper API documentation from the source code of an application using code documentation and the basic language syntax as tools. The documentation thus generated is much easier to grok than fumbling in the IDE with code completion and random file opening and reading. Once again tools exists for that , e.g. &lt;a href="http://blogs.msdn.com/sandcastle/"&gt;Sandcastle&lt;/a&gt;,&lt;a href="http://www.phpdoc.org/"&gt;Phpdocumentator&lt;/a&gt;, &lt;a href="http://docs.python.org/library/pydoc.html"&gt;Pydoc&lt;/a&gt;,&lt;a href="http://java.sun.com/j2se/javadoc/"&gt;Javadoc&lt;/a&gt; and etc. the list goes on and on. &lt;br /&gt;&lt;br /&gt;A problem most developers I've encuntered have is that they do not know what to write in the code documentation, even when they have written the component them selves. &lt;br /&gt;&lt;br /&gt;When I write my code documentation I use the following model for each component memeber I document (class, property, method, package etc...). &lt;br /&gt;&lt;br /&gt;Each documetation item is composed of two elements: THE WHAT and THE HOW. Of the two THE HOW is optional since in some cases it is not needed.&lt;br /&gt;&lt;br /&gt;This is best shown by an example&lt;br /&gt;&lt;br /&gt;&lt;code style='font-family:"currier new"'&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// THE WHAT : MovieService is a service provider for using basic CRUD operation on the Movie object permanent repository storage(e.g. database )&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;///&lt;br /&gt;/// &amp;lt;example&amp;gt;&lt;br /&gt;/// An instance of the MovieService object is created with its static Create method which will connect the object instance to the proper system Movie repository.&lt;br /&gt;/// &lt;br /&gt;/// MovieService movieService=MovieService.Create();&lt;br /&gt;/// IEnumerable&amp;lt;Movie&amp;gt;  movies= movieService.Select();&lt;br /&gt;/// &amp;lt;/example&amp;gt;&lt;br /&gt;public class MovieService&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// THE WHAT: Creates a basic instance of the MovieService object. It does not however intialize the required repository connection for the Movie object.&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; private MovieService {}&lt;br /&gt; &lt;br /&gt; ///&amp;lt;summary&amp;gt; THE WHAT: Creates a basic instance of the MovieService object and intializes the required repository connections for the Movie object.&amp;lt;/summary&amp;gt;&lt;br /&gt; /// &amp;lt;returns&amp;gt; Working MovieService intance&amp;lt;/returns&amp;gt;&lt;br /&gt; public static MovieService Create{return new MovieService();}&lt;br /&gt; &lt;br /&gt; /// &amp;lt;summary&amp;gt; THE WHAT: Returns a collection of all Movie objects in the Movie object repostitors.&amp;lt;/summary&amp;gt;&lt;br /&gt; ///  &amp;lt;returns&amp;gt;IEnumerable&amp;lt;Movie&amp;gt; collection &amp;lt;/returns&amp;gt;&lt;br /&gt; public IEnumerable&amp;lt;Movie&amp;gt; Select() {return new List&amp;lt;Movie&amp;gt;();}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The THE WHAT ant the THE HOW texts int he previous example are just for the example sake, in real life documentation endeavors they are not needed, and should not be used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3675501778322841920?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3675501778322841920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/code-documentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3675501778322841920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3675501778322841920'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/code-documentation.html' title='Code Documentation'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7460199441279181105</id><published>2009-10-07T22:43:00.005+02:00</published><updated>2009-10-08T09:03:19.379+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arhitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Arhitecture of a thick web application</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4uzlKD92WwA/Ssz9n0uFA8I/AAAAAAAAAec/croubLBLulw/s1600-h/WebApplicationThickClientArhitecture.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 271px;" src="http://3.bp.blogspot.com/_4uzlKD92WwA/Ssz9n0uFA8I/AAAAAAAAAec/croubLBLulw/s320/WebApplicationThickClientArhitecture.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389961714664276930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A thick web application is a application composed of two parts , one is the server which generates HTML , CSS , Javascript and other elements and sends them over a network using the HTTP protocol towards clients who render the received content on the user machine in the form of an interactive user interface, where all the programming elements are tightly bounded in a single application element residing on the server.&lt;br /&gt;Nowadays thick web applications are not the hip thing to do. Everybody is doing service oriented applications or rich internet applications or even cloud oriented applications. Distributed systems are the in of the moment. Thick applications are seen as antiquated, not performing solutions, unable to cope with the requirements expected from modern systems both in the performance/scalability and the maintainability/coolness sides of things. &lt;br /&gt;Everyone forgets that a few years ago every application was a thick application, and that everybody started their careers learning and writing those types of applications. Of course there are still viable cases for such applications to be developed. &lt;br /&gt;First, they are simpler to understand, develop, deploy and maintain. Secondly they can be developed much cheaper and faster than their distributed counterparts due to the lesser numbers of different parts which need to interact and be set up in order to deploy and maintain the thick system in respect to the distributed one.&lt;br /&gt;I’ve actively developed user experience enhanced (web 2.0) applications both in PHP and ASP.NET (with a side note in Django and Google App Engine for a short time) and I’ve found that the following general application architectures is very suitable for developing thick web applications.&lt;br /&gt;The architecture is composed of the following elements (from the front to the back): &lt;br /&gt;&lt;strong&gt;Client side modules (screen).&lt;/strong&gt; This is the top most tier of the application. Here is what is actually sent and executed to the client. Due to the fact how the majority of web application frameworks are organized here we talk about client side code which drives the behavior of a specific module(screen). In lesser respect we talk also about images, video, flash, HTML, and CSS code. &lt;br /&gt;&lt;strong&gt;Client side components.&lt;/strong&gt; This tier is composed of general client side components (once again we talk here mostly about javascript elements – objects and functions) used once or more in one or more client side modules. A client side component is used only for data carrying and data transformation purposes. The required input is provided by the client side code on the each module, and resolution of the task assigned to the client side component is decided by the client side module using the component. Each component must be simple as possible and must do one thing, and one thing only.&lt;br /&gt;&lt;strong&gt;Server side modules (screen)&lt;/strong&gt;. This the first server side tier. This tier has two important tasks: first it must generate client side elements sent to the client in response to their request, and the other it must make use of the services provided by the service tier and the API provided by the Domain tier objects returned by the called services in order to compose them in a viable user task. A user task is a set of operations (a workflow) u user must do on the module (screen) in order to achieve a quantifiable business objective. &lt;br /&gt;This tier is where is decided what service (or services and their interactions) must be used in response to a users operation and what message must be sent back to the user in response. This tier must “know” everything that it needs to know about the business problems it tries to solve to successfully communicate with the user.&lt;br /&gt;&lt;strong&gt;Server side components.&lt;/strong&gt; Server side components are composed of reusable elements (classes, functions, widgets or other similar elements) used one or more times in one or more modules. Each component must be used for data carrying or data transformation, it must rely for its required input on the server side module using it and must not decide what to do with its output , which is left to do for the module making use of the component. &lt;br /&gt;&lt;strong&gt;Services.&lt;/strong&gt; This the first tier on the middle tier side. How it is separated from the other middle tiers is not important. What is important how it is used and how it is structured. Regardless of the programming implementation (functional or object oriented) the Service tier must provide a set of stateless, not dependent services each providing an atomic operation. Services must be grouped together by the business task their can perform when used together, but must not make assumptions about the order they are called or the way messages are sent back and forward between the user and the application.&lt;br /&gt;Services must concern themselves with their required input and expected output. If an error condition occurs (invalid parameter etc) the service must raise and exception (or similar message carrying ) construct which will provide technical data to the front end about the error condition occurred. It must not, however, return a full fledged user message.&lt;br /&gt;&lt;strong&gt;Domain&lt;/strong&gt; This tier is tasked with the modeling of the business domain the application is working on. The domain tier is composed from entities, value objects, events and repositories each interacting with each other in the same manner they interact in the business system used by the application. In order to find out more about the Domain tier please read the excellent book written by Eric Evans &lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1254952283&amp;sr=8-1" target="_blank"&gt;Domain Driven Design&lt;/a&gt; .&lt;br /&gt;This tier is used by both the server side modules and the services. The services will work with input and output parameters taken from the domain tier, and the server side modules will use them to carry out their associated business tasks.&lt;br /&gt;&lt;strong&gt;Infrastructure.&lt;/strong&gt; This tier is used only by the service tier since it provides low level support for interacting with the underlying system, database, other application services and etc. If you need to open and read a file, or send an e-mail message use this tier. What to do with the read data from the file, or what to put in the e-mail message is the job of the server side and services tiers. &lt;br /&gt;&lt;strong&gt;Database.&lt;/strong&gt; The database,  or the backend, is the final tier of our typical thick web application architecture. The database is used for permanent data storage, data storage manipulation, querying and fast retrieval.  Only one thing is important regarding the implementation of the database: under no condition put a line of application logic in it, no matter how fast or simple it seems to be. It almost always is a bad decision, which will lead to lower system operation visibility and a nightmare of maintenance problems. Just don’t do it. Really. &lt;br /&gt;How to tie all of this together. It’s both simple and terribly complex. What I’ve found out works best is to first design the domain of the application, then translate it into a data model and data  transformation procedures. Secondly to define all the business task which must be carried by a user, group them in related modules and break each task into atomic operations which will be actually written as services using the domain tier of input/output. &lt;br /&gt;When writing services I use the following technique: first I ask my self what questions as the user interface I have in order to successfully complete the business task, and then what operations I must perform in order to do it. As the last thing I define the input and output messages for each task/operation. &lt;br /&gt;The infrastructure tier must be made low level as possible. Really low level stuff. The question I ask my self is what I need from the system (world) around me as the services and what I want to be present but also to forget it ever exists. The answer to both question goes into the infrastructure tier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7460199441279181105?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7460199441279181105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/arhitecture-of-thick-web-application.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7460199441279181105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7460199441279181105'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/arhitecture-of-thick-web-application.html' title='Arhitecture of a thick web application'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4uzlKD92WwA/Ssz9n0uFA8I/AAAAAAAAAec/croubLBLulw/s72-c/WebApplicationThickClientArhitecture.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-2829080112280901391</id><published>2009-10-03T17:51:00.003+02:00</published><updated>2009-10-03T18:21:49.529+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><category scheme='http://www.blogger.com/atom/ns#' term='Deadline sprints'/><title type='text'>Short, short deadline sprint rules for success</title><content type='html'>Imagine this situation, its 24 hours before a very important deadline and your project isn't ready. But you must show some progress to the client, something anything to stop them from stopping the project and turning to someone else. What do you?&lt;br /&gt;&lt;br /&gt;I've been caught in this situation several times already this year, and will in all probability caught again, and its not easy or simple to handle. For each project I was a technical lead, and the responsibility to actually do the task by the deadline fell to me. &lt;br /&gt;&lt;br /&gt;The following rules helped me:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Cash in your relationship chips , you'll need them to motivate your people and make them buy in the effort required of them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write a task list of all tasks needed to be carried out in order to successfully meet the dead line, and then filter it out to the bare essential. It's time for brutal reality, not Christmas wish list making.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Take the core, the most difficult and most important stuff on your self. They made you a technical lead for a reason. Now is time to earn it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Distribute the remaining stuff to each team member according to their capabilities and aptitude.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make sure no one introduces new (or reopens) new defects into the system. Test the core twice before committing. Break heads if necessary. It's not the time to create more work.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do not commit unfinished work. It either is done, or it isn't. Only pure 100% completed and tested changes go into the repository. Make sure everyone is on the level with this.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do standups every four hours in the first twelve hour period, then switch to two hour standups for the remainder of the sprint. Track only completed, not completed progress on the created task list. Look for problems, and replace people who got tired or the tasks assigned to them are to difficult to handle. Pair programming was proven effective in both cases.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On achieving all (or the majority) of the planned task code freeze the repository, and label it as such. Do not allow anyone to commit now unless its a critical defect fix you personally authorized. Break heads if necessary.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;After the code was freezed, test everything on your machine. If everything checks out label the code in the repository as such. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Publish the product to the production environment and then check it there once again. If everything checks alright, go home to your family for a head bashing for spending 24 hours on work while your kid won he's first soccer prize (or similar). Be proud of your self for achieving something great and meaningless.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The following rules(principles, steps) work because there is a clear scope of the work to do in a very short amount of time. Everyone is clear on the importance of the work to do and what is the price of failure.&lt;br /&gt;&lt;br /&gt;The two most important thins are frequent standups and the written, prioritized task list. Why? Frequent standups remind everyone one the goals and the principles of the work to do. They allow faster knowledge sharing between team members and allow you to get a clear view of the progress achieved thus far, of the problems had and allow you to frequently react to those problems in order to remove the impediments thrown in front of the team.&lt;br /&gt;&lt;br /&gt;Remember in the end everything falls to you. You must be the leader, the one that starts first and goes home the last. The one that pushes the code to the production and says is done. At four am there is no one else. Its your responsibility to sleep for two hours and show to work to check if everything is OK with the business people showing the product to the client. &lt;br /&gt;&lt;br /&gt;You are the hart and soul of the team. You must show firmness and clarity of vision and command, you must be supportive because without them you are nothing . You are your team, and they are yours for good and for worse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-2829080112280901391?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/2829080112280901391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/short-short-deadline-sprint-rules-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2829080112280901391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/2829080112280901391'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/10/short-short-deadline-sprint-rules-for.html' title='Short, short deadline sprint rules for success'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5126487387590773738</id><published>2009-09-21T08:17:00.001+02:00</published><updated>2009-09-21T08:20:13.982+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='brownfield development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Best practices in brownfield development</title><content type='html'>The wikipedia definition for the term 'brownfield is this : ''In the United States city planning jargon, brownfield land (or simply a brownfield) is land previously used for industrial purposes or certain commercial uses. The land may be contaminated by low concentrations of hazardous waste or pollution, and has the potential to be reused once it is cleaned up. Land that is more severely contaminated and has high concentrations of hazardous waste or pollution, such as a Superfund site, does not fall under the brownfield classification. Mothballed brownfields are properties which the owners are not willing to transfer or put to productive reuse.[2]' . &lt;br /&gt;&lt;br /&gt;I couldn't agreed more with this definition, especially about the hazardous waste and pollution parts. Brownfield development in software industry is very common, rarely a developer will develop a system from scratch without dealing with legacy code and applications. &lt;br /&gt;&lt;br /&gt;In my opinion brownfield development is hard, and understudied. Every book on software development teaches how to develop a green field project, e.g. a project developed from scratch. Which is good. But no one is taught the essential skills and practices of brownfield development. &lt;br /&gt;&lt;br /&gt;And that hurts. Very much.&lt;br /&gt;&lt;br /&gt;What are the problems associated with brownfield development? They are many and varied and depend on both technical and human reasons:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Lack of understanding on the underlying reasons why a technical solution was chooses to solve a particular problem.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lack of any legacy technical documentation and tests.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Developers think they know the 'only right way' to develop software.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fear and uncertainty of breaking existing, working functionality.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;When working on brownfield project I've found the following to be true and very helpful and productive:&lt;br /&gt;&lt;br /&gt;Do not try to re-engineering the project when implementing new functionality, when the time comes that will be the only thing you will be doing. That way your will not bog down on useless, defect prone work.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Do it as the other guy, use the same existing infrastructure and follow the same development principles. That way you will not add competing solutions and will achieve a homogeneous environment.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Write a short, concise documentation for each feature you develop. That way everybody will know what you have done and why.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Document key technical solution and practices in the project. Some problems and questions keep reappearing over and over. That way you will save everyone the time and effort of figuring them by them selves.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Write smoke tests (functional or unit) for the core functionality of the project. That way you will always know if the core works or not.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The goal here is to not increase needlessly the complexity of the system, to save time and effort and to quickly gain the core knowledge the other guys had. If the client wanted you to re-engineer their system they would have hired you for that specific goal. It is often better to follow existing practices and procedures than to try to reinvent the wheel and fall in a bottomless pit of defects keeping popping up and deadlines never met.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5126487387590773738?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5126487387590773738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/09/best-practices-in-brownfield.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5126487387590773738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5126487387590773738'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/09/best-practices-in-brownfield.html' title='Best practices in brownfield development'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1778616025659552168</id><published>2009-09-10T09:39:00.002+02:00</published><updated>2009-09-10T09:48:19.688+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Another day sprint</title><content type='html'>I'm concluding another day and a half development sprint. I started yesterday at five a.m. with a trip to Zagreb which lasted till six p.m. , filled with back to back blood grinding meetings. I've returned to Labin at eleven p.m. and started working on a deadline pressed project with three other developer. We've succesfully deployed the newest application version fifteen minutes ago. Another hour, and I'm crashing and burning into the nearest bed. &lt;br /&gt;&lt;br /&gt;What lessons I've learned:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Writing at least functional, or just smoke, tests solves much development problems&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Task development is half of well done feature&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Regular standup meetings for tracking progresss and quick reactions to changes in the project situation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Wokrin in a virtual enviroment saves time and money, and increases the speed a new developer can join an undergoing project&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Power naps help a lot&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;What is the motivation for doing a day and a half development sprint? For me is the challenge and the opportunity to be a hero, to save the day. To complete something hard and critical, which not many people can do. For others, I don't know exactly, but I recon is the same as me. I feel downright special right now. &lt;br /&gt;&lt;br /&gt;Well I am special. so are my colleagues, we are a special team which completed something special. Nobody can take that away from us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1778616025659552168?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1778616025659552168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/09/another-day-sprint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1778616025659552168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1778616025659552168'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/09/another-day-sprint.html' title='Another day sprint'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3850333788995861787</id><published>2009-08-25T21:04:00.001+02:00</published><updated>2009-08-25T21:06:10.548+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Sharing your knowledge</title><content type='html'>Why are developers, and people in general , so prone to entropy?  Most of the software developers I know are really quick to throw aways good engineering practices in favor of writing more code. And use the same code writing exercise as an excuse of not doing those practices in the first place. &lt;br /&gt;I have to much work to do! See, how many bugs I have to fix! What do I get from writing all these down, nobody will read that! Testing is stupid, I will be the only one doing it , everyone else doesn't do it! &lt;br /&gt;Oh , how many such sentences I've heard from everyone I talked to. And the energy I spent correcting each and different attitude. Ah! And then to see them fall back to their evil no engineering ways, practically makes me wonder why do I try. &lt;br /&gt;OK, I try , because I really want to teach others what I know and think that should be a practice for all experienced developers, only this way our profession will grow and evolve. I do not gain anything by not sharing and teaching others. &lt;br /&gt;What are the benefits of sharing (for example with your team mates):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You can shuffle boring and uninteresting work to them, while you focus on more challenging stuff&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;You can discuss problems with someone who understands the topic , and possibly made some learning on their own&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;You learn by teaching&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;People around you will write code with greater quality&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Teaching others , or sharing knowledge , has its drawbacks :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Time spent teaching others is not time spent on improving you&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Teaching others (in my experience) often diminishes your knowledge in the eyes of others , since for them is so easily gained&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Teaching is a strenuous and continuous process with unknown results (if you want to see big bangs for you bucks quickly, better be ready for disappointment)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;And the greatest truth of all: you can't force people to really learn and implement that they are not interested in. Especially if you do not a rifle on their heads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3850333788995861787?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3850333788995861787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/sharing-your-knowledge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3850333788995861787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3850333788995861787'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/sharing-your-knowledge.html' title='Sharing your knowledge'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6032544203088075200</id><published>2009-08-24T06:44:00.000+02:00</published><updated>2009-08-24T06:45:25.191+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workplace'/><title type='text'>Back to work</title><content type='html'>'m nervous, really nervous. For the last two weeks I was at home, resting and relaxing on my hard earned holiday. These were the first totally relaxed two weeks of holiday in , I think, more then five years. And now, today, I'm going back to work. And I'm so nervous. Really.&lt;br /&gt;&lt;br /&gt;For the past two weeks I haven't studied anything related to the field of Software Engineering. Instead I spent my time with my son Sven and my wife Tijana, I read fantasy novels (Steven Erikson “The Bonehunters”) and prepared a 4E D&amp;D quest for my wife and our two friends. In short I was a lazy bug in all. Now is time to go to work and enter the grinding machine of stress, constant learning, long hours and impossible deadlines (no deadline is impossible, it is just impossible what you want to do in that time span with the resources you have). &lt;br /&gt;&lt;br /&gt;How do I cope with this emotion? Well I woke early, I restarted my morning pilates exercises, opened a DNR TV video for Windows Workflow Foundation. During lunch break I will read “Software Engineering” 8th edition, and will begin a new practicing advanced ASP.NET 3.5 in hopes of one day continue with WCF, WPF and F#.&lt;br /&gt;&lt;br /&gt;Will I succeed? Will I be my old self and continue my work as usual? Or will I fall victim to laziness and the eternal question: Which is best, fighter or wizard?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6032544203088075200?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6032544203088075200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/back-to-work.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6032544203088075200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6032544203088075200'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/back-to-work.html' title='Back to work'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6710522613200111442</id><published>2009-08-11T12:38:00.001+02:00</published><updated>2009-08-11T12:42:27.635+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCoffe'/><title type='text'>Second Opencoffe Istra meeting</title><content type='html'>The second Istrian Open Coffee meeting will be held on Saturday 15th at 18:00 hours at the “Cvajner” caffe on the ancient roman square of Pula, on the tip and shorelines of Istra, the greatest peninsula of world. Come and join your fellow developers with excellent coffee, free Internet wireless connection and exhilarating talk about everything web development, web design, business and marketing on the web. Everything goes, as long is remotely related to the web. &lt;br /&gt;&lt;br /&gt;To find out more please join the  &lt;a href="http://groups.google.com/group/opencoffee-istra" target="_blank"&gt;Opencoffee Istra&lt;/a&gt;  group. There is no shortage of people willing to help a fellow web enthusiast. &lt;br /&gt;&lt;br /&gt;A special call is made to all web designers or front end engineers out there. On the last meeting the tip of the scale went to the developer, business side of things. The present web designers felt a bit alone with their tags, photoshops and animated gifs (or should I say flashy thingis). If you are a web front-end enthusiast your are more then welcome on out next gathering.&lt;br /&gt;&lt;br /&gt;Do not forget, the next meeting will be held on the 15th of August, at the “Cvajner” caffee in Pula on the ancient roman forum .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6710522613200111442?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6710522613200111442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/second-opencoffe-istra-meeting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6710522613200111442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6710522613200111442'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/second-opencoffe-istra-meeting.html' title='Second Opencoffe Istra meeting'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6977077126404076202</id><published>2009-08-07T06:40:00.006+02:00</published><updated>2009-08-07T06:44:44.630+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><category scheme='http://www.blogger.com/atom/ns#' term='Documentation'/><title type='text'>Document first , document later</title><content type='html'>There is a great debate in my head, what is best – to document first , or to document latter. The wanna be engineer in my head would scream  “Document first!”, but my practical side, the one that has been into the trenches, that has seen things, horrible things would say “Document later!”. How to reconcile those two opposing views?&lt;br /&gt;&lt;br /&gt;Documents can be generally be placed into two broad categories, those that are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Generally written before development&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Generally written afterwards development&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Why do I say Generally? Because in software development nothing is set in stone, and everything is fluid, thus documents cannot be said to have been written always before head or afterwards a piece of software is developed( class, module, library etc.) . A set of documents could be generally written before head, like requirements or the high level architecture, and some are generally written afterwards like in some cases detailed API technical specification.&lt;br /&gt;&lt;br /&gt;What makes a document fall into one of the two general categories. Two things :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Type of document&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Current state of the software life cycle&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The Type of the document generally dictates when a software piece will be written. Like, requirements or the functional specification or something like that which is generally needed before a piece of software is written. And some which cannot be (or can, but albeit very hardly depending on the skill of the developer and the knowledge of the system), like detailed technical specification which is not ever accurate when written first and is ever (hopefully) updated once a particular piece of software is written. &lt;br /&gt;&lt;br /&gt;The other most contributing factor is the current state of the software life cycle a team find its self in. When developing a green field software it is generally best to do the documentation first ( I'm not discussing waterfall here, you could develop module after module, and before each module write the technical documentation for it before going into development), but when a team finds it self knee deep in a brownfield development project, which generally doesn't have any documentation what so ever, which isn't even commented properly so you cannot generate an API spec automatically which is remotely useful to anyone, when you need to fix unknown defects, when you need to implement a piece of functionality and don't know how to place it inside the project and how it is to be connected to everything else, writing documentation first could be and exercise in futility since you don't know enough about the system. This will change gradually during brownfield development when you will reach a state where writing design documentation first would be a better choice in terms of quality of work and writing speed place into the construction of the document.&lt;br /&gt;&lt;br /&gt;So, what to say to may two different parts? It depends. And that is the only answer I can give them, which places my little self once again on the verge of a nervous breakdown due to over thinking so simple things. But documentation is important, some cannot see that, but those cocky bastards will soon find them selves trying to remember how they did that, or where somebody placed this and how is generally this implemented and so on, and will loose valuable money debugging the thing out of its life in order to find something which would take five flimsy minutes to read. Who is stupid now, ha?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6977077126404076202?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6977077126404076202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/document-first-document-later.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6977077126404076202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6977077126404076202'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/08/document-first-document-later.html' title='Document first , document later'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5896592433143474417</id><published>2009-07-25T22:53:00.000+02:00</published><updated>2009-07-25T22:54:30.159+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Database development blues</title><content type='html'>In most line of business application there are two major types of artifacts involved : the database and the application.  Sometime there are two types of developers, but mostly that is not the case. The same pure smuck that built an entity inside the application will usually write the database and UI code for it.&lt;br /&gt;Well generally I don't think thats wrong. I strongly belive in cross functional teams where each developer can work with equal skill on each application tier. When you work in the outsourcing industry as I do, you quickly came to appreciate those team members who seem to be able to do evertyhing: database modeling, stored procedures, domain objects, html and css layouts, documentation, testing and so on. &lt;br /&gt;The major problem with the approach of one developer doing both the application and the database work is that that developer approaches the database work in the same way as he approaches the development of a typical application. But those two types of artifacts are not the same, they behave differently during each phase of the product life cyle.&lt;br /&gt;The application code is fairly easy to modify, extend and delete where the database code is always resistant to change, and it grows more resistant as the product and its database grows. Why is that?&lt;br /&gt;The database is composed of three different types of artifacts:&lt;br /&gt;Data structure&lt;br /&gt;Programmed logic&lt;br /&gt;Data&lt;br /&gt;Data structure is the logical representation of the types of data stored in the database and their respectiove relations. We call them tables. &lt;br /&gt;The programmed logic is what we say to the database it should do with the data that goes in and out of a table. We call this : stored procedures, functions, triggers, constraints etc. To most developers this is the closest thing to real development they will find in a database project.&lt;br /&gt;The data, well, there is not much to say about that. This is the meat and bones of what a database is to most people. The reason d'etre of a database. Users data, application or system data stored for eternity in a database for all to see and use. Most databases store data about them selves in special databases and tables. Figure that. &lt;br /&gt;Well the thing is with databases that the data stored inside them is the most valuable thing in a line of business project. A developer can frag the entire application code and it wouldn't be even as worse if he fragged the data stored in a database. So, losing or modifying data in a database is not a good thing.&lt;br /&gt;As a database (and its accompanied application code) is being developed the volume of useful, production data inside it grows. Each change to the database structure becomes much hardere, since you cannot loose data (thats why most people try to nail the database structure before starting the development process) , and it gets even worse when the database goes live to live free in the wild of an enterprise IT infrastructure. If you frag the database there you can kiss your ass, head and small fingers good bye because angry people in business suits will descend apon your small little you like vultures on a helpless white rabbit with its back pawns broken. Its that bad. &lt;br /&gt;So working with the database is hard and risky. &lt;br /&gt;The underlying fact with the database is that its always changing. New data is added inside it, changed, deleted. The structure is change, new tables are being added each day. Even the programmed logic changes from time to time. It is always changing regardless of it being in development or in production. While the nice and good application code changes quite rapidly and easily during development but its damn impossible to change when its compiled in an executable and shipped to remote production server in the prairie. &lt;br /&gt;So what to do when you have a line of business product to ship on a rapid development track with database and application work done in parallel by the same people. Well , its simple. &lt;br /&gt;Stop making changes in the database manually. Write scripts. &lt;br /&gt;Repeatable, stable , data saving, scripts. &lt;br /&gt;Then , respect the database. It is not your run of mill .NET application. It requires different development practices.&lt;br /&gt;In database work you done have the write, compile, test life cycle of application development. Once you loose data it is gone, once you mess thing its hard to go back. &lt;br /&gt;Think of a new development process for working with the database. It will repay you ten fold in virgins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5896592433143474417?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5896592433143474417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/database-development-blues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5896592433143474417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5896592433143474417'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/database-development-blues.html' title='Database development blues'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4134454162599583492</id><published>2009-07-10T13:51:00.002+02:00</published><updated>2009-07-10T14:14:04.670+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>14th SQL/DEV User Group Meeting in Rijeka  Review</title><content type='html'>I must say it was an interesting trip. Me and my team went to Rijeka yesterday to attend the 14th local SQL/DEV User Group Meeting. We took a company van and proceeded along the eastern Istrian coast to Rijeka. It took us two hours due to extensive working on the repair of the road and hordes of tourists enjoining the scenery. &lt;br /&gt;We arrived an hour latter than planned.&lt;br /&gt;The meeting was held at the "Naval University" of Rijeka. There were around fifteen to twenty people mostly from three to four companies including our own.&lt;br /&gt;The entire event had some good and bad sides. I'll categorize them .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Good&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Interesting and friendly crowd. We all were welcomed there warmly, and the fact that we were the new faces there made no difference. The MVC talk was interesting, rich with data and the speaker was well informed and mostly good. I met Aleksandar Zgonjan of &lt;a href="http://www.pro3x.com/"&gt;Pro3x&lt;/a&gt; there. After the presentation we all moved to a bar near the train station and had a drink there. I met several persons there including Jasmin Ćelić the president of the local programmers guild. We discussed the possibility of met organizing a presentation there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Bad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The technical equipment did't work. The projector malfunctioned or it didn't work with windows. I don't know. We started the presentation one hour late when Hrvoje Hudoletnjak brought a new one from work. Because of the that the IronRuby and Ruby on Rails presentation was not held , which was a shame for me because I was interested in it. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All in all it was a good day. Rijeka is a fantastic city, full of life and history. The most fascinating thing was the torpedo exposed in the courtyard of the university. A historical note : the first torpedo was developed in 1905 here in Rijeka in the factory "Torpedo". I touched the damned machine , examined it head to to toe and event fearfully knokced on its point a few times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4134454162599583492?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4134454162599583492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/14th-sqldev-user-group-meeting-in_10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4134454162599583492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4134454162599583492'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/14th-sqldev-user-group-meeting-in_10.html' title='14th SQL/DEV User Group Meeting in Rijeka  Review'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3442951367516499641</id><published>2009-07-09T14:38:00.003+02:00</published><updated>2009-07-09T14:49:46.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>14th SQL/DEV User Group Meeting in Rijeka</title><content type='html'>I'm thirty minutes away from a trip the fourteenth SQL/DEV User Group in Rijeka. This time its a corporate spornsored trip. Five other colleagues are going with me. We managed to gather up a big van with air conditioning and, event , a corporate sponsored meal. Nice. &lt;br /&gt;&lt;br /&gt;The SQL/DEV user group meeting will be organized in the Nautical University of Rijeka and will be composed of two lectures :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;ASP.NET MVC development practices&lt;/li&gt;&lt;br /&gt;&lt;li&gt;RubyOnRails, Ruby and IronRuby for .NET developers&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;And of course, after the presentations a gathering will be organized with drinks and snacks with all the attendees which will be an opportunity to meet new people and learn or discuss about interesting ideas and technologies.&lt;br /&gt;I really think these type meetups are important for a developers advancement, since you can learn and hear about development use cases which would normally be hidden from you.&lt;br /&gt;I started thinking about organizing a presentation for the next OpenCoffe meeting. Something short, maybe half and hour long, and interesting. Practical, maybe event daring in the specific way I conduct all my presentations ;)&lt;br /&gt;I haven't decided anything yet. I was wondering to do something on the following themes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Web UI testing and automation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Web portal development process&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Drupal theme development&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PHP Unit testing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Building an MVC framework in PHP.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Workflow Foundation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ASP.NET Data binding controls&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Don't know. More that I think about it I realize that I know squat. Maybe I should just cover and listen to wiser heads talking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3442951367516499641?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3442951367516499641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/14th-sqldev-user-group-meeting-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3442951367516499641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3442951367516499641'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/14th-sqldev-user-group-meeting-in.html' title='14th SQL/DEV User Group Meeting in Rijeka'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4097656248972625501</id><published>2009-07-05T15:28:00.000+02:00</published><updated>2009-07-05T15:29:00.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCoffe'/><title type='text'>OpenCoffee Club Pula Meetin One Review</title><content type='html'>The summer air was full of heat and sweat. It was heavy, oppressive and devoid of people. The streets were empty. No one was out except from those unfortunate enough to work on the hottest day of this summer or those stupid enough of not having anything else to do that included the sea or something where the air conditioning was turned to the lowest cooling option available and then some. &lt;br /&gt;And there was I sitting on the therace of the "Cvajner" caffee in Pula nervously waiting for the attendees of the first Istrian OpenCoffee meeting. I came twenty minutes last and sat in the coolest spot I could find, ordered my white coffee with sweetener and water , please, and started reading the eight edition of the Software Engineering book. &lt;br /&gt;And then it dawned to me.&lt;br /&gt;How am I going to recognize all those people. And most importantly, how are they going to recognize me? I didn't know the answer to that question. I started to look around. Two tables east of me a group of girls, mostly hot, sat around a laptop and discussed firewire software. Hmm, I thought, the don't look the web developer type. Should I approach them? I decided not. And so I waited.&lt;br /&gt;The first to come were Lucijan Blagonic of &lt;a href="http://www.polarnorth.org"&gt;PolarNorth.org&lt;/a&gt; and Emanuel Blagonic of &lt;a href="http://www.emanuelblagonic.com/"&gt;emanuelblagonic.com/&lt;/a&gt; and &lt;a href="http://www.extendis.hr/"&gt;Extendis.hr&lt;/a&gt;, two brothers who professionally work in web design and user experience design areas of the business. As I feared they didn't recognize me at first as a fellow attendee. My fears were found. I noticed them. They stood on the entrance of the Cvajner cafee and darted open looks around as if searching for &lt;a href="http://hr.wikipedia.org/wiki/Richard_Stallman"&gt;Richard Stallmans&lt;/a&gt; ghost who, as the popular legend says, developed sometime ago in this same caffee where our first meeting was to be held.   I thought they must be fellow attendees, but I was to shy, scared of a public debacle and most worst humiliation to openly approach them so I used the most sly tactic possible. I closed the book I was so pointedly reading almost a moment ago in order to show the cover. &lt;br /&gt;And it worked.&lt;br /&gt;Lucijan and Emanuel noticed me and approached. Thus the first Istrian OpenCoffee meeting kicked off. And it was glorious. Soon others arrived.&lt;br /&gt;First of the rest was Tomo Krajina &lt;a href="http://digresije.info/"&gt;digresije.info/&lt;/a&gt; and &lt;a href='http://www.panoye.com'&gt;panoye.com&lt;/a&gt; and &lt;a href='ttp://puzz.info'&gt;puzz.info&lt;/a&gt;. He was followed by Toni Milovan of &lt;a href='http://www.fwd.hr/'&gt;fwd.hr&lt;/a&gt; and &lt;a href='http://www.mackorisnik.com/'&gt;mackorisnik.com&lt;/a&gt;, and &lt;br /&gt;We started talking almost immediately. What is your specialty? What are your interests? It was the same for every other attendee who came later. The themes were a legion and our knowledge extensive.&lt;br /&gt;I forgot about the oppressing heat, the girls two tables away. We talked until nightfall and then some. We covered a lot of themes , but only a scant few stayed in my memory:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Best web development platform&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Open source content management frameworks&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;UI test automation (I even developed an example on my laptop)&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;High traffic site optimization&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Gimp Vs Photoshop&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Tables vs. Divs&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Everyone had his own opinion and freely shared it. We joked and no one was barred from talking. The atmosphere was friendly and interesting and I will definitely attend next time. &lt;br /&gt;&lt;br /&gt;I was wonderful meeting. We all agreed to meet once a month, and that all the meetings will be organized through our google group &lt;a href="http://groups.google.com/group/opencoffee-istra"&gt;OpenCofee Istra&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4097656248972625501?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4097656248972625501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/opencoffee-club-pula-meetin-one-review.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4097656248972625501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4097656248972625501'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/opencoffee-club-pula-meetin-one-review.html' title='OpenCoffee Club Pula Meetin One Review'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4531705372668756528</id><published>2009-07-03T21:27:00.002+02:00</published><updated>2009-07-03T21:34:07.137+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCoffe'/><title type='text'>OpenCoffee Club Pula, first Meeting</title><content type='html'>On Saturday 7th in Pula will be held the first Open Coffee meeting for web developer and other related ilk. The meeting will be held at 19:00 hours in the coffebar "Cvajner". &lt;br /&gt;I'm really excited to attend this meeting. I see it as an opportunity to see and talk with people with the same interest in development technologies who are not necessary work related.&lt;br /&gt;A google group for the meeting was created &lt;a href="http://groups.google.com/group/opencoffee-istra"&gt;here&lt;/a&gt; for those of you who would like more information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4531705372668756528?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4531705372668756528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/opencoffee-club-pula-first-meeting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4531705372668756528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4531705372668756528'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/opencoffee-club-pula-first-meeting.html' title='OpenCoffee Club Pula, first Meeting'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3491944847885193085</id><published>2009-07-01T04:55:00.002+02:00</published><updated>2009-07-01T05:02:39.797+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Overworking it, a bit</title><content type='html'>Its five past five in the morning. I'm literally sleepless. The amount of work I've been doing recently is crazy. I've been at work for twelve to fifteen hours a day, plus we had two all nighters (twenty three hours of software development in a stretch). And, of course I've had the added bonus of leading a team or two during that time, so it added up on my burn out status.&lt;br /&gt;&lt;br /&gt;I'm a wreck. &lt;br /&gt;&lt;br /&gt;I rose early because I'm going on a business trip to Zagreb for a meeting with a client, and then to Ljubljana for another meeting with a colleague. Wow! What a trill.&lt;br /&gt;&lt;br /&gt;I'm so wasted. &lt;br /&gt;&lt;br /&gt;The tiredness is not a problem. I'm coping very good thank you. It's my learning that the problem. I really neglected my studies for the past month. Yesterday I finally finished "Pro WF" after six months of reading. Stupid. Once I read a development book in two weeks. &lt;br /&gt;&lt;br /&gt;I must pick my pace or I will be crushed by younger, more time free forces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3491944847885193085?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3491944847885193085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/overworking-it-bit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3491944847885193085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3491944847885193085'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/07/overworking-it-bit.html' title='Overworking it, a bit'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3368941241873283795</id><published>2009-04-30T14:41:00.003+02:00</published><updated>2009-04-30T14:48:58.399+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managment'/><category scheme='http://www.blogger.com/atom/ns#' term='Teams'/><title type='text'>What choices do I make to look at my feelings in the growing summer rain</title><content type='html'>I've been tasked with my first real leadership position in my current company. I'm a bit struggling with that, since it is new for me and I'm involved with about four to five different projects at the moment.&lt;br /&gt;What made my job easier , and what actually prepared me for that, was the following:&lt;br /&gt;1. My experience as an Insurance Adjuster&lt;br /&gt;2. My occasionally blossoming social life and non verbal recognition of human emotions( it is surprising what people will tell you with their body language)&lt;br /&gt;3. Technical books like "The mythical man month" and "Rapid Development"&lt;br /&gt;4. My project manager, who is also a great teacher &lt;br /&gt;5. Regular stand ups&lt;br /&gt;6. Task management (help you Manager Tools)&lt;br /&gt;8. Learning to ask the right questions (What problems do you have? When are you going to be done?) Surprisingly effective.&lt;br /&gt;9. Delegation, you can't delegate enough! (again, thank you Manager Tools).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3368941241873283795?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3368941241873283795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/04/what-choices-do-i-make-to-look-at-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3368941241873283795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3368941241873283795'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/04/what-choices-do-i-make-to-look-at-my.html' title='What choices do I make to look at my feelings in the growing summer rain'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-7920348541136995494</id><published>2009-03-02T20:42:00.003+01:00</published><updated>2009-03-02T20:56:38.560+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>The sun and the way UML diagrams fold on my freshly inked skin</title><content type='html'>It is my firm belief that any modern developer, being junior or senior needs to know at least the basic of UML 2.x class, sequence and activity diagrams in order to be productive in his workplace and to communicate effectively with his coworkers about one of the most hard and abstract matters known to man, by which I mean the matter of software design. &lt;br /&gt;But what I find in the field today is sorry  state of affairs where the majority of developer are not aware that UML even exists, a small percentage of can read it and only a handful can write and express them selves in the fine software modeling language of UML. It is my opinion , as a practicioner of the craft, that each high school that teaches programming and each university that prepares young feeble minds for a career in IT or software development must teach its students the basics of reading and writing of UML. &lt;br /&gt;UML is most critical to understand object oriented design. When a developer is able to express his idea about a system in uml , that developer shows a deep understanding of that idea, and therefore is able to teach to other, implement it by producing qualty code and adapt it to changes which are sure to come in the future. &lt;br /&gt;Code which isn't described by UML (or any other notation for the matter)is hard to read, hard to teach and hard to change. Code that is described by UML isn't any of those things.&lt;br /&gt;But by the God of Chips and Neurons, UML isn't hard to learn either. You just need a manual (e.g. UML distilled by Marting Fowler) a pen and sheet of paper on which you can sketch your first diagrams. I've learned my UML near the sea in Pula where I live. I would put the Fowler book in my backpack, take a notes and a black 0.4 pilot pen and I would venture on foot the Pula's "long see" (lungo mare) a walkaway for tourists and kinds high on booze and midnight sex , and I would sit there by the see and draw my diagrams watching the sun go down deep below the summer sea and enjoy my self learning a powerful tool which made a better developer, a better person and more ... I don't know.. just better than I was before. &lt;br /&gt;That should be enough for any of you sorry asses who haven't had the time to learn a tool as basic as UML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-7920348541136995494?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/7920348541136995494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/03/sun-and-way-uml-diagrams-fold-on-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7920348541136995494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/7920348541136995494'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/03/sun-and-way-uml-diagrams-fold-on-my.html' title='The sun and the way UML diagrams fold on my freshly inked skin'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6018549705221210998</id><published>2009-01-27T20:25:00.004+01:00</published><updated>2009-01-27T20:54:35.532+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Watin'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Automed User Inteface Testing</title><content type='html'>User interfaces components are hard to unit test with standard unit testing framework. There are several reasons for that. In my opinion the principal is the fact that user interface components rely heavily on the interaction between the user of the system and underlying framework of business(or other objects) supporting the user interface control. And sometimes, is quite hard to remove the component from its natural environment for testing purposes, as is the case with ASP.NET web components. &lt;br /&gt;The solution to this problem is two fold. First all domain and infrastructure objects should be logically and physically removed from the user interface and unit tested separately using convectional testing methods. This is nothing new, there are numerous design philosophies associated with that (for example the &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; design pattern always so popular with web development frameworks). The second is to to test the user interface component attached to its underlying system base, in a separate - clean - environment specially prepared to for testing purposes &lt;span style="font-weight:bold;"&gt;using&lt;/span&gt; automated unit testing tools. &lt;br /&gt;For example and ASP.NET application whose user interface is composed by a separate web component library and relies heavily on client side code to facilitate heavy user interactions with few page reloads in order to maximize user experience (ah, the oh so popular Microsoft buzz word of the moment) and to reduce stress load on the system. There are five distinct parts to this application:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;ASP.NET user interface&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ASP.NET web control&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ASP.NET web control domain objects (entities, repositories, services and specifications)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Javascript user control attached objects&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Javascript domain object&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;All these parts compose the user interface of this theoretical (and so typical application). First , lets us remove all domain objects. Both client side and server side object can be tested using respective testing environments. Now for the remaining three elements there is no way of testing them separately. And, also there is no practical need. Because the goal of testing user interface components is not to see if each of them works correctly as a separate unit (it is impractical , because the amount of mocking requires a separate framework of its own - often custom made for one project only) , the goal it to test the user interface as one system (logical separated by functionality, just to give some order to the mess) in order to provide to the team and to the customer that the system which is built provides requested functionality.&lt;br /&gt;This is accomplished by using automated unit testing frameworks. One that I especially like is &lt;a href="http://watin.sourceforge.net/"&gt;Watin&lt;/a&gt;, an open source project under active development which allows any developer to programmatically test the user interface of any web application inside Firefox and Internet Explorer (which we are the two browser mostly tested by web developers). &lt;br /&gt;Watin is a good framework. Of course there is place for improvement, by what is accomplished now is very useful in enterprise strength projects. For anyone who has developed with javascript using this framework will be easy and will come naturally. &lt;br /&gt;I would recommend it for everyone doing serious web development in any environment and with any tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6018549705221210998?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6018549705221210998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/01/automed-user-inteface-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6018549705221210998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6018549705221210998'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2009/01/automed-user-inteface-testing.html' title='Automed User Inteface Testing'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3345336842707188963</id><published>2008-11-20T23:30:00.003+01:00</published><updated>2008-11-20T23:48:50.515+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Designing proper HTML code</title><content type='html'>I think there is a need to engineer HTML code in a web web application, the same way server side and client side code is engineered. I'm posing my self the question how?&lt;br /&gt;For standard programming languages I use UML, but UML can't be applied to HTML. Html denotes the structure of a hyper text it doesn't model interactions or functions. It can't be effectively described with standard software engineering techniques.&lt;br /&gt;HTML code is simple, and short and anybody can learn to do it in one hour. It would seem to the causal user that HTML doesn't need to be specially engineered. I think that is not the case. Every web application is always finally rendered into HTML. All user interactions are defined by how the page is structured in HTML, the way the server side code is structured depends on the way HTML is structured and the ease CSS can be developed also depends on the way HTML is structured. Not to mention cross browser and cross platform portability. &lt;br /&gt;It really matters if a developer uses tables withing tables, or a series of stacked divs. It really meters the decision between table cells and unsorted lists or paragraphs. When put in perspective, most problems I've encountered in my career as a web developer had to do in a way with badly engineered HTML. &lt;br /&gt;I think it is critical to find a way to design and plan markup code for web applications. If we as engineers spend so many hours a day preparing or code and our applications to be of the maximum quality, I think it is imperative to spend the same energy on HTML. &lt;br /&gt;I know what you think. HTML is not serious, it is for kids not engineers. But look around you. Web applications are everywhere, and so it is HTML. Without HTML there would not be the world wide web as we know it. Its simplicity is what it drove web applications inside and outside the corporate firewalls. And neglect to properly engineer HTML code is one of the root causes of the poor qualty many web applications suffer. &lt;br /&gt;It just came to me today, this idea. I spent several days designing several objects in UML, documenting them, writing them, testing them, writing and thinking about unit test, automating them, and it all worked as a charm. But when it got down to HTML and its sister cousin CSS I worked as newb coding like hell without preparing out a head, doing a crap job on a critical part of the application I'm working on. I can't put it there like that. I have to rewrite it tomorrow to increase the quality of the code I'm producing. But how many hours of work would I saved if I engineered my HTML code in the same way I engineered my javascript and C# code?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3345336842707188963?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3345336842707188963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/11/designing-proper-html-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3345336842707188963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3345336842707188963'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/11/designing-proper-html-code.html' title='Designing proper HTML code'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4806512514436840510</id><published>2008-11-03T11:48:00.002+01:00</published><updated>2008-11-03T11:58:40.316+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Learning the devils way : killing the interest first</title><content type='html'>I grow tired of the endless stream of SQL going into my head on daily bases. It all looks the same, but with subtle differences. I'm just no so interested to learn what different flavors of create table exist out there. But I must. But I so needed to advance my self career wise. &lt;br /&gt;So I soldier on. Learning T-SQL every day, one hour a day. My personal learning time. And during my project time I'm learning PL/SQL. Of course my project time doesn't allow me much time to learn all that I need about the damned Oracle SQL dialect, so I learn during my break, during my free time at home in the evenings experimenting on the Oracle 10g EX database I've installed on my Ubuntu machine for just that purpose. &lt;br /&gt;But it tires me so. I would rather learn Jquery or Dojo, or read some new PHP book (like PHP in Action from Manning), or continue my studies of Django or learn a new cool language like Erlang or OCaml. But not. I'm stuck with T-SQL and PL/SQL. It is my choice. One that I had to make.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4806512514436840510?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4806512514436840510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/11/learning-devils-way-killing-interest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4806512514436840510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4806512514436840510'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/11/learning-devils-way-killing-interest.html' title='Learning the devils way : killing the interest first'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8040204283990737368</id><published>2008-10-29T22:16:00.006+01:00</published><updated>2008-10-29T22:41:42.794+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>I have a bloody dream of software never written by a sane head</title><content type='html'>I have a couple of ideas. Development wise. Something I want to do on the side on my free time usually spent not being with my family but watching stupid tv shows and movies in order to free my mai9nd from all day developing in some stupid, soon to replace programming languages. But I digress. &lt;br /&gt;I had several ideas today:&lt;br /&gt;1. Writing an unit testing framework fro stored procedures in &lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt;, written in MySQL for MySQl. I don't think those exists. And I think they are needed for the all continuous integration thingy. and I think uit would be an interesting idea to implement it. If , ever, I'm going to do that I'm going to open source it and host it on Google Code. Way cool idea, I must say. I'm impressed with my self.&lt;br /&gt;2. Writing a microblogging service bus that will connect to other microblogging services of interest pool their data and present disperses them as a part of their aggregate feed. &lt;br /&gt;Here it is how I envisioned it. It would be php based on REST. So simple pot and GET request. no fancy WSDL. XMl would be used to send data over the web each service bus will host data and provide service for one personal microblog (which would be accessed through a client, separately written in whichever technology I or someone chooses). Now the owner of the microblog would in theory register to someone else's microfeed, and pool their data as well as his whenever a microblog feed would be requested by a client (obviously mine and theirs feed would be differentiated). Each microblog would also post a service with commonly used words to link to a cluster of relate microposts, and a service listing other microblogs aggregating feeds from this blog. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4uzlKD92WwA/SQjYEbGEk9I/AAAAAAAAACY/OCQkJh33AFA/s1600-h/blog1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 201px;" src="http://4.bp.blogspot.com/_4uzlKD92WwA/SQjYEbGEk9I/AAAAAAAAACY/OCQkJh33AFA/s320/blog1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5262693735086724050" /&gt;&lt;/a&gt;&lt;br /&gt;3. For my next laptop which I will buy in a couple of years I'm going for a pure virtual platform. Here is what I want. A laptop with a fresh, fast , stable and lite linux install with &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; or something better installed. And then several virtual machine , with various configurations(I may need to run several on the same time) , each used for a separate purpose - testing, development, home use, art... etc. Neat. I just can't wait for 2010 to come. Thats the year I'm going probably to get my new laptop. Maybe. If I'm lucky. Really lucky.&lt;br /&gt;On the personal note, my son who just turned eleven months old and I barely see during the week started walking by him self. So no longer hand holding. No boy he is a home missile bent on general havoc and destruction. I love the little dynamo. &lt;br /&gt;I work for nine hours a day, minimum, and drive for two hours plus one hour for waking up and doing morning stuff nobody needs to know. So I'm gone for twelve hours each day during the bloody week. And that my friends takes a toll, on me on may family on everybody. And of course when I get home I'm next to useless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8040204283990737368?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8040204283990737368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/i-have-bloody-dream-of-software-never.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8040204283990737368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8040204283990737368'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/i-have-bloody-dream-of-software-never.html' title='I have a bloody dream of software never written by a sane head'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4uzlKD92WwA/SQjYEbGEk9I/AAAAAAAAACY/OCQkJh33AFA/s72-c/blog1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3920218636788126532</id><published>2008-10-25T00:41:00.002+02:00</published><updated>2008-10-25T01:07:03.748+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stored Procedures'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Googling'/><title type='text'>Oracle , stored procedures and table statements</title><content type='html'>I drive for two hours every day to go to and from the work. In my car I hav an mp3 player and I spend those hours listening to trade podcasts. Mostly .NET rocks, FLOSS weekly and Stack Overflow. There are others , but they are not currently worth mentioning. I heard in one episode of .NET rocks that the internet is killing the software printing industry. They said that less and less people have time to read and study a book on any topic for several months before starting to work with the technology they were studying. Now, everybody uses Google. &lt;br /&gt;Developers usually open their IDE, or editor, read some tutorials and then start coding. When they hit a problem they google the solution for it. Nobody reads. Nobody has the time to learn a technology that will change inside a year. I guess is true. Thats how I started doing it. Learning by googling. And really, I think thats the wrong way to do it. &lt;br /&gt;See, here is my rationale. You can acomplish lots of thing by doing that. But I guarantee that you wont do it right, You are bound to miss some fundamental things. Or you are going to use the wrong solution for the problem you are facing. All things which would be easily avoided if you've taken time to learn a technology properly. &lt;br /&gt;But thats not possible. You have so much to learn, so many possibilites. It is not possible to learn them throughly. It would take you all your working day to just keep up with all of that, I wish I could. But I can't. &lt;br /&gt;What I do is pick a technology, buy a book or two and separate one hour a day, each working day to learn it chapter by chapter. These are technologies I like or think will be critical for my work for a longer period of time. Like SQL Server, or ASP.NET. &lt;br /&gt;Now things will come that will require of me to learn something new just for one project. The technology in question may be extensive, but I don't have the time and the energy to learn it properly. In those cases I resort to Google to be my guide. &lt;br /&gt;And thats what happened with stored procedures and Oracle. See, I'm kinda the db guy for my team. So for our latest project I got stuck doing database work besides my regular web work, Our client uses an Oracle database. We planned several stored procedures to handle all data transactions between the client and the database. Now, I haven't ever worked with Oracle and PL/SQL. And the project was way under way , so I didn't have much time to learn PL/SQL. So I started googling. &lt;br /&gt;My first task was to create two procedures which would create some new tables and destroy them respectively. Some alter table statements were thrown in the mix. &lt;br /&gt;Now , the first problem was that I couldn't do CREATE AND ALTER TABLE statements inside a stored procedure. I had to use EXECUTE IMMEDIATE, which runs all sorts of queries inside the stored procedure. &lt;br /&gt;Now the following problem was that the created stored procedures couldn't create tables becuase my user couldn't explicitly do that . My user , which was handed to me by the client, received its permissions through roles. In order for a stored procedure created by my user to be able to create tables and so , my user must have the CREATE TABLE privilege granted to it specific. &lt;br /&gt;Here is the code:&lt;br /&gt;&lt;br /&gt;GRANT CREATE TABLE TO UserName;&lt;br /&gt;&lt;br /&gt;CREATE STORED PROCEDURE TestProc&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;   EXECUTE IMMEDIATE 'CREATE TABLE TestTable (name VARCHAR2 NULL)';&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;It took me two whole days to do that. Fantastic. One site that helped me a lot was &lt;a href="http://www.java2s.com/Code/Oracle/CatalogOracle.htm"&gt;this&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3920218636788126532?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3920218636788126532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/oracle-stored-procedures-and-table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3920218636788126532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3920218636788126532'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/oracle-stored-procedures-and-table.html' title='Oracle , stored procedures and table statements'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-3084746348289835103</id><published>2008-10-21T12:14:00.003+02:00</published><updated>2008-10-21T12:33:43.435+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Incompetent people piss me off</title><content type='html'>I'm so pissed when someone in the team does not do their job. I'm so angry. And what angers me most is when I have no power what so ever to compel them to do so. I can say something. I can remind that someone about what they must do, and I can even share the work weight with them which is the stupidest thing for me to do, since I'm not paid to work for two people. I'm not paid to do any of those things either. But I do them non the less. &lt;br /&gt;I'm so pissed off.  &lt;br /&gt;I want the project to succeed. I want to advance in my career. I depend on my team mates doing their job so we can all succeed. Software development is not a single player activity. It takes several people to finish an average project. It doesn't take one, it takes several. But what if some of them do not want to do their job. What if some want to sit in their chair, do nothing except reading funny papers on the internet and saying: I don't know anything, I don't know how to do that bla ... bla... bla... &lt;br /&gt;Move your ass, god dammit. You retarded morons. Why did you even applied for this job if you didn't want to work and commit your self? Why! There are plenty of government founded jobs for those type of people. Leave room for someone who wants to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-3084746348289835103?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/3084746348289835103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/incompetent-people-piss-me-off.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3084746348289835103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/3084746348289835103'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/incompetent-people-piss-me-off.html' title='Incompetent people piss me off'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-6279859617428830510</id><published>2008-10-20T12:39:00.003+02:00</published><updated>2008-10-20T12:53:03.680+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eduaction'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development Culture'/><title type='text'>Fighting to learn</title><content type='html'>Learning things is hard. It takes time and resources, not to mention will. The older I get the harder it is. I think that's true for every body. I just read a blog post from &lt;a href="http://codeclimber.blogspot.com/2008/09/honing-your-craft.html"&gt;Ethan Vizitei&lt;/a&gt; and I couldn't agree more with what he said. I don't know. This is something that was bothering me for a long time. See I'm a learner. I like to learn, I want to learn. I want to better my self. &lt;br /&gt;I've been doing it since I was a boy. Learning to program, learning to write, learning a new trade or skill. Always learning, always being a target of those who do not. I had a rough child hood. My learning separated my from my peers. People do not like those who separate them selves from the mold. I knew things , I wanted to know things and people reacted violently when I showed my knowledge. Verbally and physically. &lt;br /&gt;Bastards.&lt;br /&gt;When I grew older and bigger, when I started lifting weights people stopped being physical with me . I moved away, started working in the industry and baam. They still were there, those who refuse to learn.&lt;br /&gt;Its OK, that's their decision. I accept that. But the sheer amount of energy those people used to deter others from learning and introduce new things is amazing. I just always kept finding my place in knowing what others didn't (not something unusual per se) for the sheer fact I willed my self to explore and learn those things. How can anyone evolve as a software developer if not by constantly learning new things?&lt;br /&gt;It's just tiresome talking with those people. Explaining things to them, listening to their half baked rationale why things should remain the same. It is so hard, it is so depressing and so fruitless. You can change people, you just cant... But refusing to learn, refusing evolve is not something I will settle for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-6279859617428830510?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/6279859617428830510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/fighting-to-learn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6279859617428830510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/6279859617428830510'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/10/fighting-to-learn.html' title='Fighting to learn'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-1200276181239946483</id><published>2008-08-21T20:05:00.003+02:00</published><updated>2008-08-21T22:05:08.517+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>I wanna learn Java</title><content type='html'>I wanna learn Java. I want it so bad. Well not really that bad , but I was always interested in working with this technology. But I never got around to learn it. &lt;br /&gt;See I had this career development plan in my head. I wasn't about where or what I would be doing, instead it was about what technologies I would use and when. I started my professional career with PHP, then I've migrated to Python and now too C# .net, which was something I didn't plan for. I've always had a fondness for open source cross platform technologies. Too me, locking your self to a specific operating system is not what a modern developer should do. With so many options out there , too me, what makes the most sense is to develop in technology that is OS agnostic, instead to lock your self in a proprietary technology and thus reducing your employment chances in case of loosing your job. Is good to be flexible. &lt;br /&gt;So why Java? Why not be happy with .NET, is the same thing only different package? Too me this is a philosophical question. Do I want to make my money locking my self to a company that I really do not admire, or do I want to earn my bread working in something that is open, portable and positive?&lt;br /&gt;Well to me today the only logical choice is Java. And in couple of years I want to be known as a Java developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-1200276181239946483?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/1200276181239946483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/08/i-wanna-learn-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1200276181239946483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/1200276181239946483'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/08/i-wanna-learn-java.html' title='I wanna learn Java'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-5004404603307503415</id><published>2008-07-31T21:44:00.002+02:00</published><updated>2008-07-31T22:18:31.205+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Web applications as web services</title><content type='html'>My running theory is that a typical web application is in reality a web service - distributed and reliant application. It is no surprise , I think all experienced web developers know it. On one side we have the server machine which runs HTTP server that is handles traffic to and from our server side application. The technology that is used to build the server side application is irrelevant. Nowadays you can use almost any programming language known to man to build a server side application. It is a matter of taste, really and of course client expectations. What is important is the fact that our application responds to request trafficked through the web server with code that is transmitted to the client using the HTTP protocol, and which is "compiled" into an client application inside the browser Virtual Machine. That client application is then able to send request back to the server for a new set of code which in turn will replace the existing application with a new one. &lt;br /&gt;Well, that was true in the past, and not so much today (I'm talking about web apps here, not pages - I make a distinction between the two) because we have WEB 2.0 client apps that send request to the server for periodic updates for the client side code without the need for the complete user interface deconstruction we always experienced in the past, with what the ASP.NET guys called the old post-back model. &lt;br /&gt;So if we think about our web apps in this way is no wonder that we need a team to build even the smallest of web apps. Excpecially if we wanted to build them right. &lt;br /&gt;Web application developers experience a host of problems regular developers don't even know about. First there is the whole browser compatibily issue. CSS, HTML and javascript do not render on different browser, different browser verisons or event different operating systems in the same way. A piece of client side functionality that works in Firefox on Windows wont work on IE. If we are building a big app, we need specialized teams for each browser family in order to provide the maximum stabiliy and user coverage for our apps. Thats one problem we all know and hate for the life of us. But one problem that is often overlooked and not discussed out loud is the fact that HTML as a UI generating language was not designed to build UI for web applications. The original goal of the language was to ease the disemminationa and aviability of scientific papers between scientist. Not building applications.&lt;br /&gt;And thats a big problem. If you've ever done javascript heavy applications you often encountered problems and you had to generate tons code to solve them , just because you wanted to implement a functionality that would take in desktop application several lines of code to implement. &lt;br /&gt;I'm really glad that with HTML 5 they are going to fix or attempt to fix the problem. And what Micrsoft did with XAML in Silverlight and WPF and Mozilla with XUL is a real step towards the solutions of the problem. Thats how real web applications should be build in the first place. Why do I need to regenerate the entire UI with every click of the mouse, and why do I have wait so much time for stuff that should be handled on the client. The only thing that should be shuffled across the net is Data, not code to be compile again and again on my computer. It is not practical, it is not functional and it is not friendly. And what really bothers is me is the notion that building web applications is easy, is fast and simple and that kids could do it and its not real software engineering work. And what bothers me the most is that the notion often comes from people who know absolutely nothing about web apps. &lt;br /&gt;First you have to wrap your head around the service generated and absolutely reliant client, than you have to learn and really understand five different technologies , of which four are have several critical difference based on the virtual machine they are executed upon (HTML, CSS, JavaScript and XML). The only simple thing (simple in the fact that you have to know one variation at the time ) is the server side language. &lt;br /&gt;And you can do so much with the web, and it really pains me to see that people don't really understand it and to see so much problems that arise from that ignorance that could be easily solved if the applications in questions were developed with little more understanding what it takes to build a web project.&lt;br /&gt;To build a web product you need to have to following people:&lt;br /&gt;A web designer&lt;br /&gt;A graphical artist&lt;br /&gt;A javascript engineer&lt;br /&gt;A RIA animator&lt;br /&gt;A RIA programmer &lt;br /&gt;A server side engineer&lt;br /&gt;A database administrator&lt;br /&gt;A system administrator&lt;br /&gt;A really, really good architect&lt;br /&gt;And what is important a leader with a vision and understanding what the platform requires of the people that are building atop it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-5004404603307503415?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/5004404603307503415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/web-applications-as-web-services.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5004404603307503415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/5004404603307503415'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/web-applications-as-web-services.html' title='Web applications as web services'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-8634081844761840934</id><published>2008-07-25T09:47:00.003+02:00</published><updated>2008-07-25T09:58:22.896+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Workplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Fun at work</title><content type='html'>It's not all hard work in my life. There is also fun at play. At work, I mean. I have plenty of fun at home with my family . My son , Sven, just started walking and I'm so happy watching him stumble with his first steps. He is so cute. But I digress, my family is not the theme of this post.&lt;br /&gt;My work is.&lt;br /&gt;See, when someone here celebrates a birthday is customary to throw a small party in the office. And since I work in a company that has more then three hundred people is party all the time (well at least once a month, because not all people actually celebrate their birthday or want to throw a party at work- but most do). Since my PM is often away, his desk is empty so people use it as a place to host the food and kick start the party.&lt;br /&gt;This is quite nice, because my appetite is insaciable and having scores of food behind me really is handy when working. Plus is free, which is an even greater bonus.&lt;br /&gt;I've posted a picture of the last party( which was , emm, today not one hour ago.. plenty of food left behind me). The picture shows the desk behind mine littered with cookies and juices:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4uzlKD92WwA/SImHWbNOypI/AAAAAAAAAAg/8gHMZA6AxBQ/s1600-h/Picture+011.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_4uzlKD92WwA/SImHWbNOypI/AAAAAAAAAAg/8gHMZA6AxBQ/s320/Picture+011.jpg" alt="" id="BLOGGER_PHOTO_ID_5226857661870295698" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-8634081844761840934?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/8634081844761840934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/fun-at-work.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8634081844761840934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/8634081844761840934'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/fun-at-work.html' title='Fun at work'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4uzlKD92WwA/SImHWbNOypI/AAAAAAAAAAg/8gHMZA6AxBQ/s72-c/Picture+011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4110484857727341696</id><published>2008-07-20T21:05:00.004+02:00</published><updated>2008-07-20T22:30:14.714+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><title type='text'>My take on MVC</title><content type='html'>MVC , or Model - Viewer - Controller is very popular on the web framework market. It has become one of the selling points for web based applications and framework. Everybody has or has to have it in order to beat he competition.&lt;br /&gt;It seams if you don't implement the MVC pattern in your application you are not serious. And we all know that the most important thing in software development is being serious. If you are a member of a fringe developing group (PHP, Python, Perl, Ruby and so on... ) you have cerantainly being labeled as not serius as a software developer by your more serious and respectable colleagues in .NET, C++ or Java land.  And they are right. Given the fact that all the big, technologically unsavy client go to them to buy software. It really matters. Its a fact of life. If you wanna develop in the big league you must be serious (and therefore program in serious programming languages and use serious developing techniques).&lt;br /&gt;I've being developing with PHP for over four years now. I've started working with PHP 4 and switched over to PHP 5 when it hit mainstream. I loved the OOP capabilities it offered. In the beginning my web apps were plagued by a mirad of simple and annoying problems. Liking issues, navigational issues, code and markup mixed together, character encoding problems and so on. It got better over time, and what really made my apps better, more easier to develop and maintain was the use of the Model - Viewer - Controller design patter.&lt;br /&gt;Every one and his grandmother has his take on MVC . I've developed mine, and I think I got it pretty much right. Everything revolves around one file. That file will be the single point of entrance of the application. In most cases it will be &lt;span style="font-weight: bold;"&gt;index.php&lt;/span&gt; since it's a natural entry point for every PHP base web site.&lt;br /&gt;Beside the index.php  I will create a directory structure that will consist of three directories : &lt;span style="font-weight: bold;"&gt;Contoll, Model , View&lt;/span&gt;.  And one other file &lt;span style="font-weight: bold;"&gt;config.php&lt;/span&gt; for various configuration options.&lt;br /&gt;It will look like this :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/&lt;/li&gt;&lt;li&gt;/Control&lt;/li&gt;&lt;li&gt;/Model&lt;/li&gt;&lt;li&gt;/View&lt;/li&gt;&lt;ul&gt;&lt;li&gt;/template&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;/config.php&lt;/li&gt;&lt;li&gt;/index.php&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;!-- body { color: #000000; background-color: #FFFFFF; } .webhtml1-cssclassselector { color: #800080; } .webhtml1-csscomment { color: #FF8000; } .webhtml1-csserror { color: #FF0000; text-decoration: underline; } .webhtml1-cssidselector { color: #800080; } .webhtml1-cssnumbervalue { color: #0000FF; } .webhtml1-cssproperty { color: #800040; } .webhtml1-cssrulesetwhitespace { } .webhtml1-cssselector { color: #800080; font-weight: bold; } .webhtml1-cssspecial { } .webhtml1-cssstringvalue { color: #0000FF; } .webhtml1-csssymbol { color: #0000FF; } .webhtml1-cssundefinedproperty { color: #FF0000; text-decoration: underline; } .webhtml1-cssundefinedselector { color: #FF0000; } .webhtml1-cssundefinedvalue { color: #FF0000; text-decoration: underline; } .webhtml1-cssvalue { color: #0000FF; } .webhtml1-csswhitespace { } .webhtml1-escomment { color: #FF8000; } .webhtml1-eserror { color: #FF0000; font-weight: bold; text-decoration: underline; } .webhtml1-esidentifier { color: #0000FF; } .webhtml1-eskey { font-weight: bold; } .webhtml1-esnumber { color: #008000; } .webhtml1-esstring { color: #FF0000; } .webhtml1-essymbol { } .webhtml1-eswhitespace { } .webhtml1-globalinactive { color: #CFCFCF; } .webhtml1-mlcomment { color: #FF8000; } .webhtml1-mlerror { color: #FF0000; text-decoration: underline; } .webhtml1-mlescapedamps { color: #FF8040; } .webhtml1-mlkey { color: #2D8C58; } .webhtml1-mlquotedvalue { } .webhtml1-mlsymbol { } .webhtml1-mltag { color: #000080; } .webhtml1-mltagname { color: #3E73AE; } .webhtml1-mltext { } .webhtml1-mlundefinedkey { color: #FF0000; text-decoration: underline; } .webhtml1-mlundefinedtagname { color: #FF0000; text-decoration: underline; } .webhtml1-mlvalue { color: #FF00FF; } .webhtml1-mlwhitespace { } .webhtml1-phpcomment { color: #A5A5A5; } .webhtml1-phpconstant { color: #8000FF; } .webhtml1-phpdoccomment { color: #FF8000; } .webhtml1-phpdoccommenttag { color: #0000FF; } .webhtml1-phperror { color: #AA0000; text-decoration: underline; } .webhtml1-phpfunction { color: #008000; font-weight: bold; } .webhtml1-phpidentifier { color: #008000; } .webhtml1-phpinlinetext { } .webhtml1-phpkeyword { color: #0000BB; } .webhtml1-phpmethod { color: #0080FF; } .webhtml1-phpnumber { color: #0000BB; } .webhtml1-phpstring { color: #DD0000; } .webhtml1-phpstringspecial { color: #FF1C1C; font-weight: bold; } .webhtml1-phpsymbol { } .webhtml1-phpvariable { color: #0066CC; } .webhtml1-phpwhitespace { } --&gt;&lt;br /&gt;&lt;/style&gt;The code for the index. php file is this:&lt;br /&gt;&lt;!--StartFragment--&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="webhtml1-mltag"&gt;&lt;span class="webhtml1-phpkeyword"&gt;&lt;span class="webhtml1-phpfunction"&gt;session_start&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;session_regenerate_id&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt;* &lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@author&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; Nikola Stjelja &lt;nstjelja@gmail.com&gt;;&lt;br /&gt;* &lt;/nstjelja@gmail.com&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@copyright&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; GPL2&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Load configuration&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;include&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'config.php'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Get the control&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;include&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'Control/control.class.php'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Get the model&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;Control&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;::&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;get_model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Load the page&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;-&gt;&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;load_page&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//load the view&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;include&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'view/view.class.php'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//show the template&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;View&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;::&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;show_template&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;-&gt;&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;template&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;,&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;-&gt;&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;data&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-mltag"&gt;?&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--EndFragment--&gt;&lt;br /&gt;Each request in your application will go through this file. First the configuration will be loaded. The config.php file will contians only configuration options. It is best to set those options as constants. The the Control class will be loaded. It is a static class, e.g. it doesn't have instances. It has only one public method get_model() which will return the model object. The model object has one public method load_page() and two public proprieties template and data, which are loaded as argument to the View static class. The View class handles any templating your application has to do in order to present its content to the client requesting it. The entire entry point of our application has no more that 29 lines , it is simple and readable. It shows you exactly what part of the application does.&lt;br /&gt;The beauty of it is that the application logic can become quite complex but the underlying system will remain simple to use and understand. Needless to say that the most of the work is done inside the model object. Here is the abstract Model class each model object must inherit from:&lt;br /&gt;&lt;!--StartFragment--&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="webhtml1-mltag"&gt;&lt;span class="webhtml1-phpkeyword"&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt;* &lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@author&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; Nikola Stjelja &lt;nstjelja@gmail.com&amp;amp;&gt;;&lt;br /&gt;* &lt;/nstjelja@gmail.com&amp;amp;&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@copyright&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; GPL2&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Main application logic. This class is inherited by all Model classes.&lt;br /&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;abstract&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;class&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;Model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Template file name&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;template&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;='template.tpl.php';&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Array with the all data viewable as variables inside the template&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$data&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;Array&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'title'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&gt;&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'MVC Application'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Class consturctor&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;abstract&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;__construct&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Prepares the page to be displayed.&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;abstract&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;load_page&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * This method prepare super global variables for usage&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;protected&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;sterilize&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;)&lt;br /&gt;{&lt;br /&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=(&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;strip_tags&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;));&lt;br /&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;if&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; (&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;get_magic_quotes_gpc&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;()) &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;stripslashes&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;return&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;var&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Class destructor&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;abstract&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;__destruct&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-mltag"&gt;?&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--EndFragment--&gt;&lt;br /&gt;As you see the class is quite simple. It provides a simple interface that anyone can understand and use. The load_page is the main class method servers as the main class logic controller. The Control static class implement the Factory patter. It's main goal is to create the adequate model object based on the web page query. This is a very simple navigational mechanism. It allows to the developer great freedom in how to set up the site navigation. It's also very simple and short. The Control class may be extended with extra classes that check if the user is logged in or if the user accessing a resource has the right to do so.&lt;br /&gt;&lt;br /&gt;&lt;!--StartFragment--&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="webhtml1-mltag"&gt;&lt;span class="webhtml1-phpkeyword"&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt;* &lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@author&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; Nikola Stjelja &lt;nstjelja@gmail.com&gt;&lt;br /&gt;* &lt;/nstjelja@gmail.com&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@copyright&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; GPL2&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* This is a static class that checks for a specific query string, and&lt;br /&gt;* upon it returns the expected model object.&lt;br /&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;class&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;Control&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;private&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;static&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;choice&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Get the choice from the $_GET&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;private&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;static&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;get_choice&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;self&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;::&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;choice&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;trim&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;strip_tags&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;urldecode&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;_GET&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;[&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'q'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;])));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Based on what date is contained inside the choice propriety return the&lt;br /&gt;      * model object&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;get_model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(){&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//preuzmi izbor&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt;  &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;self&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;::&lt;/span&gt;&lt;span class="webhtml1-phpmethod"&gt;get_choice&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;switch&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;self&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;::&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;choice&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;){&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//default model&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt;   &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;default&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;:&lt;br /&gt;  &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;include&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;'model/model.class.php'&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;  &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;return&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;new&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;Model&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-mltag"&gt;?&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--EndFragment--&gt;&lt;br /&gt;After both the Control and Model objects have done their job comes than the time for the View class to do its. It views class takes two parameters inside its show_template method. Both parameters come from the Model object, the template name and the data array. The main job the View class is to find the template file, fill it with variables . The rest is upon the template file it self. Normally the developer can implement his or her favorite templating system quite easly. But I like to stick with pure php. With discipline you can write a pretty readable template file just using ifs thens and whiles.&lt;br /&gt;&lt;br /&gt;&lt;!--StartFragment--&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="webhtml1-mltag"&gt;&lt;span class="webhtml1-phpkeyword"&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt;* &lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@author&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; Nikola Stjelja &lt;nstjelja@gmail.com&gt;&lt;br /&gt;* &lt;/nstjelja@gmail.com&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccommenttag"&gt;@copyright&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt; GPL2&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Connects the template file with model provided data&lt;br /&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;class&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;View&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;{&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpdoccomment"&gt;/**&lt;br /&gt; * Loads and shows the chosen template&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;public&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;static&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;function&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt; &lt;/span&gt;&lt;span class="webhtml1-phpidentifier"&gt;show_template&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;template&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;,&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$data&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;){&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt;  &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;while&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;list&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;k&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;,&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;v&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;)=&lt;/span&gt;&lt;span class="webhtml1-phpfunction"&gt;each&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;data&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;))&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;&lt;/span&gt; &lt;span class="webhtml1-phpkeyword"&gt;$$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;k&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;=&lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;$&lt;/span&gt;&lt;span class="webhtml1-phpvariable"&gt;v&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpcomment"&gt;//Load the template&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpwhitespace"&gt;  &lt;/span&gt;&lt;span class="webhtml1-phpkeyword"&gt;include&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;(&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;"templates/&lt;/span&gt;&lt;span class="webhtml1-phpstringspecial"&gt;$&lt;span style="font-family:monospace;"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;span class="webhtml1-phpstring"&gt;"&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-phpsymbol"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span class="webhtml1-mltag"&gt;?&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--EndFragment--&gt;The template is a standard php file. It receives its variables from the $data array generated by the model object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4110484857727341696?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4110484857727341696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/my-take-on-mvc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4110484857727341696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4110484857727341696'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/my-take-on-mvc.html' title='My take on MVC'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4438809425494504865.post-4917643100444940748</id><published>2008-07-15T21:45:00.001+02:00</published><updated>2008-07-15T22:41:55.876+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='childhood'/><category scheme='http://www.blogger.com/atom/ns#' term='BASIC'/><category scheme='http://www.blogger.com/atom/ns#' term='Umag'/><category scheme='http://www.blogger.com/atom/ns#' term='Istra'/><category scheme='http://www.blogger.com/atom/ns#' term='Croatia'/><category scheme='http://www.blogger.com/atom/ns#' term='Commodore 64'/><title type='text'>How I started</title><content type='html'>I started developing when I was ten years old. I lived in Umag, Istria with my parents and my yunger sister. I just received my first computer , the venerable C64. My father bought it for from a guy who worked in the marina, and smuggled it from abroad at my fathers request. My father has, and had a lot of connections. That will be for a man who for years was the sole insurance seller for a small town in Istria.&lt;br /&gt;It was a grey, silent day. One of many like it in Umag. Winters were always hard. Empty streets, vast empty spaces where no one alive throdded and smiled. Not unlike summers where the streets were full of people, mostly foreigners who came here to enjoy their summer vacations. My father decided to buy ma computer after my constant pestering and nagging to buy me one. My best friend at the time had one , and I always loved to play games at his house whenever we visted his family. Finally my father decided to give in and by me a computer, to be exactly he decided to buy me a Commodore 64, just like the one my friend had. So, here we were, just outside the town marina, a gray winter day dying around us, and my father just gave a slip of deutche marks to a guy I never saw before, and most cerentainly will never see again, and in return he got a brain new commodore 64.&lt;br /&gt;It was a dream come true. My mother, of course disapproved when she found out what had my father done. But it was over. The corner stones of my career as a software developer were set.&lt;br /&gt;I started by playing games. All the classics , bought or copied from pirate collections bought legally at the time from a magazine in Belgrade. It was a different, different time. And I was young and living the life. I never grew over games, but I wanted more. I wanted to create them. I've created several board games at the time, me and the children from the apartment building played them together outside my apartments door, but I wanted to create computer games.&lt;br /&gt;The C64 box came with dutch manual. It explained the basic of BASIC, how to write statements, how load and save programms. It was my mother who helped me out at first. She wrote with me my first 'Hello World' applications. She wrote with me my first 'IF THEN ELSE' structure.&lt;br /&gt;She soon couldn't keep up with me. I always loved to write, and I also became interested in RPGs. I never played them, and never could in my little, redneck town. I read about them in a kids magazine. My imagination became so feverish with the possibilities RPGs offered that I just wanted to play them , write them.&lt;br /&gt;My first games were a cross over between chose your adventure books and rpgs. The were short, written inside a day in BASIC, and morbid. My imagination ran wild. Of course, they are lost now, sacrificed to my adolescence.&lt;br /&gt;The last thing I wrote for my C64 was an arcade. I just figured out how to do primitive graphics reading code from the back of the manual. The game was simple. The hero 'Super Nikola' chased the bad guy who was his dark opposite across the screen. I never finished it.&lt;br /&gt;Times finally got us.&lt;br /&gt;The war came, the famine, the fear. The big fucking scare.  I stopped playing with my computer, and made my self busy with playing invisible. I'm from mixed ancestry, and in war time Croatia that was the wrong thing to be.  So I survived.&lt;br /&gt;After scary years things normalized in my part of the country. We were near the Italian-Slovenia border, so no war came to us. Only a flood of refugees from all over. My father got fired, and he and my mother decided to start a company. I started working there at the tender age of twelve years old. Just during vacation time. Manning the office, selling insurance and of course learning to use a brand new 486.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4438809425494504865-4917643100444940748?l=mylifeasadeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mylifeasadeveloper.blogspot.com/feeds/4917643100444940748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/how-i-started.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4917643100444940748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4438809425494504865/posts/default/4917643100444940748'/><link rel='alternate' type='text/html' href='http://mylifeasadeveloper.blogspot.com/2008/07/how-i-started.html' title='How I started'/><author><name>Nikola Stjelja</name><uri>https://profiles.google.com/115273098033962804679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-oGnrZemKh6w/AAAAAAAAAAI/AAAAAAAACaU/_wfSO6Od8Ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
