{"id":9847,"date":"2023-11-29T10:09:28","date_gmt":"2023-11-29T13:09:28","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9847"},"modified":"2023-12-26T15:59:55","modified_gmt":"2023-12-26T18:59:55","slug":"a-solucao-esta-no-abstrato-transcricao-e-aplicacao","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/a-solucao-esta-no-abstrato-transcricao-e-aplicacao\/","title":{"rendered":"A Solu\u00e7\u00e3o Est\u00e1 no Abstrato: Transcri\u00e7\u00e3o e Aplica\u00e7\u00e3o"},"content":{"rendered":"\n<p>Neste artigo, vamos explorar uma t\u00e9cnica poderosa que utilizo em programa\u00e7\u00e3o &#8211; a arte de abstrair problemas para alcan\u00e7ar solu\u00e7\u00f5es mais claras e eficazes. A partir da abstra\u00e7\u00e3o, \u00e9 poss\u00edvel identificar a ess\u00eancia de um desafio complexo, o que muitas vezes nos leva a uma solu\u00e7\u00e3o elegante e eficiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Poder da Generaliza\u00e7\u00e3o<\/h2>\n\n\n\n<p>Voc\u00ea j\u00e1 esteve diante de um desafio de software que parecia intranspon\u00edvel? Nessas horas, minha estrat\u00e9gia \u00e9 generalizar o problema. Despojo-o das suas complexidades espec\u00edficas para examinar o cerne da quest\u00e3o. Ao olhar para um desafio de otimiza\u00e7\u00e3o ou verificar se um elemento pertence a um conjunto, pergunto a mim mesmo: &#8220;Estou perdido nos detalhes quando a solu\u00e7\u00e3o poderia ser simples?&#8221;.<\/p>\n\n\n\n<p>A generaliza\u00e7\u00e3o \u00e9 o processo de procurar a taxonomia de um problema. Removendo o contexto superficial, eu posso destilar o problema aos seus fundamentos l\u00f3gicos ou matem\u00e1ticos, extraindo uma representa\u00e7\u00e3o abstrata que se aplica a uma classe mais ampla de desafios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pesquisa e Abstra\u00e7\u00e3o<\/h2>\n\n\n\n<p>Qual \u00e9 a vantagem de pensar abstratamente? Ao abstrair, posso fazer pesquisas eficazes, consultando fontes como pesquisas acad\u00eamicas ou documenta\u00e7\u00f5es para descobrir solu\u00e7\u00f5es que foram bem-sucedidas em cen\u00e1rios similares. Isto est\u00e1 em linha com a ideia da busca por padr\u00f5es <em>design patterns<\/em> que sugerem solu\u00e7\u00f5es para problemas comuns em design de software.<\/p>\n\n\n\n<p>Suponhamos que eu esteja explorando algoritmos para agrupamentos em redes sociais. Uma pesquisa me leva ao conceito de grafos bipartidos. Por que n\u00e3o posso simplesmente come\u00e7ar com essa solu\u00e7\u00e3o? Porque sem a generaliza\u00e7\u00e3o, eu poderia estar perdendo uma adapta\u00e7\u00e3o necess\u00e1ria que s\u00f3 \u00e9 percept\u00edvel atrav\u00e9s da compreens\u00e3o da forma geral do problema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De Volta ao Espec\u00edfico<\/h2>\n\n\n\n<p>Com uma solu\u00e7\u00e3o abstrata em m\u00e3os, retorno \u00e0 realidade do meu problema \u00fanico. Eu transformo o conhecimento geral em algo aplic\u00e1vel ao contexto espec\u00edfico. Vamos ilustrar isso com um exemplo em C#:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public Graph BipartiteGraphMatching(List<User&gt; users, List<Interest&gt; interests)\n{\n    var graph = new Graph(users.Count + interests.Count);\n\n    foreach (var user in users)\n    {\n        foreach (var interest in interests)\n        {\n            if (user.Interests.Contains(interest))\n            {\n                graph.AddEdge(user.Id, interest.Id);\n            }\n        }\n    }\n\n    return graph.FindMaximumMatching();\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> Graph <\/span><span style=\"color: #88C0D0\">BipartiteGraphMatching<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">User<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> users<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">Interest<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> interests<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> graph <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Graph<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">users<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Count<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">interests<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Count<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">foreach<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> user <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">users<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">foreach<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> interest <\/span><span style=\"color: #81A1C1\">in<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">interests<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">user<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Interests<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Contains<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">interest<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #D8DEE9\">graph<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">AddEdge<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">user<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Id<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">interest<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Id<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">graph<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">FindMaximumMatching<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Este m\u00e9todo exemplifica como a teoria dos grafos bipartidos pode ser utilizada para criar pares entre usu\u00e1rios e interesses, um conceito poderoso para sites de relacionamento. Agora a solu\u00e7\u00e3o n\u00e3o \u00e9 apenas um conceito: \u00e9 aplic\u00e1vel e pronta para melhorar um produto de software real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>A generaliza\u00e7\u00e3o e a especializa\u00e7\u00e3o funcionam de m\u00e3os dadas para resolver problemas complexos de software. Ao abstrair um problema, desconstru\u00edmos a dificuldade em partes gerenci\u00e1veis, permitindo-nos entender e resolver cada parte de forma independente. Ao especializar, trouxemos a solu\u00e7\u00e3o de volta ao problema original com uma nova perspectiva e abordagem.<\/p>\n\n\n\n<p>No universo da programa\u00e7\u00e3o, onde cada problema pode parecer um labirinto, \u00e0s vezes a sa\u00edda est\u00e1 em subir e ver o labirinto do alto. Voc\u00ea est\u00e1 pronto para ascender ao n\u00edvel da abstra\u00e7\u00e3o e ver as suas solu\u00e7\u00f5es de desenvolvimento de software sob uma nova luz?<\/p>\n\n\n\n<p>Atrav\u00e9s dos grupos de estudo e sess\u00f5es de mentoria que lidero, discutimos e praticamos essas estrat\u00e9gias de abstra\u00e7\u00e3o e aplica\u00e7\u00e3o para resolver problemas de forma mais eficaz, enriquecendo nosso conjunto de ferramentas para enfrentar os desafios do desenvolvimento de software moderno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A generaliza\u00e7\u00e3o permite compreender a ess\u00eancia de um problema de software, levando a solu\u00e7\u00f5es mais claras.<\/li>\n\n\n\n<li>Uma solu\u00e7\u00e3o abstrata pode ser encontrada atrav\u00e9s da pesquisa, e ent\u00e3o adaptada ao problema espec\u00edfico.<\/li>\n\n\n\n<li>Exemplificar o processo de especializa\u00e7\u00e3o com c\u00f3digo ajuda a visualizar como teorias abstratas s\u00e3o aplicadas na pr\u00e1tica.<\/li>\n<\/ol>\n","protected":false},"featured_media":9852,"parent":0,"template":"","cursos":[5],"class_list":["post-9847","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-algortimos"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/9847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/9852"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9847"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}