[{"data":1,"prerenderedAt":679},["ShallowReactive",2],{"blog-post-howto-write-tickets":3},{"id":4,"title":5,"body":6,"created":670,"description":671,"extension":672,"isVisible":84,"meta":673,"navigation":84,"path":674,"seo":675,"stem":676,"tags":677,"__hash__":678},"blog\u002Fblog\u002Fhowto-write-tickets.md","Howto write tickets",{"type":7,"value":8,"toc":660},"minimark",[9,13,18,21,26,38,45,48,53,112,116,244,248,255,259,390,394,412,416,419,422,425,429,436,440,443,446,450,453,656],[10,11,12],"p",{},"One of the first (and quite common) issues that developers can face in a project\nis usually the poor or missing ticket description they get from products owners\nor managers.",[14,15,17],"h2",{"id":16},"guidelines","Guidelines",[10,19,20],{},"Here are some small tips for writing better tickets",[22,23,25],"h3",{"id":24},"problem-description-is-vital-information","Problem description is vital information",[10,27,28,29,33,34,37],{},"It is a common problem that a ticket description actually contain \u002F suggests\na ",[30,31,32],"strong",{},"solution"," but never describes the actual ",[30,35,36],{},"problem",".",[10,39,40,41,44],{},"It is even more dangerous, if a ticket actually suggests only a ",[30,42,43],{},"technical\nsolution"," without describing the actual issue. On top of that, if this ticket\nhas been written by a manager or someone with low technical background, it will be\nrevised most probably by developers.",[10,46,47],{},"It is very important to describe the actual problem inside the ticket, since a\nfeature implementation needs to be reasoned. People need to understand the scope\nof this ticket and also get the big picture.",[49,50,52],"h4",{"id":51},"a-no-go-example","A no go example:",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-sql shiki shiki-themes github-dark","Description\n-----------\n\nAdd a new column `color` in the table 'FRUITS'\n","sql","",[61,62,63,72,79,86],"code",{"__ignoreMap":59},[64,65,68],"span",{"class":66,"line":67},"line",1,[64,69,71],{"class":70},"snl16","Description\n",[64,73,75],{"class":66,"line":74},2,[64,76,78],{"class":77},"sAwPA","-----------\n",[64,80,82],{"class":66,"line":81},3,[64,83,85],{"emptyLinePlaceholder":84},true,"\n",[64,87,89,92,96,100,103,106,109],{"class":66,"line":88},4,[64,90,91],{"class":70},"Add",[64,93,95],{"class":94},"s95oV"," a new column ",[64,97,99],{"class":98},"sU2Wk","`color`",[64,101,102],{"class":70}," in",[64,104,105],{"class":94}," the ",[64,107,108],{"class":70},"table",[64,110,111],{"class":98}," 'FRUITS'\n",[49,113,115],{"id":114},"a-better-example","A better example:",[54,117,119],{"className":56,"code":118,"language":58,"meta":59,"style":59},"Description\n-----------\n\nCustomers need to be able to search and choose fruits based on color\n\nAcceptance criteria\n-------------------\n\n1. Allow customers to search fruits by color by the following way:\n.....\n2. Allow customers to store color information for each fruit\n.....\n",[61,120,121,125,129,133,161,166,172,178,183,214,220,239],{"__ignoreMap":59},[64,122,123],{"class":66,"line":67},[64,124,71],{"class":70},[64,126,127],{"class":66,"line":74},[64,128,78],{"class":77},[64,130,131],{"class":66,"line":81},[64,132,85],{"emptyLinePlaceholder":84},[64,134,135,138,141,144,146,149,152,155,158],{"class":66,"line":88},[64,136,137],{"class":94},"Customers need ",[64,139,140],{"class":70},"to",[64,142,143],{"class":94}," be able ",[64,145,140],{"class":70},[64,147,148],{"class":94}," search ",[64,150,151],{"class":70},"and",[64,153,154],{"class":94}," choose fruits based ",[64,156,157],{"class":70},"on",[64,159,160],{"class":94}," color\n",[64,162,164],{"class":66,"line":163},5,[64,165,85],{"emptyLinePlaceholder":84},[64,167,169],{"class":66,"line":168},6,[64,170,171],{"class":94},"Acceptance criteria\n",[64,173,175],{"class":66,"line":174},7,[64,176,177],{"class":77},"-------------------\n",[64,179,181],{"class":66,"line":180},8,[64,182,85],{"emptyLinePlaceholder":84},[64,184,186,190,193,195,198,201,204,206,208,211],{"class":66,"line":185},9,[64,187,189],{"class":188},"sDLfK","1",[64,191,192],{"class":94},". Allow customers ",[64,194,140],{"class":70},[64,196,197],{"class":94}," search fruits ",[64,199,200],{"class":70},"by",[64,202,203],{"class":94}," color ",[64,205,200],{"class":70},[64,207,105],{"class":94},[64,209,210],{"class":70},"following",[64,212,213],{"class":94}," way:\n",[64,215,217],{"class":66,"line":216},10,[64,218,219],{"class":94},".....\n",[64,221,223,226,228,230,233,236],{"class":66,"line":222},11,[64,224,225],{"class":188},"2",[64,227,192],{"class":94},[64,229,140],{"class":70},[64,231,232],{"class":94}," store color information ",[64,234,235],{"class":70},"for",[64,237,238],{"class":94}," each fruit\n",[64,240,242],{"class":66,"line":241},12,[64,243,219],{"class":94},[22,245,247],{"id":246},"is-it-a-bug-write-down-how-to-reproduce-it","Is it a bug?  Write down how to reproduce it",[10,249,250,251,254],{},"When writing \u002F describing a bug ticket, we need to pay attention to the\ninformation we provide to support team. It is also ",[30,252,253],{},"very"," helpful, if we\nwrite down the steps how this problem can be reproduced.",[49,256,258],{"id":257},"good-example","Good example",[54,260,262],{"className":56,"code":261,"language":58,"meta":59,"style":59},"Description:\n------------\nUser is unable to enter device control panel. The following error is shown on\nthe screen:\n\n\"Device cannot be found. Please contact support team\"\n\nThe issue can be reproduced as following:\n1. Enter APP\n2. Click twice on the \"Control panel\" by using the third button (new tab)\n3. The second tab shows an error\"\n",[61,263,264,272,277,312,317,321,326,330,343,350,373],{"__ignoreMap":59},[64,265,266,269],{"class":66,"line":67},[64,267,268],{"class":70},"Description",[64,270,271],{"class":94},":\n",[64,273,274],{"class":66,"line":74},[64,275,276],{"class":77},"------------\n",[64,278,279,282,285,288,290,293,296,299,301,304,306,309],{"class":66,"line":81},[64,280,281],{"class":94},"User ",[64,283,284],{"class":70},"is",[64,286,287],{"class":94}," unable ",[64,289,140],{"class":70},[64,291,292],{"class":94}," enter device ",[64,294,295],{"class":70},"control",[64,297,298],{"class":94}," panel. The ",[64,300,210],{"class":70},[64,302,303],{"class":94}," error ",[64,305,284],{"class":70},[64,307,308],{"class":94}," shown ",[64,310,311],{"class":70},"on\n",[64,313,314],{"class":66,"line":88},[64,315,316],{"class":94},"the screen:\n",[64,318,319],{"class":66,"line":163},[64,320,85],{"emptyLinePlaceholder":84},[64,322,323],{"class":66,"line":168},[64,324,325],{"class":98},"\"Device cannot be found. Please contact support team\"\n",[64,327,328],{"class":66,"line":174},[64,329,85],{"emptyLinePlaceholder":84},[64,331,332,335,338,341],{"class":66,"line":180},[64,333,334],{"class":94},"The issue can be reproduced ",[64,336,337],{"class":70},"as",[64,339,340],{"class":70}," following",[64,342,271],{"class":94},[64,344,345,347],{"class":66,"line":185},[64,346,189],{"class":188},[64,348,349],{"class":94},". Enter APP\n",[64,351,352,354,357,359,361,364,367,370],{"class":66,"line":216},[64,353,225],{"class":188},[64,355,356],{"class":94},". Click twice ",[64,358,157],{"class":70},[64,360,105],{"class":94},[64,362,363],{"class":98},"\"Control panel\"",[64,365,366],{"class":70}," by",[64,368,369],{"class":70}," using",[64,371,372],{"class":94}," the third button (new tab)\n",[64,374,375,378,381,384,387],{"class":66,"line":222},[64,376,377],{"class":188},"3",[64,379,380],{"class":94},". The ",[64,382,383],{"class":70},"second",[64,385,386],{"class":94}," tab shows an error",[64,388,389],{"class":98},"\"\n",[49,391,393],{"id":392},"bad-example","Bad example",[54,395,397],{"className":56,"code":396,"language":58,"meta":59,"style":59},"APP is not working.\n",[61,398,399],{"__ignoreMap":59},[64,400,401,404,406,409],{"class":66,"line":67},[64,402,403],{"class":94},"APP ",[64,405,284],{"class":70},[64,407,408],{"class":70}," not",[64,410,411],{"class":94}," working.\n",[22,413,415],{"id":414},"add-test-criteria","Add test criteria",[10,417,418],{},"Apart from how to reproduce an issue, steps are very important for QA (quality\nassurance). If you are not resolving a bug, you need to provide a way\nhow to test this new feature you are implementing.",[10,420,421],{},"It is also important to also involve the testing team here. They will need\nfurther information from development about how features can be tested.",[10,423,424],{},"Sometimes you may also think that several tickets cannot be tested end-to-end.\nActually these cases are very rare and extreme and each feature and change needs\nto be tested. It is better to try to cover with tests as much as possible.",[22,426,428],{"id":427},"add-implementation-notes","Add implementation notes",[10,430,431,432,435],{},"Before working on a ticket, it is important to discuss with developers\nand write down, ",[30,433,434],{},"how"," this ticket is going to be implemented.\nThese notes can be very useful during code review or later, since you provide\nsome important insights how this solution works. This area can also be useful\nfor the developers themselves, in order to remember what has been discussed.",[22,437,439],{"id":438},"it-is-all-about-teamwork","It is all about teamwork",[10,441,442],{},"It would be excellent, if the product owners or customers could describe and\nformulate all requirements and criteria properly into tickets. But we also\nneed to understand the limits between people and roles into team.",[10,444,445],{},"A good ticket description and organisation is in the end a good teamwork where\nall sides contribute to the same goal. As mentioned above, there are several\nparts in a ticket which need to be written by different roles and usually is\na common work between them.",[22,447,449],{"id":448},"complete-example","Complete example",[10,451,452],{},"This is a complete example that I may use as a template when I write tickets:",[54,454,458],{"className":455,"code":456,"language":457,"meta":59,"style":59},"language-markdown shiki shiki-themes github-dark","Description\n-----------\n\nCustomers are unable to check currently in their shopping cart, how many items\nin total it contains. Having this information in their cart is valuable, in\norder to check if they will also rent a car for transporting them or not.\n\nAcceptance criteria:\n--------------------\n\n* Add in shopping cart summary view the total amount of item it contains\n  - label: \"Total items\" (font-size: 13px, color: blue, line-height: 1.5)\n  - value: (font-size: 13px, color: black, line-height: 1.5)\n\n\nQA test criteria:\n--------------\nPlease perform the end-to-end test below: \n\n* Open shopping application\n* Enter cart summary view page: \u002Fapp\u002Fshopping-cart\u002F\n* Check the value marked in element ID: \"shopping-cart-total-items\"\n* Text stored in element shall always contain the total items stored in shopping cart\n\nImplementation notes:\n---------------------\n\n## Backend ##\n\n* Extend ShoppingCart model to also include \"totalItems\" property (long, nonnull)\n* Extend ShoppingCartService to also calculate required field mentioned above\n* Extend OpenAPI documentation\n\n\n## Frontend ##\n\n* Extend ShoppingCartOverview component and add new field\n\n\n","markdown",[61,459,460,464,468,472,477,482,487,491,496,501,505,510,515,521,526,531,537,543,549,554,560,566,572,578,583,589,595,600,606,611,617,623,629,634,639,645,650],{"__ignoreMap":59},[64,461,462],{"class":66,"line":67},[64,463,71],{},[64,465,466],{"class":66,"line":74},[64,467,78],{},[64,469,470],{"class":66,"line":81},[64,471,85],{"emptyLinePlaceholder":84},[64,473,474],{"class":66,"line":88},[64,475,476],{},"Customers are unable to check currently in their shopping cart, how many items\n",[64,478,479],{"class":66,"line":163},[64,480,481],{},"in total it contains. Having this information in their cart is valuable, in\n",[64,483,484],{"class":66,"line":168},[64,485,486],{},"order to check if they will also rent a car for transporting them or not.\n",[64,488,489],{"class":66,"line":174},[64,490,85],{"emptyLinePlaceholder":84},[64,492,493],{"class":66,"line":180},[64,494,495],{},"Acceptance criteria:\n",[64,497,498],{"class":66,"line":185},[64,499,500],{},"--------------------\n",[64,502,503],{"class":66,"line":216},[64,504,85],{"emptyLinePlaceholder":84},[64,506,507],{"class":66,"line":222},[64,508,509],{},"* Add in shopping cart summary view the total amount of item it contains\n",[64,511,512],{"class":66,"line":241},[64,513,514],{},"  - label: \"Total items\" (font-size: 13px, color: blue, line-height: 1.5)\n",[64,516,518],{"class":66,"line":517},13,[64,519,520],{},"  - value: (font-size: 13px, color: black, line-height: 1.5)\n",[64,522,524],{"class":66,"line":523},14,[64,525,85],{"emptyLinePlaceholder":84},[64,527,529],{"class":66,"line":528},15,[64,530,85],{"emptyLinePlaceholder":84},[64,532,534],{"class":66,"line":533},16,[64,535,536],{},"QA test criteria:\n",[64,538,540],{"class":66,"line":539},17,[64,541,542],{},"--------------\n",[64,544,546],{"class":66,"line":545},18,[64,547,548],{},"Please perform the end-to-end test below: \n",[64,550,552],{"class":66,"line":551},19,[64,553,85],{"emptyLinePlaceholder":84},[64,555,557],{"class":66,"line":556},20,[64,558,559],{},"* Open shopping application\n",[64,561,563],{"class":66,"line":562},21,[64,564,565],{},"* Enter cart summary view page: \u002Fapp\u002Fshopping-cart\u002F\n",[64,567,569],{"class":66,"line":568},22,[64,570,571],{},"* Check the value marked in element ID: \"shopping-cart-total-items\"\n",[64,573,575],{"class":66,"line":574},23,[64,576,577],{},"* Text stored in element shall always contain the total items stored in shopping cart\n",[64,579,581],{"class":66,"line":580},24,[64,582,85],{"emptyLinePlaceholder":84},[64,584,586],{"class":66,"line":585},25,[64,587,588],{},"Implementation notes:\n",[64,590,592],{"class":66,"line":591},26,[64,593,594],{},"---------------------\n",[64,596,598],{"class":66,"line":597},27,[64,599,85],{"emptyLinePlaceholder":84},[64,601,603],{"class":66,"line":602},28,[64,604,605],{},"## Backend ##\n",[64,607,609],{"class":66,"line":608},29,[64,610,85],{"emptyLinePlaceholder":84},[64,612,614],{"class":66,"line":613},30,[64,615,616],{},"* Extend ShoppingCart model to also include \"totalItems\" property (long, nonnull)\n",[64,618,620],{"class":66,"line":619},31,[64,621,622],{},"* Extend ShoppingCartService to also calculate required field mentioned above\n",[64,624,626],{"class":66,"line":625},32,[64,627,628],{},"* Extend OpenAPI documentation\n",[64,630,632],{"class":66,"line":631},33,[64,633,85],{"emptyLinePlaceholder":84},[64,635,637],{"class":66,"line":636},34,[64,638,85],{"emptyLinePlaceholder":84},[64,640,642],{"class":66,"line":641},35,[64,643,644],{},"## Frontend ##\n",[64,646,648],{"class":66,"line":647},36,[64,649,85],{"emptyLinePlaceholder":84},[64,651,653],{"class":66,"line":652},37,[64,654,655],{},"* Extend ShoppingCartOverview component and add new field\n",[657,658,659],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":59,"searchDepth":74,"depth":74,"links":661},[662],{"id":16,"depth":74,"text":17,"children":663},[664,665,666,667,668,669],{"id":24,"depth":81,"text":25},{"id":246,"depth":81,"text":247},{"id":414,"depth":81,"text":415},{"id":427,"depth":81,"text":428},{"id":438,"depth":81,"text":439},{"id":448,"depth":81,"text":449},1550866387,"This is a description 2","md",{},"\u002Fblog\u002Fhowto-write-tickets",{"title":5,"description":671},"blog\u002Fhowto-write-tickets",[],"n1__1nRldsWfvt0nujUHpk3-JvjtZAvannJFPQmMA1Q",1786914024289]