Um pouco de fundo
Hoje tenho 28 anos e nunca tive nenhum treinamento formal em desenvolvimento de software, mas tenho dois graus de ensino superior equivalentes a um BA em Relações Públicas e um MBA Executivo focado em Gerenciamento de Projetos. Eu trabalho nesses campos há cerca de 6 anos e, há 2,5 anos, deixei / perdi meu emprego e decidi mudar de direção.
Depois de um mês pensando nas coisas, decidi começar a desenvolver freelancers pequenos sites no WordPress. Eu aprendi sozinho e hoje posso dizer que tenho uma carreira humilde, mas bem-sucedida, desenvolvendo temas e plugins do zero para meus clientes - principalmente agências terceirizando parte de seu trabalho de desenvolvedor para sites de médio / grande porte.
Mas, às vezes, sinto que não ter estudado matemática o suficiente ou não ter uma compreensão formal das coisas realmente me atrasa quando tenho que competir ou trabalhar com desenvolvedores mais experientes. Estou constantemente procurando maneiras de aprender mais, mas parece não ter o básico.
Infelizmente, passar mais 4 anos em Ciência da Computação não é uma opção no momento, então estou tentando aprender tudo o que posso com livros e recursos online. Esse método nunca vai ter a NASA me empregando, mas eu realmente não me importo agora. Meu objetivo é primeiro passar da barra e ser capaz de me chamar de programador real.
Atualmente, estou gastando meu tempo livre estudando Java para programadores (para aprender uma linguagem que todo mundo diz ser difícil / exigente), lendo trechos do Code Complete (para aprender as melhores práticas) e também Code: The Hidden Language of Computer Hardware e software (para entender o funcionamento interno dos computadores).
TL; DR
Então, minha situação atual é a seguinte: sou basicamente capaz de escrever qualquer sistema completo em PHP (com a ajuda do Google e alguns livros), integrando Ajax, SQL e outros enfeites, e talvez um pouco mais lento do que um desenvolvedor experiente esperaria devido a toda a pesquisa envolvida.
Mas ontem fiquei preso tentando descobrir (não o Google) uma solução para o teste FizzBuzz porque não tinha o operador do módulo de if($n1 % $n2 == 0)
método memorizado.
O que você sugeriria como uma boa maneira de resolver esse dilema? Quais assuntos / livros devo estudar que me levariam a resolver problemas mais rapidamente e talvez mais "do modo de programadores"?
EDIT - Parece que houve alguma confusão sobre o que eu não sabia para resolver o FizzBuzz.
Talvez eu não tenha me expressado direito: sabia os passos necessários para resolver o problema. O que não memorizei foi o operador do módulo. O problema estava na transposição da matemática básica para o programa, e não no conhecimento da matemática básica.
Fiz o teste por diversão, depois de ler sobre isso em Coding Horror . Eu apenas decidi que era uma boa linha de comparação de base entre mim e os desenvolvedores formalmente treinados.
Eu apenas usei isso como um exemplo de como não ter lidado com a matemática em um ambiente de computador antes me faz perder tempo pesquisando coisas básicas, como operadores de módulo, para poder resolver problemas simples.
I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)
e combino isso com você sem saberif($n1 % $n2 == 0)
, me pergunto sobre a exposição que você teve a coisas escritas em PHP. Eu acho que a maioria das coisas que você faz vai além de um simples cálculo de módulo. Você poderia dar mais informações sobre o que acha que é capaz de fazer?stuck b/c I didn't memorize %
problema, vale a pena notar que existem outras maneiras de fazer isso: (assumindo $ n2! = 0)if (is_int ($n1 / $n2))
ouif (($n1 / $n2) == (int) ($n1 / $n2))
Conhecer palavras-chave é uma coisa, e saber como expressar as idéias subjacentes na ausência de uma solução interna é outro.Respostas:
No seu caso, como você é autodidata e já tem o que parece ser uma abordagem boa, saudável e sem BS para a aprendizagem. Ainda algumas sugestões ...
A prática leva à perfeição
Eu acho que você deveria mergulhar em exercícios de programação, como:
Até pegue as perguntas dos exames anteriores de universidades conhecidas ao seu redor ou de competições de programação locais (ou remotas). Por exemplo, temos um bom na França para aspirantes a programadores do ensino médio chamado Prologin , e fornece todos os anos uma boa série de quebra-cabeças (provavelmente apenas em francês, desculpe, mas esse é o tipo de coisa que eu quero dizer )
Para saber mais: Onde posso encontrar quebra-cabeças e desafios de programação?
Livros Clássicos e Referências
Também poderíamos recomendar uma lista muito longa de livros incríveis , mas eu diria que a resposta zen é que não existe um caminho certo para a iluminação.
Seria difícil dizer quais estão no topo da lista. Portanto, continue lendo várias coisas para aprender as armadilhas gerais a serem evitadas e as melhores práticas a serem seguidas, como você está fazendo agora.
Para mais:
Forçando os limites
Além disso, procure material que coça a cabeça, como:
Não necessariamente deve ser tomado como exemplo de coisas para fazer hoje em dia, mas vale a pena tentar descobrir o que diabos está acontecendo lá.
Sistemas de pares são motivacionais
Você também pode espreitar (e se envolver) nas seguintes comunidades para melhorar suas habilidades de forma incremental ao ser confrontado com outras pessoas.
Educação a tempo parcial
Se você não tiver tempo ou motivação para participar de outro curso de quatro anos ou algo semelhante (que pode até não ser necessário ou recompensador, e caro), considere procurar material de ensino on-line. Obviamente, estes não se limitam à ciência da computação.
Graças ao esforço original do MIT OpenCourseWare , agora existem várias universidades que seguiram o exemplo e você pode encontrar muitos materiais de cursos de nível universitário gratuitamente. Nem sempre é fácil navegar e ler por conta própria, mas alguns são muito bem feitos. Para começar do zero e subir bastante, considere também a Khan Academy .
Alguns vão um pouco mais longe e oferecem cursos on-line reais de graça, onde você também tem acesso ao material do curso, mas também oferece palestras com ritmo e auto-avaliações regulares. Por exemplo, visite Coursera ou Udacity .
A maioria dos itens acima costuma publicar suas palestras no Youtube ou no iTunesU, assim você encontrará bastante material se sua sede de conhecimento ainda não tiver sido suprimida por todos os links anteriores.
Se você deseja algo que ofereça uma experiência mais próxima da universidade "real", considere universidades remotas, que também permitem trabalhar em meio período, mas exigem que você siga o ritmo e faça auto-avaliações e final de exames de ano (às vezes no local), como com a OpenUniversity e suas variantes internacionais.
A paixão mantém você indo
(e obtenha olhos suficientes observando seu código para criticá-lo e ter diferentes perspectivas)
Os franceses dizem:
Continue fazendo o que está fazendo e, eventualmente, você será um especialista. Leva tempo e trabalho.
Veja também Estou com problemas para aprender para obter mais sugestões.
PS: Embora seja uma ferramenta muito controversa para entrevistas e não ajude a identificar bons candidatos, costumo usar o FizzBuzz para pelo menos eliminar os incrivelmente "ruins". Então comece a praticar! :)
fonte
Não tenho codificado há muito tempo (comecei a aprender SQL sozinho há cerca de 27 meses e comecei a codificar em Perl há cerca de 20 meses), mas a citação acima parece algumas coisas que ouvi de ex-alunos:
Ok, esse último provavelmente foi um pouco duro ... mas o ponto que estou tentando fazer é que resolver problemas não é memorizar . Se fosse, algum gênio poderia programar um computador para resolver todos os problemas, e nenhum de nós teria que pensar novamente (que mundo infernal seria esse ...).
Agora, é verdade que qualquer empreendimento intelectual consiste em pelo menos um pouco de memorização. Em particular, se você for codificar em PHP, deverá entender os tipos de dados básicos (números, seqüências de caracteres, matrizes), coisas básicas que você pode fazer com eles (para números: adição, subtração, multiplicação, divisão e módulo; para cadeias de caracteres: concatenação, substrings, substituição e pelo menos algum conhecimento de expressões regulares; para matrizes: concatenação, aderência a elementos, união de elementos, looping, contagem de elementos, etc.) e as estruturas lógicas básicas que se pode usar (instruções if / then / else, loops foreach, loops etc).
Em seguida, quando encontrar um problema, use o problema para fornecer o contexto de quais ferramentas você precisa. Para o FizzBuzz, você precisa saber quando um número é divisível por 3, 5 ou 15. Ok, então estamos lidando com números .... que ferramentas básicas nos permitem dizer quando um número inteiro é divisível por outro? Bem, o operador do módulo. Então, use isso. (É claro que, se seu número for
$n
, você pode imaginar e ver se o último dígito$n
é 0 ou 5 e / ou se os dígitos$n
somam algo divisível por 3, mas eu discordo ...) Você precisa faça isso para cada número entre 1 e 100, para evitar o túnel do carpelo, use umforeach
loop.O moral da história é que, por um lado, você diz "Sou basicamente capaz de escrever qualquer sistema completo em PHP" e, por outro lado, não pode codificar o FizzBuzz, a primeira afirmação está incorreta. Alguns dos meus ex-alunos de cálculo juraram de alto a baixo que entendiam os conceitos, mas simplesmente não conseguiam resolver os problemas no exame ... ou nos trabalhos de casa ... ou nos problemas do questionário. Eles estavam errados quanto à sua compreensão também.
Pare de inventar desculpas e aprenda o básico.
fonte
Você pode pensar que o FizzBuzz é um problema de brinquedo; quando é que precisarei usar o operador de módulo em um programa real? Mas você realmente usa isso o tempo todo. Três exemplos comuns:
row_number % 2 == 0
) e exibe uma cor para linhas pares e uma para linhas ímpares.if item_number % N == 0
sido escrita como equivalente (if item_number|divisbleby: N
).if cur_item_number % 50 == 0 then commit_data
.Claro que existem outras maneiras de fazer todas essas coisas. Mas você pode fazer um zumbido de efervescência sem usar o operador módulo ou comparar a divisão flutuante com a divisão inteira. Por exemplo, para o FizzBuzz, você pode fazer algo como o seguinte pseudo-código.
Para concluir, se você quiser ser um grande programador algum dia, não comece a aprender livros de idiomas. Sim, um livro PHP / Java fará com que você obtenha respostas do google / stackoverflow e de programas que estão trabalhando pela metade muito mais rápido do que qualquer outra coisa. Mas para realmente saber como escrever programas ótimos de qualidade e pensar como um programador, você precisa de alguma exposição a livros reais de CS.
Comece com um livro de CS que introduz uma linguagem de programação e os antecedentes de CS, com o famoso exemplo de Estrutura e interpretação de programas de computador (que ensinará Scheme - um dialeto Lisp) ou possivelmente algo como Think Python Como pensar como um computador Cientista (que eu não li). Ambos são gratuitos online.
Você precisa, eventualmente, ler um bom livro de algoritmos, o melhor sendo os algoritmos do CLRS (não gratuito), embora este livro de algoritmos on-line gratuitopode ser um substituto de baixo custo (se você puder apenas comprar o CLRS). O livro de algoritmos ensina como pensar em resolver problemas do computador e apresenta uma variedade de estruturas de dados (Matrizes / Listas Vinculadas / Montes / Árvores Binárias / Árvores B / HashTables) e algoritmos importantes que você precisa saber como usar da melhor maneira . Você não precisa memorizar todas as provas ou saber escrever perfeitamente todos os algoritmos (quem já usa um Fibonacci Heap); mas você deve saber intuitivamente que o loop for aninhado é O (N ^ 2); as classificações de comparação são, na melhor das hipóteses, O (N lg N), a pesquisa binária é O (lg N), pode encontrar mediana em O (N), por que os bancos de dados do disco rígido usam árvores B, etc.). No mínimo, um forte conhecimento do livro de algoritmos o ajudará a aceitar entrevistas de programação técnica da variedade google / facebook. Ao ler livros de programação, não basta ler / ler; você'
Também recomendo um livro sobre engenharia de software (código completo ou programador pragmático) depois de ler o livro de CS e algoritmos, que ensinará as práticas recomendadas de como escrever um bom código que pode ser mantido (nomes claros; comente apenas quando necessário ; manter código unido; refatorar quando necessário; usar controle de versão; etc).
fonte
Ninguém memoriza essa coisa. Você deveria inventar por conta própria. Se você conhece o operador de módulo e sabe o que ele faz, então é trivial um ótimo ajuste para o problema do FizzBuzz.
Eu vou sair em um membro aqui e geralmente sugerem que o problema é PHP. Eu gosto de dizer que Java é a pior linguagem já projetada e PHP é a pior linguagem já criada , porque mesmo seus criadores admitem que nunca foi projetado. É difícil aprender boas práticas de engenharia de software quando seu ambiente é praticamente a definição de como não fazê-lo. E, dependendo de uma estrutura para fazer tudo, não é dizer muito.
Java é uma das linguagens mais fáceis e piores que existe. Só tem uma coisa: herança manual coletada pelo lixo. Se seus amigos ou consultores dizem que o Java é difícil, encontre novos amigos. C ++ é uma linguagem difícil que inclui muitos conceitos e que ninguém contestará. Você também pode fazer C #, que pelo menos possui alguns genéricos e lambdas.
Como você aprenderá a codificar, quando seus idiomas foram projetados e implementados por pessoas que não podem codificar, e você depende de estruturas para tudo o que faz?
fonte
Eu acho que você precisa dar uma olhada no porquê de ficar preso tentando descobrir o FizzBuzz. Então, suponha, você lembrou que há um operador que lhe
$n
diz se é divisível por um número. E você tem má sorte para esquecer o que é. Tudo bem, por que você não tenta fazê-lo de outra maneira? Se você souber algo sobre código, poderá encontrar uma dúzia de outras maneiras de fazê-lo. Alguns deles podem parecer estranhos - como, por exemplo, colocar cada múltiplo de 5 em uma matriz e depois verificar se$n
está entre eles - e é uma solução ruim, mas ainda assim seria uma solução. No entanto, você está dizendo que não tinha, apenas estava preso. Pode ser um sintoma de um problema maior.Há duas coisas na programação que você precisa aprender.
A partir de sua descrição, parece que você começou com a primeira parte, mas um pouco ausente na segunda parte. Um bom curso de CS geralmente ajuda muito com isso, mas não é o único caminho. Tentando resolver problemas diferentes e lendo sobre como esses problemas precisam ser resolvidos, lendo os livros fundamentais citados aqui - tudo isso ajudaria. Depois de entender a mentalidade do programador, você descobrirá que começar a usar um novo pacote de truques não será um grande problema. Você precisaria pesquisar no Google aqui e ali, é claro, mas nunca ficará preso.
fonte
Você é bom em desenvolvimento da mesma maneira que em qualquer outra coisa: prática. Existe um bom conceito no mundo da programação chamado código kata . Este é essencialmente um exercício em que você codifica uma solução para um problema relativamente pequeno, analisa o que é bom e o que é ruim, descarta tudo e faz de novo. O FizBuzz é um kata por si só. Então faça e faça mais. Quando você encontrar coisas que não parecem muito boas ou simplesmente não funcionam, pesquise e seja minucioso. Faça perguntas nos sites de perguntas e respostas, leia artigos e blogs, veja como os outros lidam com isso e pratique o que aprendeu.
No curso dessa prática, você aprenderá quanto conhecimento matemático / teórico adicional poderá precisar. Se você se deparar com conceitos que você simplesmente não consegue entender, leia sobre eles e seus conhecimentos prévios e decida caso a caso, se você deseja fazer um curso ou o que você tem para expandir seus conhecimentos. bases teóricas.
fonte
Estou interpretando que isso significa que você não sabia e / ou não se lembrava do operador do módulo. Se for esse o caso, o ponto de partida é revisar as construções de idiomas no idioma que você está usando. Revise tudo o que você não 'sabe frio' e aprenda qualquer coisa que você simplesmente não sabe.
fonte
Continue codificando, continue aprendendo. Eventualmente, com bastante dedicação, você verá o FizzBuzz e se perguntará por que teve que pensar nisso. Muitas empresas fazem uma pergunta no estilo FizzBuzz como parte muito inicial de suas entrevistas, portanto, falhar desta vez significa que você pelo menos aprendeu algo sobre o processo de contratação.
Continue escrevendo o código, apresentando as idéias do projeto e pesquisando.
fonte
Posso recomendar o aprendizado de JavaScript antes de Java, C ++? Razões para você:
Recursos gratuitos para iniciantes
http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
Eu tinha cerca de 10 outros links, mas o SE não me permite publicá-los até atingir 10 repetições.
Aprender C ++, Java, etc, também é útil, mas o IMHO não tem o impacto geral na programação da Web como o JS, pois você pode usá-lo tanto no front quanto no back-end. Diverta-se!
fonte
Você pode encontrar e ajudar outras pessoas, por exemplo, giving.code (divulgação: meu site) ou Code for America ou qualquer outra coisa. Essa é uma excelente maneira de obter mais exposição a problemas que não sejam de criação de páginas da Web em PHP e se sentir bem também.
Quando você tem um problema para resolver - ou ajuda a resolver, ou apenas entende -, a escolha do código ocorre naturalmente ao longo do caminho. Ter um objetivo é a melhor maneira de aprender alguma coisa.
fonte
Então você não conseguiu resolver o problema do FizzBuzz. Grande negócio. Agora você pode, e eu aposto que você nunca esquecerá todas as inúmeras maneiras de como. Tente não ficar tão ansioso para se classificar como um programador ruim, simplesmente porque você não conseguiu resolver um problema estúpido do alto da sua cabeça.
Essa é uma questão. A outra é que você parece se sentir um pouco atrás da curva de aprendizado de programação. Como outros já disseram, continue codificando e continue lendo. Quanto mais você faz, melhor fica. É simples assim. Comece com o que você achar que é o maior buraco no fundo e prossiga a partir daí.
fonte
Eu não acho que me recusaria a recomendar alguém para contratar, porque eles não sabiam que era o operador do módulo, desde que:
Nem sempre é (embora geralmente)%, e alguns idiomas são estranhos. E diabos, depois de uma década, não posso dizer honestamente que conheço todos os operadores perl (e qual é a espaçonave que se faz de novo?), Nem sempre me lembro perfeitamente dos operadores bit a bit. Faz alguns anos desde que eu fiz qualquer coisa que exigisse isso.
O que poderia me fazer hesitar em recomendar alguém seria se isso causasse algum ataque de pânico por falta dessa pergunta / teste. Isso pode me dar a impressão de que eles eram um pouco verdes demais (a menos que fosse uma posição muito básica). Ninguém precisa de alguém que memorize (ou sinta necessidade) memorizar essas coisas. Você precisa de alguém que entenda conceitos muito mais amplos. Ninguém vai se importar se você procurar isso no google, mas terá que estar confiante na entrevista que saber% não era grande coisa e também que você sabe usar "operator" como uma palavra-chave ao fazer uma pesquisa rápida no google procurar.
Além disso, isso é apenas uma idéia ... mas se a faculdade comunitária local tiver um programa de compsci, todos os seus outros créditos serão transferidos e você provavelmente precisará de apenas 20 créditos para o curso de 2 anos. Quase poderia terminar isso em um semestre. Eles querem que você faça um curso sobre estruturas de dados, e também espero que algoritmos ... possam torná-lo um pouco mais forte.
fonte
Aqui está um exemplo de curso: http://www.ox.ac.uk/admissions/undergrad_courses/courses/computer_science/computer_science_.html
Sugiro que você leia primeiro o seguinte: Programação orientada a objetos (muito comum, usada em todos os lugares, é aqui que entra o java) Simultaneidade (para escrever programas java que não batem misteriosamente no mundo real, aprender sobre impasses) (a maioria dos aplicativos precisa salvar dados, a teoria é importante aqui) Paradigmas de programação (leia sobre pelo menos uma linguagem não ops, de preferência funcional, para expandir seu pensamento e aprender coisas novas)
Quando olho para os 4 anos de ensino de ciências da computação, para ser sincero, acho que há apenas alguns cursos que você precisa levar a sério.
Estruturas de dados e algoritmos (e você precisa de matemática aqui para ficar realmente bom e ser levado a sério por outros programadores), redes de computadores e sistemas operacionais vêm à mente como os mais importantes. Outros assuntos que lidam com código de nível inferior, como ser capaz de codificar em montagem, sem dúvida não são tão importantes para você. A engenharia e os testes de software expõem você a conceitos úteis e você pode entender isso com o tempo.
Basta baixar um pdf que explica esses conceitos de maneira intuitiva e você estará no seu caminho.
Em alguns cursos de ciências da computação, pelo menos nos meus, o primeiro ano é uma introdução a todas as áreas da engenharia, como mecânica, elétrica, civil, etc. Há muitas matemáticas complicadas, lembre-se, que novamente podem ou não ser relevantes hoje para a maioria dos programadores de aplicativos. Portanto, muitos dos engenheiros hoje em dia têm apenas 3 anos de educação científica em ciências (espero que isso faça você se sentir melhor :)
Ponto crucial da resposta: você pode levar algum tempo para estudar todos os dias, digamos uma hora ou mais, e durante um período de tempo, tornar-se um bom programador. Apenas continue aprendendo. E lembre-se de escrever algum código todos os dias.
fonte
Para mim, minha estratégia é atacar apenas o problema relevante para o que estou trabalhando. Portanto, meu conselho é que você não precise aprender tudo, apenas leia as coisas relevantes para o que está trabalhando, porque se você tentar aprender tudo de uma vez, há uma tendência de se prostrar e acabar odiando a programação.
Paz
fonte