Ok, então aqui está o meu problema:
Eu trabalho para uma grande empresa, alguns conseguiram um emprego (francamente porque a entrevista foi fácil). Não é que eu não conheça minhas coisas, sou muito bom em entender java, são bibliotecas etc.
Mas, sempre que tento resolver algum problema lógico, acho realmente difícil encontrar uma solução.
Por exemplo, conversion of decimal to roman
quando vi a solução, acho que é um problema simples. Mas eu não era capaz de implementá-lo após 1-2 horas de tentativas!
Sinto-me burro e não vale a pena ser um engenheiro de software. As habilidades de resolução de quebra-cabeças devem vir nativamente para um ótimo programador. Mas quando tento resolver alguns quebra-cabeças, não consigo encontrar uma solução e apenas pesco no google! ... e odeio isso!
Quando um problema é enfrentado (como o recurso implementar xyz) no trabalho, sou bastante rápido e sou respeitado no meu local de trabalho por isso, mas não tenho nenhum orgulho disso. Porque quando tento resolver qualquer problema desafiador em termos matemáticos ou lógicos, eu me atrapalho. Ainda sinto que amo o que estou fazendo (como engenheiro), mas me sinto muito triste por não conseguir resolver alguns problemas difíceis de lógica que os meus amigos apresentam.
Sinto-me desmoralizado :(
TL; DR: Entendo as coisas de um ponto de vista prático (implementando recursos em nosso produto), mas ao tentar trabalhar no problema, digamos ProjectEuler, SUCO demais! E eu preciso afiar meu cérebro!
Então, minhas perguntas são:
- Como devo corrigi-lo? Devo começar por resolver (e me forçar a) projetar problemas de euler? Mesmo que demore horas para resolver alguns problemas básicos ?
- Ou devo voltar ao básico e estudar matemática básica?
- Eu realmente não acho divertido resolver quebra-cabeças. Mas eu quero torná-lo divertido para mim! E acho que, se os entender de uma maneira melhor, gostarei!
PS: Eu nunca fui educado em CS (minha graduação era eletrônica). Mas isso não é desculpa para ser um desenvolvedor ruim.
Obrigado!
fonte
Respostas:
Primeiro, é maravilhoso ver isso como uma fraqueza em suas habilidades. Você realmente sabe onde precisa melhorar, o que facilita muito o processo e indica que você é melhor do que pensa.
Acredito que seu principal problema, que já vi muitas vezes antes, é que você não possui um "conjunto de ferramentas para resolver problemas". Quando se depara com um problema, o que você faz? Como você resolve isso? Sou lento em matemática, mas como sei usar as pequenas ferramentas matemáticas, acedi o cálculo.
Portanto, além de apenas trabalhar na solução de problemas, é necessário analisar quais ferramentas e habilidades você traz para a mesa quando o faz. Se você estava trabalhando em um novo recurso no trabalho, simplesmente se senta sem IDE, sem depurador, sem documentação, sem internet e sem código-fonte? Claro que não!
Existem ferramentas para resolver problemas, você simplesmente não os conhece ... ainda . O artigo da wikipedia possui alguns links para técnicas de solução de problemas. Mas a ferramenta mais importante é o método científico . O artigo da wikipedia inclui uma abordagem pragmática:
Todos os problemas podem ser resolvidos desta maneira! Muitas pessoas não seguem essas etapas. É como um desenvolvedor que se recusa a testar seu código. Em absoluto. Ele terá problemas para descobrir que existem erros.
Finalmente, a outra ferramenta principal para a solução de problemas é decompô-la com etapas simples . Por exemplo, o primeiro problema nos exemplos do projeto Euler :
Temos dois fatos e um problema aqui. O fato um mostra como definir um múltiplo de três ou cinco abaixo de 10. 3 * 1,3 * 2,3 * 3,5 * 1 são todos válidos. 5 * 2 não é porque é igual a 10. Então, o fato dois nos diz que os somamos para obter 23.
Portanto, já temos um método de encontrar valores e podemos adicioná-los para obter nossa soma. Obviamente, podemos examinar os fatos e aplicar um simples reverso da ordem. 3, 5, 6 e 9 são múltiplos de 3 ou 5. Isso é 3% 3, 5% 5, 6% 3, 9% 3, todos dão um mod de zero. Portanto, outra abordagem seria passar de 999 para 1 e modular cada número com 3 e 5. Colete a lista de valores e adicione-os.
Eu sugeriria a arte da programação unix como um excelente exemplo de uso de pequenas ferramentas no mundo da programação. Encadear eles permite resolver problemas muito complexos, e não posso contar o número de vezes que esses conceitos me ajudaram.
fonte
Muitos programadores também são "solucionadores de quebra-cabeças" naturais, mas há muito mais na programação do que isso. Se todos os programadores estivessem focados em resolver problemas algorítmicos interessantes, teríamos cargas e cargas de software que poderiam resolver problemas interessantes, mas nenhum deles seria utilizável ou sustentável.
Acho que há relativamente poucos desafios do tipo "solução de quebra-cabeças" em meu trabalho. A maioria dos desafios é mais sobre o estudo de código antigo, o aprendizado de uma nova API, o design da arquitetura de algum componente de uma maneira que as pessoas não jurarão sobre isso daqui a três anos. Tudo isso é desafiador, mas não tanto do tipo de quebra-cabeça lógico. Por outro lado, tenho colegas que passam a maior parte do tempo pensando em algoritmos de otimização de compiladores e que são muito bons nisso.
Eu acho que é importante que os programadores pensem constantemente em "como posso melhorar o que faço?", Mas ser um bom programador não exige necessariamente que você seja ótimo em resolver quebra-cabeças.
Pessoalmente, recebo minha solução para resolver quebra-cabeças resolvendo "geocaches misteriosos" .
fonte
Deixe-me avisá-lo, quanto mais você souber, mais perceberá quão pouco você sabe.
Só não desanime com isso. Continue aprendendo e tentando trabalhar em áreas que você percebe que estão faltando.
Agora vamos à sua pergunta. Minha sugestão seria começar a trabalhar nos problemas do projeto eule r.
Minhas razões para isso são simples, comece na pergunta mais popular, normalmente esses são os problemas mais fáceis de resolver.
Quando você se deparar com um problema, tente resolvê-lo, trabalhe sozinho, tente abordagens diferentes. O funcionamento do projeto euler permite verificar e testar sua resposta.
Se você decidir que não pode resolver esse problema, comece a pesquisar o problema (sem procurar a resposta). Não tente novamente.
Depois de resolver o problema, o projeto euler possui uma seção na qual eles mostram as melhores respostas para cada implementação de idioma. Analise a resposta deles no seu idioma preferido, entenda a solução e o pensamento que foi adotado.
Agora feche a resposta que eles forneceram e tente novamente por conta própria até resolvê-la novamente.
Se você praticar o suficiente, a lógica e o pensamento para resolver esses problemas ficarão cada vez mais fáceis para você.
fonte
A maioria dos trabalhos de programação não requer muita lógica. Mas esses podem não ser os trabalhos que você gosta.
Como orientação geral, tente aprender algoritmos e estruturas. Eu posso aconselhar o manual The Algorithm Design da Skiena. Depois de conhecê-los, você começará a categorizar os problemas. Isso se parece muito com o problema dos vendedores ambulantes, aqui eu posso usar uma árvore, aqui eu posso usar uma pesquisa binária ...
O Projeto Euler tem uma grande variação de quebra-cabeças. Muitos destes são facilmente executáveis com um conhecimento básico de matemática. Outros são mais fáceis de resolver quando você conhece alguns desses algoritmos.
fonte
Acredito muito que você tenha começado sua jornada na programação, então, se você demorar algum tempo para entender e acertar, parece que isso não é problema. A única diferença que faz é a cada tentativa que você está aprendendo algo como WoW! ! a última coisa que fiz não faz sentido, porque eu precisava de decimal e não o dobro
Se a solução de um quebra-cabeça não lhe interessar, então não procure mais por isso, existem outros problemas lógicos flutuando assim que você conhece sua base de códigos. Você pode trabalhar neles e apresentar as alterações sugeridas ao seu mentor ou líder . (não se preocupe se você cometer algum erro, eles o ajudarão a saber por que sua metodologia está com defeito; portanto, seja um observador perspicaz e um ouvinte apto)
Vai levar algum tempo para você se acalmar e, em seguida, pode ser que você continue disparando em todos os cilindros. Escusado será dizer que evite o desejo de procurar uma solução no google ou no SO, faça alguns esforços do seu lado e só inicie o seu navegador quando você estiver em dúvida ou absolutamente sem noção
fonte
Primeiramente, saber que sua fraqueza é uma força real; portanto, você sabe o que estudar para obter um jogo melhor.
Meu conselho seria: leia muito código que resolve problemas de lógica. Todo mundo tem seu próprio estilo na solução de quebra-cabeças, a leitura de código pode sugerir uma maneira de aprender a fazer isso. Além disso, a capacidade de entender o código provavelmente também indica a teoria matemática que descreve o problema; portanto, ao longo do caminho, você aprenderá também sobre os problemas subjacentes.
Cheers, Carlo
fonte
Eu sinto que devo adicionar a isso.
Como a resposta escolhida já afirmou, conhecer a sua fraqueza é uma enorme vantagem e existem algumas ferramentas básicas para aprender técnicas de solução de problemas. O que eu acho que falta na resposta, no entanto, é simplesmente encontrar maneiras de praticar problemas difíceis - muito. Seja teimoso ao concluir totalmente todos os problemas que tentar. Ler código, muito código, é bom, assim como ler livros sobre a solução de problemas, mas escrever código é quase mais importante.
De certa forma, compartilhamos a mesma fraqueza (embora não seja tão ruim quanto você pensa). Para praticar minhas habilidades de resolução de problemas, estou sempre trabalhando em algum problema do projeto Euler ou HackerRank. Se for um problema fácil, escolho 7 linguagens de programação e tento resolvê-las em todas elas. Para problemas mais difíceis, posso escolher três idiomas muito diferentes um do outro, apenas para manter razoável o tempo que gasto no problema. Para todos os problemas, depois de encontrar uma solução, procuro as soluções que os outros apresentam e me certifico de entendê-los. Se você não entender alguma solução, sempre poderá postar no StackOverflow ou provavelmente aqui no Programmers Stack Exchange ou algo assim, e tenho certeza de que há alguém no site que poderia responder à sua pergunta (é raro que não exista).
Basicamente, porém, verifique se você está praticando, e não apenas lendo, e pratique muito. Assim como os esportes, um pensamento claro exige tempo e esforço.
Outra coisa que você pode fazer para ajudar na maneira como pensa sobre os problemas é escrever o conjunto de testes para os problemas que você resolve primeiro. Você não pode escrever um bom teste para um problema sem primeiro entendê-lo completamente. Se você fizer isso para diferentes idiomas, isso terá a vantagem de ensinar diferentes técnicas de teste ao mesmo tempo.
fonte