{"id":2659,"date":"2021-02-23T14:22:29","date_gmt":"2021-02-23T17:22:29","guid":{"rendered":"https:\/\/www.blogs.unicamp.br\/zero\/?p=2659"},"modified":"2023-08-25T20:11:08","modified_gmt":"2023-08-25T23:11:08","slug":"engenharia-de-software-em-age-of-mythology","status":"publish","type":"post","link":"https:\/\/www.blogs.unicamp.br\/zero\/2659\/","title":{"rendered":"Engenharia de Software em Age of Mythology"},"content":{"rendered":"\n<p class=\" eplus-wrapper\">Age of Mythology (tamb\u00e9m conhecido como AoM), \u00e9 um jogo de computador de estrat\u00e9gia em tempo real baseado em mitologia produzido pela Ensemble Studios e distribu\u00eddo pela Microsoft Game Studios. De forma geral, envolve administrar recursos e guerrear, uma estrutura bem parecida com a franquia Age of Empires. Mas e ai, onde entra a Engenharia de Software?<\/p>\n\n\n\n<p class=\" eplus-wrapper\">Engenharia de Software \u00e9 uma \u00e1rea da engenharia e da computa\u00e7\u00e3o voltada \u00e0 especifica\u00e7\u00e3o, desenvolvimento, manuten\u00e7\u00e3o e cria\u00e7\u00e3o de software, com a aplica\u00e7\u00e3o de tecnologias e pr\u00e1ticas de ger\u00eancia de projetos e outras disciplinas, visando organiza\u00e7\u00e3o, produtividade e qualidade. Uma das frentes nessa \u00e1rea, \u00e9 o teste de software,  que busca fornecer informa\u00e7\u00f5es sobre sua qualidade em rela\u00e7\u00e3o ao contexto em que ele deve operar, se relaciona com o conceito de verifica\u00e7\u00e3o e valida\u00e7\u00e3o. Isso inclui o processo de utilizar o produto para encontrar seus defeitos. Nesse sentido, vamos para a seguinte narrativa:<\/p>\n\n\n\n<p class=\" eplus-wrapper\"><em>Estava eu jogando enquanto aguardava minha civiliza\u00e7\u00e3o avan\u00e7ar da Idade Her\u00f3ica para a Idade M\u00edtica, a evolu\u00e7\u00e3o trazia um custo para a civiliza\u00e7\u00e3o (1000 pontos de comida e 1000 pontos de ouro) o qual foi pago de antem\u00e3o ao in\u00edcio do processo. <\/em><\/p>\n\n\n\n<p class=\" eplus-wrapper\"><em>Quase para ocorrer a evolu\u00e7\u00e3o, eu me arrependi de uma decis\u00e3o e corri para interromp\u00ea-la, mas j\u00e1 era tarde, seu progresso estava em 100%, mesmo assim cliquei para interromper e ent\u00e3o minha civiliza\u00e7\u00e3o evoluiu para a Idade Mitol\u00f3gica, e eu recebi o estorno da evolu\u00e7\u00e3o (a\u00e7\u00e3o que ocorre quando voc\u00ea a interrompe).<\/em><\/p>\n\n\n\n<p class=\" eplus-wrapper\"><em>Na confus\u00e3o da partida reparei que meus pontos de comida e de ouro aumentaram em 1000 cada um, por\u00e9m n\u00e3o era poss\u00edvel refletir muito sobre isso (literalmente est\u00e1vamos em meio a uma guerra).<\/em><\/p>\n\n\n\n<p class=\" eplus-wrapper\">Ap\u00f3s o t\u00e9rmino da partida fui refletir sobre o que ocorreu, agora pensando como o sistema foi programado (\u00e9 ai que entra a Engenharia de Software):<\/p>\n\n\n<ol class=\"eplus-wrapper wp-block-list eplus-styles-uid-9f76b5\">\n<li class=\" eplus-wrapper\">Quando voc\u00ea coloca para evoluir, o c\u00f3digo do jogo deve subtrair dos seus recursos o custo da evolu\u00e7\u00e3o (nesse caso 1000 pontos de comida e 1000 pontos de ouro), e manter em &#8220;caixa&#8221; at\u00e9 que a evolu\u00e7\u00e3o termine;<\/li>\n\n\n\n<li class=\" eplus-wrapper\">Se a qualquer momento voc\u00ea interromper a evolu\u00e7\u00e3o esse valor de caixa volta para voc\u00ea;<\/li>\n\n\n\n<li class=\" eplus-wrapper\">Contudo, ap\u00f3s a evolu\u00e7\u00e3o ser conclu\u00edda, esse valor de caixa \u00e9 descartado;<\/li>\n\n\n\n<li class=\" eplus-wrapper\">Embora isso devesse ocorrer junto com a evolu\u00e7\u00e3o, quem programou o c\u00f3digo pode ter criado uma esp\u00e9cie de gatilho, que ap\u00f3s completar a evolu\u00e7\u00e3o, envia uma mensagem avisando para remover a op\u00e7\u00e3o de cancelar a evolu\u00e7\u00e3o e para eliminar o valor em &#8220;caixa&#8221;;<\/li>\n\n\n\n<li class=\" eplus-wrapper\">Assim, o gatilho dessa mensagem s\u00f3 ocorreria ap\u00f3s a evolu\u00e7\u00e3o, isso significa que primeiro a evolu\u00e7\u00e3o acontece, para ent\u00e3o se impedir que ela seja interrompida e o valor estornado;<\/li>\n\n\n\n<li class=\" eplus-wrapper\">Ent\u00e3o, se no intervalo entre a evolu\u00e7\u00e3o e o envio da mensagem para cancelar a possibilidade de interromper a evolu\u00e7\u00e3o, voc\u00ea ativar a interrup\u00e7\u00e3o da evolu\u00e7\u00e3o, ent\u00e3o o jogo interromper\u00e1 algo que j\u00e1 ocorreu e te estornaria o valor que estava em caixa.<\/li>\n<\/ol>\n\n\n<p class=\" eplus-wrapper\">Claro, isso at\u00e9 ent\u00e3o era minha teoria baseada em como eu imaginava ter ocorrido aquele erro. Hora de testar:<\/p>\n\n\n<div class=\"wp-block-image \">\n<figure class=\"aligncenter size-large eplus-wrapper\"><img fetchpriority=\"high\" decoding=\"async\" width=\"645\" height=\"487\" src=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-42-18.png\" alt=\"\" class=\"wp-image-2660\" srcset=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-42-18.png 645w, https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-42-18-300x227.png 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><figcaption class=\"wp-element-caption\">Minha civiliza\u00e7\u00e3o criada em um ambiente controlado, atualmente na Idade Her\u00f3ica com 1584 pontos de comida e 1062 pontos de ouro.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image \">\n<figure class=\"aligncenter size-large eplus-wrapper\"><img decoding=\"async\" width=\"645\" height=\"487\" src=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-01.png\" alt=\"\" class=\"wp-image-2662\" srcset=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-01.png 645w, https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-01-300x227.png 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><figcaption class=\"wp-element-caption\">Processo de evolu\u00e7\u00e3o para a Idade M\u00edtica em 99% de conclus\u00e3o, minha civiliza\u00e7\u00e3o tem 584 pontos de comida e 62 pontos de ouro.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image \">\n<figure class=\"aligncenter size-large eplus-wrapper\"><img decoding=\"async\" width=\"645\" height=\"487\" src=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-03.png\" alt=\"\" class=\"wp-image-2663\" srcset=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-03.png 645w, https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-44-03-300x227.png 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><figcaption class=\"wp-element-caption\">Quando a evolu\u00e7\u00e3o da civiliza\u00e7\u00e3o n\u00e3o \u00e9 interrompida no intervalo das mensagens do c\u00f3digo-fonte.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image \">\n<figure class=\"aligncenter size-large eplus-wrapper\"><img loading=\"lazy\" decoding=\"async\" width=\"645\" height=\"487\" src=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-43-46.png\" alt=\"\" class=\"wp-image-2661\" srcset=\"https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-43-46.png 645w, https:\/\/www.blogs.unicamp.br\/zero\/wp-content\/uploads\/sites\/187\/2021\/02\/Screenshot-from-2021-02-23-13-43-46-300x227.png 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><figcaption class=\"wp-element-caption\">Quando a evolu\u00e7\u00e3o da civiliza\u00e7\u00e3o \u00e9 interrompida no intervalo das mensagens do c\u00f3digo-fonte.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\" eplus-wrapper\">Testei em diversas evolu\u00e7\u00f5es tamb\u00e9m, e de fato o sistema parece funcionar com esse gatilho, possibilitando que o bug ocorra. Embora, interromper a evolu\u00e7\u00e3o nesse intervalo seja muito dif\u00edcil, pois mesmo em ambiente controlado, conseguia realizar o bug mais ou menos uma vez a cada dez tentativas. Ou seja, em termos de jogo esse bug \u00e9 invi\u00e1vel de se usar e at\u00e9 mesmo prejudicial a quem tenta, podendo tomar mais tempo (cancelando a evolu\u00e7\u00e3o antes que ela ocorra de fato) ou n\u00e3o render nenhum benef\u00edcio (cancelando a evolu\u00e7\u00e3o ap\u00f3s o valor de caixa ser descartado).<\/p>\n\n\n\n<p class=\" eplus-wrapper\">Em Engenharia de Software, vemos algumas t\u00e9cnicas para &#8220;balan\u00e7ar&#8221; um programa na tentativa de que ele apresente alguns bugs em pontos tidos como cr\u00edticos para quem programou. No caso do Age of Mythology, esse bug se encontrava no tempo de comunica\u00e7\u00e3o entre duas partes do c\u00f3digo-fonte.<\/p>\n\n\n\n<p class=\" has-text-align-center eplus-wrapper\">Cr\u00e9ditos da imagem de capa a <a href=\"https:\/\/pixabay.com\/photos\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1209641\">Free-Photos<\/a> por <a href=\"https:\/\/pixabay.com\/pt\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1209641\">Pixabay<\/a><\/p>\n\n\n\n<hr class=\" wp-block-separator has-css-opacity eplus-wrapper\" \/>\n\n\n\n<p class=\" has-text-align-left eplus-wrapper\">Como referenciar este conte\u00fado em formato ABNT (baseado na norma NBR 6023\/2018):<\/p>\n\n\n\n<p class=\" eplus-wrapper\">SILVA, Marcos Henrique de Paula Dias da. Engenharia de Software em Age of Mythology. <em>In<\/em>: UNIVERSIDADE ESTADUAL DE CAMPINAS. <strong><strong><a href=\"https:\/\/www.blogs.unicamp.br\/zero\/\" target=\"_blank\" rel=\"noreferrer noopener\">Zero &#8211; Blog de Ci\u00eancia da Unicamp<\/a><\/strong>. <a href=\"https:\/\/www.blogs.unicamp.br\/zero\/category\/v-5-ed-1\/\" target=\"_blank\" rel=\"noreferrer noopener\">Volume 5. Ed. 1. 1\u00ba semestre de 2021<\/a><\/strong>. Campinas, 23 fev. 2021. Dispon\u00edvel em: <a href=\"https:\/\/www.blogs.unicamp.br\/zero\/2659\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.blogs.unicamp.br\/zero\/2659\/<\/a>. Acesso em: &lt;data-de-hoje&gt;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estudando a raz\u00e3o de um comportamento estranho identificado dentro de Age of Mythology.<\/p>\n","protected":false},"author":434,"featured_media":2666,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"editor_plus_copied_stylings":"{}","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"pgc_sgb_lightbox_settings":"","_vp_format_video_url":"","_vp_image_focal_point":[],"footnotes":""},"categories":[1217],"tags":[],"class_list":["post-2659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-v-5-ed-1"],"_links":{"self":[{"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/posts\/2659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/users\/434"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/comments?post=2659"}],"version-history":[{"count":14,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/posts\/2659\/revisions"}],"predecessor-version":[{"id":5281,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/posts\/2659\/revisions\/5281"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/media\/2666"}],"wp:attachment":[{"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/media?parent=2659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/categories?post=2659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blogs.unicamp.br\/zero\/wp-json\/wp\/v2\/tags?post=2659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}