tag:blogger.com,1999:blog-72966684322461699442024-03-18T06:40:29.829+02:00Dennis Nerush's BlogSoftware == ArtDennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.comBlogger62125tag:blogger.com,1999:blog-7296668432246169944.post-52138672768190395662017-02-04T10:35:00.001+02:002017-02-04T10:35:33.439+02:00Moving my blog to a new home – Medium<p><img alt="Image result for moving to a new home" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0CH7xlyN_-38HAhkzNwdZBe__LAReXp-r4OpUXeZtYj30F4SgX2VB07qQq61RbKOFooId4pvjd3GPCiT_TtR1g9lg65Y10ePiJL5Kw0MNznKSpLsBj3LOCly8HRK_rR2WQPJIN9oQYrQ/s1600/moving-into-new-home-packing-tips.jpg"></p> <p>I have this blog on Blogspot for almost 5 years. For the last year I was publishing almost every post here and also in Medium. Today I’ve decided to finally stop publishing here and move all my publications to Medium.</p> <p>Here is a link to my new blog - <a title="https://medium.com/dennis-nerush" href="https://medium.com/dennis-nerush">https://medium.com/dennis-nerush</a> .</p> <p>Feel free to follow me there and subscribe <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="https://lh3.googleusercontent.com/-d0btXhC2Rpo/WJWSU90WVgI/AAAAAAAAWh8/xY4smTz8RuQ/wlEmoticon-smile%25255B2%25255D.png?imgmax=800"></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com1tag:blogger.com,1999:blog-7296668432246169944.post-38626898617319552232016-12-31T17:21:00.001+02:002016-12-31T21:10:03.621+02:002016 year in review<p><img alt="Image result for year in review 2017" src="http://4597wq4asyz01jes8rz3yr94.wpengine.netdna-cdn.com/wp-content/uploads/2016/12/2016-review.jpg" width="535" height="359"> <p><font size="4">2016 was a great year for me. And now, when it has almost ended, is a great opportunity to review it. </font> <p><font size="4">I will use </font><a href="http://dennis-nerush.blogspot.co.il/2015/12/my-2016-goals-and-2015-reading-list.html"><font size="4">last year’s format</font></a><font size="4"> and talk about some of my achievements, future goals and this year’s reading list (it is in the end of the post).</font> <p> <h1>Writing</h1> <p><font size="4">This year I’ve written 10 posts on various topics. I’ve written almost 2 times less posts than last year, but some of my posts are way longer than my usual posts (the agile estimations series are 32 pages long!). This year the posts were less technical and they talked about management soft skills, self-improvement and leadership. These posts are hard to write. Despite that I think that this is the kind of posts that I should keep writing. However, I do want that some of my posts to be also technical.</font> <h2 align="center"><font color="#4f81bd">2017: I want to write at least 12 posts. One post a month</font></h2> <p align="center"> </p> <h2>My favorite posts of 2016</h2> <ul> <li><a href="http://dennis-nerush.blogspot.co.il/2016/04/should-we-use-mvc-for-modern-web.html"><font size="4">Should we use MVC for modern web applications?</font></a><font size="4"> </font> <li><a href="http://dennis-nerush.blogspot.co.il/2016/12/estimations-in-agile-development.html"><font size="4">Estimations in agile development series</font></a><font size="4"> </font> <li><a href="http://dennis-nerush.blogspot.co.il/2016/12/weekly-thoughts.html"><font size="4">Weekly thoughts</font></a> </li></ul> <p> <h1>Public Speaking</h1> <p><font size="4">This year I had a single public talk about website localization in a meetup (video will be up soon). It was great experience since I like presenting very much. I tend to present quite a lot internally in my company but no enough externally.</font> <h2 align="center"><b><font color="#4f81bd">2017: I want to present at least 4 times at external meetups and conferences</font></b></h2> <p><b></b> <h1>Mentorship</h1> <p><font size="4">I’ve done a lot this year. From leading different efforts and changes in the company to managing my project and day to day team responsibilities. Some of things went well and others are still in progress. I think that one of my strengths is the ability to execute and finish almost anything. This is all thanks to plenty of opportunities and guideless that allowed me to gain this experience. However, I think that my next step is not to keep executing lots of different efforts by myself. It is time to share the knowledge and start delegate my wishes to others, provide them with the different opportunities and guidance like that was given to me.</font> <h2 align="center"><font color="#4f81bd">2017: I want to mentor others and help them make things happen</font></h2> <p><b></b> <h1>Learning</h1> <p><font size="4">After 5 years I have finally finished my Computer Science degree. This is one the achievements that I’m happy that it is over, however I’m still proud I’ve done it. This year I’ve also learned React.js and its eco system. </font> <p><font size="4">In this year I want to learn a “big data” language, like R or Go or even Scala. I have a serious lack of knowledge when it comes to this area. I also want to learn the “electron” framework for creating desktop java script applications. And I want to strengthen my Node.js and React Native skills. They are not as strong as I want them to be.</font> <h2 align="center"><font color="#4f81bd">2017: I want to learn a new programming language, Electron framework and strengthen my node.js and React Native skills. I want to build at least one project for each of this stack</font></h2> <p><b></b> <h1>Open source</h1> <p><font size="4">This year I’ve contributed only once to an open source project (Polly, you can read about it in </font><a href="http://dennis-nerush.blogspot.co.il/2015/12/everybody-has-plan-until-they-get.html"><font size="4">this post</font></a><font size="4">). </font> <p><font size="4">In this year I want to make a bigger contribution to the open source community.</font> <h2 align="center"><font color="#4f81bd">2017: I want to contribute to at least 4 different open source projects.</font></h2> <p><strong></strong> <h1>Sports</h1> <p><font size="4">This year was a hard year for me in terms of sports. Until May I was exercising like I was used too, 3-4 times a week in the gym and also running 10km 3 times a week. However, after the Mountain to Valley race, my knee was hurt and it forced me to stop exercising and running the way I wanted until now.</font> <h2 align="center"><font color="#4f81bd">2017: I want to heal my knee and slowly come back to run at least 15km by the end of 2017</font></h2> <p><strong></strong> <h1>Reading</h1> <p><a href="https://lh3.googleusercontent.com/-GJ03vcgjY6w/WGfMoNePUQI/AAAAAAAAWZY/zGDklxNKpLk/s1600-h/a.png%25255B3%25255D.jpg"><img title="a.png" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="a.png" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLuXO206N6gxkPPQaGn9oeh0xK89W2y-oyJlqDFiuflKIDAQ2UIx9ZAw6Y1FVnQsZq9d0alILgUGJGznC5IeyPSuhHMJ5QV_ismhMito0C-lyTyUVTlfWi597mfPg7hyphenhyphenrkwtWNSWB1rHI/?imgmax=800" width="397" height="340"></a> <p><font size="4">I commute to work by train. I hate traffic. It is enjoying and forces you to stay focused on the road, without almost any ability to concentrate on something else. On the train however, I can sit comfortably and do whatever I want. It is 40 minutes, twice a day when I can work, write, rest and of course read. So I try to leave this time for reading. This year I’ve managed to read <strong>13 books</strong> this way and also read <b>a lot</b> of stuff online (1% top reader of Pocket <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMte2aKnLicE0VsRQsuRTEcSHjpNmExTT9jG_LBh3vwFCgC1Z_cckjGvGd0q72jPnzqAxg52sONOXOfaK8mS4STnXz5jvta8M18z82hQxWjp_xYMm8F5Q3BIM7OwIHSP1DaH8-b2MoxyY/?imgmax=800">). I love reading both books and online posts, however the books I find the most satisfying and teaching. In the end of the post you can find my 2016 reading list.</font> <h2 align="center"><font color="#4f81bd">2017: I want to read at least 13 books.</font></h2> <p><strong></strong> <h1>The best for last – 2016 reading list</h1> <p><font size="4">I want to share with you the books I’ve read and recommend the top 3.</font> <p> <h2><b>1. </b><b><a href="https://www.amazon.com/Managing-Humans-Humorous-Software-Engineering/dp/1484221575/ref=sr_1_1?s=books&ie=UTF8&qid=1483006983&sr=1-1&keywords=managing+humans+3rd+edition">Managing humans 3<sup>rd</sup> edition</a></b></h2> <p><font size="4">This is a must read book for every manager. It has great tips for almost every possible situation. I started to use many of his recommendations and I already see the results.</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1M5cww9JePklJeFgV9ulVlJJeIwiBSrxicr93dC9TD1uB89nO0tDEJKBaG0qVYBk9dNOaKn3Xri7Zh7dYnI6DxQs593CA2LpWFkqCqrntn8HCUAxKg4b8tE5uzL0_zTMv1Mxo_tEydY8/s1600-h/clip_image004%25255B3%25255D.jpg"><img title="clip_image004" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjstup4sy2N7eV-Ie478bNzQWnOk6eRTIvNmGLgcNzxavr-pCyFWwSLMw4zUs2LQtE03hOCGqZhSBFMexhs1LeEwGfvGJFGQmX9Onb_JXg59nUYx4kBoIhkSkpS_aSxWNf7Na0e2jn1SZo/?imgmax=800" width="146" height="218"></a> <p> <h2><b>2. </b><b><a href="https://www.amazon.com/Zero-One-Notes-Startups-Future/dp/0804139296">Zero to one</a></b></h2> <p><font size="4">Very interesting book about the startup world. It focuses on the reasons for actually taking an idea and making it into a real product. It has a very unique view and it is written by one of the greatest enterpanures in the world.</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhocEFhBs7ROJadFuQxLhR-polrgFKGoDQPuXjf2_LdFoUeZemgpnWgoEnb4-kEX6e_ZXDKy1gFNrGrJG2UMUfJjNI7dxZeZ5FR3dgaEwhF8_la4tYqeZps1hyphenhyphenGuDVPx0TFFLslt43P70k/s1600-h/clip_image005%25255B3%25255D.jpg"><img title="clip_image005" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image005" src="https://lh3.googleusercontent.com/-0Iz0E0ZXAJs/WGfMtmIvnhI/AAAAAAAAWZw/0R5EXYGehlU/clip_image005_thumb.jpg?imgmax=800" width="144" height="224"></a> <p> <h2><b>3. </b><b><a href="https://www.amazon.com/Hard-Thing-About-Things-Building/dp/0062273205/ref=sr_1_1?s=books&ie=UTF8&qid=1483092028&sr=1-1&keywords=hard+thing+about+hard+things">The hard things about hard things</a></b></h2> <p><font size="4">I’m sure that you heard at least someone recommend this book. It touches parts that no one else talks about. This book makes you think, a lot.</font> <p><a href="https://lh3.googleusercontent.com/-vi-MeZ3MiXk/WGfMufmOyFI/AAAAAAAAWZ0/w8CabQYpd3A/s1600-h/clip_image007%25255B3%25255D.jpg"><img title="clip_image007" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image007" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAPZ-Fv3WQ9YN107231ZVQfxR_uOd-Eonw_WODhNmZUC8xmud1yV4N-MnwyWJZzRcwlueDNlv9Io4Hf6pEemgiy_3FVWxiG0IBsDtrLfECTE8ZiwDlEjfNpawzwsoeE6NXMXbcK1kAnFw/?imgmax=800" width="128" height="192"></a> <p><font size="4">Here are the rest, I enjoyed all of them.</font> <p><a href="https://lh3.googleusercontent.com/-jdQ1ayoc-iY/WGfMvzbgOQI/AAAAAAAAWZ8/OMOkR1o2e-c/s1600-h/clip_image009%25255B3%25255D.jpg"><img title="clip_image009" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image009" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMsvLyKlbhJ-EHATzIxEqtqxeInWUTQwU2-IWaSfQ1rt2jmebslEPFzxfWelQVvtozYeKEcN1NBuxuWIxLDApQVx_WVfx4hG55lfyoizK1LrAkNubdyjAEaotbE-ue8tPFeU6If0jUMkM/?imgmax=800" width="133" height="200"></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcl41nlc9ziXhtCAzwGtuIbg-cgMA-4g84ls8P4c5e0JCzIW-iO7bHof8vsqk-Bd5T1RUUh9eMtOYhyHgz7iKt9ZRS3BxPvSOAdrUNzg4VCyYVd2pnqzW8HE42jcv5KSMWQ_r-FOrtkNo/s1600-h/clip_image011%25255B3%25255D.jpg"><img title="clip_image011" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image011" src="https://lh3.googleusercontent.com/-IJpJpQY-wn8/WGfMyoWL42I/AAAAAAAAWaI/ORjRWHcwOIo/clip_image011_thumb.jpg?imgmax=800" width="162" height="202"></a> <a href="https://lh3.googleusercontent.com/-UyabJu0R7zI/WGfMzbyctaI/AAAAAAAAWaM/FTorE-_mbFk/s1600-h/clip_image013%25255B3%25255D.jpg"><img title="clip_image013" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image013" src="https://lh3.googleusercontent.com/-WYQM8lVVdlk/WGfM0swryEI/AAAAAAAAWaQ/_x-cqXc0eZI/clip_image013_thumb.jpg?imgmax=800" width="135" height="202"></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOAmTSUxqs5BYoIbv1ctLQ_JpRrDxlYRM3jqKcfBvwzI2qZZDG_HgP5JqxtYrSdfjmZ77TdB5EhS9uNYNEAWyrHNb6rkAtZa2LAODIYnc9BNZT0zJkIIVPAtiC1do8jvC6t5GGbNFsWL4/s1600-h/clip_image015%25255B3%25255D.jpg"><img title="clip_image015" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image015" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTr6RTMAl1kGT2j_a4fqR5TfZdBlzTgHuljsAOKud1HigWYAS1hbXlrrQv3pBCJjK2znT_fZvHxdWvAhW5DITEY8DzgFG9ZWk8kR9PoTXilG1o3qrkCS-tDJWSKShFF-JmM_pXveviZxU/?imgmax=800" width="133" height="200"></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-2Fw4kzsv7JY2LV6uv7B2Uw_wX0G_MeXWEJRy73lls5eU9gO_w5pWdfvRi5K0nmrMueVLTIa-HPh07JS9_HVQCMReSn6gLDH4jYppyO34X6rdVg_glx6I_CprxVW43tNV-vCwHj8Wo5o/s1600-h/clip_image017%25255B3%25255D.jpg"><img title="clip_image017" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image017" src="https://lh3.googleusercontent.com/-9GRw9mDwsJM/WGfM5MjEUfI/AAAAAAAAWag/NjPEO4E_ITk/clip_image017_thumb.jpg?imgmax=800" width="133" height="202"></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiujNglrNzccNFdENLWpHGyEgiS7lRrLCT-4TkmT-wiMskg0cwlx2cLTkqdUrCaIBzhXrMvcnWcjrXNfuUt-2K8Ljy1R06XbZnyb_V4hbubZTmAxYVlrXAhPKrp8vwnT7wtGGUMwc6RWBM/s1600-h/clip_image019%25255B3%25255D.jpg"><img title="clip_image019" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image019" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Uc7iNZ-tN3_gyFH4wfRxm2V7TjSjV2w-USf57czuiONaLhxe05TSyOh1bAr-qnsqQgs_c0II15CG0ifgrXzs43pE76MOStQy1lh36anVmvEJyJQvVLGPBCXX9OOScO0QRblHQ8it0Qc/?imgmax=800" width="127" height="202"></a> <a href="https://lh3.googleusercontent.com/-b5qU9KwbZIQ/WGfM7WAyRRI/AAAAAAAAWas/8qPSE7hx5Sw/s1600-h/clip_image021%25255B3%25255D.jpg"><img title="clip_image021" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image021" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt41kaTHTdFNhULD_Q1keWGXCo9tlloUxlmXYDpEOFMeGxgDuKHOfLN8e45Y2UQqsnWqKHExUJbjrHxOEZfxMYhV7uKV5gaGy3u5Kj7_93DfmCE8rESvL18qljnPCrRSvGwwotlC6VZQQ/?imgmax=800" width="138" height="191"></a><a href="https://lh3.googleusercontent.com/-ehF-H-QIlcc/WGfM9M77t8I/AAAAAAAAWa0/JO-J6t7R9-A/s1600-h/clip_image023%25255B3%25255D.jpg"><img title="clip_image023" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image023" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjitVrm6WfTMb6J-r8epDa7DCOmFgcWUha5-vqefINr_QuY44LF2OOe6eH7aPXkzbWfvzXLvbhVF1MNnO2wyTVipKzVIOGFHuRhWqdIxa18JP3PMN91VVjkRXeSfCCiaX-HRY4nfZmcUlE/?imgmax=800" width="129" height="193"></a><a href="https://lh3.googleusercontent.com/-x3JulrMeX9s/WGfM-ntOENI/AAAAAAAAWa8/6hT4JFNX7Hc/s1600-h/clip_image025%25255B3%25255D.png"><img title="clip_image025" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image025" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidbGYUDV9pBqguaUmD6J3rCRyhpMLGnbGUNJcVxcT0YxY_CC-3O7q5mj3jSssYmP4Wh5DDR_oxz6VYFMoBVB9EZo5FPyWvngNYLt2p0__B-0e2KSScuCSa3Fy0SHpP0mFGmP1WJZV5l68/?imgmax=800" width="136" height="196"></a> <a href="https://lh3.googleusercontent.com/-JT7dODl977w/WGfNApxIpTI/AAAAAAAAWbE/b3i0zV8hz_k/s1600-h/clip_image029%25255B3%25255D.jpg"><img title="clip_image029" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image029" src="https://lh3.googleusercontent.com/-O0q0IadBNZ0/WGfNBUeltOI/AAAAAAAAWbI/LtaGI0JrlmI/clip_image029_thumb.jpg?imgmax=800" width="129" height="197"></a> <p> </p> <p><font size="4">Happy New Year everybody!</font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com9tag:blogger.com,1999:blog-7296668432246169944.post-40698780398701047402016-12-25T19:13:00.001+02:002016-12-25T19:13:14.202+02:00Weekly thoughts<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaOYDpHBCR8tgRHNx_gjUnrrrh53pMUdOwQtXofQVE9BNp7CZfVa667k56fMJKvZKqOnkAJCgF-H10-8bGxSrwFBhrN1kpW_5NZy6AwDcI777fgM-dYJ2wh8dPJruAFTY0AbL4P5_m028/s1600-h/clip_image002%25255B4%25255D.jpg"><img title="clip_image002" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image002" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0vXCh5-BCbkcmiad59etFg4rtKaamqOomymL68ln_gIZsju4bs4OvFVigR6rtsc6rYGva9An8MMpbh1q6JjRALbD6yIYO-bq-tevwVxAl2-itOYGoo8MidliL8GJkOGufR7q3JrQIXgQ/?imgmax=800" width="678" height="439"></a> <p><font size="4">Previously I’ve talked about </font><a href="http://dennis-nerush.blogspot.co.il/2016/08/manage-your-life-like-you-manage-project.html"><font size="4">the importance of a dedicated time for personal reflection</font></a><font size="4">, a retrospective of your life. This tool helps me to improve in all aspects of my life. However, my job is a huge part of my life – and I want to make sure that I also constantly improve in it. Moreover, I want to make sure that I constantly improve <b>it</b>. Therefore I’ve create a method that allows me to retrospect my work in all its aspects and, most importantly – to share it with my manager. I call it “Weekly Thoughts”.</font> <p><font size="4">Every Wednesday evening, I have a scheduled slot in my calendar for some time for myself (it has to be in your calendar, because </font><a href="http://dennis-nerush.blogspot.co.il/2014/11/that-is-not-on-calender-does-not-exist.html"><font size="4">what is not in your calendar doesn’t exist</font></a><font size="4">). I write it down in an email and then send it to my manager. Unlike an actual retro, I use a slightly different format:</font> <ol> <li><font size="4"><b>Things I’m excited about</b>: </font></li> <li><font size="4"><b>Things I’m concerned about</b>: </font></li> <li><b><font size="4">Inbound</font></b></li> <ol> <li><u><font size="4">What is working and we should keep doing</font></u></li> <li><u><font size="4">What is not working for me </font></u></li> <li><u><font size="4">Opportunities</font></u></li></ol> <li><b><font size="4">Outbound</font></b></li> <ol> <li><u><font size="4">What is working and we should keep doing</font></u></li> <li><u><font size="4">What is not working for me</font></u></li> <li><u><font size="4">Opportunities</font></u></li></ol> <li><b><font size="4">People</font></b></li> <ol> <li><u><font size="4">Opportunities</font></u></li></ol> <li><b><font size="4">Recruiting</font></b></li> <li><b><font size="4">What concerns my manager and how I can help him</font></b></li></ol> <p><font size="4">As you can see, the format is different from a regular retro. The main reason is that <u>it isn’t only a retro</u>. Retro is a method for reflecting previous events. However, this method has several other purposes.</font> <p><b></b> <p><b></b> <h1><font color="#4f81bd">What is on your mind?</font></h1> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrUdqO5MfA967Bek4E9qoxrkApTMXyObycytrr94bgJkYBzn2n8rOtMoNBVY9fq_75F9lVKE4deZIqU2gE4IxfT7EkAaVki1t1_ohwaKcgYc3NHcFnhHoqMVbfnPEKzMNQtJMaEzhQM8s/s1600-h/clip_image006%25255B4%25255D.jpg"><img title="clip_image006" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image006" src="https://lh3.googleusercontent.com/-rpi0WNLpugo/WF_9vNb3FWI/AAAAAAAAWXY/_ytpq4EiriU/clip_image006_thumb%25255B1%25255D.jpg?imgmax=800" width="434" height="335"></a><b></b> <p><font size="4">I call it “weekly <b><i>thoughts</i></b>” on purpose. Look at the first two points: “<i>Things I’m excited about” and “Things I’m concerned about</i>”. Unlike a usual retro, I’m not looking for action items; I just try to understand what’s made me tick this week and what’s stopped me from ticking. It can be a cool feature that I delivered, a meetup that I’ve hosted or a simple conversation that made my week. Things that make you tick, that make you happy during the day, are worth mentioning. It is easy to talk about the bad stuff – I want to cherish the good stuff, too. </font> <p><font size="4">The things I’m concerned about, on the other hand, I do want to address. So sometimes I’ll create personal action items for them. However, sometimes I don’t know how to treat something – like if one of my team members is leaving, or if a decision takes too long to approve. </font> <p><font size="4">Those things are on my mind. They concern me. For good and for bad. There is someone who should know about them: <b>my manager</b>. I schedule the time for my weekly thoughts on a Wednesday since it is the day before my 1 on 1 with him. This allows me to be more prepared for our meeting and also allows him to better understand me. Weekly thoughts is such a powerful tool because it allows me to share the full context of my work with my manager. </font> <p><font size="4">Don’t keep your thoughts to yourself. Share, ask for advice or direction</font>. <h1><font color="#4f81bd">What is your role in the manager-employee relationship? </font></h1> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEietosPPQDxcRnWXW9U_Kcv_lRj0Fja-QLzCe3rJGkPYgV9S9fl8IaLWYt8B1jVGSS40JrFa2d8dVCBaQbph_0l1DZ3SP-8JgrOI8t5WTj_JTNUqvjIrJ67lTsX5CzrDyda3Xhg-ERMWTM/s1600-h/clip_image008%25255B4%25255D.jpg"><img title="clip_image008" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image008" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiolKKzbS7GbFwHHL6asyXIUa12WqYvkDcyHEoSDeodylbIhS0C7fmKtVYc709ZK6XNKgVmVxhtcAnGVbF874xFANwxNZKF7RNMz6XIQ6zZCdCbjGqIYW78lCDIntyvcmQ3EnFYZIPf3g/?imgmax=800" width="431" height="253"></a> <p><font size="4">There is an important truth that all of us sometimes forget.</font> <h2 align="center"><font size="5">We are not the only concern of our managers</font></h2> <p><font size="4">They also have goals and tasks that do not necessarily concern us. Decisions that they want to take, some efforts they are pushing and, of course, tasks from their own manager. I’ve realized along the way that the fact I have a manager doesn’t mean this is a one-way relationship. I can help him as much as he helps me. I want my manager to succeed in his goals as much as he wants me to succeed in mine. </font> <p><font size="4">Therefore I have a special part in my format that is dedicated for the things that concern my manager and ways <b>I </b>can help<b> him.</b></font> <h1><font color="#4f81bd">What happens in other aspects of your job?</font></h1> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgt0jm8_rvlNPL_ZwmJzfRIGcBdRcEOlXHpVnPVrKg6EydiJWVyAznawAMhUAKzb5SAlfpWL8F9fDzvrUJxMpqPCOH5XbkrKr3GiPdEaQJAJUq_tMRFEzmFWs6O4dodrDIe0dmgfipuwY/s1600-h/clip_image010%25255B4%25255D.jpg"><img title="clip_image010" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image010" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ6ubdN6f_wDx7-kReKbZZZMr1pxiZuFlfE31v2iLip91L2h8QczGozjzSkoCefMnez-fWxdVFHiq_ezY6qjg2F8pKXiClwRrjZis-sslFSDlqHmcpoA4U2OXBlk1XG4gT1dhUqMqGqZI/?imgmax=800" width="480" height="250"></a> <p><font size="4">“Job” is a short word (so is “work”) that has many parts, aspects and responsibilities – so when I say that I want to improve my work, I want to improve it in all of its parts. I choose to divide my job into 4 aspects:</font> <p><font size="4">Inbound, outbound, people and recruiting (I know that in the future this format will change, since I’ll have more or different responsibilities. But it works for now).</font> <p><font size="4">I want to separately focus on each part, and try to see what “works for me” and what doesn’t. Each of these parts deserves its own retro.</font> <p><font size="4">In the <b>inbound</b> part, I focus on my team. How is our communication? How can we increase velocity? Are we happy? Do we celebrate wins? Do we achieve our goals, and so on. </font> <p><font size="4">In the <b>outbound</b> part, I focus on everything that is external to my team. The interfaces with our stakeholders, the product owner, peers and other teams in R&D, and the company in general. Does our work hurt them? How can we share our knowledge with them? And how can we improve our process?</font> <p><font size="4">The <b>people</b> part may seem unnecessary since I already have the “inbound” part. However, my team members deserve a focused and dedicated part just for them. In the inbound section I think mostly about us as a team, a group of people who work together and can do it better. In the “people” part, I try to better understand every one <b>individually</b>. What makes them tick, what concerns them and how can I help them? </font> <p><font size="4">The last part is <b>recruiting</b>.<b> </b>Not only is recruiting a very important responsibility, it also requires a lot of time and attention. Therefore it has a dedicated part in my format, in order to see what works for me in the recruiting process and what doesn’t. Where do I and all the other recruiters waste time that shouldn’t be wasted? And what methods I find better than others.</font> <h1><font color="#4f81bd">What opportunities are you missing? </font></h1> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHERFAJ6As_rHiV29ac7EbLop2_JG0aSymtm0fvaCia3-3zoR1H-kDigoufW07auwR7mcZd1XE5TIC_rG6JuE43LRlZ630wo_OKxYWIHC_fvu5nn9HWKDXH2trm4UYAqViMxYbty47yTM/s1600-h/clip_image012%25255B4%25255D.jpg"><img title="clip_image012" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image012" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3gaAKV9Z2LHeKOsRMOArahXM9V4VnxC8kzyC8h3whAlYLy9PT9R_minpO6kQhKeP_TQN4u6DB9iwOIBFd_k5dqTYn3aSk46Dokfylshf_SY8wERTfCoFvqq8IoYnUBqvBuN9eQThHFg/?imgmax=800" width="401" height="358"></a><b></b> <p><font size="4">You can see that in almost every section there is an “<b>Opportunities</b>” part. Here I try to think a little about the future. What we should start doing now in order to improve or be ready for in the near-future. This is very powerful, since we rarely think about the future. We are so focused on today’s “fire” and tomorrow’s delivery that we basically never think about the opportunities we might be missing. By the way, you will need to miss some of those opportunities for whatever important reason. But there is a big difference when you knowingly miss opportunities and when you simply miss them because you are not aware of them in the first place. </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPkOKOLyhJvVf_JKUbsQMbMDAXyP7Pf10qoQm6qjfP1LvZgkvJN7UiEhjLPsMzyAWGVHd9kSBSw4FG9m0Kd6tQSlypbLKHZc1X2P61WdHaCJVByZ0gFzoWdvdKsN-tnu7SHnEAyGd7ShM/s1600-h/clip_image014%25255B4%25255D.jpg"><font size="4"><img title="clip_image014" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image014" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglkHihXKkyzJ6uzFTfICKoWkqd1nKq73EFimTrVbD9fWVvGkQS19d5Vr9hBnCTa5O0O3P5wQVJUjHq-g4itzjCf24nrTqtoez2I9ilaOKGzYKaqjbJp26ExuOw1xqhouiYhFZC9syQaw8/?imgmax=800" width="405" height="263"></font></a> <p><font size="4">My first job was at the age of 12 (I washed the stairs of my building), and since then I have worked almost all the time – after school, in the summer, during my military service (I consider my army duty as a software engineer as work) and now. So for the last 13 years I’ve been constantly working. I have learned that if you try to think further ahead, constantly try to improve yourself and your surroundings, and share your thoughts with your manager, you will gain two very important things: <b>Change </b>and<b> Trust</b>.<b></b></font> <p><font size="4"><b>Think</b> about it ;)</font>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com1tag:blogger.com,1999:blog-7296668432246169944.post-20755773795435537942016-12-20T20:19:00.001+02:002017-07-20T14:31:08.420+03:00Estimations in Agile development - Improving Estimations using Burndown, Burnup and Actual Time metrics<span style="font-size: medium;"></span> <br />
<span style="font-size: medium;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuIVkBBo74Plp4PKkTRKuaoKIihLq57CggTvx4qKZFMF5__Txyz8OW1yka39MKzXfEDdMyJK8Xx_nn5G3lju3JZlRkgsBY1UXYithahr4qkYj1-_el31AOzKNxnN5ZvUsFXugPvDlmFTA/s1600-h/iStock_000016213049Small%25255B3%25255D.jpg"><img alt="iStock_000016213049Small" border="0" height="296" src="https://lh3.googleusercontent.com/-EiYflMye_WE/WFl3lZcycLI/AAAAAAAAWWU/Pv7QqDbILEs/iStock_000016213049Small_thumb%25255B1%25255D.jpg?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="iStock_000016213049Small" width="642" /></a></span> <br />
<span style="font-size: medium;">This is the fourth and the last post in the Estimations in Agile development series.</span> <br />
<ol>
<li> <span style="font-size: medium;"><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-epics-user-stories-and-tasks-2570ba9f9d3d">Epics, User Stories and Tasks</a></span><br />
</li>
<li> <span style="font-size: medium;"><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-estimating-the-backlog-with-story-points-358d12b566d1">Estimating User Stories with Story Points</a></span><br />
</li>
<li> <span style="font-size: medium;"><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-sprint-planning-methods-capacity-vs-velocity-vs-feature-a5b4bb1a159e">Sprint Planning Methods: Capacity vs. Velocity vs. Feature </a></span><br />
</li>
<li> <span style="font-size: medium;">Improving Estimations using Burndown, Burnup and Actual Time metrics (<strong>you are here</strong>)</span></li>
</ol>
<span style="font-size: medium;">In the previous post we’ve discussed the different methods for the sprint planning and the benefits of using absolute units like hours for estimating small efforts in a known time frame - the sprint.</span> <br />
<span style="font-size: medium;">In this post we’ll see some metrics that will help us verify and improve our estimations over time and even allow us to predict whether we’ll achieve our long term goals.</span> <br />
<span style="font-size: medium;"></span> <br />
<h1>
<span style="color: #4f81bd;">Burndown</span></h1>
<span style="font-size: medium;">After we finish estimating all the tasks we can create a rough estimation regarding the amount of work that has to be done (according to the daily capacity) in order to finish all the tasks on time.</span> <br />
<b><img height="402" src="https://lh5.googleusercontent.com/OPNobCF_d1WkYFmm3XX9ioylu8jhVfzQ4TpHidgEQEkvpJivJFluNtFUUzFSGIE3eGGZglNHGuNPbJSpQ18k7RyD_D5oCJIcVNQmZNd8R1pnsLJrA5jxGIXzNpMrpOAlEyaVNfcvwRuZYG2PyA" width="792" /></b><br />
<br />
<span style="font-size: medium;">The green line displays that available capacity for a current day. In other words – we need to make sure that our remaining work for the sprint is below the green line. Otherwise we won’t complete all the tasks on time.</span> <br />
<span style="font-size: medium;">Each day developers should update the “remaining work” field for their tasks – how much time is left for finishing the task. That metric will allow us to know whether we’ll finish all the estimated tasks or not.</span> <br />
<span style="font-size: medium;">The burndown might go up when new tasks are added or new information is discovered during the sprint.</span> <br />
<span style="font-size: medium;">The remaining work should be updated daily and the team should look at the chart in the </span><a href="https://www.mountaingoatsoftware.com/agile/scrum/daily-scrum"><span style="font-size: medium;">daily stand up meeting</span></a><span style="font-size: medium;">. In this event we can easily see that our estimation are not correlating with our actual performance. The impact is clear: if the team proceeds with the current phase they won’t finish all the planned tasks for the sprint on time. Hence the user won’t receive a working product.</span> <br />
<b><img height="419" src="https://lh5.googleusercontent.com/rc9zNJZ40-6PhjW3isot5eRWkW6QOYX81TYHwFjJ2IaytDmF9n9Hpe490xyHUNOjLvaiTA0P0s45QgZeZwD9qDMtWuv-MIMt4PzYfVVImhKdJ2kEMo3xPSTePltalaEws19G2RKo" width="928" /></b><br />
<span style="font-size: medium;">In this very moment the team should decide on the action to make the chart to convergent.</span><br />
<span style="font-size: medium;">They can decide on giving some extra work to close the gap or perhaps remove the least prioritized task from the sprint – this is of course done with the product manager who is the stakeholder of the sprint.</span> <br />
<span style="font-size: medium;">The burndown chart is a daily feedback tool. it is effective only when it is updated on a daily basis. it is also another reason why I think one should use hours and not story points for the sprint’s tasks. when working with story points you don’t update the remaining time - you don’t change 3 SP tasks to 1 SP task, you simply work on it until it’s done. This way the burndown will not reflect your actual progress daily and it will be hard to understand if you are on track.</span> <br />
<b><img height="523" src="https://lh6.googleusercontent.com/MpGmv9Bqb9ZJqoJ7tMkAFF9lOIEO4cXfdYg8Er3BJnoIoz-BbxumHwOhxCfMRipl34tSCFbP2X3w8LScE1Lr53GylKmpyKIp3TLJO_z1SPDO_m3YXwzEmkUMp7aFQRv_sJfdSfB5" width="716" /></b> <br />
<br />
<h1>
<span style="color: #4f81bd;">Actual vs. Estimated - Improving the team’s estimations</span></h1>
<span style="font-size: medium;">Even in a two weeks sprint we cannot know everything. Something will always surprise us. A larger than estimated task, an external requirement, un-expected technical support and more. Sometimes there is absolutely nothing we can do about it, however sometimes we can learn from these unaccurate estimations and correct them in the future. Therefore I suggest another metric which purpose is to compare our initial estimations to our actual performance. </span> <br />
<b><img height="439" src="https://lh5.googleusercontent.com/c6JwBEk9ifZIt7rMvf__73VrtXFGj5B85tZsexHJDD7I0QIYUZzTYs657otGkzJSb6a0ahQ6_oHU2BQ0YlSLi1PaG9dkq_3_74dgyI0XbL-4MS0u68Inj5kD1G7kbwxcsl7WUMWIDtdfHTGNhg" width="791" /></b><br />
<br />
<span style="font-size: medium;">After finishing a task, the team member will fill another field “Actual Work” with the actual time that took him to complete the task. This way we’ll create another graph that will compare the planned estimation to the actual one, Allowing us to see which tasks were underestimated, overestimated and which were exactly as we predicted. Our purpose is to minify the gap between the actual and the estimated. ”why did the task take longer/less than we estimated? Could we do something in order to predict it?” This graph is a great topic to start the </span><a href="https://www.mountaingoatsoftware.com/agile/scrum/sprint-retrospective"><span style="font-size: medium;">retro meeting</span></a><span style="font-size: medium;"> with. </span> <br />
<span style="font-size: medium;"></span> <br />
<h1>
<span style="color: #4f81bd;">Predicting the future with Burnup chart</span></h1>
<span style="font-size: medium;">The burndown chart allows us to monitor only a single and the current sprint. It allows the team a clear view on their progress in the sprint. However, it doesn’t tell if the team if the whole project is on track or will they finish it on time? Every stakeholder and manager wants to know when will the project, milestone or a release be ready. It is hard to predict a date 3-6 months into the future. Any estimations for this feels like a hunch. “<em>Well, we have 3 months left and 2 more big features, so I guess will make it on time</em>”. How can we monitor our progress on a ~weekly basis?</span> <br />
<strong><img height="465" src="https://lh5.googleusercontent.com/YS8NWDZhL-rEilTHsPme74-c21YLAZ2rf19WgRn66JGZ71Gjq0hR7npEt3vVagtmVKVrUPj1wdA_vmmD0P7baLQ6xPM020aIKsdBHjLsAm1P6sHdzEACAYjBEP1ZplFyutz2o5AR" width="694" /></strong> <br />
<span style="font-size: medium;">Actually we can predict all this using our previous progress. Let’s say we are 4 sprints in (2 months) in a 6 months project. Will we make it on time? To answer this we need only 2 things:</span> <br />
<ol>
<li> <span style="font-size: medium;">Estimated backlog (Epics/ user stories with their SP values)</span><br />
</li>
<li> <span style="font-size: medium;">The Team’s average velocity</span></li>
</ol>
<span style="font-size: medium;">Average Velocity is the amount of story points that we finish in each sprint divided by the number of sprints (those who read the </span><a href="http://dennis-nerush.blogspot.co.il/2016/10/estimations-in-agile-development-sprint.html"><span style="font-size: medium;">previous post</span></a><span style="font-size: medium;"> probably understand that this metric won’t be too accurate but it is enough for this purpose). </span> <br />
<strong><img height="474" src="https://lh5.googleusercontent.com/ywPhaM1cAs8t4TrkSv6q9PXziZjXq7idJE9AE6Ro4Z7DZQSFe2v3svLmAKXxeVV5Mutc4S_hEULmU2Hk6IuTZgkXwp3uBrp2tgR5ny-VNUx5PbYARteomOH9GnCTjybi3X8AZIqb" width="779" /></strong> <br />
<span style="font-size: medium;">Team’s average velocity for the last 4 sprints = (10 +8 + 6 +11)/ 4 = ~9.</span> <br />
<span style="font-size: medium;">The beauty of the team’s average Velocity is that it gets more accurate with every sprint. Therefore if we know the end date (4 months from now) and the average velocity, then we can predict how many story points the team will finish by that time.</span> <br />
<span style="font-size: medium;">We’ll take the previous chart and we’ll turn it into a cumulative</span> <br />
<strong><img height="522" src="https://lh3.googleusercontent.com/Yoosq0KoAFrP9YYBq5QGgF5wRz08aIXbHX70BddbCIyQ4zhpyhv3-T7Dkl58V7pM__r4BL8SzQ_XjLF8CPuG7WP8-9zqh1TPD33VFEY_HkZI6P_p0jmCQZ6I1_KhZpKaM3pcUpLI" width="756" /></strong> <br />
<span style="font-size: medium;">Now, based on the average velocity we can calculate how much SP we’ll finish in the future sprints.</span> <br />
<strong><img height="473" src="https://lh3.googleusercontent.com/N9m6VuwISB_8kkB8f0NZOwRsNtZcuMbfsNjzJbW4Zgb298jY0Yd6-2jCfOvx-vcZw8b7d1dxSW0vk9o69AqlI0HmuNPzXVTYENj5D9wnidpXwvDVOkdMKLxkB-DdBqfGseNbxpP6" width="702" /></strong> <br />
<span style="font-size: medium;">All the data on the right of the black line (the present sprint) is predicted based on actual data from the previous sprints. You can see that after 12 sprints the team will finish ~110 Story Points. If the total required amount is 100-110 then it seems that we have the right velocity and we’ll finish the project on time. But we all know that the above chart is too good to be true. The below one is probably more realistic:</span> <br />
<strong><img height="475" src="https://lh4.googleusercontent.com/hEOQvemDpnqUkI7KuEEG73X7ZZsCgaulafq-YpPx9L0rmRa-MT3TeR4e5u3c-WrKAmhlguv-vMtG2nhwUvGxL84-JoRnusXW4Svl7BWeLdLTFQ-6hgaPhQDo36qgDPJIn-lxny86" width="702" /></strong> <br />
<span style="font-size: medium;">This chart is called burnup and it allows a clear, data driven, look at the future. Based on this data the team, and everyone else, knows that the project won’t be ready on time. The velocity should be higher, the ETA should move or the project scope should change. Either way -this is not a hunch. </span> <br />
<span style="font-size: medium;"></span> <br />
<h1>
<span style="color: #4f81bd;">Summary</span></h1>
<span style="font-size: medium;">In this post we’ve seen 3 ways to improve our estimations and predictability. The actual vs. estimated is the best tool to verify and improve your estimations over time and the burnup will let you know you need to speed up your development, even if you finish all sprints on time. The key is to constantly check yourself and improve.</span> <br />
<span style="font-size: medium;">In this series we covered lots of topics regarding Agile development and estimations. It is important to remember that there is no “right” way to do Agile. There are common fundamentals but different teams should use and adopt the principles and process that suits them best. And remember that nothing is constant - something that used to be “right” for you then, may not be right anymore. So keep retroing yourself and your process, keep fine tune it all the time and I hope that you’ll find what is best for you.</span> <br />
<span style="font-size: medium;">Feel free to share and comment.</span> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/07/estimations-in-agile-development-epics.html"><span style="font-size: medium;">Estimations in Agile development – Epics, User Stories and Tasks</span></a> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/09/estimations-in-agile-development.html"><span style="font-size: medium;">Estimations in Agile development – Estimating User Stories with Story Points</span></a> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/10/estimations-in-agile-development-sprint.html"><span style="font-size: medium;">Estimations in Agile development – Sprint Planning Methods: Capacity vs. Velocity vs. Feature</span></a> <br />
<span style="font-size: medium;">Estimations in Agile development - Improving Estimations using Burndown, Burnup and Actual time metrics</span><strong> (you are here)</strong><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com2tag:blogger.com,1999:blog-7296668432246169944.post-14011789267313591332016-10-08T16:47:00.001+03:002018-02-07T10:51:52.095+02:00Estimations in Agile development – Sprint Planning Methods: Capacity vs. Velocity vs. Feature<span style="font-size: medium;"></span> <br />
<span style="font-size: medium;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9LfoapyRXX2IjnAKhFSNuYkgwyrK7k1E_MNrKq8FJ_2O5VPYcG05KwWHFSBeAqWMkR6_Dm0QqpoArc1-V6qEdAZUgo6BSgrmNalmfv54v8A_XINolksOrBYccVKr4mFx3UKA7Qb5fmqE/s1600-h/time%25255B3%25255D.jpg"><img alt="time" border="0" height="563" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQSiguKhJojTw3EzJcn92lmnEHUhGo0hAJZNLfLmxzyPJCB_iQFQhxcpSbrgL5o4NhcI_Srf-hzrdE6AkaR1hdgfaOSGLE8ecHhspTNF2hajiSMhdSQ-AbclsyklOOPC86RRLkaKHyTaw/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="time" width="800" /></a></span> <br />
<span style="font-size: medium;"><br /></span>
<span style="font-size: medium;">The updated version of this post can be found <a href="https://medium.com/dennis-nerush/estimations-in-agile-development-sprint-planning-methods-capacity-vs-velocity-vs-feature-a5b4bb1a159e">here - in my new blog</a>.</span><br />
<span style="font-size: medium;"><br /></span>
<span style="font-size: medium;">This is the third post in the Estimations in Agile development series.</span> <br />
<ol>
<li> <span style="font-size: medium;"><u><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-epics-user-stories-and-tasks-2570ba9f9d3d">Epics, User Stories and Tasks</a></u></span><br />
</li>
<li> <a href="https://medium.com/dennis-nerush/estimations-in-agile-development-estimating-the-backlog-with-story-points-358d12b566d1"><span style="font-size: medium;"><u>Estimating User Stories with Story Points</u></span></a><br />
</li>
<li> <span style="font-size: medium;">Sprint Planning Methods: Capacity vs. Velocity vs. Feature <strong>(you are here)</strong></span><br />
</li>
<li> <span style="font-size: medium;"><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-improving-estimations-using-burndown-burnup-and-c2f6fff37ff3">Improving Estimations using Burndown, Burnup and Actual Time metrics</a></span></li>
</ol>
<span style="font-size: medium;">In the previous posts we’ve learned how to breakdown features to epics, user stories to tasks, and how to estimate epics and user stories. We talked about the three prioritization cycles and their importance, and why relative units like story points work better than time based units like ideal days. </span> <br />
<span style="font-size: medium;">In this post I want to focus on the sprint and on the meeting that starts the sprint – the sprint planning. I’ll show you why technical tasks, unlike epics and user stories, <strong>should be estimated in time based units like hours.</strong></span> <br />
<span style="color: #c0504d;"><span style="font-size: large;"><strong>The Purpose of the Sprint</strong></span> </span> <br />
<span style="font-size: medium;">A sprint’s purpose is to <strong>deliver value</strong> to a user and <strong>receive feedback.</strong> If by the end of the sprint, a user doesn’t receive any value or the team doesn’t receive any feedback for their work, the sprint wasn’t successful. Only after seeing real working features, a user can tell that they are, indeed, what he needs.</span> <br />
<span style="font-size: medium;">A “user story” shares the exact same purpose – deliver a value to a user, that means that <strong>we should be able to accomplish at least a <u>single</u> user story in a sprint.</strong></span> <br />
<span style="color: #c0504d;"><strong><span style="font-size: large;">Capacity planning vs. Velocity planning vs. Feature planning</span></strong> </span> <br />
<span style="font-size: medium;">The top user story in the backlog is the one that we need to deliver first since it is the most valuable to the user. But how do we know if that user story actually fits into a <u>single</u> sprint?</span> <br />
<span style="font-size: medium;">There are 3 methods to decide how many user stories can fit in a sprint:</span> <br />
<ol>
<li> <span style="font-size: medium;"><strong>Feature Planning</strong></span><br />
</li>
<li> <span style="font-size: medium;"><strong>Velocity Planning</strong></span><br />
</li>
<li> <span style="font-size: medium;"><strong>Capacity Planning</strong></span></li>
</ol>
<span style="font-size: medium;">Let’s drill down to each of those methods.</span> <br />
<strong><span style="color: #c0504d; font-size: large;">Feature planning</span></strong> <br />
<span style="font-size: medium;">This method basically states that by the end of the sprint, a chosen feature(user story) must be ready. This method is usually used when the team has a deadline that cannot be changed like a commitment for stakeholders or an external constraint. The team will literally do whatever it takes to accomplish the feature. Including long hours and even weekends. The team will not be able to keep up with this for long.<br /><strong>Avoid using this method if possible</strong>. However if the company does work like this, then it is important to take the right buffers and plan ahead in order to remove the dependency between the external and the internal dates.</span> <br />
<span style="color: #c0504d; font-size: large;"><strong>Velocity planning</strong></span> <br />
<span style="font-size: medium;">Velocity planning method uses the team’s average ‘velocity’ in order to determine the amount of user stories for the sprint. </span> <br />
<span style="font-size: medium;">Velocity is a metric that defines the amount of story points a team accomplishes in a single sprint. <br />For example, if a team finished a total of 10 story points 2 sprints ago and another 10 story points in the last sprint, then its velocity is 10 story points. <br />When planning based on previous velocity, in the upcoming sprint the team should take user stories with total of 10 story points.</span> <br />
<span style="font-size: medium;">This method is obviously better than the previous one. However this method <strong>is not accurate enough</strong> for a two weeks sprint resolution.</span> <br />
<span style="font-size: medium;">The velocity based planning is relying on addition of relative units – story points. The problem with adding these values is that 1SP + 2SP != 3SP.</span> <br />
<span style="font-size: medium;">A story point is a relative unit that describes a story’s complexity relatively to another story (X is 2 times harder than Y). This unit is great for comparing stories and deciding on their priority, however a 2SP task doesn’t equal to two 1SP tasks. As a matter of fact, 2SP task doesn’t necessarily take the same amount of time that as another 2SP task.</span> <br />
<span style="font-size: medium;">Let’s assume that our project is already running for 10 sprints. We could look back at every user story in every sprint and give it the <strong>actual time</strong> it took. This will allow us to convert <u>story points to time</u>. Let’s say that after that calculation 1SP is equal to an average of 12 hours. </span> <br />
<span style="font-size: medium;"><img alt="C:\Users\Dennis\Downloads\snip_20160427004317.png" height="713" src="https://lh6.googleusercontent.com/zTCaT2HhjrrkPZWaJPVSfX9ryYO6bVCQonona_Fsnp5z9xAxcSo26z-c3H0odRQJ8Uq04GwYHNQ0P8e90ITfqBeQIxdMgAYU9KI3LgK2AoYZi0TlTybLUPnyVEaZSjI0pmZLtzX-KvkKQ6JoKw" width="573" /></span> <br />
<span style="font-size: medium;">*</span><a href="http://www.shopyourway.com/agile-estimating-and-planning-paperback/1237095"><span style="font-size: medium;"><u>Agile Estimating and Planning</u></span></a><span style="font-size: medium;"> by Mike Cohn page 162</span> <br />
<span style="font-size: medium;">As you can see that despite the fact that the average is 12, we had tasks that took less and some that took more. The standard deviation becomes bigger as the SP number value is higher (some 3SP tasks will take 30 hours while others may take 45 -50% more). It should not be a surprise – after all 2SP states that it is 2 times more complex than 1SP task, it doesn’t mean that every time it will take twice as long.</span> <br />
<span style="font-size: medium;">Therefore if you plan your sprint using velocity don’t be surprised if some of the tasks take longer than others although they have the same SP value, and that you won’t finish all the planned tasks by the end of the sprint.</span> <br />
<span style="color: #c0504d; font-size: large;"><strong>Capacity Planning</strong></span> <br />
<span style="font-size: medium;">There are many unknowns when we try to plan months ahead (like in the beginning of the project). However things are different then we plan a sprint (which is only 1-4 weeks long). There are several known facts that allow us to plan more accurately:</span> <br />
<ol>
<li> <span style="font-size: medium;">A sprint’s length is <strong>constant</strong> (read </span><a href="https://www.benday.com/2014/07/24/really-bad-idea-change-sprint-length/"><span style="font-size: medium;"><u>here</u></span></a><span style="font-size: medium;"> why) it can be 1 - 4 weeks longs. Either way it is known, hence we know how many working days there are in the sprint.</span></li>
</ol>
<ol start="2">
<li> <span style="font-size: medium;">We also know of how many working hours are there in a single day of a sprint. </span></li>
</ol>
<ol start="3">
<li> <span style="font-size: medium;">And we also know how many team members to we have.</span></li>
</ol>
<span style="font-size: medium;">For example in a 2 week sprint we have 10 work days, 9 hours a day and 4 team members. 10 X 9 X 4 = 360 hours.</span> <br />
<span style="font-size: medium;">However we don’t actually have 360 hours right? What about all the meetings? The days off and other <strong>known wastes.</strong>We know most of our wastes when we plan for 2 weeks ahead. We also know another thing – we don’t actually work 9 hours a day, take off lunch, breaks, vacations, support hours and other context switches and it will be more like 6. <br />Each team member can easily calculate his capacity by simply looking at his calendar, so in order for the total capacity to be accurate, a sprint capacity calculation should consider every team member individually.</span> <br />
<span style="font-size: medium;"><img height="670" src="https://lh5.googleusercontent.com/ULUf5qKMIRfEbVKFw6Ao5yd35ejqM0cmj4il7Ys8HXtADBNPSOuoNLHpj5xHzHuz_sNhzfGrYwyBI9zUyRUJWFtecreXO0i6Tx3k91yEQcaUmLHZsblH8YGAKrxSLOZt0HUNrOrMcSH44zku0w" width="561" /></span> <br />
<span style="font-size: medium;">That is the sprint capacity (for a 1 week sprint). </span> <br />
<span style="font-size: medium;">The capacity represents the absolute amount of work that the team can handle in <strong>hours</strong>. The sprint’s capacity is like an empty glass which size is determined by the team members working time (also hours).</span> <br />
<span style="font-size: medium;"><img alt="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ62oVyyqvzXroppq5tEfrjxsf5aZp8IRA7YWgz8GhzBjJZL1FO" height="296" src="https://lh4.googleusercontent.com/UIWfXLp91fJCG7rEWDQmrj-kfn7qFivZozDxOMELHYOpADqDe52Zl-gMo3CbBVMBzPI4jpDB7MH6REeNDxo_Xz9x8VFbQsiGpAYIuDXLVbmxfasysgw6iEpK6b_mf41eK0CfdBeUsCON1Gypig" width="592" /></span> <br />
<span style="font-size: medium;">The size of the glass is in hours, therefore in order to fill it we also need to use hours. Unlike big features, epics or user stories which are hard to estimate, tasks should be well defined and should require a relatively small effort (no longer than 3 days). The tasks estimation is created using <u>“</u></span><a href="https://www.mountaingoatsoftware.com/tools/planning-poker"><span style="font-size: medium;"><u>poker planning</u></span></a><span style="font-size: medium;"><u>”</u>. </span> <br />
<span style="font-size: medium;"><img height="141" src="https://lh4.googleusercontent.com/YQ7SMPrVXCy2W4OA-uNbMtihnfRlA806haT2NuNsKOmYCCpUWDkNQUtzyngjL6taS2uTSPsv_F4iQT7ocT-uz7q4duqdS6oML9tGKJu4QFVKhYPVbR3oXOWkVHwzpYC-a2_VEJZ-AwgGqkUx9w" width="521" /></span> <br />
<span style="font-size: medium;">After estimating the first task we add it to our sprint backlog and basically “fill the glass” a little.</span> <br />
<span style="font-size: medium;"><img height="86" src="https://lh6.googleusercontent.com/uQFxD8hZJrIRn6ZPhOq6i5wmvRgjp-hL1ZxIJRATEI4cfBdOQ3NL_kyJMT4G6kIlQZ7cJ920BGNRZnZt1AdiHeBHqz01l1PXIrOlA2gn9GjZgQfWCrk0j0wjLgqsKT1EB2KV0HWgH7tzozDuMw" width="200" /></span> <br />
<span style="font-size: medium;">We can see that we haven’t reached our capacity yet. Therefore we can keep estimating until we’ll reach it.</span> <br />
<span style="font-size: medium;"><img height="78" src="https://lh3.googleusercontent.com/ynnsqXwUWSRJOndmbrLoyFNrUYzVSJ_EH0jHoDFfgzufyGsTSy1xnhTVmnhJYkSSZ764jZxY5UaNw3twqz2FcPjujjpgZfshKWGvztzeoGE9Kkqwdvt3z8BUbqUVuUhNr7hEzSdXN3zKm2NegA" width="170" /><img height="117" src="https://lh5.googleusercontent.com/h4hekQNty9g61jpdJFAfYihpZLJjXAyb2puXTaylodvl-B6xgHNLefg-GZBp4A7Pc6V9meh6RzWSPXVnakm_4H15a7EP1Q3TdtuwFzeUUNPzPAi11w1x2tucmyiwsMpnTT-ixVP6Tu6fNLc2Ag" width="624" /></span> <br />
<span style="font-size: medium;">We had successfully filled our time with…time! Before the planning we have removed all the known potential wastes and therefore we have a pretty good reason to believe that we’ll complete all the tasks in the sprint on time.</span> <br />
<span style="font-size: medium;">We could wait for the end of the sprint and find out whether our estimations were correct, or we could use some useful metrics to verify <strong>daily</strong> that we are on track. <br />We could also use some other metrics that will allow us to improve our estimations over time, and for the grand finale, we can use a very special metrics that will help us to predict the future.</span> <br />
<span style="font-size: medium;">Read about all that and more in the next and the last post of this series. </span> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/07/estimations-in-agile-development-epics.html"><span style="font-size: medium;"><u>Estimations in Agile development – Epics, User Stories and Tasks</u></span></a><u> </u> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/09/estimations-in-agile-development.html"><span style="font-size: medium;"><u>Estimations in Agile development – Estimating User Stories with Story Points</u></span></a> <br />
<span style="font-size: medium;">Estimations in Agile development – Sprint Planning Methods: Capacity vs. Velocity vs. Feature <strong>(you are here)</strong></span> <br />
<span style="font-size: medium;">Estimations in Agile development - Improving Estimations using Burndown, Burnup and Actual time metrics <strong>(go here)</strong></span> <br />
<span style="font-size: medium;"></span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com14tag:blogger.com,1999:blog-7296668432246169944.post-12508964014896028182016-09-04T11:31:00.001+03:002017-07-20T14:29:39.588+03:00Estimations in Agile development – Estimating the Backlog with Story Points<span style="font-size: medium;">This is the second post in the Estimations in Agile development series.</span> <br />
<li><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-epics-user-stories-and-tasks-2570ba9f9d3d"><span style="font-size: medium;">Epics, User Stories and Tasks</span></a> </li>
<li><span style="font-size: medium;">Estimating User Stories with Story Points (<b>you are here</b>)</span> </li>
<li><u><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-sprint-planning-methods-capacity-vs-velocity-vs-feature-a5b4bb1a159e">Sprint Planning Methods: Capacity vs. Velocity vs. Feature</a></u> </li>
<li><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-improving-estimations-using-burndown-burnup-and-c2f6fff37ff3">Improving Estimations using Burndown, Burnup and Actual time metrics </a><span style="font-size: medium;"><a href="https://lh3.googleusercontent.com/-iyA762AjCtY/V8vb5O3ctWI/AAAAAAAAU08/fiaQ4tCYyTA/s1600-h/estimate%25255B9%25255D.jpg"><img alt="estimate" border="0" height="387" src="https://lh3.googleusercontent.com/-Dr03NoKceeQ/V8vb6JfS10I/AAAAAAAAU1A/bZ5-6twpLYs/estimate_thumb%25255B7%25255D.jpg?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="estimate" width="412" /></a></span><br />
<span style="font-size: medium;">In the <a href="http://dennis-nerush.blogspot.co.il/2016/07/estimations-in-agile-development-epics.html">previous post</a> I’ve introduced the different product backlog items, their hierarchy and scope.</span><br />
<span style="font-size: medium;">In this post we’ll learn how to estimate user stories using <i>story points</i>.</span> <span style="font-size: medium;">I’ve introduced the videos website project that I’m building. This is its current epics backlog:</span> <br />
</li>
<li> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8foqoPLGzwJKhWQn5SHeOFt9LI7y9njHUebaUug-qjF6rFpiVa1emSxwWB10_iuRSOjdVF9_0MmEmvsm0dJWGfDcj5d5AuH2CJP2MqtVfLT405QieV9GCY57tMAbv9gRJWk56e0XdXA8/s1600-h/1%25255B3%25255D.png"><img alt="1" border="0" height="160" src="https://lh3.googleusercontent.com/-1O-wUkIMbBY/V8vb69mNoQI/AAAAAAAAU1I/S4oYo6RAXhY/1_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="711" /></a> <br />
<b><span style="font-size: large;">Story points</span></b> <br />
<span style="font-size: medium;">We need to estimate those epics, but how? The trivial option is time. We usually estimate effort in time “<i>It takes <u>two hours</u> to get to Tel Aviv”, “The renovations will be over in <u>a week</u>”. </i>However, it is extremely hard to estimate long term effort in time.</span> <br />
<span style="font-size: medium;">Let’s look at the first epic <i>Allow users to find, play and comment on videos. </i>This is obviously a lot of work. It is more than a week and probably less than a year. Every time driven estimation won’t be accurate. It is hard to estimate accurately something that is longer than a week. Months? Impossible. We need something else.</span> <br />
<span style="font-size: medium;">When estimating long term effort we should use a more <b>relative</b> unit like size or complexity.</span> <br />
<span style="font-size: medium;">These units allow us to easily compare features by their size or complexity. “<i>This one is 2 times bigger/more complicated than this one”. </i>It allows to easily separate the complex features from the easy features or from the small ones to the large features.</span> <br />
<span style="font-size: medium;">Since the units are relative to one another we can choose any numeric representation that we want. We only have to stay consistent while using it.</span> <br />
<span style="font-size: medium;">It can be 1,2,3 story points when 1 is super easy and 2 is harder, or 10, 20, 30… . It doesn’t really matter and that is the beauty in story points. Personally I prefer reflecting size in story points. “How long does it take to get from Tel Aviv to Herzelia? Same as getting from Tel Aviv to Holon which is 2 (some relative representation of this size)”.</span> <br />
<span style="font-size: medium;">Another option is ideal days. “<i>How many days will it take if the days have absolutely no distractions?</i>” The problem in this way is that yet again it is time based and we suck in estimating long term in any time based method. Hence it is not recommended. <i></i></span> <br />
<span style="font-size: large;"><b>Prioritize, estimate and prioritize again</b><b></b></span> <br />
<span style="font-size: medium;">The backlog will be constantly prioritized and changed due to business requirement, estimations and new discoveries along the way.</span> <br />
<span style="font-size: medium;">In order to properly prioritize we need to have the business prioritization along with the estimated R&D effort. Usually it will take 3 rounds:</span> <br />
<ol>
<li><span style="font-size: medium;">The first one is a “business prioritization” round. The product manager will prioritize the epics based on their business values. <i>What feature does the user must have first?</i></span> </li>
<li><span style="font-size: medium;">The second round is a “<i>technical effort estimation</i>” round. The R&D will go through the list of epics and spot the ones with the highest level of uncertainty and risks. We don’t want to leave the unknowns to the end – we want to tackle them from the beginning in order to increase our level of certainty in the required effort. Unknown effort usually is a big effort, hence its story points value will be big.</span><span style="font-size: medium;">The recommendations epic has many uncertainties like introducing intersects into the system and understanding what videos the user will actually want to watch. It seems like it is <i>3 times</i> bigger effort than the other two epics. We’ll estimate it with a value of <i>30 </i>while the other epics are 10. The cool part is that it doesn’t have to be “3 times bigger” it can be 5 or 10 times bigger. It is relative. It means that a new epic will have an estimation that is relative to the previous ones: is it “<i>more like” </i>the big one (30) or more like the first one (10).</span> </li>
<li><span style="font-size: medium;">The third and last one is the “business prioritization” round again. This time the product manager sees the required effort for all the epics and decides whether some of the highly estimated epics should be moved higher or lower in the backlog. Perhaps if a feature is so difficult to implement then it shouldn’t be implemented at all. Our product manager is fine with our estimations and he decides to leave the epic in its current priority. The first two are more valuable than the recommendations. </span></li>
</ol>
<span style="font-size: medium;">This is our current estimated backlog:</span> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC8Ewe6OF64yMI-DHtYZOhsQI7pJgkbmk_y6Cyb8bhRA5s9yPspsQ8EPRb3JFs_baPcRZoCPckgXpKtI9UCobGg7uVpuCadBNxJTn29ywM3XpkF2zNO3ISNNjQEUijgniCDRkW-wZ4Yeo/s1600-h/2%25255B3%25255D.png"><img alt="2" border="0" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWg55fCamiJYKE91I5kQn-Cuj9_VTxjKiMf357eXhTu3RsQUcBN7J_gb6jT79sbGcq-LUuuSvvX2y2F01PCB-cBRejNbfmQlJvvoBeTeyLmaPUvgQPG7sYL7iZ97zm1wrStCiWmJiRCd4/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2" width="851" /></a> <br />
<b><span style="font-size: large;">Estimating User Stories</span></b> <br />
<span style="font-size: medium;">The epics are prioritized and estimated. Now what? We can start all the epics simultaneously but then it will take us much longer to finish the first one as opposed to focusing only on the first epic. Keep in mind that every epic has a real value to the user hence we want to decrease the <b>time to market</b> of every epic. In order to achieve that we must strive to <b>start only a single epic at a time</b>. There is a great phrase that one of my managers used to tell “<b><i>stop starting – start finishing</i></b><i>”. </i>We should strive to focus on the most important feature first. Finish it and only then move to the next one. The feedback that we’ll get from real users might change our initial priorities. </span> <br />
<span style="font-size: medium;">Now it’s time to split the first epic to user stories. We’ve done it already in the previous post:</span> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcRBnA6VX8jYtIyptXO0Isl6p0-rc4u1T0MdxmQsgISh-i2NaQZH_pQCm2waawzYBM6JWj1_jIojpN_l8CvlP8N-YQ2AqoDPE5VNpex6PP2U5-HDDxeecl54ewMjCayIBe__NXGIE5lnk/s1600-h/3%25255B4%25255D.png"><img alt="3" border="0" height="240" src="https://lh3.googleusercontent.com/-lSFUliRIxws/V8vb81ujWsI/AAAAAAAAU1Y/3THs_eSjttY/3_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="3" width="696" /></a> <br />
<span style="font-size: medium;">The estimation process of user stories is identical to the epics. User stories also give actual value to the user, hence we need to deliver the feature with the most value first. Watching videos in a video library application is probably more important than commenting or searching (without videos to search or comment on).</span> <br />
<span style="font-size: medium;">Now it is time for technical estimations round using story points – same as before. In this case the first user story is bigger than the other two since this is the first feature. We need to build the application’s first screens, create the project, build continuous deployment (hell yeah! From the start) and allow to actually watch videos.</span> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRqB-M0-trz6kC84XrfMCDxh3LOyUsKNPCiwkV63fya9Fz0Tj-8ZSKKFa-MZ35mc80LvUz9ySg-biPymekJ1G_BlRP48paAOC15GY5p8SY1mvWwoLUo7FdbyJ7jUoiqkcqVz4q1uUWOf4/s1600-h/4%25255B3%25255D.png"><img alt="4" border="0" height="201" src="https://lh3.googleusercontent.com/-Hy16U2nY194/V8vb957UZBI/AAAAAAAAU1g/T_Ja80RZ7lU/4_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="4" width="701" /></a> <br />
*If you try to add up the estimations you won’t reach 10. That’s alright since 2 SP and 1 SP are not equal to 3 SP. In the next posts we’ll talk about ways to sum estimated effort in a more precise way. <br />
<span style="font-size: medium;">The filter user story has the smallest estimation since it has no persistence complexity and it feels like less effort than the other features. </span> <br />
<span style="font-size: medium;">If a user story receives a big estimation then it is a sign that we don’t understand it well enough or perhaps it is just too big as a single feature. In both cases the best practice is to split it to 2 or more user stories while every user story will give actual value to the user. That is exactly what I meant in my previous post when I mentioned that epics split to themes and only then to user stories. Since this is our first estimations round we still don’t know what a too big estimation is. In the next post we’ll learn how to define our limit and by doing so define when we should break the user story further more.</span> <br />
<span style="font-size: medium;">Time for the last business round of prioritization. This round is the most important one since it determines the next feature that the R&D will work on and that the user will see. </span> <br />
<span style="font-size: medium;">After we’ll complete it and deliver it to the user we’ll receive feedback that might change these priorities. This is good. Our job is to deliver what the user wants. Having a real product at his hands might change some of his first assumptions. This is why the prioritization will happen again and again. Along with the priorities the estimations will also change. Something that we thought was 2 S.P. appeared to be much easier or much harder and it is no longer should be like other 2 S.P. user stories. It may sound depressing to constantly re-prioritize and re-estimate the backlog, however, this is the only way it will truly reflect the product. </span> <br />
<a href="https://www.blogger.com/null" name="_msocom_1"></a> <br />
<a href="https://lh3.googleusercontent.com/-T4dgRuEpNI4/V8vb-EyjNII/AAAAAAAAU1k/Jwvvica0nDA/s1600-h/5%25255B3%25255D.jpg"><img alt="5" border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwELceQxCLqIi96OQBO5Wy1F4W9LsjGRlXu3m9ppAJVlcpf-jxPUdxDwSpXg1BELDd8hGW0KIrrv2oaoh1E2WakLivnuGvQuimylgqgAVx_NCpEDWhluLTKU9wpfizPp-_GgmPCUX3h4s/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="5" width="612" /></a> <br />
<b><span style="font-size: large;">Starting the sprint</span> </b> <br />
<span style="font-size: medium;">We know the user story that we should work meaning we are ready to start our sprint. The sprint starts with a “sprint planning meeting”. In this meeting the team splits the user story to technical tasks and estimates them. <b></b></span> <br />
<span style="font-size: medium;">Should we also use story points for estimating tasks?</span> <br />
<span style="font-size: medium;">How do we know that we filled our team’s capacity?</span> <br />
<span style="font-size: medium;">What is capacity?</span> <br />
<span style="font-size: medium;">How do we improve our estimations?</span> <br />
<span style="font-size: medium;">All that and more in the next post.</span> <br />
<span style="font-size: medium;"></span> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/07/estimations-in-agile-development-epics.html"><span style="font-size: medium;"><u>Estimations in Agile development – Epics, User Stories and Tasks</u></span></a><u> </u> <br />
<span style="font-size: medium;">Estimations in Agile development – Estimating User Stories with Story Points (you are here)</span> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/10/estimations-in-agile-development-sprint.html"><u>Estimations in Agile development – Sprint Planning Methods: Capacity vs. Velocity vs. Feature</u></a><u> </u><strong><u>(go here</u>)</strong> <br />
Estimations in Agile development - Improving Estimations using Burndown, Burnup and Actual time metrics <br />
<span style="font-size: medium;"></span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</li>
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com4tag:blogger.com,1999:blog-7296668432246169944.post-39641453309494640862016-08-13T19:43:00.001+03:002016-08-15T00:24:22.846+03:00This is what I read<p><font size="4">I read a lot. I think that reading is one of most important activities one can do in order to </font><a href="http://dennis-nerush.blogspot.co.il/2016/08/manage-your-life-like-you-manage-project.html"><font size="4">improve and become better</font></a><font size="4">. </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSGKn9UnYudF6_bOewM3Zu-nwBKrAFxwND-gulky4Sh_ufyInCYgYc6ZkB8_BBhjk_r6bUjdUGuztBnbtxXl8260N4apu-bweAx4qW_H8nUPGLBXzL6YUwlsxKbng0ySQxC9A_mSph_fQ/s1600-h/clip_image0023.png"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_7HIV98qw2B6TOHsLVDADyzPEszDa6Vn_P881HYmNbG7niCE-JvNnSj-8EA2h1ro-oGDlpbrxGklflwGW6vwhez4NbOksCYkq2V4Gz7uHvDaZ0IqZiBghJso0zFsb9nS1soDzaRELaEE/s1600-h/clip_image0024"><img title="clip_image002" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAyOUo9YYx1qdwZw5EEemBrOyowbhPbtLXLrxB84TJMvLhdl0GQWeQyC2VHsfRx0FFIPt9UqSaCDhpqMKQjr3rrY4548DHsmqbWwKLhuWC3h3nK8eaGCsIeyrBCXv95WCQ1krz1JYq46w/?imgmax=800" width="622" height="426"></a></font></a> <p><font size="4">I share most of what I read on my </font><a href="https://twitter.com/DennisNerush"><font size="4">Twitter account</font></a><font size="4">. Recently more and more people ask me where I find the stuff I read. So I decided to share with you my sources. </font> <p><font size="4">There are 5 main sources where I constantly find great articles, videos and posts:</font> <blockquote> <p><font size="4">1. <strong>Feedly</strong> – here I keep my blog roll (you can find the full list in the end of this post). It is a simple RSS reader where I subscribe to the blogs that are the most relevant to me and which I want to be up to date with their content. if I land on a good post in an unfamiliar blog, I go through the last 3-4 posts and if most of the content is actually good and relevant, then I add the blog to </font><a href="https://feedly.com/"><font size="4">Feedly</font></a><font size="4">.</font></p></blockquote> <blockquote> <p><font size="4">2. <strong>Twitter</strong> – unlike Facebook, that is full of my friends posts (and pictures), in </font><a href="https://twitter.com/DennisNerush"><font size="4">Twitter</font></a><font size="4"> I follow business newspapers, tech news, engineering content, leading CEO’s and tech world “celebrities”. </font></p></blockquote> <p><a href="https://www.linkedin.com/in/lnetanel"><font size="4">Netanel Lev</font></a><font size="4"> wrote once a post describing the difference between Twitter and Google Reader (like Feedly) - <i><a href="https://lnetanel.com/2009/09/16/twitter-is-my-radio-station-google-reader-is-my-disc-player/">Twitter is my radio station, Google Reader is my disc player!</a> </i>This post describes perfectly the difference between a RSS reader that has predictable content that you have chosen like music on a CD (Yes I know, that is an old post <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="https://lh3.googleusercontent.com/-1ndYj4H2Bu0/V69OMIcEpxI/AAAAAAAAQk8/p6i1Nj5foDI/wlEmoticon-smile%25255B2%25255D.png?imgmax=800">). And Twitter, that is unpredictable and “<i>every new tweet is a song that maybe I like or not”. </i></font> <blockquote> <p><font size="4">3. <strong>Pocket</strong> <strong>recommendations</strong> – </font><a href="https://getpocket.com/"><font size="4">Pocket</font></a><font size="4"> is my favorite and most used app. I keep there everything I find interesting, in order to read it later, when I have time. Another cool Pocket feature is a recommendations feed that is created by different members of the Pocket community (the content that they recommend to others, and by Pocket itself using personalization mechanisms). The more you read the better recommendations Pocket will provide for you.</font> <p><font size="4">4. <strong>Software Lead Weekly</strong> – this is a weekly </font><a href="http://softwareleadweekly.com/"><font size="4">mailing list</font></a><font size="4"> created by </font><a href="https://www.linkedin.com/in/orenellenbogen"><font size="4">Oren Ellenbogen</font></a><font size="4">. It aggregates great articles and videos regarding tech, leadership, startups and engineering culture. </font> <p><font size="4">5. <strong>Books</strong>! Posts, articles, videos, tweets are great way to learn new things and be updated with what happens in the world. However, if you wish to master something and become a true expert you have to read books. A post by some expert can get you this far, but a whole book that is written by that same expert will teach you whole lot more. </font><a href="https://readthink.com/95-business-books-for-people-who-dream-big-36e63a563153#.52qis0rkm"><font size="4">This post</font></a><font size="4"> has a list of 95 books in various topics that are probably relevant to you. This is a great place to start building your library. </font></p></blockquote> <p><a href="https://lh3.googleusercontent.com/-4Nth55Jd0S4/V69OMlWzrYI/AAAAAAAAQlA/yFy93z8mFjc/s1600-h/P_20160813_192102%25255B4%25255D.jpg"><img title="P_20160813_192102" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="P_20160813_192102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDuYW0W_Ge1s_xlNY_SyU4IZH4qKjXuzL6eVbWsSeW7326Bd7hce7VwJSMe-n2RnkFSpUH5JG85ZagYuw6MzLc_qB2Po_2QY3ZY5cz9gT3eNCbvmIvzuSQ3HyByLnER1MEnGICc9uzTiI/?imgmax=800" width="947" height="554"></a></p> <p><font size="4">I think that you should have at least 2 sources (besides reading books):</font> <p><font size="4">(1) A blog roll that you have picked based on your interests (you can use any RSS reader, Feedly is my choice).</font> <p><font size="4">(2) “An unpredictable radio” – Twitter, Pocket, Medium and more in order to be exposed to new sources and things you didn’t know that exist. </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg78PYuRw3ZEX38dO2J4M_lJVuTmOqwmriMi3S__ib82sdxqK-IHQbebAxYhcrkZfq4cCUPI0Wppt6017TXVyTC0KKqTuxEHGor4PWNglm9KD_tAzP-cZtA0aP6S15U8sGF8syX5HUA5-U/s1600-h/clip_image0063.jpg"><font size="4"><a href="https://lh3.googleusercontent.com/-65_I-ngoMUQ/V7Dhf95SMGI/AAAAAAAAUn8/pRzTczePsuwHgpweFgRx_7idHlPCJQs8wCHM/s1600-h/clip_image0064"><img title="clip_image006" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image006" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs-BWAXoWiWO4J0fk2eG5x6mHJKHsyqV1BwfUgOnCNPtSj8I4HtO_uM1F28TQpaAdpgfOLHzWS_Ta8eU6vfQ7ADehf2G3iTITJvqbsXWB4SftZ18sv7YBgRNPKBWBjg7ctaC3B_RkEKWY/?imgmax=800" width="616" height="476"></a></font></a> <p><font size="4">Keep reading!</font> <p><font size="4"></font> <p><font size="4">As promised here is my blog roll:</font> <p><font size="4"><strong>.NET</strong></font> <blockquote> <p><font size="4">1. </font><a href="http://dailydotnettips.com/"><font size="4">http://dailydotnettips.com/</font></a><font size="4"> - Short posts of great tips in .NET and Visual Studio</font> <p><font size="4">2. </font><a href="https://visualstudiomagazine.com/Home.aspx"><font size="4">https://visualstudiomagazine.com/Home.aspx</font></a><font size="4"> - .NET news</font> <p><font size="4">3. </font><a href="https://shonnlyga.wordpress.com/"><font size="4">https://shonnlyga.wordpress.com/</font></a><font size="4"> - a friend of mine who writes about .NET related stuff</font> <p><font size="4">4. </font><a href="http://www.dotnetrocks.com/"><font size="4">http://www.dotnetrocks.com/</font></a><font size="4"> (podcast) - no need to listen to all of the episodes – pick the ones that you feel are relevant to you</font> <p><font size="4">5. </font><a href="https://codeblog.jonskeet.uk/"><font size="4">https://codeblog.jonskeet.uk/</font></a> <p><font size="4">6. </font><a href="https://ayende.com/blog/"><font size="4">https://ayende.com/blog/</font></a><font size="4"> - Oren Eini, one of the best developers in Israel (some say that in the world). He used to write about .NET low level stuff but now most of his posts are about RavenDB (his product - .NET based DB), Sometimes he shares some bugs that they had and more interesting stuff</font> <p><font size="4">7. </font><a href="https://visualstudiomagazine.com/rss-feeds/blogs.aspx"><font size="4">https://visualstudiomagazine.com/rss-feeds/blogs.aspx</font></a><font size="4"> - Visual studio blog posts</font> <p><font size="4">8. </font><a href="https://visualstudiomagazine.com/rss-feeds/news.aspx"><font size="4">https://visualstudiomagazine.com/rss-feeds/news.aspx</font></a><font size="4"> - Visual Studio news</font> <p><font size="4">9. </font><a href="https://blogs.msdn.microsoft.com/dotnet"><font size="4">https://blogs.msdn.microsoft.com/dotnet</font></a><font size="4"> . NET announcements </font> <p><font size="4">10. </font><a href="http://feedly.com/i/subscription/feed/http:/visualstudiomagazine.com/rss-feeds/features.aspx"><font size="4">http://visualstudiomagazine.com/rss-feeds/features.aspx</font></a><font size="4"> -new features in the NET world</font></p></blockquote> <p><font size="4"><strong>Architecture:</strong></font> <blockquote> <p><font size="4">1. </font><a href="https://lostechies.com/"><font size="4">https://lostechies.com/</font></a><font size="4"> a blog with several great writers: the creator of AutoMapper, CQRS and event Sourcing experts and more</font> <p><font size="4">2. </font><a href="http://martinfowler.com/"><font size="4">http://martinfowler.com/</font></a><font size="4"> - The one and only Martin Fowler.</font> <p><font size="4">3. </font><a href="http://www.aviransplace.com/"><font size="4">http://www.aviransplace.com/</font></a><font size="4"> - Head of WIX backend. He writes about software solutions, architecture and management</font> <p><font size="4">4. </font><a href="http://www.softwarearchiblog.com/"><font size="4">http://www.softwarearchiblog.com/</font></a><font size="4"> - The best Israeli Hebrew blog.</font> <p><font size="4">5. </font><a href="http://enterprisecraftsmanship.com/"><font size="4">http://enterprisecraftsmanship.com/</font></a></p></blockquote> <p><font size="4"><strong>UX:</strong></font> <blockquote> <p><font size="4">1. </font><a href="http://uxi.org.il/"><font size="4">http://uxi.org.il/</font></a></p></blockquote> <p><font size="4"><strong>Tech stuff:</strong></font> <blockquote> <p><font size="4">1. </font><a href="http://www.hanselman.com/blog/"><font size="4">http://www.hanselman.com/blog/</font></a><font size="4"> - Scott Hanselman’s blog</font> <p><font size="4">2. </font><a href="http://www.hanselminutes.com/"><font size="4">http://www.hanselminutes.com/</font></a><font size="4"> - Scott Hanselman’s podcast </font> <p><font size="4">3. </font><a href="https://thefutureorganization.com/"><font size="4">https://thefutureorganization.com/</font></a><font size="4"> - Hebrew Tech podcast. My favourite episodes are “Bumpers” – one hour of 2-3 minutes short discussion about variety of technology topics like frameworks, tools, announcements , posts and more </font> <p><font size="4">4. </font><a href="http://blog.house-of-code.com/"><font size="4">http://blog.house-of-code.com/</font></a><font size="4"> - Yossi Shmueli’s blog</font></p></blockquote> <p><font size="4"><strong>Culture</strong>:</font> <blockquote> <p><font size="4">1. </font><a href="http://blog.crisp.se/"><font size="4">http://blog.crisp.se/</font></a><font size="4"> - Used to work in Spotify and now in Lego!! Greatposts about agile, lean and culture</font> <p><font size="4">2. </font><a href="http://www.joelonsoftware.com/"><font size="4">http://www.joelonsoftware.com/</font></a><font size="4"> - Joel Spolsky the creator of Stack Overflow and Trello. Worth following him on Twitter.</font> <p><font size="4">3. </font><a href="http://blog.karmona.com/"><font size="4">http://blog.karmona.com/</font></a><font size="4"> - Moti Karmona’s blog</font> <p><font size="4">4. </font><a href="https://blog.8thlight.com/"><font size="4">https://blog.8thlight.com/</font></a><font size="4"> - culture and leadership – software oriented </font> <p><font size="4">5. </font><a href="http://www.mngttips.com/"><font size="4">http://www.mngttips.com/</font></a><font size="4"> - Hebrew podcast about management</font> <p><font size="4">6. </font><a href="http://shavua.net/"><font size="4">http://shavua.net/</font></a><font size="4"> - The BEST Hebrew podcast! It’s about startups. They interview the biggest Israeli CEO’s, CTO’s and enterpanures about their startups success or failure. </font> <p><font size="4">7. </font><a href="https://thefutureorganization.com/"><font size="4">https://thefutureorganization.com/</font></a><font size="4"> - Podcast regarding the culture in different organizations and startups </font> <p><font size="4">8. </font><a href="https://lnetanel.com/"><font size="4">https://lnetanel.com/</font></a><font size="4"> - Netanel Lev’s blog</font> <p><font size="4">9. </font><a href="https://lnetanel.com/"><font size="4">https://medium.com/@rabashani/</font></a><font size="4"> - Shani Raba’s blog</font> <p><font size="4">10. </font><a href="http://randsinrepose.com/"><font size="4">http://randsinrepose.com/</font></a> <p><font size="4">11. </font><a href="http://www.timeninjablog.com/"><font size="4">http://www.timeninjablog.com/</font></a><font size="4"> – time management tips</font></p> <p><font size="4">12. <a title="https://apakash.wordpress.com/" href="https://apakash.wordpress.com/">https://apakash.wordpress.com/</a> Alon Pakash’s blog</font></p></blockquote> <p><font size="4"><strong>Web:</strong></font> <blockquote> <p><font size="4">1. </font><a href="https://fivejs.codeschool.com/"><font size="4">https://fivejs.codeschool.com/</font></a><font size="4"> - 10 minutes podcast episodes about the latest libraries and feature in JS. </font> <p><font size="4">2. </font><a href="https://internet-israel.com/"><font size="4">https://internet-israel.com/</font></a><font size="4"> - Hebrew blog </font></p></blockquote> <p><font size="4"><strong>Tech companies blogs:</strong></font> <blockquote> <p><font size="4">1. </font><a href="http://blog.wix.engineering/"><font size="4">http://blog.wix.engineering/</font></a><font size="4"> - Wix blog</font> <p><font size="4">2. </font><a href="https://code.facebook.com/"><font size="4">https://code.facebook.com/</font></a><font size="4"> - Facebook blog - Priceless!!!!</font> <p><font size="4">3. </font><a href="https://labs.spotify.com/"><font size="4">https://labs.spotify.com/</font></a><font size="4"> - Spotify</font> <p><font size="4">4. </font><a href="http://nerds.airbnb.com/"><font size="4">http://nerds.airbnb.com/</font></a><font size="4"> - Airbnb</font> <p><font size="4">5. </font><a href="https://baremetrics.com/"><font size="4">https://baremetrics.com/</font></a> <p><font size="4">6. </font><a href="https://blog.twitter.com/"><font size="4">https://blog.twitter.com/</font></a><font size="4"> - Twitter</font> <p><font size="4">7. </font><a href="http://githubengineering.com/"><font size="4">http://githubengineering.com/</font></a><font size="4"> - Github</font> <p><font size="4">8. </font><a href="http://engineering.instagram.com/"><font size="4">http://engineering.instagram.com/</font></a><font size="4"> - Instagram </font> <p><font size="4">9. </font><a href="https://engineering.pinterest.com/blog/rss"><font size="4">https://engineering.pinterest.com/blog/rss</font></a><font size="4"> - Pinterest </font> <p><font size="4">10. </font><a href="http://techblog.netflix.com/"><font size="4">http://techblog.netflix.com/</font></a><font size="4"> - Netflix</font></p></blockquote> <p><font size="4"></font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com4tag:blogger.com,1999:blog-7296668432246169944.post-49487840704539966702016-08-02T18:58:00.001+03:002016-11-25T12:10:38.683+02:00The Project of Your Life<p><font size="4">By settings personal goals we improve ourselves and become better. I use Lean and Scrum principles for creating and tracking my personal goals.</font> <p><font size="4">Keep reading and see how it works.</font> <p><font size="4"></font> <p><font size="4">When working on some project we set milestones, long term goals, short term goals and KPIs. </font> <p><font size="4">We track progress and learn from our work by having retrospective meetings and checkpoints along the way. </font> <p><font size="4">Now imagine you have a very large project ahead of you and <b>you don’t plan at all</b>. You just float and react to the different events along the way. Do you think you can make it right? On time? On budget? The answer, like always, is “it depends”. However, it’s more likely that you won’t. </font> <p><font size="4">In order to succeed, we <b>need to manage our life</b> and <u>not</u> be managed by it. You need to manage it exactly like you would manage that project.</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb_wWvzteYTMNq1CmWis2QV0Lx9cNbmylp0UEE5sxHp1g7woEYHXQCS0hbIDt2JuhWa2oP1SySK0CbHDnubdoicy-RzlgwNif1k3dbG5mNDxMw26tvNj_6zDYcPdGnk2aOd007odDsIqU/s1600-h/multitasking9.jpg"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4DPN-7DolXqTUmKIPJjLfOOBkOshFEwHmThwg_D9h0UFUEyRMVMmwj-_BXWtGrxkMcC9a5k7mntXcQQuqj4ACOxP6C40vO3WkIJ1OcBb9Bm2nzaMQyUDOo6wOYrAHs1rbMNM7zfq9nBU/s1600-h/multitasking10"><img title="multitasking" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="multitasking" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Tjeqfq-U5SLn7FPhAkHcImd7ReXLzWb_8zIJiAvROvNmh3R448b-mtkXYHAqnJPzNsZXCK5qc_zJ1tDBRI0UX2q0lopYsx8ncARL4rzNCMGr_dh5wrrhkZkLHdYdKuC9U6tpBCo_Bpg/?imgmax=800" width="759" height="539"></a></font></a> <p><b><i><font size="4">Your life is a project and you are its developer, designer and product manager</font></i></b> <p><font size="4">How many times did you say to yourself that you need to be better in this and that you should learn that? How many of those goals have you actually accomplished? </font> <p><font size="4">The first step is to define what you want. I personally like this <a href="http://www.careerealism.com/mid-year-review-questions/">article</a>. It makes me think about my strengths, weaknesses and just the things I want to know. I have a dedicated time every six months when I go over these questions and create my <b>long term goals</b>. These goals are the things I want to accomplish in order to be successful and better than I am today. I keep them in my </font><a href="https://keep.google.com/"><font size="4">Google Keep</font></a><font size="4"> notes. </font> <p><font size="4">*These are my personal goals:</font> <p><a href="https://lh3.googleusercontent.com/-X4XVWGxLyZY/V6DC1VH8GAI/AAAAAAAAPaI/0nD7IfY6fLM/s1600-h/1%25255B3%25255D.png"><img title="1" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbP9ZOOQB_2gx5kEMc0kAtFBIzp6Bzf4K1sByRNz8hobWGvMW3sxuONUwHccmo2PyVkOoHfC2mGyIUYkRDwZCejVJb_zn2SlMHkvV2BYquj4ggBD_ejo71b-T6MJWOxOE8mOQcC0JpgI8/?imgmax=800" width="585" height="435"></a> <p><font size="4">Every personal (and not just personal) goal should be </font><a href="http://topachievement.com/smart.html"><font size="4">well defined</font></a><font size="4"> (SMART goal). </font> <p><font size="4"><b>S</b>pecific – Your goal definition should answer these questions: Who is involved? What do I want to accomplish? When? <br><b>M</b>easurable – How can you measure progress and know if you are done?<br><b>A</b>ttainable – How can this goal come true?<br><b>R</b>ealistic – Be honest with yourself. Don’t define unreachable goals.<br><b>T</b>imely – Provide a time frame. Then, creating 6 month goals, you are ready to do it.</font> <p><b><font color="#4f81bd" size="5">Breaking Down Long-term Goals to Short-term Goals</font></b> <p><font size="4">Defining long term goals is the first step in improving. Setting a goal is better than setting no goals at all. <b><i>Writing it down is a commitment to yourself</i></b><i>.</i></font> <p><font size="4">In order to accomplish a long-term goal, which is usually a big goal (I want to master JavaScript, etc.), we need to break it down to smaller pieces – smaller goals (milestones) that we’ll accomplish along the way. Those goals should also be SMART goals. I have a recurring monthly time when I go over my long-term goals and decide what I want to do this month in order to get closer to accomplishing the whole goal. Like in Lean development, I constantly adopt and change my goals according to the situation (Perhaps there is no reason why I should learn JavaScript anymore?).</font> <p><font size="4">The monthly short-term goals don’t always have to correlate to the long-term goals. Perhaps I want to take care of something in my job or maybe learn something that is not part of my long-term goals and is important for the following month. To be honest, it doesn’t really matter. As long as you take time to think about it, take a decision and commit to it by writing it down you will improve and be better. That is the whole point.</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEqnsd4ytzhEdifapImwNYa0siWgb8c2aRXO7XoS9vQXFJ8dgb_MNIKp4G7JPvm9K-bdwDv-q0lnXQKEIxvYoK3XEpsRFgHh_p5AcCfE453QyDqru6P-Ri9dbmswBwTBh471k3XCllMEA/s1600-h/2%25255B3%25255D.png"><img title="2" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2" src="https://lh3.googleusercontent.com/-ei-09t_55VE/V6DC61BzknI/AAAAAAAAPaU/66_q6InTHUc/2_thumb%25255B1%25255D.png?imgmax=800" width="612" height="343"></a> <p><font size="4">If you have never tried to “manage” your life and set goals for yourself, then I suggest you start with monthly goals. Think about the month ahead of you and try to define how this month will become a successful one. </font> <p><font size="4">If you have set personal goals before, then I suggest you take it further.</font> <p><font size="4">A month is a lot of time – four whole weeks! Usually when we have so much time ahead of us, we won’t start any task until the very end-and that is only if someone reminds us about it in the first place. That’s called <i>the </i></font><a href="https://en.wikipedia.org/wiki/Student_syndrome"><i><font size="4">student syndrome</font></i></a><font size="4">.</font> <p><b><font color="#4f81bd" size="5">Weekly and Daily goals</font></b> <p><font size="4">Scrum uses sprints in order to prevent the student syndrome. I like to look on my weeks as sprints. Every week has a </font><a href="http://www.scrum-institute.org/Sprint_Planning_Meeting.php"><font size="4">sprint planning</font></a><font size="4"> and a </font><a href="https://www.mountaingoatsoftware.com/agile/scrum/sprint-retrospective"><font size="4">retro</font></a><font size="4">. I go over the previous week’s calendar and see how it went. I try to find the things I need to be better in and the things I need to preserve and keep doing. This way I can improve and track my progress <b>weekly</b>. At the beginning of the week I have a dedicated time for planning my weekly goals which are subsets of my monthly goals, and the tasks I need to accomplish this week regardless of any long-/short-term goal.</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3W4JGulz0VjzsCZgifsK6PtjPPeV-IETI-ynB-Ow-hfN6LhGskBtS6IrrOvCksbjMwxh5G8_yeM2dhceTgbCYMNHL0mEAMuQ9b15bUKQWw9o6E97XRbHFCxyhWa-xoR_ceiNX3OleJ9g/s1600-h/3%25255B3%25255D.png"><img title="3" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="3" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTbhRF8yJQ6vIwtdpgSfuye0Lg4el75YdEexXkq3mf5ygIHIy4EmCCdkZmwYbRqsMGVLeGugHrlZpTSZgEKUOMu3o89fDaqwhraBX4Z04USV7XX2LmuFwsw8RJotmsGB_dT0nC7P0Oj_s/?imgmax=800" width="602" height="318"></a> <p><font size="4">During the week I have a “</font><a href="https://www.mountaingoatsoftware.com/agile/scrum/daily-scrum"><font size="4">daily standup meeting</font></a><font size="4">” (although I do it on the train on my way to work) using </font><a href="https://www.any.do/"><font size="4">Any.DO</font></a><font size="4">. This has a very cool feature that at 08:00 makes me go over my daily tasks and decide when I want to do them (sometime today or later this week).</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUBdH7EWDGWxngNoOPyhcTmlFuC1QYfK_ggJMRpIPC8RxYh5gc832hCo066fdP0wMc7mC6BjZyPwhD0hoRFWjGhJgDWRiCHxE1mvdr-i80o3enSzmBLMdyHoYq0rUKh4Gl7aUvTmsQrLw/s1600-h/4%25255B3%25255D.jpg"><img title="4" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="4" src="https://lh3.googleusercontent.com/-O6W3uFsujSA/V6DEDeJc4KI/AAAAAAAAPbM/efF5TI0EnRI/4_thumb%25255B1%25255D.jpg?imgmax=800" width="377" height="212"></a> <p><a href="https://lh3.googleusercontent.com/-EBoVftLygYU/V6DEFryDYFI/AAAAAAAAPbQ/5chujqMsDS4/s1600-h/5%25255B3%25255D.png"><img title="5" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="5" src="https://lh3.googleusercontent.com/-jD3l33jbbf0/V6DEHXCFf5I/AAAAAAAAPbU/9awxVtsboJ0/5_thumb%25255B1%25255D.png?imgmax=800" width="378" height="225"></a> <p><font size="4">It is simply a to-do list that reminds me of the tasks I need to accomplish every day.</font> <p><font size="4">Every week ends with a retro. I go over my previous week and write down important notes, facts and decisions. I write them in </font><a href="https://penzu.com/"><font size="4">Penzu</font></a><font size="4">, which is basically a diary with a very cool feature –every week it sends me the note I wrote a year ago. This way, I’m constantly being reminded of my decisions (you need to use it for a year in order for it to be effective - don’t give up!).</font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCcqk9qfNS3UZgYQ8RXO41XtnIvl8-OjiUw4d0hzWUi5GcLOl1iruhqARjvgjh2aw4R9SJL09osRNyVJHmdkwLb_NSL7axDhMuY5StLXzqIcHB7JHeACDGWsoDn5zPvkoaCQSKZ6fNXKk/s1600-h/6%25255B3%25255D.png"><img title="6" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="6" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe0DX_6nsMUQqs3lgNeXzun1ul9YLU-edO1X308jDk7xhgQaSZP0f00G_Uf9da0pwZyHtj22LChWtZYY3iUUCyU1oBrzIpe2FF5H1HdbC8vZntAry6nyT2pSu_vYt2dNAnTX1COh7tV5M/?imgmax=800" width="482" height="444"></a> <p><b><font color="#4f81bd" size="5">Summary</font></b> <p><font size="4">If you want to improve, you need to set personal goals.</font> <p><font size="4">The goals should be both long- and short-term.</font> <p><font size="4">Track both of them in Google Keep.</font> <p><font size="4">Every week, set yourself weekly goals and have e retro for the previous week. Write it down in Penzu and be reminded of it afterwards.</font> <p><font size="4">Have a daily meeting using Any.Do. </font> <p><font size="4"></font> <p><font size="4"></font> <p><font size="4">This works for me, perhaps it can also work for you.</font> <p><font size="4">Or maybe I’m just crazy <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="https://lh3.googleusercontent.com/-7aiTW2VAzdA/V6DDGhFIkqI/AAAAAAAAPaw/nSnAeyEegdc/wlEmoticon-smile%25255B2%25255D.png?imgmax=800"></font> <p><font size="4"></font> <p><font size="4">Acknowledgments:</font> <p><font size="4">Netanel Lev and Shani Raba for reviewing the post.</font> <p><font size="4"></font></p> <p><font size="4"></font></p> <p><font size="4"></font></p> <p><font size="4"></font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com8tag:blogger.com,1999:blog-7296668432246169944.post-48857796391820527572016-07-18T10:07:00.001+03:002017-07-20T14:28:25.708+03:00Estimations in Agile development – Epics, User Stories and Tasks<span style="font-size: medium;">Agile, scrum, Kanban and Lean are no longer “new” methods for software development. There are hundreds of articles, books and courses about them. However, most of them include introduction material that mainly focuses on the basics. If you actually start using one of these methodologies you’ll quickly ask yourself with a missing – <b>how are you supposed to estimate your work?</b> </span> <br />
<span style="font-size: medium;">If you search the web you will see that there is not much data about estimations, simply because it is HARD. It is <b>very hard</b> to estimate correctly. Jeff bezos used to say <i>“If you are planning for more than twenty minutes ahead in this kind of environment, you are wasting your time”</i>. We cannot predict the future, but we can maximize our chances in getting as close as possible to it. </span> <br />
<span style="font-size: medium;">After reading several agile books (e.g. </span><a href="http://www.shopyourway.com/agile-estimating-and-planning-paperback/1237095"><span style="font-size: medium;">Agile Estimating and Planning</span></a><span style="font-size: medium;"> by Mike Cohn), scrum courses and 6 years of practicing Scrum and Kanban in various projects I’ll try to add that missing piece called <b>estimations in Agile development.</b> </span> <br />
<span style="font-size: medium;">This is the first of 4 posts in the “Agile Estimations” series. </span> <br />
<ol>
<li><span style="font-size: medium;">Epics, User Stories and Tasks (<b>you are here</b>) </span> </li>
<li><span style="font-size: medium;"><u><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-estimating-the-backlog-with-story-points-358d12b566d1" target="_blank">Estimating User Stories with Story Points</a></u><u> </u></span> </li>
<li><u><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-sprint-planning-methods-capacity-vs-velocity-vs-feature-a5b4bb1a159e" target="_blank">Sprint Planning Methods: Capacity vs. Velocity vs. Feature</a></u> </li>
<li><a href="https://medium.com/dennis-nerush/estimations-in-agile-development-improving-estimations-using-burndown-burnup-and-c2f6fff37ff3" target="_blank">Improving Estimations using Burndown, Burnup and Actual time metrics</a></li>
</ol>
<span style="font-size: medium;">This series is not an introduction to Scrum. Before you keep reading, you should be familiar with the </span><a href="http://agilemanifesto.org/"><span style="font-size: medium;">agile manifesto</span></a><span style="font-size: medium;"> and Scrum in general. There is no “right” way to do Agile. You should change it so that it fits your needs. However, it is very important to understand the root principles and evolve from them. </span> <br />
<span style="font-size: large;"><b><span style="color: #4f81bd;">Making the series practical</span></b> </span> <br />
<span style="font-size: medium;">In order for this entire series to be practical and not just theoretical we’ll apply the content on a Youtube like application that I’m building right now. It should allow users to upload and watch videos. It should allow users to edit their videos details and rate others videos. It should have search, tags and filters (top seen, recently added and more). It also should recommend different users videos that matches their interests. </span> <br />
<span style="font-size: large;"><b><span style="color: #4f81bd;">Let’s start</span></b> </span> <br />
<span style="font-size: medium;">Before we jump to the different approaches regarding estimations let’s first understand what is it that we need to estimate. A project’s specification evolves with time. It starts with large and unknown features requests and eventually transforms to some tiny and technical tasks. In this post we’ll understand how this transformation does happen and why. </span> <br />
<span style="color: #4f81bd;"><span style="font-size: large;"><b>It is not just User Stories</b> </span></span> <br />
<span style="font-size: medium;">Everybody knows that in Scrum and most of the other agile methodologies you must have a board and some sticky notes on it. </span> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0CwOPq6BTzQUhIZDYVNftjBNpFXcvyCfPwkEUThJy_M_NX2xyh1YYAMe6DRnZSN5HJdSJJd_hmirLdVtY2G6lqBfOONpYFHIigdEwqgaeRhekt3FxZKkLaCxsGOYmZFfYYnLqIaNa9ek/s1600-h/clip_image0023"><span style="font-size: large;"></span></a><span style="font-size: large;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimPX2NCzdKyMX1uNSqLaQ4Mz3keDyc2uNZOzf6fLzIsLCimqChuXLsEV6_wW-yUTsObJ3HiSgu6HPp5gMLeoWJ_AAiDXFtQuEiVx8v6rYWZHcsg3Qfm3WqRgC8hAW8SQfML4_MT-IGMXY/s1600-h/clip_image0024"><img alt="clip_image002" border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIcqsLwD9OoH1jMEtgZ7CefSsrZTRD5fqSA5qeceUrgxulTJPR1s-TcnzuLKn4KfWdWaoWTr2mwsZ1ESQuZScIJ_WUmahHsvvqvXgLmUV_uLXGVI_pS4u-bXxp_SiL8k67zwRwZYKCVrY/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="433" /></a></span><span style="font-size: large;"> </span> <br />
<span style="font-size: large;"><span style="font-size: medium;"><span style="font-size: small;">*Maybe your board is not a <u>physical</u> board but it is still <b>a</b> <u>board</u>. With notes</span>.</span> </span> <br />
<span style="font-size: medium;">What are those notes? They are the actual work that is currently being done. The actual <b>tasks</b> that the team is working on in order to accomplish some <b>user stories</b>. User stories represent the user’s need. A feature that should be added to the application that will gain the user value. The tasks are the <b>technical</b> representation of that need. </span> <br />
<span style="font-size: large;"><span style="font-size: medium;">A user story represents a feature. However sometimes that feature doesn’t stand on its own or it is part of some bigger feature or a business concept that incorporates several features. That is called an <b>Epic</b>.</span> </span> <br />
<span style="font-size: large;"><b><span style="color: #4f81bd;">Epic</span></b><b></b> </span> <br />
<span style="font-size: medium;">An epic is the biggest representation of a feature. In order to deliver an epic to the user we must divide the epic to smaller pieces – user stories. </span> <br />
<span style="font-size: medium;">*In the Agile books epic is not divided directly to user stories it first divides to something that is called “<b>Themes</b>” and only they are divided to “User Stories”. However in the last 6 years I have never seen any team that uses Themes therefore we’ll not use them either. </span> <br />
<span style="font-size: medium;">In our application we have three epics: </span> <br />
<ol>
<li><span style="font-size: medium;">Allow users to find, play and comment on videos </span> </li>
<li><span style="font-size: medium;">Allow users to upload and edit content </span> </li>
<li><span style="font-size: medium;">Recommend videos to users based on their interests </span></li>
</ol>
<span style="font-size: medium;">This is our current <b>product</b> <b>backlog</b>. A backlog is basically a list of features that represents all the user’s needs and wishes. The backlog has two main principles that we should always apply: </span> <br />
<span style="font-size: medium;">1. The backlog must always be prioritized from high to low according to the user’s needs. </span> <br />
<span style="font-size: medium;">2. Every backlog item must have a “<b>DoD</b>” – <b>D</b>efinition<b> o</b>f <b>D</b>one that defines when the feature is actually complete. Sometimes it is called “Acceptance criteria”. It doesn’t replace the full description of the feature or its design. It is only a single sentence (maybe a couple) that describes how the feature will behave in the end. </span> <br />
<span style="font-size: large;"><span style="font-size: medium;">Our backlog is already prioritized so let’s add DoD to the epics.</span> </span> <br />
<a href="https://lh3.googleusercontent.com/-zxXrEk3tmJI/V4yACAidZ3I/AAAAAAAAPU4/mZSlEmHnTOc/s1600-h/1%25255B7%25255D.png"><img alt="1" border="0" height="175" src="https://lh3.googleusercontent.com/--Zf114t0dRU/V4yACqVSYzI/AAAAAAAAPU8/DUvVW4YWDcM/1_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="446" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDp-K046p3wkilfelO0kf81omo1m8Oc3w5fZ9bIPokxysLYMeY0NaYVwVM346vTjF2VUzkzIXTz8dOllQfu3jUMq0XYfISITNpwpSmFX2lMkgNUxtIv9S8Ze2q7S4SwCxRLOKhUiqf3_I/s1600-h/2%25255B7%25255D.png"><img alt="2" border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjOlpbHKoQVTcocnJSqF36TwqiC6bEyBxuArANCWW6VbXrybBJdqI6dxLCY9qJoufgjNldXUmgnCKZ8qlTImeVj0T1EKNsUJFRcQZGXlMHP8dHtwKp-CPi1L6M5ZbGCqK1oYaWmnjYksw/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2" width="450" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi06G6nAP7oHR5ZuLB8N7PNYxfgDI0uWKSoDgWBVl8I2A9onstES6bKnIM8djSPZNlI3Z8uPP0CaAbgpwb4_1cgxN35qpRsBrAfufiot-RpLNO1V-UZ6SpHMFhZnMfwe4Z3bN62pAQ6u6g/s1600-h/3%25255B7%25255D.png"><img alt="3" border="0" height="189" src="https://lh3.googleusercontent.com/-aCk789tCO5k/V4yADyFhqJI/AAAAAAAAPVM/z5-lViAGnXY/3_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="3" width="453" /></a><br />
<span style="font-size: medium;">*there are many agile management tools out there. You don’t have to use them, a physical board and sticky notes can be enough. However, when working on big project a dedicated virtual tool might be really useful. I personally recommend on </span><a href="https://www.visualstudio.com/en-us/products/what-is-visual-studio-online-vs.aspx"><span style="font-size: medium;">Visual Studio Team Services</span></a><span style="font-size: large;"><span style="font-size: medium;">.</span> </span> <br />
<span style="font-size: medium;">Remember that the epics should <b>not</b> include any technical or implementation details. They should only describe the business value. A more detailed description will be found inside the epic’s user stories. </span> <br />
<span style="font-size: medium;">By prioritizing the backlog we know what is the most important feature that the user needs, hence it will be developed first. After we’ll finish it we’ll move to the next one in the list. This way we always deliver the user what he wants the most. </span> <br />
<span style="font-size: medium;">I think that this is one of the best concepts in Agile development that is so different from the traditional ones. This way we can deliver small and valuable features to the user and receive feedback along the way. </span> <br />
<span style="color: #4f81bd;"><span style="font-size: large;"><b>Breaking Epics into User Stories</b> </span></span> <br />
<span style="font-size: medium;">So the first epic is “<i>Allow users to find and play videos</i>”. In order to get a better understanding of what it really means we should divide it to smaller pieces – user stories. Every user story should match the following template: “<i>As X I need/want Y to do/so that Z</i>”.<i> As <b>a logged in user</b> I want to <b>update the details of my videos </b>so that <b>they be correct.</b></i><b></b> </span> <br />
<span style="font-size: medium;">It is extremely helpful when a user story has at least X and Y defined since it clearly expresses the main role of the feature (As a <u>logged in</u> user) and by so the relevant business stakeholders of this feature. </span> <br />
<span style="font-size: medium;">Will we fail if we won’t name our user stories like that? Of course not. </span> <br />
<span style="font-size: medium;">Do all the user stories need X Y and Z defined? Definitely not. However doing so makes you truly understand the scope and value of the feature. </span> <br />
<b><span style="font-size: large;"><span style="font-size: medium;">Epic: <i>Allow users to find, play and comment on videos</i></span> </span></b> <br />
<a href="https://lh3.googleusercontent.com/-bnmRZ4Kt2FM/V4yAETIoTFI/AAAAAAAAPVQ/y4vEGyVV0IU/s1600-h/1%25255B3%25255D.png"><img alt="1" border="0" height="172" src="https://lh3.googleusercontent.com/-aPv0ZwotCk4/V4yAEvQqwnI/AAAAAAAAPVU/223MXl9ft5o/1_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="442" /></a> <br />
<a href="https://lh3.googleusercontent.com/-nZXimBGFrNU/V4yAFP_AjkI/AAAAAAAAPVY/5XasFomiV70/s1600-h/2%25255B3%25255D.png"><img alt="2" border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN8R3OdRmciZXfXxwPqnVop3T4hlDFHg-BTmLiRpYUefVaQo9BiDjHpH57uyj1VqHGtsxQ23kmWV23SpJdNjuOYjEuW20HpU1Nyxv6ZttmyvdeQveI0RzaSQtuPHWELJ_zO-6ZkNSgZbQ/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2" width="443" /></a> <br />
<a href="https://lh3.googleusercontent.com/-vwcpB6W-2cY/V4yAFyLaslI/AAAAAAAAPVg/ll_ZgeTbkHc/s1600-h/3%25255B3%25255D.png"><img alt="3" border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXG3J2CibBxNluakHR_K37dW026cHY1WFyqQ_qAZB2Ii0gm_5DpKsyMyWpNkjvyEn01GssJevDloMBFW1Twp63sO1csGRSalupstP_j13hpd_Eif1HtpJp1iUBbrey1_i_ErV4Z2UZaME/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="3" width="446" /></a> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimPafYdKf243nAYBamTG7fSY9ZYvlbwuc0HuD1jWzBXVmjSN326jgOXktbzjnPV9_6QjXgh9Suqsr3_Rjyg3zfkE6l3OfQ9effInq9f75vfKtgHtdxLqvhu61r0Brmygxwryl-OsLOA9c/s1600-h/4%25255B3%25255D.png"><img alt="4" border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjZzIzX35yf-Bv-rk18kEBTTTY0R0EgEhyvkH5Byg-kZrYKjwQxwQfcQSC691lTR7ADIuwD8UE-dKOAgQIzKFqlpAEo2KCTNXTgxhgbiJpM9PQwjg5c9L7eoLIb1S5w5nbmBZsaj8oQTg/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="4" width="444" /></a> <br />
<span style="font-size: medium;">Few things to note: </span> <br />
<ul>
<li><span style="font-size: medium;">The DoD adds meaningful information for the implementation of the feature. </span> </li>
<li><span style="font-size: medium;">The use of <i>user</i> and <i>logged in user</i> for separating the action of an anonymous user and a logged in one. </span> </li>
<li><span style="font-size: medium;">The priorities of the user stories determine what the most important feature to the user is and which one is the least. </span> </li>
<li><span style="font-size: medium;">Every user story gives actual value to the user and brings us closer to the <b>epic’s </b>DoD. </span></li>
</ul>
<span style="font-size: medium;">Now we can split the top user story to its technical parts – the tasks. </span> <br />
<b><span style="font-size: large;">User story: <i>As a user I want to play videos from a list of videos</i> </span></b> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihYC8tdHvA8RSji06zwNdq4My6L68jrPCu0WH2Ph93UC4_8p3xkAnUYBlrzSGG20eOzLK-sybzmJ8QyijbqCnyNIi2Y6dcr1Rv94I5AEN0USuFhnbERMQk243f2LosXhoHQ-cBVibC31A/s1600-h/1%25255B16%25255D.png"><img alt="1" border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis3aUCkQPV5gEPVqU9ivg7FUva_VOKMxrcG1boRa1_3mA9geoA_Dv1A1TVKwGM-rqoOBVpK4G0d-okqovyla3M-agGrLMc6s-sy7tY85TQB_fWP5jv3X0UthPJjvgxb_xvlU-_NUqXi8U/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="430" /></a> <br />
<a href="https://lh3.googleusercontent.com/-nHGgOWFQjG8/V4yAHyFXOqI/AAAAAAAAPV4/Bw2JiC2vcd8/s1600-h/1%25255B17%25255D.png"><img alt="1" border="0" height="169" src="https://lh3.googleusercontent.com/-9q_wqRDe_6I/V4yAIS8VI3I/AAAAAAAAPV8/VPlgGjRlqIY/1_thumb%25255B9%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="434" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3I19Jvw3zNZdISvhyVPMjWtRl-olqXe-Sd8x2Qdzxsv31D91hCBhOPnT_DwvL0Jd9v1ri39p22ELU-wyYK5LTSwk8rvmuTwVDkoCIyxJwd8BZYPRnnROocmsM_vKnvPeaCKSMhnpoRu8/s1600-h/3%25255B14%25255D.png"><img alt="3" border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif6RqWbZUp3rZ445OhyphenhyphendQEEYci-i0jd6-mgr_lRHe4253vr_aapKipN-XxL5_N5gqk2R1wTpC-6gQNOGiBMNtLFTDj_Mpcw8MMNQSSDVyLZjjXDcxIWYxDJCj4mvV5WBXBuck5XTog3PY/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="3" width="434" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3VaetTJAHJ5lQ2sMXq4V9zU3aomIVV5FLlvUuUIydyOqkUJUWxNk7m3BU_bx_chJLHqkbERcbKEIEHWJmhgzcQgb4Bv767Sq8K_-7O5CdBOt9O8qku-pZ4b0DIimzVdSCk6WO6-mMvsw/s1600-h/4%25255B8%25255D.png"><img alt="4" border="0" height="174" src="https://lh3.googleusercontent.com/-bH2-CN9YtsM/V4yAKlMto1I/AAAAAAAAPWM/RTTngrFJ2pc/4_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="4" width="433" /></a><br />
<span style="font-size: large;"><b>The complete backlog:</b> </span> <br />
<a href="https://lh3.googleusercontent.com/-xg-6JJ0PTsg/V4yALPZUNBI/AAAAAAAAPWQ/Bf5S9w0LDwc/s1600-h/5%25255B3%25255D.png"><img alt="5" border="0" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDeA9tg91p6VTVavgUvpraYvXIiuqSMzNdJouSslIC-bbE4zzH9PO47HnF1MBfiTGbXWCyoFVrKcI-Qybrrb1FGGd-l3eEzPAnRosL88dl27Sg7cNl-n2GL2_ll_vIFv-CJ3tjQIgcxRo/?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="5" width="503" /></a> <br />
<span style="font-size: medium;">So now after we are familiar with all the product backlog items it is time to give them estimations. </span> <br />
<span style="font-size: medium;">But how do we estimate? </span> <br />
<span style="font-size: medium;">What estimation units should we use? </span> <br />
<span style="font-size: medium;">What are story points? </span> <br />
<span style="font-size: medium;">Do we have the same estimation units to all the backlog items? </span> <br />
<span style="font-size: medium;"> </span> <br />
<span style="font-size: medium;">All the answers and much more are in the next post. </span> <br />
<span style="font-size: medium;"> </span> <br />
<span style="font-size: medium;">Estimations in Agile development – Epics, User Stories and Tasks (you are here) </span> <br />
<span style="font-size: medium;"><a href="http://dennis-nerush.blogspot.co.il/2016/09/estimations-in-agile-development.html"><u>Estimations in Agile development – Estimating User Stories with Story Points</u></a></span><u> <strong>(go here)</strong></u> <br />
<a href="http://dennis-nerush.blogspot.co.il/2016/10/estimations-in-agile-development-sprint.html"><u>Estimations in Agile development – Sprint Planning Methods: Capacity vs. Velocity vs. Feature</u></a><u> </u> <br />
Estimations in Agile development - Improving Estimations using Burndown, Burnup and Actual time metrics <br />
<span style="font-size: large;"></span> <br />
<span style="font-size: large;"></span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com7tag:blogger.com,1999:blog-7296668432246169944.post-80360135530649461142016-04-29T00:02:00.001+03:002016-06-12T14:34:04.323+03:00Should we use MVC for modern web applications?<p><img style="float: none; margin-left: auto; display: block; margin-right: auto" alt="" src="http://www.yucatanpremier.com.mx/media/img/comprar%20o%20rentar%20en%20merida_el%20dilema%20eterno%202.jpg" width="829" height="303"><font face="Calibri"><font size="4"></font></font></p> <p><font face="Calibri"><font size="4">MVC is one of the most commonly used design patterns in web applications. It can be used both with server and client side rendering. Frameworks like ASP.NET MVC and Angular adopted the pattern and made the development extremely easy and straight-forward.</font> </font></p> <p><font face="Calibri"><font size="4">Despite its popularity, I claim that the MVC <b>pattern is no longer the best solution</b> for creating <b>rich</b> and <b>modern </b>web applications.</font> </font> <p><font face="Calibri"> </font> <p><font face="Calibri"><b><font color="#4f81bd" size="5">MVC – the good parts</font></b> </font> <p><font face="Calibri"><font size="4"><b>S</b>ingle <b>P</b>age <b>A</b>pplications rule the web with different client side rendering frameworks like Angular, Backbone, React and many more. These frameworks made JavaScript development easier-and by doing so made the client “smarter” and the server “dumber” by mostly being responsible for communicating with the client and data persistence. Most of the applications’ logic moved to the client side.</font> </font> <p><font face="Calibri"><font size="4">In order to support this transition the MVC pattern has moved to the client by creating controllers that manipulate data (the model) that is presented in the views. This makes a lot of sense, as opposed to using just jQuery for some simple DOM manipulation and handling all the heavy lifting in the server.</font> </font> <p><font face="Calibri"><font size="4">So instead of rendering the view in the server for each request, now it’s extremely easy to render it in the client and give the users a faster and cleaner experience.</font></font> <p><font face="Calibri"><font size="4">“Magic tricks” like two-way binding allow applications to respond quickly to different events and change the appearance of the app accordingly.</font> </font> <p><font size="4" face="Calibri">Let’s have a look at the </font><a href="https://docs.angularjs.org/guide"><font size="4" face="Calibri">Angular docs</font></a><font size="4" face="Calibri"> website. We can easily navigate through the different sections in the website while avoiding a trip to the server for rendering the next page.</font></p> <p><iframe height="315" src="https://www.youtube.com/embed/Y59PthCkq7s" frameborder="0" width="560" allowfullscreen></iframe></p> <p><font face="Calibri"><font size="4">That is a classic MVC case. It works great for the “simple” apps where most of the page content is static and the user’s changes don’t affect different parts of the page.</font> </font> <p><font face="Calibri"> </font> <p><font face="Calibri"><b><font color="#4f81bd" size="5">However, this is not what rich modern applications look like.</font></b></font> <p><font face="Calibri"><font size="4">Let’s look at this example. What happens when we increase a product’s quantity?</font> </font></p><iframe height="315" src="https://www.youtube.com/embed/6KofhDUJprk" frameborder="0" width="560" allowfullscreen></iframe> <p><font face="Calibri"></font> </p> <p><font size="4"><font face="Calibri"><b>Four</b> different parts of the page change (the header counter, the notification, the quantity of the product and the cart title).</font></font> <p><font size="4" face="Calibri"></font> <p><font color="#4f81bd" size="5" face="Calibri"><strong>Let’s try to implement it using Angular</strong></font> <p><font size="4" face="Calibri">Obviously I won’t build the entire app in a single view or use a single controller. That’s the worst practice, since it will break the <a href="https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design">SOLID</a> principles of development by creating a giant controller that is responsible for EVERYTHING. This will become difficult to maintain over time. </font> <p><font face="Calibri"><font size="4">I want my code to be highly reusable and simple to use, which I can achieve with <b>components. </b>Angular provides me with directives and, since Angular 1.5, it also provides components. I will create a controller, a directive and a template (view) for each of the following elements: the header, the notification and the quantity counter. In order to notify the other components that a product was added to cart, I can do 2 things:</font> </font> <ol> <li><font face="Calibri"><font size="4">Use $rootScope and raise an event on it while subscribing to it on the other components.</font> </font><iframe style="width: 100%" height="266" src="//codepen.io/DennisNerush/embed/GZXWOR/?height=266&theme-id=0&default-tab=js,result&embed-version=2" frameborder="no" allowtransparency scrolling="no" allowfullscreen="true">See the Pen <a href="http://codepen.io/DennisNerush/pen/GZXWOR/">Share Data using rootScope</a> by Dennis Nerush (<a href="http://codepen.io/DennisNerush">@DennisNerush</a>) on <a href="http://codepen.io">CodePen</a>. </iframe> <li><font size="4" face="Calibri">Use a shared service to pass the data between the components. </font><iframe style="width: 100%" height="266" src="//codepen.io/DennisNerush/embed/yOxMXX/?height=266&theme-id=0&default-tab=js,result&embed-version=2" frameborder="no" allowtransparency scrolling="no" allowfullscreen="true">See the Pen <a href="http://codepen.io/DennisNerush/pen/yOxMXX/">Share Date using Shared Service</a> by Dennis Nerush (<a href="http://codepen.io/DennisNerush">@DennisNerush</a>) on <a href="http://codepen.io">CodePen</a>. </iframe></li></ol> <p><font face="Calibri"> </font> <p><font size="4" face="Calibri">MVC doesn’t provide us with an out of the box solution for cross components communication. We need to extend it and create workarounds.</font> <p><font size="4" face="Calibri">Here we saw just a single use case for cross components communication. For an entire application we’ll have many different events that will be managed using shared services or the $rootScope. </font> <p><font face="Calibri"> </font> <p><font face="Calibri"><b><font color="#4f81bd" size="5">Does MVC help?</font></b> </font> <p><font face="Calibri"><font size="4">MVC forces us to separate the logic that is in the controller from the view that is just a template. It sounds like good practice, but if you think about it (and don’t kill me right away) maybe that’s actually not so good.</font> </font> <p><font face="Calibri"><font size="4">We are creating components, self-existing components that, like it or not, have their logic coupled to their view. You can’t really change the controller without affecting the view, and vice versa.<b></b></font> </font> <p><font size="4"><font face="Calibri"><b>That’s alright!</b> The components can be “smart”, they can have logic, handle their state and respond to different events and properties in a different way. So if that’s the case, why do we try to extract the logic and make the view dumb? </font></font> <p><font size="4" face="Calibri">Why not create components that define their functions, handle state and create the view in a single class – <b>a real reusable component</b>. This component will use actions to trigger events that will be dispatched through the application and notify other components that something has happened, and allow them to respond if it’s necessary. This pattern is called </font><a href="https://facebook.github.io/flux/docs/overview.html"><b><font size="4" face="Calibri">Flux</font></b></a><font size="4" face="Calibri"> and it’s used widely with the promising new framework </font><a href="https://facebook.github.io/react/"><font size="4" face="Calibri">React.js</font></a><font face="Calibri"><font size="4">.</font> </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTU_EFP7z1aePsmN3P_PiIc4oIoWQbxtfOY60AexNNU8j5Ymx32_n47UruDwLuuJl0AoEf8Klw8N-Ingm4xC2GVHHLdjdDA6_UyWrXIRXdpk9fj6nxgcJmzFO4c7E3CQAYUddGQ-JLMh4/s1600-h/clip_image0023.jpg"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGDq8eWv-beL6-RGIhRAGXIcLvuV9_RrVfQBP75XjmbO60wHnl1YdHVKeSMp-cvz6SYDI7rtrfWBu8ksbYYzcGlsLZQrODoAnVCuC_R-noycQtF2VquYywoKtL4e392yzBXgP0PHKGGT0/s1600-h/clip_image0024.jpg"><font face="Calibri"><img title="clip_image002" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002" src="https://lh3.googleusercontent.com/-eYCTGwsvn4U/VyJ6cFxRjvI/AAAAAAAAPA8/hjftPYl2QNQ/clip_image002_thumb1.jpg?imgmax=800" width="589" height="336"></font></a></font></a><font face="Calibri"> </font> <p><font face="Calibri"><font size="4">Flux introduces three new features that create the necessary infrastructure:</font> </font> <ol> <li><font face="Calibri"><font size="4">Action – A simple class that defines the events that components may trigger.</font></font> <li><font face="Calibri"><font size="4">Dispatcher – A class that dispatches the events from the Action to the different Stores.</font> </font> <li><font face="Calibri"><font size="4">Store – A store catches the events, processes them and then fires a completion event that components may subscribe to.</font> </font></li></ol> <p><font face="Calibri"></font> </p> <p><font face="Calibri"><font color="#4f81bd" size="5"><strong>Let’s implement the previous example with React and Flux</strong></font></font> <p><a href="https://lh3.googleusercontent.com/-JQxADIXIW3o/VyJ6cSuL4ZI/AAAAAAAAPBA/t3t8jh-drdo/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHudBprD2yJGeejwQ5QvrCIK4c1LymPnD_mmPt_Tj3Aq-uaTmeLs5OftuSQi7vCV0jYhXVqqodLNxH3ywkxJ6nJQBezAat6cl4DmaOZu-KWCWeDxYo8luHMyQFNgYY8hWrqkRiwvXMtr0/?imgmax=800" width="255" height="331"></a> <p><font size="4" face="Calibri">Here’s a basic Flux file structure. You can find all the parts we discussed earlier here. </font> <p><font size="4" face="Calibri">The + button will call an action, which will trigger “<i>INCREASE</i>” event.</font> <p> <iframe style="width: 100%" height="266" src="//codepen.io/DennisNerush/embed/wGYpWV/?height=266&theme-id=0&default-tab=js&embed-version=2" frameborder="no" allowtransparency scrolling="no" allowfullscreen="true">See the Pen <a href="http://codepen.io/DennisNerush/pen/wGYpWV/">wGYpWV</a> by Dennis Nerush (<a href="http://codepen.io/DennisNerush">@DennisNerush</a>) on <a href="http://codepen.io">CodePen</a>. </iframe> <p><font size="4" face="Calibri">The <i>CartStore</i> will respond to the event, calling to the server and actually modifying the product’s quantity.</font> <p> <p><font size="4" face="Calibri">Then the store will fire a “<i>PRODUCT_QUANTITY_WAS_CHANGED</i>” event to notify who ever listens.</font> <iframe style="width: 100%" height="266" src="//codepen.io/DennisNerush/embed/VaEyKG/?height=266&theme-id=0&default-tab=js&embed-version=2" frameborder="no" allowtransparency scrolling="no" allowfullscreen="true">See the Pen <a href="http://codepen.io/DennisNerush/pen/VaEyKG/">VaEyKG</a> by Dennis Nerush (<a href="http://codepen.io/DennisNerush">@DennisNerush</a>) on <a href="http://codepen.io">CodePen</a>. </iframe> <p><font size="4" face="Calibri">Then each component that subscribed to the event will be notified and will act accordingly.</font> <iframe style="width: 100%" height="266" src="//codepen.io/DennisNerush/embed/NNOXbP/?height=266&theme-id=0&default-tab=js&embed-version=2" frameborder="no" allowtransparency scrolling="no" allowfullscreen="true">See the Pen <a href="http://codepen.io/DennisNerush/pen/NNOXbP/">NNOXbP</a> by Dennis Nerush (<a href="http://codepen.io/DennisNerush">@DennisNerush</a>) on <a href="http://codepen.io">CodePen</a>. </iframe> <p> <p><font face="Calibri"><b><font color="#4f81bd" size="5">What’s the difference?</font></b> </font> <p><font face="Calibri"><font size="4">Nothing mind-blowing really. However, we don’t need to create a controller and separate it from the view and then subscribe and fire events in order to communicate. We build components that are responsible for themselves. They constantly pass events from and to each other, allowing us to easily change existing behavior, add new components and integrate them with the existing events.</font> </font> <p><font face="Calibri"><font size="4">The classic Model View Controller separation seems a little bit redundant, hence it must be completely changed for creating rich and modern web applications.</font> </font> <p><font face="Calibri"> </font> <p><font face="Calibri"><font size="4">Agree? Disagree?</font> </font> <p><font face="Calibri"><font size="4">Share your thoughts.</font> </font> <p><font face="Calibri"></font> <p><font face="Calibri">* <font size="4">I want to thank <a href="http://blog.cowchimp.com/">Yonatan Mevorach</a> for reviewing this post.</font></font> <p><font size="4" face="Calibri"></font></p> <p><font face="Calibri"></font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com8tag:blogger.com,1999:blog-7296668432246169944.post-65917918428695076022016-03-14T00:16:00.001+02:002016-05-01T14:07:44.373+03:00My Adventures in the Interviews Jungle<p> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY0SC5D5uzybELLKWIgFxRPM3Y2BJKubJWW4nisvwWFh-VbmJ4OBNpn4cklMnkmrOKW1c17dW_nJgEpltaBIa7B5g_QxiWV78nfTTlS9ABiNiYHVFOdPQVFcipl0st4S0fBU2isqk9lVA/s1600-h/hiring-manager%25255B9%25255D.jpg"><img title="hiring-manager" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="hiring-manager" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgxCv-llWNEAGTEciZjuaVpOr6ouJlna9SOV8pYRakehIHRCh9mXRxQkGVRK7chM0S1HKSrWfsPXczbQNClFjkepVKnmtikO5fyhTtMdIVIRyFiaLGur9PjK-pj74bPPzutIDih8Xy_dA/?imgmax=800" width="493" height="350"></a></p> <p><font size="4"><font face="Calibri">As you know I recently switched jobs and while finding a new one I’ve done quite a lot of interviews in different companies.</font> </font></p> <p><font size="4" face="Calibri">I really enjoyed the process! Some days I had 3 interviews in a row! My friends called me insane but hey, I can easily talk about software all day long! </font> <p><font size="4" face="Calibri">While looking for my next job I took the way a company’s interview process as a major factor for my final decision. </font> <p><font size="4" face="Calibri">In my opinion the interview process should reflect the <b>values, the culture and the professional level</b> of the company. A company that values my time, tries to make me feel like home and asks question that actually reflect my knowledge is most likely a better company than a one that does the opposite. </font> <p><font size="4"><font face="Calibri">In this post I want to share some of the questions and tasks that I had in my interviews. Some of them were great. They actually allowed me to show what I know and the overall process made me feel wanted and special. On the other hand there were some that were a complete waste of time.</font> </font> <p><font size="4" face="Calibri">Let’s start.</font> <p><strong><font size="6" face="Calibri">Ridiculous, exhausting and a waste of time</font></strong> <p><b><font size="5" face="Calibri">Bizarre questions</font></b> <p><font size="4"><font face="Calibri">“How many hair cut places are there in Tel Aviv? How many golf balls can fit into a bus?” These questions were famous due to Google’s interview process where candidates had to answer super hard and bizarre questions.</font> </font> <p><font size="4" face="Calibri">Few years ago even </font><a href="http://www.businessinsider.com/google-hiring-practices-interviews-2014-7"><font size="4" face="Calibri">Google stopped asking these questions</font></a><font size="4" face="Calibri">! </font> <p><font size="4"><font face="Calibri">“<b><i>They are a complete waste of time</i></b>” - Laszlo Bock, Google's senior vice president of people operations. 2014.</font> </font> <p><font size="4"><font face="Calibri">I couldn’t agree more – these questions don’t test anything and furthermore don’t have anything to do with the candidate’s future work.</font> </font> <p><font size="4"><font face="Calibri">When my interviewer asked me these questions I asked if their company found it useful. He replied ‘<i>yes, Google does it and so do we</i>’.</font> </font> <p><font size="4"><font face="Calibri">That was a red sign for me – if you copy from someone at least stop when they do.</font> </font> <p> <p><font size="5"><b><font face="Calibri">Endless trivia questions</font></b> </font> <p><font size="4" face="Calibri">By “trivia” I mean questions that don’t make the candidate think. Usually they start with <i>what</i> and not with <i>why.</i> Those questions check whether the candidate knows the answer or not. “<i>What is HTTP? What is a transaction</i>?” They don’t focus on the candidate understanding of why something is used or how is it used. Only if he knows the definition. </font> <p><font size="4"><font face="Calibri">Honestly - when was the last time that you used a Mutex? Or had trouble with the GC? Either way it’s googlable. So it’s ok not to know <b>all</b> the answers.</font> </font> <p><font size="4" face="Calibri">I think that <b>some </b>trivia questions can be useful for three reasons: </font> <p><font size="4"><font face="Calibri">1. To check if the candidate is serious about the job and that he took his time to prepare for the interview. Serious candidates usually prepare themselves and come ready for interviews.</font> </font> <p><font size="4"><font face="Calibri">2. To check that the candidate is not a complete noob/code monkey. It’s a bad sign if he cannot answer <b>any</b> question.</font> </font> <p><font size="4"><font face="Calibri">3. To check if the candidate knows how to say that he <b>doesn’t</b> know something. If he tries to lie and make up an answer in the interview then he will probably do it again in a real situation.</font> </font> <p><font size="4"><font face="Calibri">In one interview I had <b>an hour and a half</b> of trivia questions! Needless to say that it was one of the most exhausting interviews I’ve ever done.</font> </font> <p><font size="4" face="Calibri">In the end I asked the interviewer if they actually need all this knowledge to their day to day work. He told me <b>no</b>. They don’t even use multi threading but he questioned me for 40 minutes about mutexes, threadpool and thread synchronization. </font> <p><font size="3" face="Calibri"></font> <p><font size="5"><b><font face="Calibri">Writing code for hours</font></b> </font> <p><font size="4" face="Calibri">In one company I had a coding test as the second interview phase. I think that it’s essential to check the way the candidate writes code <strong>but</strong> and this is a big <b>but</b> it shouldn’t <b>take 6 hours</b>@#$! </font> <p><font size="4"><font face="Calibri">A small coding task should check if the candidate writes tests (perhaps TDD), uses SOLID principles and that his code is clear and well written. A simple calculator task can check all these. Writing a 6 hours long project is a waste of both the candidate’s time and the interviewer’s.</font> </font> <p><font size="4" face="Calibri">The worst part is that it’s in the company office (and not a home task) so the candidate will be stuck for 6 hours in a row writing code for some test in some company. Writing some code in the company office is good but only if it doesn’t takes the whole day.</font> <p> <p><b><font size="5" face="Calibri">Text exams</font></b> <p><font size="4"><font face="Calibri">As I mentioned before, there shouldn’t be more than a few trivia questions in an interview. The only thing that is worse the asking 30+ trivia questions is having them in a written exam while the interviewer is not even present.</font> </font> <p><font size="4"><font face="Calibri">Those tests give the candidate the feeling that his time is not valuable enough for an interviewer to be present while he answers.</font> </font> <p><font size="4"><font face="Calibri">As a candidate I want to have the feeling that I’m wanted and that my time is valued. Leaving a candidate in a room alone with a text exam does exactly the opposite.</font> </font> <p><font size="4" face="Calibri">It can be even worse if the text exam is </font><a href="http://www.hanselman.com/blog/WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx"><font size="4" face="Calibri">Scott Hanselman’s 25 things that every .NET developer ought to know</font></a><font size="3" face="Calibri"><font size="4"> and the interviewer tells that it is <u>his</u> private collection of questions.</font> </font> <p><font size="3" face="Calibri"></font> <p><strong><font size="6" face="Calibri">The Good Parts</font></strong> <p><font size="4"><font face="Calibri"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN50hnX1SBGIIPgaAwhm5ZeHL6YBAWQYX2u3Rw9KJPuOvSIMbKwRy64TA1n3AMh6nSItb9r1UTQuoRsBsKKXBfQEzCj6IFiZ8HnnfOD8oONOaj8mnXG1Qf3gTB4LVdgvuygTHZL__ZYEQ/s1600-h/jhj%25255B3%25255D.jpg"><img title="jhj" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="jhj" src="https://lh3.googleusercontent.com/-1YgD5bCK6Zk/VuZZxq1uMlI/AAAAAAAAOms/grjVru2iiwU/jhj_thumb%25255B1%25255D.jpg?imgmax=800" width="510" height="329"></a></font></font></p> <p><font size="4"><font face="Calibri">Now let’s go through the interviews that I really enjoyed, the technics and questions which allowed me to truly show my skills and made me feel wanted.</font> </font></p> <p><b><font size="5" face="Calibri">Home project, code review and pair programming</font></b> <p><font size="4"><font face="Calibri">In one company I also got a coding project however it was a home project meaning that I could go home, work on it whenever I wanted and send them back the solution when I’m done.</font> </font> <p><font size="4"><font face="Calibri">This is so much better than working on it at the company during the interview. It allows me to put in as much effort as I want while doing it in a familiar and comfortable environment.</font> </font> <p><font size="4"><font face="Calibri">After I sent them the code I was invited to a code review. I think that this is the best possible interview since it checks <b>everything</b>! Both my coding skills, my ability to explain my choices and to see how I accept critics.</font> </font> <p><font size="4"><font face="Calibri">After the code review I was asked to change something in the code – it took just 10 minutes but the interviewer sat with me the whole time and was part of my design choices. It was more like a pair programming than a test. It allowed me to show how I think before I code, my TDD skills and it also allowed me to see how it feels to actually work with someone from that company. This was the <b>best interview process!</b></font> </font> <p> <p><strong><font size="3" face="Calibri"></font></strong> <p><font face="Calibri"><font size="3"><b><font size="5">Team Leader/Group leader who is in charge of the interviews process</font></b><b> </b></font></font> <p><font size="4"><font face="Calibri">As a candidate you usually talk to the HR in order to schedule your interviews, to get more info about the company and simply talk between the interviews. The HR are usually really nice girls (never met a HR guy) but it’s way more welcoming and respectful when your point of contact is a team or a group leader of that company.</font> </font> <p><font size="4"><font face="Calibri">It makes you feel important and that you are taken seriously since a manager is investing time from his busy schedule to walk you through the interview process in his company. A company that shows this kind of respect to a candidate must show even bigger respect to it’s employees and that is a company that I want to be part of.</font> </font> <p> <p><b><u><font size="3" face="Calibri"></font></u></b> <p><b><font size="5" face="Calibri">CEO that talks to the candidates</font></b> <p><font size="4"><font face="Calibri">I really valued the companies that their CEO invested ~30 minutes to get to know me and tried to make me feel like home even before I decided to sign with his or her company. When the CEOs shared their visions for their companies and told me their missions and values I felt an immediate connection. These talks were the last step of the interview process and companies who’s CEO actually called me or invited me to come and talk to him made me appreciate that company more than others and that is a major decision factor.</font> </font> <p><font size="4"><font face="Calibri">One CEO even called me from San Francisco just “to get to know me”. He is the CEO of ~100 people. If he could find the time then most of the high level managers in not huge corporate can.</font> </font> <p> <p><b><font size="5" face="Calibri">Architectural and design questions</font></b> <p><font size="4" face="Calibri">I was surprised to see that most of the companies didn’t ask me architectural questions. Only 2 companies wanted to know if I understood the architecture of the projects that I’ve worked on. </font> <p><font size="4"><i><font face="Calibri">“Why do you have a load balancer? Why don’t you use micro services? Did you have a DRP? How does it work? What is the most fragile place of your architecture? What should you change? How? Why?”</font></i> </font> <p><font size="4"><font face="Calibri">If the <i>trivia questions</i> have usually the “<i>What</i>” prefix then the deep design questions will have the “<i>Why</i>” and “<i>How</i>” prefixes. This way the candidate must understand the pros and the cons of the architecture and more importantly to understand <b>why</b> the architecture is the way it is.</font> </font> <p><font size="4" face="Calibri">I think that these sort of questions show whether the candidate was just a code monkey or if he truly cared and understood his project. </font> <p><font face="Calibri"></font><font size="4"> </font> <p><b><font size="5" face="Calibri">White board role playing</font></b> <p><font size="4"><font face="Calibri">Almost every company asks the candidates to approach the white board to solve a problem or design an algorithm. Remember that the<b> solutions doesn’t matter</b>! It’s how you thinks what’s important. This is why it’s important to think loudly and share your thoughts with the interviewers.</font> </font> <p><font size="4"><font face="Calibri">This is a great test however I think that it can be even better.</font> </font> <p><font size="4"><font face="Calibri">In one company after I solved the problem at the white board the interviewer stood up and told “now it’s my turn”. He asked another question (something about modeling and design) and then approached to the white board and started to sketch a solution.</font> </font> <p><font size="4"><font face="Calibri">Then he asked me if that works and if his solution was good. It wasn’t and I had to spot the problem and then explain him why his solution wasn’t good enough. <b>It was great</b>!</font> </font> <p><font size="4"><font face="Calibri">We switched roles and I felt like the interviewer. It was a simulation of a technical argument and he wanted to see if I can spot the design problem and most important part to see if I can hold on to my position and be able to convince him that he was wrong in a good and calm way. This is also <b>one of the best</b> interviews I had.</font> </font> <p> <p><font size="5"><b><font face="Calibri">“How do you keep learning?”</font></b> </font> <p><font size="4"><font face="Calibri">There are plenty of developers out there. Only a small part of them are truly great developers. Many things distinguish them from the mediocre ones. One of them is what I call “<b>Continuous Learning</b>”.</font> </font> <p><font size="4"><font face="Calibri">The truly great developers always keep learning. They code, they read they write about it, they go to meetups and they are always up to date. Every company want these developers since they will always bring you progress.</font> </font> <p><font size="4" face="Calibri">If someone asks you to share this then they probably also care about learning and that place will probably have great developers who work there. </font> <p><font size="3" face="Calibri"></font> <p><font size="5"><b><font face="Calibri">“Tell me about something that you are proud of?”</font></b> </font> <p><font size="4"><font face="Calibri">Enthusiasm and ownership are extremely important qualities. Every company wants their developers to be enthusiastic about their work, to have ownership for their features and to feel accountable for the application that they are building.</font> </font> <p><font size="4" face="Calibri">In order to be proud of something you must be involved in all aspects of the product development. You must feel that you own that something to the bones. If someone is truly proud of a feature or a product then he will talk enthusiastically while describing it. </font> <p><font size="4"><font face="Calibri">I really liked when in one interview I was asked to tell about a feature that I was proud of. I could explain why did I think that this feature is important, it’s complexities and how did I actually developed it. It allowed me to show my understanding of that feature and my enthusiasm of software development. This is impossible to reproduce with only trivia questions.</font> </font> <p><font size="4"> </font> <p><font size="6"><font face="Calibri"><b>That’s it</b>.</font> </font> <p><font size="4"><font face="Calibri">This was a summary of most of my interviews. It was really interesting to see other companies and developers and to be tested for my skills. My personal advice is that when you go to an interview don’t be in the state of mind of a candidate that needs “to pass” the company’s tests. Go there and be the interviewer. Sure answer their questions, but don’t forget to ask yours. Remember that you are special and not every company deserves you. So be smart when choosing one. I think that the interview process can really help in deciding whether the company is worth going to. I hope that this post helped you know what to look for.</font> </font> <p><font size="4" face="Calibri">Good luck and feel free to share your experience! </font></p> <p><font size="4" face="Calibri"></font> </p> <p><font size="4" face="Calibri">* I want to thank <a href="https://www.linkedin.com/in/lnetanel">Netanel Lev</a> for review this post.</font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com4tag:blogger.com,1999:blog-7296668432246169944.post-47935382760474824442016-01-03T20:00:00.002+02:002016-01-03T22:03:49.781+02:00Increasing Conversion Rate in Web Forms with these 3 HTML5 features<p></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKAQh6ntGkdo91Nh3-x5iZ1cANPvchdAXRtiIt0mBdrJz1euXGaWaeT8xOOdN8hOsDT7i6lnBwWivZXKOfq_Mo3lHkIBM3H-wrLezViMJmwJH7omnhpzgz0LgJPSZyG32lIDg6jAEGSyw/s1600-h/1%25255B5%25255D.png"><img title="1" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf3ISwXeky52njjHBl-wDzlq5D6gpGbQ1YwdZKyUQ_KbOtFOkkj4W6DzZGYpvlY7oQvlW1P2QgNaGEDg-R6VRolK6RQPL2Ex64C96aBXkSVLyGuMALhTA75YCCH3hlol-V6LXfIhE-Ee0/?imgmax=800" width="382" height="396"></a> <p><font size="4"><b>Users hate typing</b>. Most of them will abandon your app when they’ll see a long and frustrating form causing you to miss a potential new user or something important like a purchase.</font> <p><font size="4"><b>Users have almost Zero patience. </b>They want to complete what they have started as fast as possible or else they’ll ditch it.<b> </b>This is why you must strive to make the forms <b>as short as possible</b> and allow them to fill them <b>as fast as possible</b>.</font> <p><font size="4"></font> <p><b><font color="#0080ff" size="5">Autofocus</font></b> <p><font size="4">The current page has a form that the user should fill. Remember that the user patience is short and that’s why you want immediately to focus him on the form. </font> <p><font size="4">If you’ll add the “<i>autofocus</i>” attribute to the first element of your form then the element will get focus after the page is ready. In mobile it will immediately show the keyboard.</font> <p><font size="4"><xmp><input type="text" autofocus></xmp></font>
<p><font size="4">It is so simple and it puts the user right where you want him.</font>
<p> <p><font size="5"><font color="#0080ff"><b>Autocomplete</b> </font></font>
<p><font size="4"><b>Users hate to repeat themselves</b>. How many times did you type your full name/address/age/telephone in the last week or month? It’s frustrating! The user has to refill these details over and over again!</font>
<p><font size="4">There must be a better way.</font>
<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh69vD1k5mlbEwYqI03me_Xkprgb34PuQ67LU8Jk_fKlVdlUdnUehlIKyJcOn0-cBTuHemU1w3Aq3IpSGgZx2x2UtJeLh0gNLlalZRgESxbfLBnqOpbH38EZlTllQiViKj1efjPAE1ZD7k/s1600-h/clip_image004%25255B3%25255D.jpg"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZCS2-tJ6h77C0YjZuuIBF19Lx9lFxADdMtWipLy6QhR3P32Oi_V5ObfgMvxAyOXZRIhlHfeQdMk2CP2b1ugvN9HiJmMa8bRFbojRS4BvyovlgZ01HpxpEhlmKs_JtkAruTGir2ckOSQ/s1600-h/clip_image004%25255B4%25255D.jpg"><img title="clip_image004" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzajmdU9nSrHTCYwfG3sKC8dhGjDxK5SMMABheZNWzHiVUSrK24MNqRH8tGKVkb-Bi2PyuxUCYmDifs2En4-M27ZMh06DehFhe-6cNqA645wWzKLE5dcd-xOYdEFnrXs5eN3NnkFGhap8/?imgmax=800" width="385" height="133"></a></font></a>
<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiz5-3i2jo4fcJcrWfksljInoPVkiYHyTwQoldJeGHDcAfkdDBs9_p6Gz34S_utpLxp-JeuP-VrPTYyL3SmSpuIPWiZ7BzbgUaKTB4tOMk0bWQYTjwUH1U00vFo3SpqeKbO7slw7LNzOU/s1600-h/clip_image006%25255B3%25255D.jpg"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipwqCCA1Kew4zW2ali7kxzEpydbvIUvtyHOvfhWtHCC5u67SBSGZdN8W9p_f3N-PyKyLqBvodMJ24N7xdCN5xbqtA1s1QqJMw2JJe0AKl_2XUAaed66epJfPAhTXkgq_IvCeXp4W-Q2ik/s1600-h/clip_image006%25255B4%25255D.jpg"><img title="clip_image006" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image006" src="https://lh3.googleusercontent.com/-SR1mb1BVe-A/Vol9-4lnlBI/AAAAAAAAOhg/dQXQ5-da35E/clip_image006_thumb%25255B1%25255D.jpg?imgmax=800" width="390" height="213"></a></font></a>
<p><font size="4">You’ve definitely seen this before – this is the Chrome’s AutoComplete feature which allows to automatically fill inputs that were filled in the past. </font>
<p><font size="4"><b>I love it!</b></font>
<p><font size="4">You must ask yourself how come that not all the forms allow you to autocomplete this data, after all they all probably use <i><xmp><input type="email" /></xmp></i>and perhaps even give it a useful name attr<i>ibute <xmp><input type="text" name="firstName/"></xmp></i></font>
<p><font size="4">They just need to add a tiny HTML5 attribute that goes by the name “<i>autocomplete</i>”. The autocomplete attribute can be set with one of these values:</font>
<p><font size="4">· country</font>
<p><font size="4">· fname</font>
<p><font size="4">· lname</font>
<p><font size="4">· email</font>
<p><font size="4">Click </font><a href="https://html.spec.whatwg.org/multipage/forms.html#autofill"><font size="4">here</font></a><font size="4"> for the complete list.</font>
<p><font size="4">Each element with an autocomplete attribute tells the browser that this element can be autocompleted with a value previously used for this kind of element.</font>
<p><font size="4">So all you need to do to enable this option and make your users happy is to add <i>autocomplete=”on</i>” and set the right values in the autocomplete attributes. Like so:</font>
<p><font size="2"><xmp><form autocomplete="on">
<label for="firstName">
First Name
<input id="firstName" type="text" name="fname" />
</label>
<br />
<label for="lastName">
Last Name
<input id="lastName" type="text" name="lname" />
</label>
<br />
<label for="email">
Email
<input id="email" type="text" name="email" />
</label>
<br />
<label for="country">
Country
<input id="country" type="text" name="country" />
</label>
</form>
</xmp></font>
<p><font size="4">Wait a second, the label field surrounds the whole input element! Why? </font>
<p><font size="4">It’s a nice trick that allows your users to click the textbox or the label to get focus to the textbox. Less clicks for the user means better chances that he completes the whole form <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKh4YzBlzkTIh3uwR3A7a6_pTgVYLYazx5X489px1UQ64m75On1YGn7XEI79Q2tWVDlj-rpvtzcpjmYVkaMxBl9Ng2iBYn85gkJUgTzdS2ZSLpKJBBVsDtECK0lD9iZXF-duzC78pNzuA/?imgmax=800"></font></p>
<p> </p>
<p><font size="5"><font color="#0080ff"><b>Geolocation</b> </font></font>
<p><font size="4">The last HTML5 feature that can really help your user is geolocation. It allows you (if the user enables it) to get the user’s current location. This means that if your form has some location inputs like shipping address or Zip code then you could autofill them using the user’s location.</font>
<p><font size="4">Think about all the times you had to look for your Zip code…</font>
<p><font size="4">Now you can ask the user:</font>
<p><a href="https://lh3.googleusercontent.com/-PBQrULP-4PU/Vol-oHKwEkI/AAAAAAAAOjk/FiJywmk6IQ4/s1600-h/clip_image008%25255B3%25255D.jpg"><font size="4"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZC7yQLDUe-YbpA9sdRIiFJaHMD0DKp2Grrtc3fjqf0ZVggWHZ_uzyv55-430rtX_iFhPVQIMN76sCIreg5F3cFK46dVphrStTBWeYX2vCvEOQ60NeovOOifQvGR_OMnzsFgdjJxZPFRg/s1600-h/clip_image008%25255B4%25255D.jpg"><img title="clip_image008" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image008" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiboA00Tm6PrRYvF6xVE58wW4zYpkpXVpnlqkBZFnxSQ8JmFajKfSCfCCZHpoiNAEbTK8e0E9VUaxj3Kj2zo9Z3_WlZZGp9TzLd6W4C0ySVkYN73POlL4XOBXepx2coR3-EiQeeDsja6A/?imgmax=800" width="426" height="168"></a></font></a>
<p><font size="4">And if he allows it then all this data will be auto filled! The users will love it!</font>
<p> <p><font size="4">With these 3 simple feature you will increase your conversion rate!</font>
<p> <p><font size="4">Feel free to comment if you have another tips.</font>
<p><font size="4"></font></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-27566793053170784962015-12-31T01:52:00.001+02:002015-12-31T01:52:44.776+02:00My 2016 Goals and 2015 Reading List<span style="font-family: Arial; font-size: medium;">2015 was a great year! I’ve worked on some of the
coolest projects that I know. I’ve learned the internals on Angular 1.X and
typescript. I’ve also started a new job (which is awesome) and made a pivot
towards mobile development. </span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg96n_4ZJCFI-sPyB93OjI5kXiGDa_2cQbwDDUVYqElEIDKNxPLuUu9ApwwjFn7n-AN3j-LtB_tp-V48ciunUVzSwyN_EQ-ihX14SzSQ3lAXRIhQu03WlDxjBJitEUem_uF_TpukdzIfwQ/s1600/s.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg96n_4ZJCFI-sPyB93OjI5kXiGDa_2cQbwDDUVYqElEIDKNxPLuUu9ApwwjFn7n-AN3j-LtB_tp-V48ciunUVzSwyN_EQ-ihX14SzSQ3lAXRIhQu03WlDxjBJitEUem_uF_TpukdzIfwQ/s400/s.jpg" width="400" /></a></div>
<br />
<br />
<span style="font-family: Arial; font-size: medium;">I’m certain that 2016 will be even greater!</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Now when 2015 is over I’d like to start a personal
tradition for myself in the blog. In the end of every year I’ll set personal
goals for the year to come. The goals will cover the blog topics and the desired
reading list for the next year. In the end of the next year I’ll go over the
goals and verify that I’ve accomplished all of them. I will also list all the
books I’ve read in that year so that maybe you will find something that suits
you. </span>
<br />
<span style="font-family: Arial; font-size: medium;"></span>
<br />
<span style="color: #0080ff; font-family: Arial; font-size: large;">Let’s Start</span>
<br />
<span style="color: #0080ff; font-family: Arial; font-size: large;"><br /></span>
<span style="font-family: Arial; font-size: medium;">This year I wrote <b>20 posts</b> in my blog which
are almost <b>3 times more</b> than last year! </span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;"><strong>2016 Goal</strong>: Write <b>at least</b>
<b>20 post</b>.</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">I want to focus on mobile, agile and management
topics. I will write on any other topic that I think is worth writing about but
these topics will be the core.</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Here are some ideas about the upcoming posts:</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Mobile oriented posts:</span>
<br />
<span style="font-family: Arial; font-size: medium;">1. TDD in IOS</span>
<br />
<span style="font-family: Arial; font-size: medium;">2. IOS and Android best practices</span><br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Agile:</span>
<br />
<span style="font-family: Arial; font-size: medium;">1. The psychology of Scrum</span>
<br />
<span style="font-family: Arial; font-size: medium;">2. Retro done right</span>
<br />
<span style="font-family: Arial; font-size: medium;">3. Agile estimations</span>
<br />
<span style="font-family: Arial; font-size: medium;"></span>
<br />
<br />
<span style="color: #0080ff; font-family: Arial; font-size: large;">2015 Reading List</span>
<br />
<span style="color: #0080ff; font-family: Arial; font-size: large;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Call me old fashioned but I love reading hardcopy
books. My dream is to have a huge library filled will all the best books in the
world. I always try to diversify and read different types of books.</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">I think that I did really well this year and picked
awesome books. By the way - this is a </span><a href="http://www.bookdepository.com/"><span style="font-family: Arial; font-size: medium;">great
website</span></a><span style="font-family: Arial; font-size: medium;"> where you can buy books with free
shipping worldwide. </span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-size: medium;"><span style="font-family: Arial;"><b>2016 Goal</b>: Read books about management,
leadership, innovation and at least one tech book.<b> At least</b> <b>10 books
in total.</b></span></span>
<br />
<strong><span style="font-family: Arial; font-size: medium;"></span></strong>
<br />
<br />
<span style="font-family: Arial; font-size: medium;">Here are the books I’ve read in 2015.</span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">1. </span><a href="http://www.amazon.com/Steve-Jobs-Walter-Isaacson/dp/1442369051"><span style="font-family: Arial; font-size: medium;">Steve Jobs</span></a><span style="font-family: Arial; font-size: medium;"> – on the
greatest minds that ever lived. He had an amazing and not ordinary life (the
movies don’t get even close to the real deal). You <strong>must</strong> read
this book if you consider yourself a manager or an entrepreneur.</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBFuoWMHPuL4SJtjTyZx8oeGocCB73xRKxg0IVG6j0IUfsIlOs0wePrWxgXA6EPySGc0nRG73H_BrbLnMTge62QKfNd0rzrad6enAF8q-IdFtCBWSuRuOGy-lSbmrAGQBjlyJHNsWkek/s1600/ss.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBFuoWMHPuL4SJtjTyZx8oeGocCB73xRKxg0IVG6j0IUfsIlOs0wePrWxgXA6EPySGc0nRG73H_BrbLnMTge62QKfNd0rzrad6enAF8q-IdFtCBWSuRuOGy-lSbmrAGQBjlyJHNsWkek/s320/ss.jpg" width="283" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">2. </span><a href="http://www.amazon.com/Last-Lecture-Randy-Pausch/dp/1401323251/ref=sr_1_1?s=books&ie=UTF8&qid=1451514464&sr=1-1&keywords=The+Last+Lecture"><span style="font-family: Arial; font-size: medium;">The Last Lecture</span></a><span style="font-family: Arial; font-size: medium;"> – an
amazing book written by a man that was going to die. This is not one of those
books about dying. It is about living. Living the life that you will not regret.
The book is about the author’s last lecture which you can also watch </span><a href="https://www.youtube.com/watch?v=ji5_MqicxSo"><span style="font-family: Arial; font-size: medium;">here</span></a><span style="font-family: Arial; font-size: medium;">.</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvLAdlVvXj0oLqfUUv2iXEh2_YlykUVHLNe6EckpEZLiZ5rFBfKnz4hWrJEnnN-GkvBI1bW4ru-1fS0CiZUU0e9-8T40PoBIaxOdlixK9OiDIpVAU5jIrcBWnoEOdRKg160vjU13iMTRg/s1600/wdf.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvLAdlVvXj0oLqfUUv2iXEh2_YlykUVHLNe6EckpEZLiZ5rFBfKnz4hWrJEnnN-GkvBI1bW4ru-1fS0CiZUU0e9-8T40PoBIaxOdlixK9OiDIpVAU5jIrcBWnoEOdRKg160vjU13iMTRg/s320/wdf.jpg" width="228" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">3. </span><a href="http://www.amazon.com/Lean-Startup-Entrepreneurs-Continuous-Innovation/dp/0307887898/ref=sr_1_1?s=books&ie=UTF8&qid=1451515012&sr=1-1&keywords=the+lean+startup"><span style="font-family: Arial; font-size: medium;">The Lean Startup</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">This is a <strong>must</strong> book for every
manager and entrepreneur. It is well written, pragmatic and has lots of great
real life examples. </span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQ8SebUa6BsiBef7ojIhttQkhtDLKyFkPMq2oSPe0OPYK3Zadl4hzBmC26vxaCE5hkohyphenhyphenvmUHhQBtHWeKZQpTlHPenX7CL9_3zKeAmiwVTeg7LQEEpeRNKCCsZJR4_wG9uxw2FeOW5mM/s1600/sdfgf.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQ8SebUa6BsiBef7ojIhttQkhtDLKyFkPMq2oSPe0OPYK3Zadl4hzBmC26vxaCE5hkohyphenhyphenvmUHhQBtHWeKZQpTlHPenX7CL9_3zKeAmiwVTeg7LQEEpeRNKCCsZJR4_wG9uxw2FeOW5mM/s320/sdfgf.jpg" width="212" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">4. </span><a href="http://www.amazon.com/4-Hour-Workweek-Anywhere-Expanded-Updated/dp/0307465357/ref=sr_1_1?s=books&ie=UTF8&qid=1451515936&sr=1-1&keywords=4+hours+work+week"><span style="font-family: Arial; font-size: medium;">4 Hours Work Week</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Life hacker Tim Ferriss in a great book about
efficiency and building the life you dream about. It shows that your dreams can
be accomplished. Just <b>start</b> and stay focused.</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQZy5q1apO0bEf0WWLKAXf7hBfc646q9dTO4hT5FZ2k5a9NP4hyphenhyphenYzqeadQZPeflz6YdUrAuQhq1wloh3t7TwDn2nuRT1FterFVTnR1MM8ZUfvLiOO5z00Rw3984vSneHfaHZ8hQgV120/s1600/qerwehr.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQZy5q1apO0bEf0WWLKAXf7hBfc646q9dTO4hT5FZ2k5a9NP4hyphenhyphenYzqeadQZPeflz6YdUrAuQhq1wloh3t7TwDn2nuRT1FterFVTnR1MM8ZUfvLiOO5z00Rw3984vSneHfaHZ8hQgV120/s320/qerwehr.jpg" width="210" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">5. </span><a href="http://www.amazon.com/How-Google-Works-Eric-Schmidt/dp/1455582344/ref=sr_1_1?s=books&ie=UTF8&qid=1451515995&sr=1-1&keywords=google+how+google+works"><span style="font-family: Arial; font-size: medium;">How Google Works</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">The managers of Google share the experience that they
gained while working in Google. </span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAqVRldWVdDERrhd2lVIlj-VJpFTnl6TfUNgExulTHT1R0PqjwMggwcyhlobM1YAEqWEBMN4UDA6IHmzjOM4fqfsIXU_i-iMGnUMuSuScYUY8om0zdYgW-MkWwEdWeF4Yf-XCISZXWCkY/s1600/eg.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAqVRldWVdDERrhd2lVIlj-VJpFTnl6TfUNgExulTHT1R0PqjwMggwcyhlobM1YAEqWEBMN4UDA6IHmzjOM4fqfsIXU_i-iMGnUMuSuScYUY8om0zdYgW-MkWwEdWeF4Yf-XCISZXWCkY/s320/eg.jpg" width="216" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">6. </span><a href="http://www.amazon.com/Leader-Who-Had-No-Title/dp/1439109133/ref=sr_1_1?s=books&ie=UTF8&qid=1451516074&sr=1-1&keywords=the+leader+who+had+no+title"><span style="font-family: Arial; font-size: medium;">The Leader Who Had No Title</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Robin Sharma is one of the best leadership and life
improving authors that I’ve encountered. I enjoyed reading all of his books. In
my opinion this one is not as good as the “</span><a href="http://www.amazon.com/Leadership-Wisdom-Monk-Sold-Ferrari/dp/8179922316/ref=sr_1_1?s=books&ie=UTF8&qid=1451516144&sr=1-1&keywords=the+leadership+wisdom"><span style="font-family: Arial; font-size: medium;">leadership wisdom</span></a><span style="font-family: Arial; font-size: medium;">” but it
has lots of great topics in it (just read both).</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzru2b28uuK6-MbUBMRv7ecDmPUF0g0CF-g7_4LXwXTjbMGrjneU7ib2vSNkfOOxtdYk0gYx0fTLyQ-4T7EL5iAraqlUkKeN6ObjwLzSW_x2MQy0ZOJqwz_OyQSY2r1bVFQ0f_03XvrsQ/s1600/sdfv.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzru2b28uuK6-MbUBMRv7ecDmPUF0g0CF-g7_4LXwXTjbMGrjneU7ib2vSNkfOOxtdYk0gYx0fTLyQ-4T7EL5iAraqlUkKeN6ObjwLzSW_x2MQy0ZOJqwz_OyQSY2r1bVFQ0f_03XvrsQ/s320/sdfv.jpg" width="221" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">7. </span><a href="http://www.amazon.com/Start-up-Nation-Israels-Economic-Miracle/dp/0446541478/ref=sr_1_1?s=books&ie=UTF8&qid=1451516169&sr=1-1&keywords=startup+nation"><span style="font-family: Arial; font-size: medium;">Start-Up Nation</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Great book that tries to determine how a tiny country
like Israel has the largest amount of successful startups in the world.</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbUVSEz_EjKJJvihaPtJ_VtQVQbIEgXuvSvN9WMiE0xHCXFH86utqGz73jtMK1wbRuuVS8w6Tcc9BgDIy-D8vKectbzaMs-Vm3lw-MnQGkm4dxwpgmCeQMjbRGSieeTYwqlP6kvTgZpcU/s1600/dsff.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbUVSEz_EjKJJvihaPtJ_VtQVQbIEgXuvSvN9WMiE0xHCXFH86utqGz73jtMK1wbRuuVS8w6Tcc9BgDIy-D8vKectbzaMs-Vm3lw-MnQGkm4dxwpgmCeQMjbRGSieeTYwqlP6kvTgZpcU/s320/dsff.jpg" width="208" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">8. </span><a href="http://www.amazon.com/Passionate-Programmer-Remarkable-Development-Pragmatic/dp/1934356344/ref=sr_1_sc_1?s=books&ie=UTF8&qid=1451516239&sr=1-1-spell&keywords=the+passionate+programer"><span style="font-family: Arial; font-size: medium;">The Passionate Programmer</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Actually that is not a good book. The title doesn’t
fit the content. It’s mostly about how not to lose your job. Don’t read
it.</span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5vLSYz6eq8Z-_s6oA6-UpFGN68ONK4rFI6mOsjuqL0zqWR3m5fLqYLyHoEgk6_BhEijgrSM4AI7CPYN58zXac-SvyOa_MVXOwKfqDKYk9XA619ukOaR2n_ArxPJCAw-JbsOvPo5ngEHU/s1600/tyujtre.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5vLSYz6eq8Z-_s6oA6-UpFGN68ONK4rFI6mOsjuqL0zqWR3m5fLqYLyHoEgk6_BhEijgrSM4AI7CPYN58zXac-SvyOa_MVXOwKfqDKYk9XA619ukOaR2n_ArxPJCAw-JbsOvPo5ngEHU/s320/tyujtre.jpg" width="213" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">9. </span><a href="http://www.steimatzky.co.il/Steimatzky/pages/Product.aspx?ProductID=11373326"><span style="font-family: Arial; font-size: medium;">מחשבות לעט לילה</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Haim Shapira writes about three philosophers:
Nitsche, Schopenhauer and Kierkegaard. How did they live, what did they believe
in and why? Very interesting. </span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlkzmolpke0rafOaoE0RM27GUj0-1QcphpyqKKXJ4NW0423XYviqukc_ZweAT6ewm-VW0y1S26sGLyF2LNmwtCKl6l4cbrgtqS9XUimuOzxzNFeBtG9n2EE9JfLGkFVUmp_vPeDnf9AQ/s1600/wef.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlkzmolpke0rafOaoE0RM27GUj0-1QcphpyqKKXJ4NW0423XYviqukc_ZweAT6ewm-VW0y1S26sGLyF2LNmwtCKl6l4cbrgtqS9XUimuOzxzNFeBtG9n2EE9JfLGkFVUmp_vPeDnf9AQ/s400/wef.jpg" /></a><br />
<br />
<span style="font-family: Arial; font-size: medium;">10. </span><a href="http://www.amazon.com/High-Output-Management-Andrew-Grove/dp/0679762884/ref=sr_1_1?s=books&ie=UTF8&qid=1451516494&sr=1-1&keywords=high+output+management"><span style="font-family: Arial; font-size: medium;">High Output Management</span></a>
<br />
<span style="font-family: Arial; font-size: medium;">Andy Grove’s book that is considered to be the Holy
Grail of management books. It was written in 1983 and it is still accurate for
this day. He covers all the aspects of being a manager. Great book, <b>it’s a
must read</b>. </span>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzTnb5kyQsWW6CK3Iaa0BP7y8shpM5FKkWtQZmFmBIJS-xMHi3Wa2IwDs004arMNpUJT38M88IdBqGHhma8zGtvZopzE9ZzsiL_HKLNN_DlXeWNd_r6hEtXhF9YkNNiWMADTuu3qY41Ks/s1600/qwerweg.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzTnb5kyQsWW6CK3Iaa0BP7y8shpM5FKkWtQZmFmBIJS-xMHi3Wa2IwDs004arMNpUJT38M88IdBqGHhma8zGtvZopzE9ZzsiL_HKLNN_DlXeWNd_r6hEtXhF9YkNNiWMADTuu3qY41Ks/s320/qwerweg.jpg" width="208" /></a><br />
<br />
<br />
<span style="font-family: Arial; font-size: medium;">Allow me to repeat the 2016 goals: </span>
<br />
<span style="font-family: Arial; font-size: medium;">1. Write at least 20 blog posts.</span>
<br />
<span style="font-family: Arial; font-size: medium;">2. Read at least 10 books.</span>
<br />
<span style="font-family: Arial; font-size: medium;"></span>
<br />
<br />
<br />
<br />
<span style="font-family: Arial; font-size: medium;">I like these goals :)</span><br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">Now it’s time to start working on them.</span>
<br />
<span style="font-family: Arial; font-size: medium;">Have a great year!</span>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com2tag:blogger.com,1999:blog-7296668432246169944.post-1272612293239329462015-12-05T17:37:00.001+02:002016-06-12T14:21:24.649+03:00Everybody has a plan until they get punched in the face<span style="font-size: small"><font size="4">“A failure” can be a result of a software or hardware problem. A fault tolerance design intends to enable the system to continue operating properly in the event of failure. In this post, I’ll talk about a way to treat a special cause of failure – a timeout using a really cool open source framework named </font></span><a href="https://github.com/App-vNext/Polly"><span style="font-size: small"><font size="4">Polly</font></span></a><font size="4"><span style="font-size: small">. </span><br><span style="font-size: small"><font size="4">We prepare for failures, we put “try catch” blocks and check “if(something == null)” every now and then. We think we’ve got it covered and that we are fully protected</font>.</span> <br></font><span style="font-size: small"><font size="4">As Mike Tyson said – that’s our plan. However, we all know that something “unpredictable” will always go wrong, and then we’ll be punched in the face.</font> </span><br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT5MqjSRaFKkdBzyzREZ1scZ27npFKDtapusIBRWCBoTidiAMpJZpgASHspIAOG4nAqjKqEojSv7zec6CZU5HQwT1mmOfzJM6e1znQHBkIIjXB3MNs1lJzmkUwQZTOZVPvkwccTsCPzmI/s1600-h/clip_image002%25255B5%25255D.jpg"><img title="clip_image002" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgylUiyT-h_NrsL3yDHTXN3UxUB56pNMvC7HcnNl0mLfae93n0Wug3DxldzNnoaRktEJGCgrZbcMixkATxFwRIoVC2jkrJYfazaIA4cEJfVwltVGzfH8Tdsnoc4ZMpFi6tYGFifARKkXrs/?imgmax=800" width="237" height="352"></a> <br><span style="font-size: small"><font size="4">Let’s say that you have a DB and you query it to get some data – user’s navigation history for example.</font></span> <br><a href="http://lh3.googleusercontent.com/-8-PYOr5z90U/VmMEmHMG9ZI/AAAAAAAAObE/gpSed5O_wPk/s1600-h/clip_image004%25255B4%25255D.jpg"><img title="clip_image004" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioYKx1fOvd1gMdGtyB4lpHN9L2UY5XcJsBdwb-Xdmphnj6M4ojIX6t68d1fZP2xRmWINGzlZ3J4suhX882U8V1LGmtwhcwFR0XwG5cBW6a_bYEIcqv_-qJ76NxdxEWxY8DkOgjyklHLwY/?imgmax=800" width="353" height="272"></a> <br><span style="font-size: small"><font size="4">One of your users clicked to get his navigation history and waited for almost a minute (yes – that’s a long time) to get an error that crashes the application!</font></span> <br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPoSxuR5D_L9H7gkPOB2_WvFHnk_ICF_F9-B8bnpYPb1_Rnz7wnSnRvQzaVGk2V-Lfrz7pAL3fSSj5ha-b-545b6tc9D6QwWwn1J_5kc5iYvbncejmIaxLv7tJbaMzWL8vxf69vpIHM5Y/s1600-h/clip_image006%25255B3%25255D.jpg"><img title="clip_image006" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image006" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwn2sEuGT0oAgSViFwgZUAB_tz7BMK63ZxD-VtReUB3p7xxE2mNsPR6ZI2PMePBqQIUjV7ENAwOmSAu_fLc2V5GsQ8wsheo0v0f1HwEkTTUq0sCAdPx5OTdv-uCQ76QacRntE-hlTP7XE/?imgmax=800" width="244" height="184"></a> <br><span style="font-size: x-small"><font size="2">(BTW This not a great error page – read </font></span><a href="http://dennis-nerush.blogspot.co.il/2015/10/6-ways-to-make-your-user-smile.html"><span style="font-size: x-small"><font size="2">here</font></span></a><font size="2"><span style="font-size: x-small"> <font size="2">about the importance of error pages that make your user smile.)</font></span><br></font><span style="font-size: small"><font size="4">You guessed right – that was a timeout to the DB. Why did it happen? Who cares? It made your user wait and eventually it crashed the application. <b>This is unacceptable</b>!</font></span> <br> <h5><span style="font-size: medium; color: #0080ff"><font size="5">How can we handle it?</font></span></h5><font size="4"><font size="4"><span style="font-size: small"><font size="4">There are two problems in this scenario: the first is that the application crashed and the second is that the user waited a minute for a response.</font> </span><br><span style="font-size: small"><font size="4"><u>Let’s start from the crash</u>. The navigation history is a cool and useful feature but it’s not the <b>core </b>of your system. The core feature is the navigation itself. You have to identify</font> <font size="4">the core features of your application and make them work, even if some other features fail.</font></span> <br></font><span style="font-size: small"><font size="4">In this example, the application should have displayed an error message saying something like “History is currently unavailable – try to remember where you went” and allow the user to use its core features any way.</font> </span><br><font size="4"><font size="4"><font size="4"><span style="font-size: small"><font size="4">Now let’s deal with the fact that the user had to wait for a whole minute before he saw the error. That’s a horrible user experience. A timeout might happen due to many</font> <font size="4">reasons in any sort of client server communication (no more available connections, waiting for a really long operation to finish or simply a stuck component).</font></span> <br></font><span style="font-size: small"><font size="4">The bottom line is that</font> <b><font size="4">someday it will definitely happen to you!</font> </b><font size="4">Furthermore it will cause <b>all</b> your users to wait until they receive the error. A timeout may accrue just once due to a race condition that only a single user will get. However, sometimes the timeout will remain until you manually fix the problem - which can take a while.</font></span> <br></font><span style="font-size: small"><font size="4">You can lower the timeout limit to a second or even 100ms - and indeed no user will wait longer than 100ms - but <b>all </b>the users will wait for 100ms and eventually <b>fail, </b>while choking your servers</font>.</span> <br></font><span style="font-size: small"><font size="4">Your goal is to <b>prevent</b> users from waiting <b>at all</b> when you know they will definitely receive a timeout. In other words, if a system component has a timeout, you don’t want the application to try to communicate with it. You want it to <b>fail fast.</b></font> </span><br><b></b></font><br><b></b><br> <h4><span style="font-size: medium; color: #0080ff"><font size="5">Fail Fast</font></span></h4><font size="4"><span style="font-size: small"><font size="4">Fail fast is a concept in fault tolerance systems that is designed to stop flows and normal operations when a possible failure might accrue. Such design will add check points before operations execution, which will check if the operation is “healthy”. Using “health indicators”, the system will know if a certain operation will most likely fail. If an operation isn’t healthy, then there’s no need to execute it and we’d rather call</font> <font size="4">a <b>fallback</b> behavior.</font></span> <br></font><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS4-6aH1KMcXLHCX2ZduKzFfatMGSGdOVJJL6_KTCxtZHG8elOBYfffzlrhpTsOJBHFNDlRBxwk328hlAuc-3JqXC72bOWJMVrMbHWlQlFNQeelJw3rnrIX3DNaKe9tKNLjh1qH_-W-Iw/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOUOVarzbvym9_vS-0pa8PBvsAN7gFWaF9F7ikXB9dvlxACnIPCg9ZeVkbNoorr8wccgqdXkykxpD9ZsT9xPbyuXcpQ59-7nGCXGU3qD7MkIvuCWuyJIELPJp2o8591Vv9Q5fv_WMimOc/?imgmax=800" width="418" height="189"></a> <br><font size="4"><font size="4"><span style="font-size: small"><font size="4">This way, we may give the users a better experience then waiting for an error</font>. </span><br><span style="font-size: small"><font size="4">Let’s examine our case: the application shouldn’t try to execute the query unless the connection to the DB is “healthy”. So the system will check the “health indicator” before the execution, and if it returns false then it should immediately turn to the fallback and display the error page without even trying to connect to the DB</font>.</span> <br></font><span style="font-size: small"><font size="4">You can take it even further – if such health indicators exist, then why can’t we check them on the <b>application startup?</b> If there’s a problem with the feature, then let’s disable it and even not show it to the user. Perhaps it’s better to make the feature “disappear” then exposing the user to a poor experience. That of course is a pure business decision (it might be a really poor experience if the <i>messages </i>tab in Facebook suddenly “disappears”).</font> </span><br></font><span style="font-size: small"><font size="4">Allowing your system automatically to disable features must be done extremely carefully. You don’t want to disable a feature for all of your users if for some reason a timeout has accrued just once. If it happened 10 times in a row, then most likely there is a real problem and only then should the feature be disabled</font>. </span><br> <br> <h4><span style="font-size: medium; color: #0080ff"><font size="5">Polly</font></span></h4><span style="font-size: small"><font size="4">Polly is a really cool and useful </font></span><a href="https://github.com/App-vNext/Polly"><span style="font-size: small"><font size="4">open source</font></span></a><span style="font-size: small"><font size="4"> that helps you create a fault tolerant system using policies for handling exceptions and creating fallback solutions. Let’s see how we can use Polly to handle our timeout scenario and allow your application to fail fast</font>. </span><br><script src="https://gist.github.com/anonymous/3570937150c57e687d57c80b6741451b.js"></script><br><font size="4"><font size="4"><span style="font-size: small"><font size="4">NavigationHistoryController has a dependency to the database where the navigation history is stored</font>. </span><br></font><span style="font-size: small"><font size="4">It has a single public method, which provides the history by calling the INavigationHistoryProvider</font>. </span><br></font><span style="font-size: small"><font size="4">We have a try-catch surrounding the provider call. As we know this catch will eventually handle the timeout exception, but it won’t fail fast.</font> </span><br><script src="https://gist.github.com/anonymous/11f147516eaa0aff50e2d4c023ee18e7.js"></script><br><span style="font-size: small"><font size="4">We have created a circuit breaker policy on the timeout exception (error code -2) setting the count to 10 and the policy duration for 10 minutes. In other words, our policy will be triggered if a SqlException will accrue 10 times and in the next 10 minutes every call to the provider will not be executed. BrokenCircuitException will be triggered instead, allowing us to quickly fallback and return an error without waiting for the timeout.</font></span> <br><script src="https://gist.github.com/anonymous/e00d274e0a5bc48eda3651a8d0a82d7a.js"></script><br> <h3><span style="color: #0080ff"></span> </h3> <h3><span style="color: #0080ff"><font size="5">Let’s test it</font></span></h3><font size="4"><span style="font-size: small"><font size="4">We’ll mock the NavigationHistoryProvider and raise an exception for every single call to it “Get” method</font>. </span><br></font><span style="font-size: small"><font size="4">We’ll call it 10 times and then another time to check if the policy was activated</font>. </span><br><script src="https://gist.github.com/anonymous/9db1125c66ec8c65efeeb0c67d6199d7.js"></script><br><span style="font-size: small"><font size="4">Works like a charm. The code is available on </font></span><a href="https://github.com/DennisNerush/CircuitBreaker"><span style="font-size: small"><font size="4">GitHub</font></span></a><span style="font-size: small"><font size="4">.</font></span> <br> <br> <h3><span style="color: #0080ff"><font size="5">Conclusion</font></span></h3> <p><font size="4"><font size="4"><span style="font-size: small"><font size="4">The applications that we build will have failures. We must recognize that things won’t always fail nicely. We must be prepared for all the possible scenarios and edge cases. The sooner we start thinking about them in our development process – the better</font>. </span><br></font><span style="font-size: small"><font size="4">I encourage you to think about it from the beginning. Start using FDD – <b>F</b>ail-<b>D</b>riven <b>D</b>evelopment</font>. </span></font></p> <p><font size="4"><span style="font-size: small"></span><br></font><span style="font-size: small"><font size="4">Best of luck</font>. </span></p>Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com5tag:blogger.com,1999:blog-7296668432246169944.post-57954311542649608072015-11-25T12:06:00.001+02:002016-11-25T12:29:33.164+02:00Applying TDD in Your Company is More Important than Ever!<p>I won’t cover the basics of <a href="https://technologyconversations.com/2013/12/20/test-driven-development-tdd-example-walkthrough/">TDD</a>. I do want to talk about the advantages of writing automated tests (unit tests and integration tests) in general, and why applying TDD ,with a little twist, should be a standard in your company. <p><b>First, why should you write automated tests? </b> <p>“In order to test and verify my code?” Daaahh! This is so obvious that it’s not worth mentioning! I think that unit tests and all kind of automated tests have many more benefits than just testing your code. <p><b>Better code</b> <strong>design</strong> – If you have ever written unit tests, you’ll know there is no (pretty) way of testing or mocking static objects and tightly coupled classes which violate the SOLID principles. A testable class is a well-designed class that is loosely coupled from its dependencies, uses dependency injection and rarely has calls to static methods. A testable class is a SOLID class which will improve maintainability, readability and extensibility. <p><b>True documentation of the code</b> – You’ve probably written a design paper at least once for a feature or any sort of documentation describing the code. Be honest – is this documentation still relevant? Does it really describe the code that is now in production? Probably not. The automated tests, on the other hand are the true documentation - since if the code breaks the tests, the code will be repaired or the tests will be modified to support the new behavior that has been added. Either way, the tests tell the real story of the class, allowing <u>any other programmer other then you</u> to quickly understand what the class does and how it behaves in different situations. <p><b>Killing the fear of change</b> – One of the programmer’s greatest fears is the fear of changing code. You never know which class depends on this specific implementation in a specific scenario. Usually, QA will let you know about it. But not your company QA – your customers (the real QA), who will get hurt and be angry due to your changes. However, if the code is fully covered with automated tests then there’s no fear! You can add, modify and even, so help me god, delete code - and in a matter of a few minutes you’ll know exactly what logic you broke, and why (the tests assertion should be really clear). <p><b>A standard for your company</b> <p>Your company is a business. It has competitors who are breathing down your neck, trying to get hold of your customers. Time and quality are crucial! You must deliver new features <b>fast</b> and with the <b>highest quality</b> so that your customers will be satisfied. <p>The only way to succeed is by writing automated tests that cover your <b>entire code base</b> and<b> all the user flows</b>. By doing this, you allow every single developer in your company (seniors and juniors) to quickly understand how the code works by reading the related tests, easily changing the code - since it has a great SOLID design – and having immediate feedback if any modification has ruined the existing logic, providing the exact places where it happened. This saves time and money, and should be the standard for every new feature in your product.<b> It should be a fundamental principle for writing code in your company.</b> <p><b>Why TDD? Just write the tests afterwards</b> <p>Why should you use TDD if you can first write all the necessary code, implement the feature and only then write the tests? <p>Writing tests after implementation is way better than not writing tests at all. However, it might not get you the same effect as I’ve described above. When you are finally done with the implementation, the thing you want the most is to declare the feature as “done” and ship it to production. You probably won’t invest enough time in fully covering the feature with good, meaningful tests. If you encounter something that is fundamental in your implementation that is not testable, you will probably just leave it like that and not change it - leaving it untested. <p>The last thing is that you are biased toward your implementation: in your opinion, the way you’ve implemented the feature is the right way. Thus you will write tests that support your implementation and not necessarily cover all the edge cases and business goals that the feature was supposed to do. <p><b>TDD – the cherry on top</b> <p>In order to truly enjoy the benefits described above you have to apply TDD -with a little twist: <p><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxQQEhUUEhQWFRUXFhUWFxYUGRcYGBYVGBUaFhcVGBUYHCogGBolHRwZIT0hJSkrLi4uGCA1ODMsNygtLi0BCgoKDg0OGhAQGi8kHyYwLDAtNSwsNy8vLDQsLywsLCwsLCwsLCwtLCwsLCwvNCwvLCw0LCwsLCwsLDIvLCwsLP/AABEIAK8BIAMBIgACEQEDEQH/xAAcAAEAAQUBAQAAAAAAAAAAAAAAAwIEBQYHCAH/xABCEAACAQIDBQUFBQYEBgMAAAABAgMAEQQSIQUGEzFBByJRYXEjMoGRoRRigpKxM0JScsHRQ1OywlSTotLh8BUWc//EABoBAQACAwEAAAAAAAAAAAAAAAACBAEDBQb/xAAvEQACAQIEBAMIAwEAAAAAAAAAAQIDEQQSITEFE0FRYZHRIjJCcYGhsfAVweEU/9oADAMBAAIRAxEAPwDr2K25FFKYmNssfEkfQJGGYJGrEn33N7KLk5T5XbTktNh7OwbM5KhrKYghzs69QG4Yv0LL4msTFuhnjYYmYySGXjiSNBGFmDh0lyMXDuoVEGfMAqBQAL3yDbAHDlVZX4swCyTvZpCl7FVtZYxlLWCgKpYtYm9wK8PtuHFQZ8LiIruq5HNmCtIPZ548wNyf3CQemlWrbfaWeOGCGUgMDPIyZViTKxCkOQxdiFFgCQrZjYEXyU2y42aE2IEDZkRbBb8No1uLahVZrDkCb9BVhDsJxFPAZ/ZzcfvopWdTMWJbjZyCy5rA5BYBfCgMjh9qwySGNJUZwCSqsCbKQrGw8CQD4Ei/OpsVikiXM7BRcAeJJ0CqBqzE6ADU1jNhbvx4T3FiXQqBHHkABOYgd45QTrZbC+tqucds4ySxSB8pjEgAyhvfyjOt/dcAEBtdHYW1oC5wmKEoJAYWNiHUqQefI+RB+NYnau8MSzR4WOaITysRbMhMar7zZCdWvZQvi17EK1XewNmfZYuFmz9+R85vmbiOZCXJOr3Y3IsD0A5Bs7Y6QyzSjV5mW5sAFRb5Y1A6XLtc6lnY+AAEODxfBZ45JnnPEAByAmNWVLLKYkCKcxJGgOVl586bRxrrCeHIjSTOY8MygEAsDZj3iHCAM5ta6odL87PE7sMyRqJ2HDmeUZVADs+e7vzzSKXzhuWdVJU2rIYLYaQvGUJCxQCCFNLRrcZmHixCxjXlk8zQFQxywo0ks6GPiLGraDK11hKOwNmbi5ugsTa2lUjeLDFA6TJIGLKvBPFLMnvBVjuzWuL2GlxVmd04SMMjl5I8N3ljexWSb/Pl0773zHwu5Nr2tj9r7FXDw4nEjESrI8Ugd0EZMhLMY1VWRrPdhGAupsg1IFgNrwmJWVFkjYMjqrqw5MrC6sPIipGawudAOZNa3tXb+H2RhYhMe8saIkSe85RQtlHRR4nQfIVxbe3fjE7RJDNw4ekKHu+Wc83Prp4AVqqVow+Z0MHw6ridVpHv6dzq28Pafg8LdYycQ46RWyA+cp0/LmrQdq9rWNlJ4IjgHTKudviz3B/KK0ClU5V5y8D0VDhWGpbrM/H02M5it8cdKbti5vwuUHySwq1G8GL/AOKxH/Nk/wC6sbStWZ9y6qNNaKK8jO4XfLHxe7i5vxOXHye9bJsvtcxkZHGWOdetxkY/iXuj8tc+pUlUmtma6mDoVPegvI7/ALv9p+CxVlkY4d/CW2Q+kg0/NatzMqhc1xltfNfS1r3v4WrybWVwe8mJigkw6TNwZFysh1ABOuW/u31Btzua3wxT+JHJr8Di3elK3g/6MjvfvbLi8a08cjoqNaCxIyKvJgOhb3j625AV6E2TjBPBFKOUkaP+ZQ39a8q16H7KsbxtmQXNymeM/hc5R+UrWcPNuTuR4zh4woQcVtp++Rt1KUq4ecFKUoBSlKAUpSgFKUoBSlKAViJNqSOWOHjWREkEbMzlSzBwkojAUg5O8CSR3lK6WJH3ejAyz4d44GKSGwVxI8eS5sXJjIZsoJbLcZioBsDesbtHdt48MmGwUkkUef2pWU8XJkb9m8gcKxfITyuM+oJ1A2isXtPeLC4aJpZZ41RVLE51JNriygG7G4tYak6c6xOE2DLGES2eItLI6SS6GQhBGCqxhREAH7igjNYm5JNQbI2biElV8TCJSATmj4S2n4jhpcpYeyEfDVNSwGfMLm9AbTgcVxI43ICmRFbLmDWLLmyhl0a2uo0Nr1KsykkBgSDlIBGjWzZT521t4VrWK2fjGmmlURZ1V0wpkZmjiXJo3DABMjtozEjKoUAHvZmH3ZBbDq6nhwq8pYuRLLi5bq8jNGRrlMhPQmUWtltQG0VTJIFBLEADmSbAepNalNu5PJiC8ksrIroYlEoCJHGwZOcZkDmxDNmJa51ANhsW2opHw8qw5OKY24fFF04lu4WFjpe3SgLfBbwQz4h8PC6SNHGryFGU5CzWRbDmTZifDu394Vla1fGbLmfCrBhhJhRntKweMTshVi7xyrnHEaTKSzC5GbkSDXyDYrRQPE8JxEUrOZYmdS3eVQMgOSNV7put9S2a5NwQM0m2cO2a00ZymzEMMoP8JbkG0Ol71jNgnB4xpJoI4nWOdgsiFWVpQoLzKF0VszMua1zYnUMCbefZE/BCZcycVTweJnkTDhCrRxzSWu7G17kWVnAbkayeO25BhEi43sc5VEjOXMNQvJCQFUWJINgPOwrDaSuzDaSuzjfaxu9iIMS08jtLFKe5If3OoiIGi26dCPO9aLXqzaWAjxMTxTKHjcWZT+vkQdQRqCK5DH2RSnGFDJbCjvCXTOVJ/Z5f4/O1uv3ap1aDzXj1PUcP4pT5WWq7OK816nP9kbHnxb8PDxtI3gvIDxZjoo8yRXTdg9josGxkxv8A5cHT1kYa/BfjXTNj7IhwcYigjCIPDmT4sebHzNX1bIYeK97Uo4rjNWo7UvZX3/f25rGB3A2fCNMMjecmaT/WSB8Kv/8A6rgf+Dw3/Ji/7azFK35IrocyWIqyd3J+ZrOO3A2fMNcMi+cd4/8AQQK03bvY6ti2EnIOpyT2I+EigWHqD611PEy5EZrFsqlrDmbC9h51523q37xW0CVZuHCeUUdwtvvnm59dPIVprcuK1R0+GvF1ZexOyW99fsa7i8OYnZGykqSDlZWW48GUkH4VFSlUD1S21Fdk7CcbeHEw/wAEiSD8alT/AKPrXG66B2J43h45oydJYmAHiykOPoGrbQdpoocUp58LPw18jutKUrpHixSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlaVvzv0mCBhgs+Itr1WLzbxb7vz6AwnOMFeRCpUjTjmkzIb473xbPS2jzMO5GD/wBTn91fqenUjiG1tpy4uVpZmLOfkB0VR0A8KgxWJeV2eRi7sbszG5JqKuRXxEqr8Dg4nFSrPwPQu5m1fteDhlJu2XK/86d1ifW1/jWbrlnYztWzTYYnmBKnqLK/0yfI103G5uG/DZVfK2VnBKK1tGYAglQdbXHqK6lCeemmdrDVOZSUiavl65fs/aGJxEacLGTzYuWbPHlEaxRYMTWE08aplRHjBIViXbMAORttW39g4CFZsXLHwWVWkkngZ4pdBcnPEQWPlrfzvW43mz18BrV9ibQxEDYePFZnTEKOFJIFE0cvDMhw2ICAIzZVYiRQAchBANi1tvFsLBYKF5443gkLKE+xMYpJJpGCRoFHccsxAs6svUiwoDcqwO0tzMDiCTJho7k3LICjE+JZCCa+7Jx00c32XFEO5RpIZlAXjIhVXDoNElUsl7d1g1wBqq52sNJ7k4VJwd4tr5HPcf2RYJ9Y2miPgGDL8mF/rWuY7sZmH7HExv5SKyfVS36V2Qm1UF/AfE6VqlRpvoW4cVxNP47/AD1/08+47s02jF/giQeMbqfoSG+lQ7pYafA7QwzzQyxDiqhMiMotJ7Mm7DwavQ2a/Un+Uf1pkv0+ZrVyFe8Sz/OVJQcJwTTVu3qTUqHh+Qpk+78jVm7OLmfYmpUN7dSPXWqg59fT+1MxnMSUr4rA8q+1IkKUpQClKUApSlAKUpQClKUApSlAKUpQHOd/9/uCWw2FPtBdZJf4D1VPv+fT15cmZiSSTcnUk6kk8yTXZ9r9meHxEzy8SRM7F2UZSMxNyRcXFzc/GsBvT2dwYPCSzpLKzIFIDZMpu6rrZb8j41zK9GtNuT2Rx8VQrzblLZHNqUr6BflVA5hlN1tqfZMXDN0Vxm/kbuv9Ca652i4tWhTCmcQDEsFkkJy2w3OURuQVMjCyBednJsbVw6u+dnu1ftOBiJN2QcJ/G6WAJ8yuU/GujgZ7w+p1eG1N4fU1TD7Ow2HMZ2bFNhIo5YjNipGmhhaMOAyGKU3xLOO6GKZRmuGFrVs282Oi40AmmhGHW8rRA55p5kKmFFhUFnVTeSy3JZE6A32eRAwIYAgixB1BB5gjrUGD2fFDfhRRx358NVW/5RXROsa8cQ+InhmxA+zYeOT2CSkLLPOyMiu68o0Cl7Ie8SbkLlANO1dpxLjFaaWN0iQNh8PDeadp2zK8phQFu6hCqRoOI5PS20YiBZFKuqup5qwBB9QdDVGFwkcQyxIiDwRQo+QFAYbZWGmnxAxeITghUaOCAkM6q5VpJJipK8Q5FAVSQoB1JY2zrP0H/gVS0oJIBGnveWl7etiPnUOAl4qZspUZnXKbE3RyhuQSDqKi32It30RKBfz8zy+AqsR+OvrUD45FCFrjO4RVIIYtroFIvyBPoCeVXVFEKKFKUqRIUpSgFUlB6elVUoYauRMvj8xzr6Htz5eP96kqhk8PiPGo2tsRatqiulRK1vT9KlrKdySdxSlKyZFKUoBSlKAUpSgFKUoBSlKAVgd/Ic+z8SPCMt+Uhv6Vnqgx2GEsbxtydGQ+jKQf1qMleLRGcc0WjzNWX3RxHDxuGbpxowfRmyn6GsXNEUYqwsykqR4EGxHzqlWIIINiNQfAjka4MXlaZ5iLyyT7HaN6ezmDE3eC0Ep1IA9mx81HunzHyNXvZ9uzJs+KRZXVmdw1kuVUAW5kC5Pp0FZzYe0RisPFMv76Bj5N+8Pgbj4VfV2o0oZs6R6KNCnm5kVqKUpW43ioMa7hG4QUyZWyByVUtbTMwBIF7a2PoanNW00qqCzsFW12ZiAFXzJ0FRbIyZgNnbBxCEOJwpZSHFi4zsys8wvlzyG2UFhlUBQqgAhrw7DYNK6SMj8JYoTnkZVyhzxZI8wEjl5GJvzCrrevmF24JrSwyRHDiRo+RdpCoIJjKt/FyGVswFxowNXk21AEZ1swAUKuocysbLGVYd0klRrbnWUjKVjHPsJuNNKqQ8QplgnYZpIyI1F3BXvNnUEtm1AUW7ut5u/s6SBW4sjyM1tZJeLyHT2aBfgLenKpBtRYkBxMsK3bhqwbKrOqXkWzHQhll7tzYLzvepodqwuwRJFYnll1B7ue2YaXy9617215VkyY87NmM6SMUIWWRj1bhlWWMJmX2drrcLqx1zWupzlYDeje/DbOX2z3ci6xJq7edv3R5mwrle2u1vFykjDqkC9DYSP8WYZf+mtU6sYbl3DcPr4hXitO72O50rzPid8sfIbti5x/I5T6JarjBb/bQitlxTtbpJaS/qXBNa/+qPYvvgVa2klf6npClci3f7YTcLjIRb/Mhvp5mNjr6g/CrPfPtEL42A4WVhh4TGzFCyiUkhnzDQlQvdsRzzeNT58LXKseFYjmZGrePQ7TSvgNa9i9vSjFiKKIyRJ7OVlBJE7xmVEuNEVUCks2ntkA1rcc0z7r1HxHiK+Rm2nTp/atb2Jt1+E0kziXiSZ0yBVjSCRxHh1Vie+XsGA1ZjINFBAEMG8iFpMRdjh87RK+uRTEzq3DQXaV2kvqoy5FGoIIMWrakGrO6NupVps7HieISorWObRhlN1JU89CLjQg2IsQSDesVFtxwkmIlTLhwi8IKeJJM5JF1VRrm7gQAnNc+IqRM2Cla3HvQkKhMTnE2l1Cg5mKcQhAp7qqGUd/KdUHvML7EjXAOuoB1BB18QdQaAqpSlAKUpQClKUApSlAKUpQHC+07ZJw+OdgO5N7VfU++PXNc/iFanXde0bd/wC24UlBeWK7pbmwt30+I+qiuFVxsVTyVH2Z5/G0eXVfZ6nTuyDeAAtg5DzJeK/j++n+781dSrzHh52jZXQlWUhlYcwQbgiu67j72JtCKzWWdB7RPHpxF+6fodPAm3g66ayPfoXsBiU48uW62NnpSlXjpFEvh4/p1qKbDiVHUkgOCt1NmAItdSOR63qqQ6n0t86j2jiuDE8mncUt3iQLDzAJv5AG9RWrILVkcmy0IjAugjUooQ5QEKhco6roALrYjodTVvs3d6HDrGqA2jbMtzzYRCBWIAANowFGlrCrBttS4b9vG8s0pLrDhwXEMaqBlZ+VywPe5Fm6AXF5jdrOHRUChHYJxSQ/tcxVouErBrixuwJC2JIsDUiZVLsGAWfK2aOKSOMhmLRiS5kdL39q38fvH4m+OwmzUMo+yiSJEinszrIESWdlYZIpbAkEOxFrC9upAmwe12yNjMTJFFhRGDHlYsCpIPGZyBfNoFUC9vN8q8l2x2xyS7QgaK8eCilGZf3pkN0d3A6BSSE8QCbm1sNkoxb2Nf3n2ViYcW8WJzPMzA5tWMuY2VlPNgeXwt0tW47s9kk0wD4t+Ap1Ea2aT8R91PqfECuxyYOOR0kZEZ0vw3IBK5hY5W6XHhVxWiOGje71OvV4zVdNRgsr6v07GlYfst2cosY3c/xNI4J/IQPpVntjst2dkZwz4cKLl+JdAPFuJfT4iug1iN6N3otow8GYuq5g4MZAIYXA5ggjU6EVsdONtEinTxtfOs1SSXn9jzbtjCxwyskUwnQcpFVlB8e639LjzqzrreO7GOZhxXosif71b/bWuY/sq2hH7qxy/wD5uAflIFqjKjNdD1FLiOGkkuZ56eiOzboY3j4LDSXuWhS5+8Fyt9QaySYdQCAoAYsWAFrlveJ8Sa0zcFJ8Jst0milSSDjEKFzOwtxRw11DkliABzItV0MRPAA0ZOJlnuzyFSY4RGAFiVY0BIu2isQT7Rr37p6EHeKPIYiKjVkltd2M/LsaBhlMS27lrd3LktkKlbZWFhYixFh4VSmxYlDhUFmdZAumVHWNYwYwPc0UcvE+JrH4zGzM8aoSLlFkjjRg4JIzSCV1K8LKfBTobNm7tV7BjaSRp5JWZgGjWJlVOEhYXLDKGztkB1NgLAXsWaRpZl4Y1HdAGUi9unnUcGzY0CBV0Q3QEkhDlKdwE93ukiw6E1htp4/ENK0eFykoLEsjECVz3QZLhQijVgLt3haqhtty65g0YdHIzRtlQ5lVA4NmZtczZbKoDAk2zVGJGJlv/i4sxbICxLHMbk962YX52OVdOXdHhV2BbQVrmGxs4icvIRIWypI8TGE5QCSkYCuoa7AZi2oFi4sDldiO7RBpM+Ylj7S17ZiF0CLYEAEAqDrqL3qRIv6UpQClKUApSlAKUpQClKUArjvadukcO5xUK+xc98D/AA3PX+Vj8ibdRXYqjnhWRWRwGVgQykXBB0II8K1VqSqRszRiKCrQys8x1Ng8W8LrJExR1N1ZdCD/AO9K2/fjcR8GWlgBfD8z1aLybxX73z8TpVcacJU5WZ5+pTnSlaWjOu7q9pkcoEeMtE/LiD9m3r/Afp5jlXQIpVcBlIZTqCpBBHiCOdeYqy27u0MTHKiYWV0Z3VQAe6WYgAlDofiKt0sbJaSVy/Q4hJezNX/J6E6/i/QVI6BgQQCCLEHUEHmCOoqKIWsCbm5ufE256VPXRidWBbrgYgAojQBfdAVbLfnYW0qw29tHDbPikxc4VAAAXCjO55KgtqxOgt+gFZerPauy4cVGYsRGssZIJVxcXBuD5HzqRM8t78b5SbSlNkWGAMWSFAAL/wCZJb35PM8rkDmSdYrtPbluvhcHg4Hw2HjiJnyMyLYkGNzYnqLiuYbn7vnaWJXDLII3dZChYEqXRC+U21AIB11t4GtbWpdhJZbnozsm259t2ZAxN3iHAk1uc0dgpPmUyN+Ktin2qqyGIJK7gA92N8mvIcVgI7+WbSuadi2w8ds6fFYfEwskRVXElwYzIpy9xh72ZTfyyC9q6Pt9JZEWKIEcVskkgNuFFYmRhqDmIGQEcmcHkDU0VJpJ6Fkm2cTPAk2Ew0bLIoZRPNwmKEXVgI45AQRYjvDQirzCbX4yPwk9sg1ikbLY3I/aKGDLcMMy5hdSOYIEe08Two+DCHRgqKhSGV1VCcpyFFK5lUGwOgOW+hqzwi8F43aFoY44XhgiRGlYKTGWMpiDZfcUAAnkSTcgDJEyOE2uGk4UimKXkASrK5y5iEdTztc5WCtYE2sL1d7QxBiikdVzlEZgt7Ziqkhb2Nr8r1gdm4GWQIGTIDKuInlYZXnmFiBGl8yICqreTvBIwljfMNgxjARuTyCtf0saw9jD2OQ7Q7VMU/7KOOIehdvmbD6V2DDyh0VhyZQw9CL15iFekd31IwuHB5iGIH14YvVLB1Zzcszuc7AVp1JSzO5kKUpV46RaQYZYlyJewF9SSSbkliTqWJuSTzJq7qKTmf5akWorchHdn2lKVImKUpQClKUApSlAKUpQClKUApSlACK0Lens1ixBMmGIhkOpX/CY+g1T4XHlW+0qE6cZq0ka6lKFRWkjzltrd/EYM2niZR0fmh9HGnw51sXZNsvjY3iEd2FS342uqj/Ufw12l0DAggEHmDqD8KtcBsqHDljDEkecgtkAUEi9tBp1PzqrHBqM1JPQpQ4eoVFJPRE3X8X6ipqikGvqPqKkBvVuJeju0faUpUiZpHbLso4nZU+UXaLLOPSM98/kL15z3W2wcDi4MSATwpFYgcynJ1HmVLD417BkjDAqwBBBBB5EHQg15O7Qd1m2XjHhIPDJLwsf3oidBfqy+6fMX6ioS7lii07xZ6vw06yIroQyMoZWHJlYXBB8CKkrg/Y92kphlGCxr5Y7+xmY6R3/AMNz0S/Jul7HS1u7qwIuNQdQR1FSTuaZRcXZn2lKwu9e8Uez4DI+rHSNOrv/AEUcyenrYUlJRV2a5SUVd7GarWe0Xaww2Bl178oMSDrdxZj8FzH5VrfZ7va7rjJsbP3EMTDNyUvxLqi89co7o8K0jfPeVtoz57FY1usaHovVj946X9AOl6qVcTHl3W7KNfGR5N47vb8XMVsvBHETRxLzkdU9MxsT6Aa/CvSiIFAA5AAD0Fcs7It3SWOMkHdF0hv1bk7j01X4t4V1WmCp5YZn1HD6TjTzPqKUpVw6BDJ19APnU1QjW3mb/AVNUYkI9xSlKkTFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAolHXw1pEeny9DVdQ8j6fUeFRejuQejuTUr4DX2pExWu787ow7Vw5hl7rjvRSgXaN/HzU8ivUeBAI2KoYcXG7MqOrMtsyqwJW9wMwBuL2PPwNDKdtTyPvTuvidmy8LEpl55HGscg8Ubr6cx1ArL7k787QwbxwYaTiK7KiQzAvHmZgqhdQyC55KQNa9ObT2dDiYzFPGkkbc1cAi/Q68j5860rZnZLg8LjYsXA0iiNi3BYh0zZSFsx7wsSG1J5VHL2N/NTVpI3Lau00wkLTTsAqjW3VuiqOpJ6VwLeXb0mPmMsmg5IgOiJ0UeJ8T1PyruO827MO0EVZi4yklSjWsT1ym6n4jxrne1+yqdLnDyJKP4X7j+g5qfmKp4uFWekVocXHQrT0ivZOe3rcdyNxpMawklBTD878mk8k8vvfLywU+zsRgZVaaArkYG0i3jYg3tf3WB8jXf9i7RXFQRzILK6ggHmOhX4G4+FV8NQU5PP06FXB4aM5vP06Fzh4FjVURQqqAqqNAANAAKkpSusdwVRIdPXSq6hLX1+A/qaxJkZPQqjGvpoKkqzwm0YpFLJIrKt8zA6AC9zflbQ68tDQbTjsxJZct7hlZSbBdVVhdveUadTbnRIylZF5SrCTai5SUuT3Qtwyq5a+XK5HeXQkkXsovVKbbhZBJG4kVmyq0feUta4Gf3QCLWJIBuLHUVkyZGlKUApSlAKUpQClKUApSlAKUpQClKUApSlAKpdb+vSqqUD1Ika3p+h/tUtUOnUc/1qlHt6fUf+KinbRkE7aMwG9iSOYgyr9lRlacvds2YlEsgYBlQkO2fS1iA1iKpbENh8SIoYC5YRCSeVgt1DWCIoGqqpc2QZQ1xYZmYbKbEeIr7UiZqZkkxCSzYqCMx34UMedyB7QxtMxaJSoYm+cAkIoI943lh288hljDxxMhIDzKY8x5BVjZr8xe5PutGbEODWz0oDWsRM8syxtOAsYjlKIlnxDLZ7JdrtHdSTlGtwt9GubeGXKHESnMrEIpdmQ5SYxIcoUMz5UyXuC2hIBNbLSgLfDB2S06pmtZghLKdBf3lHW+mtTIgUAAAAaADQAeAFVUoBSlRO9/Tx/tWG7GG7HwyX8vH+1UpDfnyNxY+B6VXHH1tbwH96lqKV9WQUW9WQLg4wpQIoUgAqAACAoUCw6ZQB8KhfZqF1c65AwAJJ1a1yxJ7wsOR0vrzta9pUzYWwwMdrFQQLgBrtYEFSBmvYWJHoafYI9O6NPXobi462Oovy6Vc0oBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBVLJf18aqpQNXIeXl+h/tVQk8fnzFSVQY/DT0qNmtiFmtioGvtRGM+R+hr4SR4j5GmbuM1t0TUqDieZ+QoGv4/QUzoZ0Tk1RxPDX/3xqgIfAfHWq+H4m/6fKl2xdsoJv5+Q5fE1WqdTz/T0qsClFEyo9xSlKkSFKUoBSlKA/9k=" width="481" height="302"> <p>First, start with an integration test for your feature – a test that will fully test the behavior of your feature. Some might call it “Behavior test” as in <a href="https://dannorth.net/introducing-bdd/">BDD</a>. I think that is just semantics. <p>If you are fixing a bug, your tests should create the environment where this bug is recreated and test that the bug is prevented before you’ve actually fixed it! You want to be sure that you are able to reproduce your bug. Only then can you start actually fixing it by writing the tests first. Same goes with a new feature - first an integration test that checks the behavior of your feature, and only then begin to implement. <p>This way, you begin with the business goals and stay focused on them while you implement the whole feature. <p>Another great benefit in starting with the integration test is that you will have to create the setup for the feature. Doing so will make you truly understand how the feature works and on what it depends on. This is crucial before you start to implement, so you won’t make unnecessary mistakes. <p>It’s not easy: it requires strong testing infrastructure and patience – it’s hard to hold back the lines of code you are just dying to type. But it is so worth it. <p>If you want to easily write code at your company and not be woken up in the middle of the night to solve a bug in production, just write the tests. Better yet – <b>start with them</b>. Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com2tag:blogger.com,1999:blog-7296668432246169944.post-47016003968149285352015-11-15T22:00:00.001+02:002015-11-15T22:00:52.828+02:00Local Images in React-Native IOSLooks familiar?<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://i.stack.imgur.com/SvCdg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.stack.imgur.com/SvCdg.png" height="400" width="233" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
There are several ways to use local images in a react-native app:</div>
<br />
<br />
<ol>
<li>Using xcassets folder - <span class="pln" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">source</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">={</span><span class="kwd" style="background-color: #eeeeee; border: 0px; color: darkblue; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">require</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">(</span><span class="str" style="background-color: #eeeeee; border: 0px; color: maroon; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">'image!bg'</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">)}.</span><span class="pun" style="background-color: white; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;"> </span><span class="pun" style="background-color: white; border: 0px; margin: 0px; padding: 0px; white-space: inherit;"><span style="font-family: inherit;">The images must be in the xcassets folder and according to the docs you should have the image in all the 3 sizes.</span></span></li>
<li>Relative path - <span class="pln" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">source</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">={</span><span class="kwd" style="background-color: #eeeeee; border: 0px; color: darkblue; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">require</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">(</span><span class="str" style="background-color: #eeeeee; border: 0px; color: maroon; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">'./bg.png'</span><span class="pun" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;">)}.</span><span class="pun" style="background-color: white; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; font-size: 13px; margin: 0px; padding: 0px; white-space: inherit;"> </span><span class="pun" style="background-color: white; border: 0px; margin: 0px; padding: 0px; white-space: inherit;"><span style="font-family: inherit;">Note that you have to add the file sufix.</span></span></li>
<li><b><span style="font-size: large;">The way it actually works</span></b> -<span style="background-color: #eeeeee;"> <span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; line-height: 22.4px;">source={{ uri: "google", isStatic: true }}</span></span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; line-height: 22.4px;"> </span><span style="background-color: white; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; line-height: 22.4px;">instead of </span><span style="background-color: #f3f3f3; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; line-height: 22.4px;">require('image!google')</span><span style="background-color: white; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; line-height: 22.4px;">. This way you can use both images that are in your xcassets folder and those that are not without killing yourself while trying to find the right relative path.</span></li>
</ol>
<br />
<div>
<span style="font-family: Helvetica Neue, Helvetica, Segoe UI, Arial, freesans, sans-serif, Segoe UI Emoji, Segoe UI Symbol;"><span style="font-size: 14px; line-height: 22.4px;">If you got here then you've probably started to use React-Native - don't give up yet- it's awesome!</span></span></div>
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com4tag:blogger.com,1999:blog-7296668432246169944.post-6475501793934377812015-11-01T14:57:00.001+02:002015-11-01T14:57:50.078+02:00Great Use of Space - Not!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgESxsB0kCVjUlGfvGMD79qzVOdci0gnwZ9V8Vra4AilG1quvqKJfITmGiyjbOAo88vTCLVWIzgvlmn_GP0_l96bCcr331ZRE4vrHVtRNSRg82v1kgSpB9NLY2k39xVz2G4LNgL80d15Xc/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgESxsB0kCVjUlGfvGMD79qzVOdci0gnwZ9V8Vra4AilG1quvqKJfITmGiyjbOAo88vTCLVWIzgvlmn_GP0_l96bCcr331ZRE4vrHVtRNSRg82v1kgSpB9NLY2k39xVz2G4LNgL80d15Xc/s640/Untitled.png" width="640" /></a></div>
Great use of space...<br />
#WhatIsUXDennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-84343070770127683412015-10-28T23:35:00.001+02:002015-10-28T23:39:25.836+02:006 Ways to Make Your User Smile<p><font size="3">In the past few years UX gained focus targeting simplicity and clarity in the user interaction with the application (mobile and web). The long registration forms have almost disappeared, the office like toolbars are gone and so is the load of unnecessarily information on a single page. The important buttons became larger and more noticeable in order to guide the user for his next action. There is no doubt that these changes improved the user experience with the applications. The absence of this UX principles became a major factor in the user’s consideration for choosing a certain app over another. </font> <p><font size="3">Simplicity and clarity became common UX practices along the different apps. The user has a variety of application serving almost the same purpose and he is free to choose whatever he likes. So how could your app be special and become the users favorite choice? The answer is quiet surprising<b> - </b>your app must be <b>fun</b>! </font> <p><font size="3">The user should remember the interactions with your app. It should make him smile, it should make him say “wow!” and sometimes it should even make him laugh. If the interaction is special and exciting not only it will make the user to come back it will also make him kindly tell his friends about that “super cool” app that made him laugh and that <b>they must try it too</b>. </font> <p><font size="3">Do your users have fun or are they excited when working with your app? Do you have a user story in your backlog with a “<i>should make the user smile</i>” definition of done .Take a look at these 6 ideas: </font> <p><font size="3">1. Animations </font> <p><font size="3">2. Easter eggs </font> <p><font size="3">3. Predict the user actions </font> <p><font size="3">4. Gamification </font> <p><font size="3">5. Since you’ve been gone </font> <p><font size="3">6. Interaction as a relationship </font> <p><font size="3">Let’s dive in: </font> <p><font size="3"><b><font size="4">Animations</font></b> </font> <p><font size="3">An <i>animationless</i> app is a boring app! The users expect live interaction, moving objects, flying adds and real life behavior while they are interacting with an application. Take a look at </font><a href="http://famo.us/integrations/angular/#/intro"><font size="3">famo.us</font></a><font size="3"> framework which allows you easily add animations to basic content pages and make them look awesome. Try to imagine how should the page/dialog/alert/form interact then it appears or disappears. Slowly fades away, moves to the right until it’s gone, falls from the top, increases font size, changes color and many more. Don’t push it – be cool. </font> <p><font size="3"> </font> <p><font size="4"><b>Easter Eggs</b> </font> <p><font size="3">Easter eggs are unexpected behaviors when the user does something in the app.. Take this logo for example: </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYUv7ZEV9mwgQZBkIUaoDojCwl_bHIIClAIdutr9hCOpyQB-6oGgdxf880X3UZCk48w_C2omzjO18EheV8dGeoiVxNRzB72gtIEYXT7k_IWEDu1S-vxQPA8WDVCEjnBV78Ic9_saCxMTI/s1600-h/clip_image001%25255B3%25255D.gif"><a href="http://lh3.googleusercontent.com/-uh8UjYCpXfo/VjE_GLWKR-I/AAAAAAAAOUg/iNfgCQY89UE/s1600-h/clip_image001%25255B4%25255D.gif"><font size="3"><img title="clip_image001" style="display: inline" alt="clip_image001" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOS6DxAdqCggboH4Pz2Zj2mzTRqkH5Ih6Z76-mnwOTVYuyFMgFFQ6-agK3Wkm5P0bM-DUffNRHkuczQJBhIziI1MdQbBFAr-hOdPuJDufP4cR3_cbr05eeGTkPymajRaDzLZR_IGcQQIw/?imgmax=800" width="422" height="241"></font></a></a><font size="3"> </font> <p><font size="3">That’s just cool! I found myself spending few minutes watching the dinosaur does “raar” when I hover the logo. It is so easy to create and it will certainly make your user smile. The </font><a href="https://en.wikipedia.org/wiki/List_of_Google_easter_eggs"><font size="3">best Easter eggs</font></a><font size="3"> I know are actually on Google. Try typing “<i>zerg rush” </i>or “<i><a href="https://encrypted.google.com/search?tbm=isch&q=Atari+Breakout">Atari Breakout</a>”. </i>Another possible and pretty cool Easter Egg is the error page. An error page is the worst thing that can happen during the user’s interaction. So we almost ought to make it fun. </font> <p><a href="http://lh3.googleusercontent.com/-Ahb-kTT_M-4/VjE_MpZSYpI/AAAAAAAAOUs/z8iucq1flbE/s1600-h/clip_image003%25255B3%25255D.jpg"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibeDmhSKvWMbyFaB4E-fw2c2imuNJ0HI9m7Q-4CTFVpv6nS9aTUdyqJykrRd5eBnjzodfCpgyKXhUDwWDXhagc2XhMYQnAGF-rIz8Hp5tXjxKOi18wo8jZUvGP3bFoDE-alZoHChH3P-o/s1600-h/clip_image003%25255B4%25255D.jpg"><font size="3"><img title="clip_image003" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image003" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOOu95d-bdRASAVQ0eETl_j9GnQDkSUBS7TdSyyhIGL-_uQAEPdAQgEnsshdkqr8LIqLCJb5VpPh7h_cRQIi2f1RfFCuqLxcnOkpOdot1Ii7QBM57oiQlYjwY7eZYEDKFMUg7DJ_PXmCc/?imgmax=800" width="471" height="368"></font></a></a><font size="3"> </font> <p><font size="3">Take a look at </font><a href="http://www.hongkiat.com/blog/60-really-cool-and-creative-error-404-pages/"><font size="3">this</font></a><font size="3"> site for some crazy ideas. </font> <p><font size="3"> </font> <p><font size="4"><b>Predict the user actions</b> </font> <p><font size="3">Which app will you prefer? A regular one that just allows you to do stuff on it or a smart one that seems as if it thinks and tries to understand and get to know you? The users want the second one. </font> <p><a href="http://lh3.googleusercontent.com/-EVpyRBSgUDk/VjE_RPrnIqI/AAAAAAAAOVE/AWCzecS1TWU/s1600-h/clip_image005%25255B3%25255D.jpg"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqzrhX4jFB1tbkJ2zbejLfLUdw3iZT4t_SkCmtIq7mvsph7nvdLhThh6LSzoUFFcv7dCGOzPXwW8XpVhXE6K05Pe2det-urjsQ_bf9W0IvK5villOx3M9EZQMxUyosgq-ivYbn-IqBn74/s1600-h/clip_image005%25255B4%25255D.jpg"><font size="3"><img title="clip_image005" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image005" src="http://lh3.googleusercontent.com/-oE00-w18wjM/VjE_UCbjxmI/AAAAAAAAOSI/PSvDx-miw58/clip_image005_thumb%25255B1%25255D.jpg?imgmax=800" width="228" height="390"></font></a></a><font size="3"> </font> <p><font size="3">Are you familiar with Waze? </font> <p><font size="3">When you open the GPS navigation app Waze in the morning it automatically asks if you are driving to work and in the evening whether you are coming back home. That’s just adorable, it’s like it knows me J </font> <p><font size="3">Think about the waze (I meant ways) that you could predict your users. If your app allows them to order something then perhaps the next time the user logs in it will automatically redirect him to the order status page and focuses on the user’s order. </font> <p><font size="3">Try to make the users think that your app cares about them, tries to learn them and to save them time. </font> <p><font size="3"> </font> <p><b><font size="3"></font></b> <p><font size="3"><b><font size="4">Gamification</font></b> </font> <p><font size="3">Everything is better when a game is involved. It’s human nature to try achieving a goal or a target. To try being the best in a group. So when the users have goals, targets and achievements to unlock they will want to do them. This way you can make them use all your app’s features while you guide them towards some achievement, stay longer online and insure that they’ll come back for more. </font> <p><font size="3">You can add levels, prizes and categorize your users. You can present them gifts when they level up or unlock some sort of achievement. Let’s say you want to give some user a coupon or a discount for his next purchase, so why not making then answer a trivia quiz or play a minified version on candy crash inside your app in order to win the discount (you can give it to them even if they lose)? </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHoahoUJKLx1ZhlwxKpDkoaqgWCeX-oJRIygUVRLHI7YLlCFhk-9o6Q0t4Sb3ytJyaRfA5BiuWOMOg4aq9_B-bsqqVyoBwCdy9EjhVd7gWHfvTFazdhDip3LN3Gi6KmZznehakja1JTyc/s1600-h/clip_image006%25255B3%25255D.gif"><a href="http://lh3.googleusercontent.com/-9IVcal_lFxM/VjE_V-7572I/AAAAAAAAOVk/OydN5xMf-Ww/s1600-h/clip_image006%25255B4%25255D.gif"><font size="3"><img title="clip_image006" style="display: inline" alt="clip_image006" src="http://lh3.googleusercontent.com/-tcW0lwhR7fw/VjE_ZereEpI/AAAAAAAAOSY/H7qwclHKpzQ/clip_image006_thumb%25255B1%25255D.gif?imgmax=800" width="575" height="299"></font></a></a><font size="3"> </font> <p><font size="3">Linkedin ranks you profile, the more details you add about yourself the higher your rank is. </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCQq3hbLSoJHGJqTXp9KoCGLpcKVtRbDbOGiu-8aHByydZopWyh0OFRlSQnO8JGDHUMdQzI3E4p8CRT9SU_zfVd3WuDq8Ax4wmYaER1B0iuOggZDPn0YiPWSdMwfJfUByFe10myEkF-5E/s1600-h/clip_image008%25255B3%25255D.jpg"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbPBzwtg9AnIL29i7hk-d8ymIz5HjPovYUYC2GH8BIZ_MIwNj9G_fJX3kTeo48E0HX3okcflWGDIl8-_blT10VawTT7CyTdThyhHW4giXrSXIkw0SJ6ZSoMyKQO6muq3E_i01jV2kCNaY/s1600-h/clip_image008%25255B4%25255D.jpg"><font size="3"><img title="clip_image008" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image008" src="http://lh3.googleusercontent.com/-hAN0g5T5VAU/VjE_eU4zMRI/AAAAAAAAOS0/5ZugQMJfqcM/clip_image008_thumb%25255B1%25255D.jpg?imgmax=800" width="528" height="290"></font></a></a><b></b><font size="3"> </font> <p><b><font size="3"></font></b> <p><b></b><font size="3"> </font> <p><font size="4"><b>Since you’ve be gone</b> </font> <p><font size="3">Nowadays almost everyone is doing continuous delivery. You add new features and change existing ones on a daily basis. How would the user know that his favorite app has a new feature or better yet how would he know that his favorite feature has changed? </font> <p><font size="3">You want to make the user feel comfortable with changes. Take a look once again at Google: </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggdbTynaE3VZY_mu0hP73WJAivKGbQkE02dbX3eZ3PU1XV4GwTAeuepSQOw23O3ULZd66ecu4cFsyKmVHPktLrwycEr31N_CZgNcpMXd-AJQ21MkvFI0PkY0bzGzIDU0fTTb_c1CdyH_A/s1600-h/clip_image010%25255B3%25255D.jpg"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3m8yVMux4v29OHJlSsGozfPqmFhkNPlg_QQOkntgEj3cgR_abPtmjnc4RlnK1bCbwjJ_QVauT05wG1-Lqq6DZN0hyJfi7Q7vqbSCwJRNFMgexZZMutSbJ79mNwa6ff7tSiojmBlrrqdg/s1600-h/clip_image010%25255B5%25255D.jpg"><font size="3"><img title="clip_image010" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image010" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg68lH3_Ici87Xr44lFqZvj2-XipzsHn8JAFjCYoLMqL26CTRnVoy48PZQvCPAmN46qjHNPadxfxkQQGGl7YQSs-Dwo008xkc1_IpDrKu7WmUZOWdSnpYbiTVmj2soJedMJjAzXTXmCg0Q/?imgmax=800" width="506" height="344"></font></a></a><font size="3"> </font> <p><a href="http://lh3.googleusercontent.com/-hjZvHp3PvYw/VjE_jav1ORI/AAAAAAAAOWg/99Z5mA0xT6Y/s1600-h/clip_image012%25255B3%25255D.jpg"><a href="http://lh3.googleusercontent.com/-hjZvHp3PvYw/VjE_jav1ORI/AAAAAAAAOWs/W_rDU8pJcDg/s1600-h/clip_image012%25255B4%25255D.jpg"><font size="3"><img title="clip_image012" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image012" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5z4bRBEiLGPzWvtgDoXmqS7rv8usK5TbywrSsUbrssYJoROeR3pHPEKRb6h3KQoMB3zxx8l9wI6qFnjWBMU8tZqWxYqKbI2XGyMDqYUfcaFprkhuXu4ZlNhoMO1CC28z95C4OXa3m9lo/?imgmax=800" width="635" height="256"></font></a></a><font size="3"> </font> <p><font size="3">Feels familiar? Google always keeps us updated so that we will never come back to our app and not know how to use it. </font> <p><b></b><font size="3"> </font> <p><font size="4"><b>Interaction as a relationship</b> </font> <p><font size="3">You will always remember the first kiss with your love one, your first date, first vacation and more. They were special. How about making the first interactions with your app special? The first login, first purchase, first comment, the 10<sup>th</sup> whatever. Make these simple actions meaningful and special. From time to time remind them of those special moments. Your users won’t believe it, they will adore your app and remember it for good. Take facebook’s ”<i><a href="https://www.facebook.com/onthisday">on this day</a>”</i> for example when it reminds us the stuff we did exactly 5 years from now. </font> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwO8xtcP6hlqfr_4ECXYmIShHr3ZB828k0VoUgDjoPzLc_VwDqTspuT253L4Nj0fOrRzztlP7TqsCq2IXoWfT2v93TOhyphenhyphen4tDzANYYddkyufUIyX3kXNyLp2XHdqgYymrXRrD3M97VkvXY/s1600-h/clip_image014%25255B3%25255D.jpg"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPmc09TifezCYmBXAyukMgcpJ6zdWVUA_VXxjCAB7qvquNDKok7GTDjcfyuaA5NvG7yAWMWz-iOsCwPlZR91QiBbJMcmvPqfj15N66P25G1bWhV7GrVxZEvHhAQloz95F8fryDObMG6E/s1600-h/clip_image014%25255B4%25255D.jpg"><font size="3"><img title="clip_image014" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image014" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh70U3OEhy0GrX2UPrBdbzNsiT9kJ6QYD-s2-Ez8JipYIlbnkZPFZlcX7Edg3gSeQ5WRmkeZQcA9346Jiq3yiEH3TJz6rUS_fJUdcwTMGNqgNYPNfHNj3INY5RLsdzPAEwyh_mZiQKrOg0/?imgmax=800" width="447" height="262"></font></a></a><font size="3"> </font> <p><font size="3">Special day in deed. </font> <p><font size="3">How does it help your app? It doesn’t. It just makes it special. And that’s what counts. </font> <p><font size="3">That’s my six ideas that I think will make your users laugh and smile. I’m sure that there are many more ways to achieve it. Feel free to comment and share your ideas. </font> <p><font size="3">Best, </font> <p><font size="3">Dennis </font> <p><font size="3"></font></p> <p><font size="3"></font></p> Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com2tag:blogger.com,1999:blog-7296668432246169944.post-21315508299544806362015-08-19T08:50:00.001+03:002015-08-19T08:50:52.614+03:00Creating Masked Input Directive with TDD–part2<p>In the <a href="http://dennis-nerush.blogspot.com/2015/08/creating-masked-input-directive-with.html">previous</a> post we started implementing the masked input directive. We’ve written tests and the implementation of the directive’s controller. Now it’s time to add the directive itself and of course we’ll start form the tests. <p>Testing the directive means testing it’s interaction with the UI. <b>These are your integration tests</b>. We’ll want to test the controller logic and the way it reflects in the UI. <p>First we’d like to test that the directive’s isolated scope has the provided “<em>mask</em>” and “<em>skip</em>” values (keep in mind that in a real application you would test the existence of all the DDO values): <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghWDu-McuG98N_-nK-vgs1_2UI4z1Bb9vvG658a43S6RdCwbckSeGhQrA7WEtvPN-bco6V7xRH91lh8oELFTggvHpzqDwpDENTKZq8ZmLzMrcrBjyYkX3QiKvAcPptwUYFJ7ftF7wVCvE/s1600-h/image%25255B4%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.googleusercontent.com/-d5u3X3pL22I/VdQZF-WUfwI/AAAAAAAAN0Q/e25EMGrKsjs/image_thumb%25255B2%25255D.png?imgmax=800" width="553" height="442"></a> <p>Some key notes from this test: <p>1. In order to test a directive we must <u>create a string that represents its DOM</u> (an element which has the directive attribute i.e.). <p>2. $<u>compile service parses the element’s DOM and executes the directive function</u> with the provided scope. So the <i>“element” </i>variable is now the directive with all its properties and methods. <p>3. We can access the scope properties using the element’s “<i>ísolateScope” </i>method. <p>Now let’s define the DDO: <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2djg3WEGpaLVKz-FcCbqhYS35kzQlEAvatgfjuc11RNvCMMv51GxAVQnfMWuWhOuROTsAGVJSvNJOz0fSIaddDseKK2GCHoZ2Zh-363q64_l4sKLgUe36BeuQPKfS9yjg0kpbIVOFAP0/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiga6KyJpVTXq8h1AqjhqDT-nvbu_zqYkW9D8Q_9CJfe7pgt51GkKuUHZdgyqU4Zh6dDekDpUzqlX1zFnvuSeOpLkLL_Z06GyB6o-qf9up63ARvIuAREverSIJ5CJOqRnTM8zYTcgbq_SQ/?imgmax=800" width="424" height="433"></a> <p>Then we’d like to test that the element’s value will have the provided mask value after the DOM compiles. <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjAGJfv8tyHfXOPX-J56uBAQL4ADp0-Qi_DSOOinCnbnwO7yPzcWxzxtHVyZw_H2rFP5v_eOhgEleam0FILd8SniuOB_XWKsPHsm-86HMY18JyusTDMlPdvlkXMfutq9y81cg2fnhm0tw/s1600-h/image%25255B12%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.googleusercontent.com/-pYR5H2JgGa8/VdQZH4MZiPI/AAAAAAAAN0w/wiYy6AKeRP0/image_thumb%25255B6%25255D.png?imgmax=800" width="556" height="202"></a> <p>And now with the <em>link</em> function: <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-QAhaw34CxM3SbkPPi64yWAkB8P1tX4YoKf0sBNCjKxpD8DsfWRaE9IlmtZ0OYQMHPrcdmZBVuDtM3V2pUUQs3pGX7iZL_KAZn8oFPKqSsbuNOqVEpWzPScJTO2Oq7Uzi6lOHBdJtw3A/s1600-h/image%25255B16%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEQoXa6aeT1mxTzoKNHJISRfXY-2msqv_7yhrur0pP0BDOHB7w63IepG9dk6_AKJ0t6XzyzkWluqHbDxFwbt4mJnh1G590Gr-as7aC1skleoWs60dcPn34fqQpt4uzxy5iujM0oX57bPc/?imgmax=800" width="423" height="339"></a> <p>In order to change the UI (the element’s value property) you have to call to<i> $setViewValue </i>that<i> </i>is a special angular method that is in charge of setting the <i>value</i> property of the directive element (<i><input type=”text” value=”this one”/></i>). <i>$render</i> is called for the UI changes to take place.<i></i> <p>Now we add the directive to an html file and actually see all the stuff that we were testing. Add an index.html file, include angular and all the client folder except the spec files! <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPGD1WlUGJih92MYWB7sx-i_AjvrYqg9AYXLyaNGHLH0MdYBRKJlcYG843pYkwT0HzSM9x_yfxfs9nwW3UKIkcZY_u84uepfToJM9FHpOx8horjE1aAeIqOYcA_NQNzbQumn4Pwjme13A/s1600-h/image%25255B20%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn7pCRGoATZiTz1b6ydyQUGmA46d6fzop2caWBGlVNKOecE8QJolRb3sG1ZsfCJYeTPd9qiz-g7oXHEntljZBeXfS4ycPOS6lcKkFJ2wp9ozbIt4sAxT5HbBJfRYnRgkycu-Wh1Ad0jv8/?imgmax=800" width="563" height="447"></a> <p>Run it: <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjgweDRnc22eUNt0Ookot41GVL1Mnn5hzzHJL_RI_xJ2vrwibd4fRIDTipOvCBvWsl6YyEyXPUYow_rSzEaUjNzKGSCoeQpFTsZW5bMgYU0W3GHethL-pzH0E84Marna2TLQvHMHBLKMQ/s1600-h/clip_image002%25255B4%25255D.jpg"><img title="clip_image002" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTyS45vFpael6VqrpqEM5sJLe9kZ6cytSu_9Ep3yJYyeU4CB8_-dSWD3TDLi95k8rJ-PlqhpHA2N1GNf747HBs-p5QXqS1QGDOoN7iXJuZ0lOzwZ7PbaWu9JsqHyUqQr8_mzpCFjDx8MM/?imgmax=800" width="612" height="90"></a> <p>That’s what I’m talking about! <p>All that’s left is connecting our <b>tested (</b>TDD baby<b>)</b> controller functionality to every time the user presses a key. <p><a href="http://lh3.googleusercontent.com/-KfwBSosKbdU/VdQZLgqQeLI/AAAAAAAAN1o/Y5mla3ZPNk0/s1600-h/image%25255B24%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiszn-OUcAkSlIH73bWl5Opo9jStbKJeBoNZQlyARmVS5Mc8svQAjRQScFLyh1xUEYKiImqqATgPWMzCuD2zymo_Fp-XWB6ef5nQW3DmbW7lSpYVG4Aixbfmol6iKxBV12Z-1st48WSP-g/?imgmax=800" width="640" height="452"></a></p> <p>I’ve created a <i>keydown </i>event using the private <i>createKeyDownEvent</i> method and fired it. <p>The implementation: <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3qPRT4NCCH_1F1uSo3W8gLlCdJxTdgBaThOst0KaNocdh-su06RFZqLGopcA1PPAV_1-FxkZ4d3HJ57cBGbvz3Pb7vUEGvLsG6TAnfHEOOkfSODXCsYxLLKAx2MRn6KMcXKvzLXBeFZA/s1600-h/image%25255B28%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.googleusercontent.com/-IqBPmuMBnw8/VdQZNiHEf_I/AAAAAAAAN2A/6htlgFw--iU/image_thumb%25255B14%25255D.png?imgmax=800" width="485" height="530"></a> <p>We subscribe to the <i>keydown</i> event, get the new char, call <i>editMask</i> and if successful re-render the UI. <p>That’s it! You have a functional masked input element which is <b>fully tested</b>. <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEY5oCiacBzH4tL4EMEeX_U7sOwlamvu8jlVsZFupz9BOvoS1Tujz3TSWl4Xxfm0dh-tZDUqSAuD4QWzdV1ND4SQY0pFT0dbXpL8uwPGzjRj7oa5P5JkJHxHs-OgeCCxNjxpR100Rmciw/s1600-h/clip_image002%25255B5%25255D%25255B3%25255D.jpg"><img title="clip_image002[5]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002[5]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV5P6on_THHblUVkrcZ0EpVkvbUm38FkWtXzBhXB5XHY5IN9ULokfP2D8Lg2QWR2QRzb1QvwJLI4oFith58mXak_8BzwqmpxCRz7a1tItJjtyW3ZbVGQiOLhdjegcneP4tpXQtaj2QBnA/?imgmax=800" width="440" height="369"></a> <p>As you can see, writing TDD with angular is extremely easy and straight forward. If you are not writing tests then you most definitely should! Just begin, it’s worth it. <p>Have fun TDDing, Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-84410239146117813982015-08-18T08:37:00.001+03:002015-12-08T21:26:10.061+02:00Creating Masked Input Directive with TDD–Part 1In the next two posts I’d like to show you three things: <br />
1. What is a “masked input”. <br />
2. How to create a masked input custom angular directive. <br />
3. And the cherry on top – implement it applying TDD! <br />
<b>So what it is “masked input”?</b> <br />
It allows users to easily enter fixed length input where you would like them to enter the data in a certain format (dates, phone numbers, ids, credit card number and more). <br />
Most of forms out there don’t supply the users any hints about the data’s format and make the users guess it (most of the time the input fields will be blank textboxes). If there’s a format mismatch then the user will receive an error and will try again. <br />
Using masks allow<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDIlYWIoPXwc3efv6wRtkiOBFNQhMwjqjzuhLkxVqBYXNjvm0ApTdpG6gYs8gQyMr1Qm9086razBLPphIpxuovEs6CFIFcBDB0VcDLCvDr1FiS1jIMyC-oaFCpj0-Hc_WchGBCE2zE7ys/s1600-h/clip_image003%25255B1%25255D.gif"><img alt="clip_image003" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd0T0vDEme1erRhhxpE1CNWxhIoRCD9g377pLvjl_L9NtKbnx4YHzVf5Pkn7yFd9Xrtk2j9DVYOY_SVL-Q6BVRLSu8bXdaA9emz8vHF4OML_TjrtcE9dFeGREjwOV_ByQnnvH8JcB_PX8/?imgmax=800" height="332" style="display: inline;" title="clip_image003" width="198" /></a> us to show the users the exact format and force them to enter it correctly. <br />
<b>Let’s implement it!</b> <br />
Remember that we’ll do it using TDD. <br />
So first let’s define the desired API: <br />
<a href="http://lh3.googleusercontent.com/-Fu4Znu3Xn-w/VdLELU1OriI/AAAAAAAANvc/Cg9K2byBr_8/s1600-h/image%25255B3%25255D.png"><img alt="image" border="0" src="http://lh3.googleusercontent.com/-NIX0HUbdX0c/VdLEMEJwA3I/AAAAAAAANvk/xG_HN-w-dTs/image_thumb%25255B1%25255D.png?imgmax=800" height="117" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="633" /></a> <br />
We want to create a custom attribute directive that will have three properties: <br />
1. <strong>Mask</strong> – the mask that the user will see in the textbox. These values will be replaced by the user’s input as they type. <br />
2. <strong>Skip</strong> – an array of chars that we want to be left along with the user’s input like ‘/’ in a date textbox – 01<b>/</b>06<b>/</b>1991 <br />
3. <strong>Ng-model</strong> – the associated model from some controller. <br />
Great! Now after we know our goal we can start writing code. <br />
<b>1. </b><b>Create ASP.NET Web API project</b> <br />
Add the following nuget packages: <br />
- Angularjs.core <br />
- jasmineTest – this is the jasmine.js testing framework for ASP.NET MVC <br />
- angularjs.TypeScript.DefinitelyTyped <br />
- jasmine.TypeScript.DefinitelyTyped <br />
The last two packages include <a href="https://github.com/borisyankov/DefinitelyTyped"><i>definition files</i></a> used generally for TypeScript for the 3<sup>rd</sup> parties intellisense. <b>However I found that even if you don’t write TypeScript there intellisense is pretty helpful</b>. <br />
<a href="http://lh3.googleusercontent.com/-jKbS770Sjn8/VdLEMnSosVI/AAAAAAAANvs/OgNEoaQpKTM/s1600-h/clip_image0026%25255B1%25255D.jpg"><img alt="clip_image002[6]" border="0" src="http://lh3.googleusercontent.com/-Ew6I0CNdzd0/VdLENXfaDTI/AAAAAAAANv0/9FkwvkYKLi8/clip_image0026_thumb%25255B1%25255D.jpg?imgmax=800" height="178" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002[6]" width="602" /></a> <br />
Now let’s add a <i>Client</i> directory, index.html file, <i>app.module.js, app.controller.js</i><i> </i>and a <i>InputMask</i> directory (all the angular code is style accordingly the <a href="https://github.com/johnpapa/angular-styleguide">John’s Papa style guide</a>). <br />
<a href="http://lh3.googleusercontent.com/-HWdKcAE6S-U/VdLEN6BWuMI/AAAAAAAANv8/c1T74YQjxt4/s1600-h/clip_image00462.jpg"><img alt="clip_image004[6]" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7eDdbDX9in_yZmd2vFdqucdiQ_oUrejx0dMWPCQf0w1YyzYsI1GrUHVH6JuZdDmKPbV4vSV49hyphenhyphenJ2fYjdzdZdb-Cl_WRZ59iOQmtYakC7E2ouS9YMZenEbMQaonnuRzhbaOGSFSh0-Wg/?imgmax=800" height="235" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image004[6]" width="244" /></a> <br />
<b>2. </b><b>Enter TDD</b> <br />
Before we implement the controller we’ll add a <i>spec</i> file to test the controller, we will add a basic test, let it fail and only then implement the controller and the module. <br />
Add a <i>form.controller.spec.js</i> file (this is a style guide naming convention, formControllerSpec.js is also fine). Now we’ll add a basic jasmine test for testing that our controller is defined.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOE9F74kWrTzZVB3uCqpdyMxZfW_eze21uDhDj8mG0Thz1jic65InrysKZXO_1SiNFDU52uQ0kGMpLInoZiu50qfwpXcIGGEAyuLaUJrdYefo4UtInwSvtKc4ndxXILhszX5-En51PsNE/s1600-h/image%25255B7%25255D.png"><img alt="image" border="0" src="http://lh3.googleusercontent.com/-iPaFPiO7sRU/VdLEQE6-PDI/AAAAAAAANwU/Njb1ewymCrk/image_thumb%25255B3%25255D.png?imgmax=800" height="313" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="519" /></a><br />
Nothing special here: we inject the $controller service in order to get our controller, inject it with a new scope and assert that the controller is defined. <br />
Now let’s add all the files into the <i>SpecRunner.cshtml</i> file: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1B2CIGHqOnPxM8TdXkPd7zUE9PUc83JPYBt2joTKnYWQJqwlIQt4n9PUdbfmJdhaARaP6cJr3YRhT7mUs507JAdqVpUQuwlaIIM41BJZGzzNPMaHKlhoOHBbUji66dN3jXpOKWvUPnqo/s1600-h/image%25255B11%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi15lipHudMqY-Pni4zHAwWtFvD8jeVX6aWAumK1LnxwfOYT8-7TLfwaiqI1qMNKFVpfBlsvOBc1wVJg4swQ29Jqwr1xHkNnbUjUKnz9WCUV1iU4px_lRrWKrh8Le0PqwoGKwmLIjXMCRU/?imgmax=800" height="415" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="640" /></a><br />
I’ve added angular, angular.mocks, the module and the controller. <br />
The test fails since there’s no module or a defined controller– let’s add them. <br />
First the module: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQQsRjR0s9zxa8_s2vWXGIs7zXVEjVSsYGGmFpAJfXGudJJ7sBMqQmIhAs2btj_ThoKsyB1_RBn5-Bz88C80LLGyJxvmtpP-Qk00N_U8rjYPIS0eAX69GJCk4VKdGyuoohImtSdylfrzY/s1600-h/image%25255B14%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtWzdG2BVls8c55N76IKvFYywuABsW7kbr6eSf9GJTFPnPPZQjUfbvRdTBQRT5K5udtfeTr7L8vgdJYkvFyBP91MOIEC-aEzipYk0IRTobvY6W37So800S6MMbMizNj2HdJDxc1w_5_jM/?imgmax=800" height="83" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a> <br />
I’m using IIFE to prevent my functions getting into the global scope and prevent the tests get to my private methods. <br />
And the controller: <br />
<a href="http://lh3.googleusercontent.com/-7wxe_sRKTgU/VdLES9lA9nI/AAAAAAAANw8/eF-qgIhbQ7Y/s1600-h/image%25255B18%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_pjXMza8MDWihekzI5IJF7hazb8P9xhah97tkUlrOdG8oAPankaSJ3LExQDy_dogQC47ODQelHHENqqu-MLB0_rkf0xfZbFsLl5KICKIEIhPSAaXJZiW_Ag3rFCFqP4mHL-KL-VaHRIE/?imgmax=800" height="271" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="551" /></a> <br />
I’m using the $inject pattern in order to make sure that my controller parameters won’t get ruined after minifying the code. <br />
Let’s run the test: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPfV24rCdXSvQdTrb9cHQrr_RwEnaHOGimcbQFRWqypVpjQavvNH4S_5Imy5C7_K4lNyGlXGfnJ7mERWKFKhn-rEvGGaLydq6ph6OXZIYbKolGhqcujubCuY4hHAXMyDkIc7Tst2KTKN8/s1600-h/clip_image002%25255B4%25255D.jpg"><img alt="clip_image002" border="0" src="http://lh3.googleusercontent.com/-M-w9foortQ8/VdLEUTUcLII/AAAAAAAANxU/2yBCHcJIquI/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" height="290" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="428" /></a> <br />
Now let’s add another test to validate that the scope works: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4V0aKswXwA-SQ_YcylrCu4McxwhkFjdl-WyvbbYb_UBQQ-wCjVG2f-nCju0__UGnPOqBb-FKeqxR4geFDe0WZsX0U9uhvVZRByH8rIqkePnGWoEmc64QXV5fn0fMGeUVLFRqCuk9_CYk/s1600-h/image%25255B22%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCThFKlPev4HpnjTPoVSPnKiX-GRH9TBOlbqwr_AZW4Y2WcD8KmVWkTWouMwyX16VcMKLejxQ1e2MA4GcL5pi1of9k92vyqttcn_W5sTlYKTEbLdWg0i8DsLVVivHOQHabNnEJVAiQBrU/?imgmax=800" height="157" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="508" /></a><br />
<b>Notice that even in js tests I still use the AAA pattern</b>. It makes the tests readable, especially when they get complex. <br />
Run and pass: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXr0WfZccfIEjUf8ip93sWgxyDzwZDC6KnCJNgWKDAvw4nDKShydyU15xceuvshIqMMdBM1AtmuELzePpuxxNbuxLK_kt3hqsmLEauHWcQP43l1hwTckJnv9RRjFZyRuXhZpu4HvbFGWk/s1600-h/clip_image002%25255B5%25255D%25255B2%25255D.jpg"><img alt="clip_image002[5]" border="0" src="http://lh3.googleusercontent.com/-Y0a3linc1LM/VdLEWqosymI/AAAAAAAANx0/XuSPz9RykRc/clip_image002%25255B5%25255D_thumb.jpg?imgmax=800" height="190" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002[5]" width="244" /></a> <br />
<b>1. </b><b>Adding the directive’s controller</b> <br />
The logic regarding the mask’s chars replacement will be inside the controller (the logic regarding the display will be inside the link function. We’ll get there later). <br />
Add an <i>InputMask</i> directory and place the controller and its spec file in it: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0wixPFoG_X0FY4Ss-ZSp9grjo9i472-sc-Jmh6n04aP0vvNl0fasPiUqDN74YKrOX9H00fKbMi_sayOrZjeU12sqrLF8hdo1tCX5bEG6oOFoP8m0MwSxX492mBRgKlvH0-tMI29JgdQA/s1600-h/clip_image004%25255B4%25255D.jpg"><img alt="clip_image004" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjacvxeLPC0k4zHPpe2cZa-Y92tbCI-TLeGcVlEoJXBfg9UaP5kTFzNdVZCxiR1RIZz9TUgUHQ4UsADZdS6i1THHbKfb6u_28MHPXiZUKAdKgdS3XH2DawTmvDwMJfS3hkNXyKUYhEH-ww/?imgmax=800" height="308" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image004" width="288" /></a> <br />
And the first test: <br />
<a href="http://lh3.googleusercontent.com/-bl83hS3JuD4/VdLEYK17RII/AAAAAAAANyM/u7sUKjQJDUQ/s1600-h/image%25255B26%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAtp-98yFCfolWiYog31GrgqrFsYSxjC0r5N1oVx3GmrimQ8wVnIzf7SQNjMDc1MrWESwSvqWEkgVoURdA21TnUzoI2d1u-1OLIPCDB3Spc8IHw3-dEN2GHcW8_thT2mgn7sPW0PftDZc/?imgmax=800" height="287" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="538" /></a> <br />
I’m placing the specs files near the source files so that the specs will be immediately noticed when someone looks at the solution and so that it will be extremely easy to see that a file is lacking its tests. <br />
Add the controller and the test will pass. <br />
Now let’s start adding some functional tests. <br />
Every time a user enters a letter a controller function must be called in order to edit the mask, it will check the current input length – it shouldn’t be longer than the defined mask and it should replace the mask characters while skipping the values provided in the “skip” array. <br />
<b>Let’s go:</b> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuGBvPgZXhiTguME0ZJN5EN2DrR6hrmEB_MgBebp-OhxUOIzBOfdoZuyK4-z9y3FAuP43nxuCquVIrMNvzOJNohv4n9QM5DjgBJoV-31pa0QjL_wofDq2Jcy573FwrwF6vO8jYV6o5MJw/s1600-h/image%25255B30%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHocp5ASq-_UuQV91Ry8kyrbZnVigW_suonYgGiAMzbcExnEyhqj8BlNNsQKNhFse79WHjfd6Wm5JsTt7ZX_TVCF3feF3MauOj0nOUwJbE0KJoTSBK_yEwqB1fX1PU2wrrXjG0_VkAeJ0/?imgmax=800" height="325" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="630" /></a> <br />
And the implementation: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIduxubq7bFknpeMzpjpMLG9oyeORFYq8xz5yaVaZ8scjLuLifq16P6mjmIeGbHALd4IiAqw7Yyd7uMPCMUqaSYYuBOhx_PyfR2GvVZRC9wIVuv4Q_VbtPFNHXd8Du-jwFfNkZ4gtRZJs/s1600-h/image%25255B34%25255D.png"><img alt="image" border="0" src="http://lh3.googleusercontent.com/-guAmAtXxF18/VdLEbMMbxqI/AAAAAAAANy0/89wAZcqLFuo/image_thumb%25255B16%25255D.png?imgmax=800" height="365" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="563" /></a> <br />
Replacing the mask as the user enters input: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwdZXQwz3a0tsjEftRVchzg_N7Z9zaZnVoCAHmuNBzpmiF0voFPH9X3qrI93NGAJX0TLdmvSGKSBPLusUNkQVUJ74806aJRzPJyz9l9vdvQYon7nJi2cGNY1J3hwNuiTNq1aRE55v5zB8/s1600-h/image%25255B38%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgFOKbn_ReDoWJLQoel4Gn1oGEF96NLDiTTbfN1H141G5aZSxWcRz1sfrppquHcqfK-Fl57tK2K1efZWxxJnlymaCOz-g0xJFK4JrsfzzMVYH1n7MgCAZ5pmvmwpp2c8tIvQGzPx3l5e8/?imgmax=800" height="335" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="593" /></a> <br />
Notice that the controller sets the ngModel with the mask value on its initialization. We’ll provide the mask value for the ngModel before calling for the editMask method from out test. <br />
The implementation: <br />
<a href="http://lh3.googleusercontent.com/-QpbD_sOKzmk/VdLEdDjSy1I/AAAAAAAANzQ/dsdFXxSSAVs/s1600-h/image%25255B43%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFSlclnjkBZ8sSht0JXRAmrE_9pzOi-RuUQXxzEe47uJbCNqZdKooOMBJJai9_p7ETZ-0YMExZhJJIGK9C9oPf9bdZyMAMOocBLEyad6pe-n9rcjia4xe98Q2GklKQBWpsbda6LzwdN2s/?imgmax=800" height="426" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="460" /></a> <br />
Now let’s add a test and its implementation for the “skip” characters functionality. <br />
Test: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIUrnDgzHMU2BFEXRi-oOarWKSNwA0-haPz9DjwnpjwBKv0Td-JpVL-bumqApMfkedhyphenhyphenrrVEThJSA5S2ggWrLRr3MQaddtcCofxzJgxqzt6-2nlZODSHBwDcokdGbrx2iA7CYnj68hhsw/s1600-h/image%25255B47%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJkiWJ1mQK0-uTt9MgBiHIAdw9JNyZPbv4KOvqk1vuYE6afiGiqsHsQ06RyQde9hWGalnKLKnMxjqLiYiJ6X7Q_M-6RwS4bAUM0JalQZo3ex4BAbnKvTyWTYjANbv1967EzkXVVsDr1I/?imgmax=800" height="281" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="476" /></a> <br />
Implementation: <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv1KkyZ-4axK2eLIXb41zoth1HtOTvN5r41mAmV7-Ml2ni2usqAYEwiL_qPEz5CpLorR0LtZBmvrg0S15b7AhDmhRza4r0tatsWisptQ4xLQZnfSH8CrHh13mkfAx_FUu0V-UtcGawEMI/s1600-h/image%25255B52%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7g36_Jeja9j8eh4fbsBl_M1tX_JpYxceTyIuz9uqh0j61JPlLfijYpCir86_t3AvUWlATirEpJeLYKc1tWdH8rz1CCVBjqgthB_6CuIRUFxK_Sfi_eHCBFFI8U67afM9ETEUrSsv0SCY/?imgmax=800" height="481" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="425" /></a> <br />
Pretty straight forward. Notice how the controller doesn’t do any UI logic– just the way it supposed to be. <br />
In a real life application you should add as many test you can for your controllers in order to achieve maximum code and use cases coverage, in this post (which is already quiet long) we’ll stop here and move towards the next <a href="http://dennis-nerush.blogspot.co.il/2015/08/creating-masked-input-directive-with_19.html" target="_blank">topic – <b>testing the directive</b></a>.Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com2tag:blogger.com,1999:blog-7296668432246169944.post-84805077426900489502015-08-14T18:58:00.000+03:002015-08-14T18:58:08.554+03:00Crawling HTML with CsQuery<div class="MsoNormal">
Recently I was asked to build a crawler for a webpage.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNKk77VPmgIu9etjjB9Qr7UI2ZkCmFQtMxsoX60sAWuUhcbVtQQYtuvElury5dxa-hTwRfN8ShjRoTlnMH15T-kShvEOasepxkfysOJzN02j3U5UM1qkLHr2td9RXSFR4HxWJuCbEi3i8/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNKk77VPmgIu9etjjB9Qr7UI2ZkCmFQtMxsoX60sAWuUhcbVtQQYtuvElury5dxa-hTwRfN8ShjRoTlnMH15T-kShvEOasepxkfysOJzN02j3U5UM1qkLHr2td9RXSFR4HxWJuCbEi3i8/s320/1.png" width="289" /></a></div>
<o:p></o:p><br />
<div class="MsoNormal">
The crawler was supposed to get part of the main page values
like the TV Show name, it’s season etc.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h3>
<span style="color: #3d85c6;"><b>So how do you do it?</b></span></h3>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
First you have to download the page’s html to your server:<o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; font-family: Consolas; font-size: 9.5pt;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; font-family: Consolas; font-size: 9.5pt;"> client = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; font-family: Consolas; font-size: 9.5pt;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">WebClient</span><span style="background: white; font-family: Consolas; font-size: 9.5pt;">())<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background: white; font-family: Consolas; font-size: 9.5pt;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background: white; font-family: Consolas; font-size: 9.5pt;"> htmlContent = client.DownloadString(link);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; font-family: Consolas; font-size: 9.5pt; line-height: 107%;"> }</span><span style="font-family: Consolas; font-size: 9.5pt; line-height: 107%;"><o:p></o:p></span></div>
<div class="MsoNormal">
Now you have the whole document as a string. In order to get
the relevant values you have to identify the path to the element that has the
desired value. You’ll want to find an element with an “<i>Id</i>” attribute so
you can be sure that it is unique and set it as the root of your path. From that
element you’ll have to travel the DOM until you get to the wanted element
and its value.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
For example: In order to get the TV show title in the
above website I’ll <i>Inspect the element</i> from the browser:<o:p></o:p></div>
<br /><div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjVxXuSoxvZLN3ZZyLXCy2Rx77R9wF5LmAP1OOaaD9VEVnk2DLqNYNWT3gmLYW-RYial8q8_Nrg9u8pHx-3LDLdoPgSHajMb8pAaULF2YVx6UbC42G4Y619ANdVf60e36vMvWKqMTykA/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="532" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjVxXuSoxvZLN3ZZyLXCy2Rx77R9wF5LmAP1OOaaD9VEVnk2DLqNYNWT3gmLYW-RYial8q8_Nrg9u8pHx-3LDLdoPgSHajMb8pAaULF2YVx6UbC42G4Y619ANdVf60e36vMvWKqMTykA/s640/2.png" width="640" /></a></div>
<br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The TV Show name is the <i>innerText</i> of the “<i>a</i>” element.
The first unique element with an “<i>Id</i>” attribute is the <i><div id=”main”>
</i>(there’s another element that doesn’t have an id attribute but still seems
kind of unique – <i><div class=”subpage_title_block”</i>> both can be
used).<o:p></o:p></div>
<div class="MsoNormal">
After we identified the root element we need to explicitly describe
the whole path:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
div (id=main) => div => div => div (notice that the
former element has an <i>“a”</i> element as a first child) > h3 => a. The
last element has the TV Show title as its innerText.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h3>
<b><span style="color: #3d85c6;">The fun part</span></b></h3>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
So how can we create such a path while the DOM is
represented as a single string?<o:p></o:p></div>
<div class="MsoNormal">
There are several solutions for crawling an HTML string: the
most common is the <a href="http://htmlagilitypack.codeplex.com/wikipage?title=Examples">HTMLAgilityPack</a>
which allows to perform lync style operation on the DOM. It’s nice but not
simple enough to use.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
There is another crawling solution - <a href="https://github.com/jamietre/CsQuery">CsQuery</a> (“Install-Package
CsQuery” from nuget). It’s API is so neat and straight forward - just the way
you would want it:<o:p></o:p></div>
<div class="MsoNormal" style="background: rgb(247, 247, 247); margin-bottom: 0.0001pt;">
<span style="border: none windowtext 1.0pt; color: #333333; font-family: Consolas; font-size: 10.0pt; mso-border-alt: none windowtext 0in; mso-fareast-font-family: "Times New Roman"; padding: 0in;">CQ dom = "<div>Hello
world! <b>I am feeling bold!</b> What about
<b>you?</b></div>";</span><span style="color: #333333; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to create a new CQ instance all you have to do is
just serve the html string.<o:p></o:p></div>
<div class="MsoNormal">
The selection is really simple too:<o:p></o:p></div>
<pre style="background: #F7F7F7;"><code><span style="border: none windowtext 1.0pt; color: #333333; font-family: Consolas; mso-border-alt: none windowtext 0in; padding: 0in;">var boldElements = dom["b"].Select(x => x.InnerText).ToList();</span></code><span style="color: #333333; font-family: Consolas;"><o:p></o:p></span></pre>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Here you select all the bold text from the DOM.<o:p></o:p></div>
<div class="MsoNormal">
So how does CsQuery help us in our example?<o:p></o:p></div>
<pre style="background: #F7F7F7;"><code><span style="border: none windowtext 1.0pt; color: #333333; font-family: Consolas; mso-border-alt: none windowtext 0in; padding: 0in;">var tvShowTitle = dom["div#"main > div > div > div> h3 > a].InnerText;</span></code><span style="color: #333333; font-family: Consolas;"><o:p></o:p></span></pre>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Yes! That simple!<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
Enjoy.<o:p></o:p></div>
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com1tag:blogger.com,1999:blog-7296668432246169944.post-89439906332212548502015-07-18T20:15:00.000+03:002015-07-18T20:15:23.428+03:00Domain Driven Design, CQRS & Event Sourcing - The Lecture video<div class="separator" style="clear: both; text-align: left;">
Here is the video of my lecture at the annual IDF conference. Enjoy.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/8y62-SGmKYw/0.jpg" src="https://www.youtube.com/embed/8y62-SGmKYw?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-37642826918596973202015-06-30T00:17:00.000+03:002015-07-18T20:16:04.733+03:00Domain Driven Design, CQRS & Event Sourcing On July 12th I'm going to give a talk at the annual IDF .NET conference which is the 3rd time that I'm one of it organizers.<br />
<div>
This time I'm going to talk about three major patterns - Domain Driven Design, CQRS and Event Sourcing. </div>
<div>
I believe that the young software developers ought to know design patterns, best practices and the big things that are happening in the industry. All those patterns are becoming more and more popular for a reason. I think that most of the applications which are developed in the IDF could use some or all of them.</div>
<div>
<br /></div>
<div>
Here are the slides - http://slides.com/dennisnerush/cqrs#/<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmIiXSOnDHcQzQ7qnf9mmautupjdM_IwcEVwZBUIJgOPKZfMhmOYGZThG6w2Nvl-GRnzZUCQNLSjIAGbtfvKxObYH0li6V3Mzx3M0zqk4RLo5VnAjteXuJ_LyQg2hLI1sVcTlexobpluU/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmIiXSOnDHcQzQ7qnf9mmautupjdM_IwcEVwZBUIJgOPKZfMhmOYGZThG6w2Nvl-GRnzZUCQNLSjIAGbtfvKxObYH0li6V3Mzx3M0zqk4RLo5VnAjteXuJ_LyQg2hLI1sVcTlexobpluU/s400/Capture.PNG" width="400" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
Wish me luck!<br />
<br />
The video of the lecture can be found <a href="http://dennis-nerush.blogspot.co.il/2015/07/domain-driven-design-cqrs-event.html" target="_blank">here</a>.</div>
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-32964595297914727972015-06-16T11:08:00.001+03:002015-06-16T11:09:38.997+03:00Creating Nuget Packages using Visual Studio 2015If you have ever created a nuget package you know how annoying it is. Using the nuget command line to pack the project and then create the .nuspec file and then build it for the desired frameworks. <br />
Visual Studio 2015 (currently RC) lets you create nuget packages extremely easy! <br />
First create a new Class Library project: <br />
<a href="http://lh3.googleusercontent.com/-EjLjUskb4Nk/VX_ZT-Loh5I/AAAAAAAAMfo/0mjgErbISsA/s1600-h/clip_image002%25255B4%25255D.jpg"><img alt="clip_image002" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5Da0nf7-VHoAH_IVKC9EKV0RAKZz9wlH0_41v90P7u1YbFKXzq2JswZfh2x4S1Wa79Jb_UqIPR8m3rekjstm5r7Bq-6GoAInCP77nImXXuoTk4lvtef2DhwqIci6-rpcN59T2gcZR_c/?imgmax=800" height="188" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="544" /></a> <br />
Notice that it is under ‘Web’ category. <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUncGjP6Dw58jOw6Srnd0JnuOxPsGSjGBc-c7XNK72M6-UArlQbd3kTpl7zy35DvTQut1vqN6jyMgSJ-meFARsNGNvhfG7uwxGgqhmIhvncJs_KRyAKhlZW0bVznZOvZNDGrxnR8dZTLE/s1600-h/clip_image004%25255B4%25255D.jpg"><img alt="clip_image004" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1WycPs4Ny0e2ZouPSZcNuivTe9ZpW-j3kEcm1-U146hIANY_OTTwwl1KMsjsdoP20ioREqbvR3XzOOLTEmbbF-ldInjKCn9GGeoGvSTaa-3_G9HDMrGgriv15LqguzdVP7i_3CAL9ui8/?imgmax=800" height="166" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image004" width="543" /></a> <br />
Now we’ll enable the nugget package creation just as written in the comments above. <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsFsVr_QNivWhuB9GwYvUleidTv8N3HrnyY9A762tb4rjPMIVmfqOjfXJ213QZgqQZaJWzeZDuWtgB0WXHq9ryT4zwkmd1ACv_TLYoUJ29GAMuuH2MXT2bfMXD_k4-T3nFgxyRMztOeoc/s1600-h/clip_image006%25255B4%25255D.jpg"><img alt="clip_image006" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnhhAwbsp7oH0yHwfuyzCURhZHIzSTehqPYFBhEobZ1oE5kflBMKDBSMvhnELqhFL-7OCij6cA477M-GaP08w7FOZwfUhQGIfDnLYaR2WyUImnKJ6w4TsVsTNjeeyakcWlR8iQ93u-1kc/?imgmax=800" height="269" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image006" width="587" /></a> <br />
I just love their UX in this window. <br />
Now we’ll need to fill the package details in the project.json file. <br />
<a href="http://lh3.googleusercontent.com/-H1O038rJ8iA/VX_ZXDm38rI/AAAAAAAAMgU/kNBV0bkB7r0/s1600-h/clip_image007%25255B4%25255D.png"><img alt="clip_image007" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbRPGcsttnUO5D0uashvWb_7CGhsd7uoANns8Ft_2Os3O6h9Oxdr5UhaJxfxdO5A69nK7rTQFMF6fECsS11kQg7rdTyj0iKQsMwKvhAWu9ws9jvNdJd_Fw3LbNTT29boOakrFFFyxmeX8/?imgmax=800" height="417" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image007" width="478" /></a> <br />
The project.json is almost the same as the .nuspec file. We can include the package dependencies and the target frameworks. <br />
Now if we compile the project and navigate to the solution directory we’ll see the nuget package in the artifacts folder. <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZMrzTTbGt7pF_ItpEoz34VSaGgnOjg-0Dd3gZuCuyHBCh4O7ffbyWAUKRglIpRdOkMhUp-odvJ_SmQ4Yi_Kh2cxA3k2VfAPitVlISUQgY-LkfvcrOu_gq1CEMsw_5ZyzjqLNPibuniF4/s1600-h/clip_image008%25255B3%25255D.png"><img alt="clip_image008" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiWYQE7IBKdliO-acWxUL1GEJE6UbXIBkSAc0B82f6bGm60sNzFHGkbwGtVfkHsC2aT3dv9Lf2xWAkPNuC0kxrOKAnssG6oip2iwTiio_gTxRPoCvKuXJcXTmMp4eoqRuZpJg9yaSmN7E/?imgmax=800" height="150" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image008" width="244" /></a> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS2piV3kvbplhjO_SybiT1gSWkfnlJBybAXLWUnPdLW_OaMfGWk0olo2YJ5icwD7l8DGY1Sgv8dDDJVKKIKCdRysfyvrJNI_wdhEXWHhyphenhyphenDGnrgajmWaIqzATiQ_ia5OiWlaNnxpGZWjPA/s1600-h/clip_image009%25255B4%25255D.png"><img alt="clip_image009" border="0" src="http://lh3.googleusercontent.com/-j2hajxuDqqA/VX_ZZQVixPI/AAAAAAAAMg8/xSbm_uHbUS0/clip_image009_thumb%25255B1%25255D.png?imgmax=800" height="325" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image009" width="597" /></a> <br />
Good luck <img alt="Smile" class="wlEmoticon wlEmoticon-smile" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhioOBPuK1qGexCUzy5XAs1rNpdviWk6RNrFnvF6lECYRwmsgKAxebKpu3tQQjketkQokeOz4t2b1PC5xLM7LG7XNHYh4iPyXhoYS6g9opcxpJu36eNtMYrZWVe9E6ROh8sav2RfY1fas8/?imgmax=800" style="border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0tag:blogger.com,1999:blog-7296668432246169944.post-91465287397170210982015-06-12T12:44:00.001+03:002015-06-12T12:44:52.640+03:00Aligning Elements using CSS3 “Flex” options<p>CSS3 introduces the “Flex” options that makes aligning elements extremely easy! It is currently supported in all the major browsers (not supported in IE 11 and below); <p>Let’s say that I want to align four elements in a line: <p><a href="http://lh3.googleusercontent.com/-Kn7wGG95Ixk/VXqp7riagpI/AAAAAAAAMdM/TmMSI8qqhIc/s1600-h/clip_image002%25255B4%25255D%25255B3%25255D.jpg"><img title="clip_image002[4]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image002[4]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHO8YAn5tvTPxpSFKHTK-VG4LmHChSr937n4KJnwmsJJwQ6Lj4JwXvmuXlRzv8OXIa-Y7dLzYSR-f4Xwga47_Tq1AmtUIvrz0yVO6QIMDWBJpLfm965fPISYer_-g34NFm32a6JQdvtI/?imgmax=800" width="407" height="101"></a> <p>The CSS:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a957c76b-cbcb-472b-a4c5-c4ac38f9ce2d" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 623px; height: 337px;background-color:White;overflow: auto;"><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;">.container </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />padding</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />margin</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />list-style</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> none</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />display</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> flex</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span><span style="color: #800000;"><br /><br />.item </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />background</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> green</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />padding</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 5px</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />width</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 150px</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />height</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 150px</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />margin</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 10px</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />line-height</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 150px</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />color</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> white</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />font-weight</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> bold</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />font-size</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 3em</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />text-align</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> center</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />-ms-border-radius</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 30%</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />border-radius</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 30%</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span><span style="color: #800000;"><br /></span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><br /><p><br /><p>The only new property here is “<em>display: flex</em>”. Not only that flex aligns the elements in a single line it also makes them responsive when the container size changes (overriding the element’s explicit width property; <br /><p><a href="http://lh3.googleusercontent.com/-NdUSSyPu410/VXqp844i7CI/AAAAAAAAMdY/5VEF1dayYDY/s1600-h/clip_image003%25255B5%25255D%25255B6%25255D.png"><img title="clip_image003[5]" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image003[5]" src="http://lh3.googleusercontent.com/-8-alzeBWPDg/VXqp9BvY7vI/AAAAAAAAMdg/gft0rwXSelQ/clip_image003%25255B5%25255D_thumb%25255B4%25255D.png?imgmax=800" width="211" height="81"></a> <br /><p>If you wish to keep the element’s original width you can add the <i>flex-wrap:wrap</i> property which will break the line if needed: <br /><p><a href="http://lh3.googleusercontent.com/-ndHnmAckofo/VXqp9l8fDcI/AAAAAAAAMdo/89EHqyb4ii8/s1600-h/clip_image004%25255B5%25255D%25255B3%25255D.png"><img title="clip_image004[5]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004[5]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7aaYl4Cala4Q3facOKOn5lWwy8onBEV_NBzwyZaotX034QlsXVIMj1Z0vfECUBYGgkfTe8q028e-qR2CT_YeBeOZPWIPYvt_2QQd1By-rFIiyj8RFSdWbnZU2PDryUNTti4lXWc0HckI/?imgmax=800" width="402" height="174"></a> <br /><p>You can reverse the order of the elements that break the line using <i>flex-wrap</i>:<i>wrap-reverse:</i> <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBQKI8dm99rOyJ7nc6TPSyxsLQMnGw_OBJCYgVPXR99G2L2Ol7osrW8XzuVYce8hBBICg5rrT8Rot4SR4ALkS1VJGbUa_TRbG6ntwrdJeimVXsnGQfc3C9JBjDKtYOOGsv8w3AJsdifc/s1600-h/clip_image005%25255B5%25255D%25255B3%25255D.png"><img title="clip_image005[5]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image005[5]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD72oTKl9Kta9B1iZTHk1cDmUNF50HUtqxc8io77UJtxE7a6vGbFVUb1UiZM1h0Pvki_mbqwpZSScQZZjiwJLa9lq14pTwySQJxlbW-ScesTrWuOAO1ZvcQoF4SoXNGVaKSuk0_23KuMQ/?imgmax=800" width="403" height="178"></a><i></i> <br /><p>You can align the whole line to center or to the first/last item (<i>flex-start/flex-end</i>) using the <i>justify-content</i> property. By default it is set to <i>flex-start</i>: <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA5hs8F4_375oPjApnHc7tWRYbrUjIIbGfP202Npl8GjsJFR3-oa609BJ-bOzTtnR5ls_Nu0xtOQOybAmuDmIU4dJPRrpsqs4FHCoaKt2_PPk7XQmMSG-UWd-Wv7q84nQjXML2DSk-CR0/s1600-h/clip_image007%25255B5%25255D%25255B6%25255D.jpg"><img title="clip_image007[5]" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image007[5]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjZvzMAV-KSgmUIiQYJCRK3xKEkmgAx6B9yUFAMC-HeMKYPBNSxjigNz1aQJ2go8s9Sq0YoXxgRdBpYNZI5AE9qi3qFaH7iYlypKTqS2sw2bhNXvqnw3197fkKHwNn5UQVJ5zW1Jj0r6s/?imgmax=800" width="438" height="136"></a></p><br /><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c94a2e2b-b006-4612-aed5-2a2ca780fe53" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 623px; height: 193px;background-color:White;overflow: auto;"><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;">.container </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />padding</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />margin</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />list-style</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> none</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />display</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> flex</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />flex-wrap</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> wrap</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />justify-content</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> center</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><br /><p><br /><p>There are two more options for <i>justify-content</i>: <em>space-between</em> and <em>space-around</em> which adds equal spaces between each element: <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaIlj4XgmfN_i3MYUDCgp918wPbCC9B24aG2wl1VRPxv62Ljdm5cabhyphenhyphenvJ5vGPKMo-4jyEWVWrFSm4sbD4IyUf0OTfqm6TRp8JUZHULrOmSIdTX2VTkffDG92SFHIGHYJb_6goVsx8a80/s1600-h/clip_image009%25255B9%25255D%25255B3%25255D.jpg"><img title="clip_image009[9]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image009[9]" src="http://lh3.googleusercontent.com/-uz8O1W_tUvA/VXqqBCKUetI/AAAAAAAAMeg/7Pu3UxwcxJ8/clip_image009%25255B9%25255D_thumb%25255B1%25255D.jpg?imgmax=800" width="393" height="90"></a></p><br /><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6c473838-8867-4b99-a5de-9a929521061b" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 623px; height: 180px;background-color:White;overflow: auto;"><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;">.container </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />padding</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />margin</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />list-style</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> none</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />display</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> flex</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />flex-wrap</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> wrap</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />justify-content</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> space-between</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span><span style="color: #800000;"><br /></span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><br /><p><br /><p>If you choose <i>space-around</i> then the first and the last elements will also have the same spaces from the borders. <br /><p><strong><font size="4">Vertical Alignment</font></strong> <br /><p>You can vertically align the elements using <em>flex-direction:column.</em> <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnE9YkCsNNvwIvSA2TA-K1VTZR2CPfspiyIGaS1Z2-lPgDGhvu9gE9YxJEE88iZQBWKLXUWAYdcHEe4rR38DqZG0190K8X-q45jojq_y17gJlRwDmnjKp31CM_8O-1OQ1o9E5H0yKTpdI/s1600-h/clip_image010%25255B4%25255D%25255B3%25255D.png"><img title="clip_image010[4]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image010[4]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGnCFXMICGBI6cg9eMIN6vwePkdH9KuL9j9c5fh0GdhE8cCvpm4Rh7LmkSawhzg4QeoiOfvBYbLUtaE4PBCerDIq6d8fnKaFoRpjZJU9q5OIAjAQR3-HV9hqTQoTzY-yOdfHW5h1MY6oo/?imgmax=800" width="93" height="320"></a><i></i> <br /><p><i></i><br /><p>Using <i>align-items</i> you can control the vertical starting point (the same like <i>justify-content</i>): <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTuVRLYkuifHQ5CX5HmWiOEaYzjLIBzfQruIovJaopgLKpQUTcIvnKeaPpj3PdRdS7RqgYM9T3kPlU5SnjajUG7R6qvN0Dv2CzfeqgnxHz7OCU7vwIU926ZUHUpZ5-5ObTnrp2NwtQa8/s1600-h/clip_image011%25255B4%25255D%25255B3%25255D.png"><img title="clip_image011[4]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image011[4]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8u__30mrZwXpUpl98AZGPtd_6nWjw6AS_b_GQ4RSj9UQZv3i0plSL5Hcs-fzrFmwf8pzfiZn6Ht9JOPVaw3RWvHWQ2sZliQdAAnk_jGfGResgaB02UEv3JgRyhKP1L8XThqCQgcymn9o/?imgmax=800" width="318" height="241"></a></p><br /><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a160ebd7-6087-4931-8fe0-bdb770c4dc56" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 623px; height: 204px;background-color:White;overflow: auto;"><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;">.container </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />padding</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />margin</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 0</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />list-style</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> none</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />display</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> flex</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />flex-wrap</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> wrap</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />align-items</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> center</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br />flex-direction</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> column-reverse</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><br /><p><br /><p>So far we’ve applied the <i>flex</i> properties only to the elements container. We can also apply some flex properties directly on the elements, like making some item be 3 times bigger than the rest: <br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgErISiICDN54zY7O66v-c5HoyK-rd-h4xCsJrdJayIrOPqNXsT5zXZLgyMNbsQ9W_20BNgT9RPb02xqJepzdEfirVX_HBjBQTz76Mrh0A97sxvto5e-j7qkxePC1xOntuP9Gl7lsysgi8/s1600-h/clip_image013%25255B4%25255D%25255B3%25255D.jpg"><img title="clip_image013[4]" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image013[4]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFJIgZENzdn-4EFyHIhsBXKKE15Bt5Ab9iBF-kCwdEyvMBCjHUpDE7wSao0sIYa_Jtpni7hvX-qn8C9KFXrWE5nHlDFe1CWPoXyCb1rYuHLQKI5U3vq8KpXi_4fqzf482iRkfjHUuXvZY/?imgmax=800" width="468" height="137"></a></p><br /><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:5809ba2c-903f-4796-87ed-d54f403a6a55" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 623px; height: 74px;background-color:White;overflow: auto;"><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;">.container > .grow </span><span style="color: #000000;">{</span><span style="color: #FF0000;"><br />flex-grow</span><span style="color: #000000;">:</span><span style="color: #0000FF;"> 3</span><span style="color: #000000;">;</span><span style="color: #FF0000;"><br /></span><span style="color: #000000;">}</span><span style="color: #800000;"><br /></span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><br /><p><br /><p>I’m using the <i>flex-grow</i> property on the wanted item and setting it’s value to <i>3</i> as for 3 times bigger. <br /><p>Flex has more properties that can help you easily align your elements . Go ahead and try! <br /> Dennis Nerushhttp://www.blogger.com/profile/14265559642179901210noreply@blogger.com0