Eu sempre gostei de física, e sempre gostei de codificação, então, quando recebi a oferta de uma posição de doutorado em física numérica (os detalhes não são relevantes, é principalmente a programação paralela para um cluster) em uma universidade, era um não -cérebro para mim.
No entanto, como a maioria dos físicos, sou autodidata. Não tenho amplo conhecimento de fundo sobre como codificar de maneira orientada a objetos ou o nome desse algoritmo específico que otimiza a pesquisa em alguma árvore do kD.
Como todo o meu trabalho até agora tem se preocupado mais com a física e os resultados científicos, sem dúvida tenho alguns maus hábitos - mais ainda porque minha codificação é minha, e não realmente um trabalho em equipe. Eu tenho usado principalmente C porque é muito direto e "o que você escreve é o que recebe" - não há necessidade de abstrações sofisticadas. No entanto, recentemente mudei para o C ++ desde que gostaria de aprender mais sobre o poder que vem com a abstração, e é bem parecido com o C (pelo menos em termos de sintaxe).
Como eu me ensino a codificar de uma maneira boa e abstrata como um graduado em ciência da computação?
Sei que meu código é eficiente, mas quero que seja elegante e legível. Lembre-se de que não tenho tempo para ler vários volumes de 1000 páginas sobre programação abstrata. Preciso dedicar tempo à pesquisa real relacionada à física (meu supervisor ria de mim se soubesse que eu dediquei tempo a pensar em como programar com elegância). Como faço para avaliar se meu trabalho também é bom da perspectiva de um programador?
fonte
Respostas:
Então, você está pedindo que alguém lhe dê uma lista de verificação de cinco etapas que o tornará um programador qualificado? Isso não vai acontecer !
Como em qualquer outra disciplina, se você quer ser bom em programação, precisa gastar tempo e esforço praticando e estudando. Você aprende a escrever um código claro e elegante, escrevendo muito código e lendo cuidadosamente o código de outras pessoas. Alguns desses volumes de 1000 páginas economizam seu tempo resumindo as lições difíceis que outras pessoas aprenderam. É ilusório pensar que você pode se tornar um programador qualificado como um efeito colateral indolor de obter um Ph.D em física. Não é que você não possa sair de um Ph.D. em física. com habilidades de programação malucas, é apenas isso que vai lhe custar tempo e problemas.
O Code Complete é uma boa introdução à mecânica do desenvolvimento de software, incluindo conselhos sobre como escrever e estruturar códigos claros e de manutenção. Sim, é um volume enorme, mas certamente não é tão denso quanto, por exemplo, os "Princípios da Mecânica Quântica" de Dirac ou a "Gravitação" da MTW. O Code Complete está o mais próximo possível de você de uma lista de verificação de cinco etapas para escrever um software melhor.
Matlab, VIM, C, MPI e Valgrind são excelentes ferramentas para conhecer. Você não menciona o uso de um sistema de controle de versão. Se, por algum acaso, você ainda não estiver usando um sistema de controle de versão, deverá começar a usá-lo imediatamente. O controle de versão também é um envio divino para escrever sua tese. Outras ferramentas básicas que você deve conhecer são um depurador, um perfil de execução, uma estrutura de log e uma estrutura de teste de unidade. Você não precisa ler um livro de 1000 páginas para cada uma delas. Trabalhe nos tutoriais on-line para obter o básico e comece a trabalhar com eles. Mergulhe mais profundamente na documentação à medida que suas necessidades se tornam mais sofisticadas.
É mais difícil aconselhá-lo a aprender os fundamentos da ciência da computação (em oposição aos fundamentos da construção de software). Você não especifica em que problema está trabalhando, esteja desenvolvendo novos algoritmos ou aplicando algoritmos existentes. Dependendo do seu problema de pesquisa, uma pesquisa das estruturas de dados básicas e algoritmos padrão pode ser útil. Outros problemas se beneficiariam mais de uma sólida formação em análise numérica. Se você deseja aprender o básico da análise de algoritmos, existem vários bons textos. O Manual de Design de Algoritmos e a Introdução aos Algoritmos vêm à mente. Existem também alguns bons cursos introdutórios disponíveis on-line agora: Design e análise de algoritmos e algoritmos .
fonte
Minha formação é um pouco parecida com a sua - eu era graduado em física e aprendi programação. Depois que me formei, assumi alguns empregos em TI e finalmente me tornei um engenheiro de software; incluindo um pouco de tempo trabalhando no OpenGDA (software usado para executar experimentos em vários sites de síncrotron).
A principal coisa que aprendi sobre as perguntas que você tinha enquanto chegava aqui é que é muito mais fácil obter essas habilidades de outras pessoas do que tentar buscá-las. Um mentor experiente pode facilmente ajudá-lo a identificar onde seu código é fraco ou onde padrões e práticas comuns podem ajudá-lo. Enquanto eu aprendia a escrever C e Objective-C sozinho, não sabia exatamente o que não sabia (se é que você me entende) até estar trabalhando com outras pessoas no mesmo código. O fato de você estar pedindo conselhos aqui significa que está se saindo melhor do que eu já fiz :-).
Agora, onde você encontra um engenheiro de software profissional doméstico? Recentemente, entrei para o MentorNet , um sistema que associa programadores experientes com protegidos.
Mas você não precisa optar por um sistema formal como esse. Encontrar um grupo local de programadores (ou onde o departamento de engenharia de software da sua universidade vai depois do trabalho na sexta-feira) é um ótimo lugar para começar.
fonte
Nenhum caminho real para o software
Antigamente, Euclides fazia perguntas como a de seu aluno, rei Ptolomeu. Sua resposta: "Não há caminho real para a geometria".
Você menciona que seu supervisor ria se soubesse quanto tempo você gasta tentando escrever código como um desenvolvedor profissional. Outros responderam suas perguntas com uma lista de coisas a serem aprendidas, desde o controle da fonte até o Design e a Análise de Algoritmos.
Eles ficam aquém do seu objetivo:
Pianista de concertos ou One Man Band?
O mundo se move rápido demais para as pessoas se interessarem. Se você quer ser pianista de concertos, não divida seu tempo aprendendo instrumentos para se tornar uma banda de um homem.
Meu conceito para o doutorado em física em projetos de médio e grande porte é como líder de ideias para definição de sistemas, especialista em teoria, especialista no assunto durante a criação de casos de uso e usuário / juiz final pelos resultados gerados por artefatos de software. Trabalhe em estreita colaboração com os melhores engenheiros de software que você puder.
Como faço para avaliar se meu trabalho também é bom da perspectiva de um programador?
Se você deseja definir um nível alto, comece aqui:
Arquitetura de software na prática, Len Bass, Paul Clements, Rick Kazman
Procure o capítulo "Noções básicas sobre atributos de qualidade". Além do código, ele considera usabilidade, modificável, desempenho, segurança, disponibilidade, confiabilidade, testabilidade, capacidade de manutenção e portabilidade (não é possível carregá-lo, mas você pode portar o design de uma plataforma para outra). Todos precisam de metas mensuráveis específicas. Referências semelhantes incluem:
http://msdn.microsoft.com/en-us/library/ee658094.aspx
http://www.sei.cmu.edu/reports/95tr021.pdf
Seus objetivos vs. C e C ++
Como o FORTRAN, esses são idiomas antigos e difíceis. Os indicadores positivos para C / C ++ incluem:
Muitas pessoas desenvolvem web, visualização de dados e big data. Muitos são motivados a encontrar ou criar outros idiomas. Por exemplo, o físico Sir Tim Berners-Lee fez seu sucesso com HTML (mas é pouco conhecido pela física). Avalie seu objetivo x sua linguagem de programação.
Considere usar o Matlab
O Matlab possui uma excelente base instalada, é especializado em matemática e ciências. Possui ferramentas para visualização de dados. Ele permite que cientistas e matemáticos expressem problemas no domínio do problema, e não no domínio da solução. A Matlab fabrica os produtos Parallel Computing Toolbox e Distributed Computing Server.
Espero que o sucesso do Matlab se deva ao uso de equipes multidisciplinares com especialistas em física, matemática, eletrônica e instrumentação, sistemas operacionais, linguagens de programação, desenvolvimento de software, testes de software, arquitetura e design de software. A analogia pode ser um pouco exagerada, mas por que você se colocaria sozinho, começando com um martelo, um cinzel e uma lima para criar algo quando você tem uma impressora 3D disponível? Como Newton pode perguntar, por que não ficar nos ombros de alguém?
fonte
Você será capaz de percorrer um longo caminho na Física sem saber nada sobre o estilo "profissional" (falando por experiência própria). Mas tenho visto muitas pessoas desperdiçarem um tempo sem fim porque perderam a noção do que estavam fazendo ou depois de terem crescido seu código por alguns anos, apenas se perderam em sua complexidade (mesmo na academia não há código "deitar fora", mas coisas fique muito mais tempo do que você pensa inicialmente).
Eu sugeriria que você iniciasse algoritmos e estruturas de dados, por exemplo, com este curso . Depois disso, você poderá pensar em desempenho em um nível mais produtivo e acompanhar, por exemplo, artigos na Wikipedia.
Depois disso, acostume-se ao que está disponível no núcleo do seu idioma, por exemplo, em C ++ cppreference.com . Também recomendo fortemente que você leia as séries Effective C ++ de Scott Meyers e Accelerated C ++ de Koenig & Moe. Pelo menos para C ++, isso fornecerá uma base sólida no lado da linguagem.
Em paralelo, você deve tentar conhecer bem suas ferramentas. Não é improvável que você desenvolva seu código no Linux, então tente aprender como obter mais diagnósticos (avisos) de seus compiladores (pelo menos gcc e clang). Aprenda também sobre ferramentas de análise estática, como cppcheck ou scan-build do clang . Aprenda como tornar essas ferramentas parte integrante do seu processo de desenvolvimento, por exemplo, integrando-as na sua configuração de compilação (sim, você deve usar pelo menos o GNU make, ou ainda melhor algo como GNU autotools / cmake / ...). Você também deve adicionar ferramentas de criação de perfil ao seu conjunto de ferramentas. Para C ++, eu recomendo fortemente que você aprenda tudo o que puder sobre o valgrind, que pode ser perfilado em um nível muito baixo (também pode ajudá-lo a encontrar vazamentos de recursos).
Tudo isso ajudará você a se concentrar no que mais lhe interessa (sua pesquisa), em vez de perder tempo encontrando bugs ou fazendo otimizações inúteis. É claro que isso é quase impossível de vender para um consultor, mas eles (e você) ficarão impressionados, mas a velocidade com a qual você poderá obter resultados confiáveis.
Você mencionou C e C ++, mas para cálculos numéricos não posso recomendar Python com numpy e scipy o suficiente. Ele permite que você escreva em uma linguagem limpa e bastante limpa em um nível muito alto (você pode até trabalhar interativamente), enquanto aproveita as rotinas extremamente otimizadas implementadas em C, C ++ e FORTRAN. Além disso, a interface do seu próprio código C ou C ++ com o Python é quase trivial.
fonte
Está correto? Produz resultados corretos em todos os casos?
Outras pessoas são capazes de ler e entender facilmente seu código?
Quando seu supervisor diz "Ótimo, agora faça também X ...", você precisa reescrever muito código?
Quando você escreve um programa, ele se torna uma ferramenta que você pode usar repetidamente ou é uma vez que é usada e joga fora o tipo de coisa?
Se você pode responder sim, sim, não e 'sim, tento fazer ferramentas em vez de cálculos pontuais', então você já está se saindo muito bem. Uma boa parte do que fazemos como programadores visa ajudar com os tipos de coisas listados acima.
fonte
Seus programas serão completamente diferentes do código-fonte comercial; portanto, muitas boas práticas e abordagens não se aplicarão ao seu desenvolvimento diário de código-fonte. Mas há uma boa maneira de aprender algumas dicas e truques.
Deixe um bom desenvolvedor de software revisar seu código e otimizar juntos. Isso lhe dará muito mais experiência e ensinará boas práticas. Também revise o código fonte escrito por outras pessoas. Pesquise projetos de código aberto no sourceforge ou no github e leia o código fonte.
Mas, acima de tudo, pense se você realmente precisa aprender algo novo para atingir seus objetivos. Fazer coisas desnecessárias apenas para tornar o código mais bonito não agregará valor aos seus aplicativos.
fonte
No que diz respeito a se tornar um programador melhor, não existe uma bala mágica. Se você é autodidata, a chave é a autoconsciência, o que parece que você tem. No entanto, aprender a codificar bem se resume principalmente à leitura e à prática.
Ser crítico com seu próprio código é uma das melhores maneiras de melhorar. Sempre se pergunte:
Minha outra sugestão seria não se trancar em C / C ++. Embora sejam bons idiomas usados por um motivo, eles exigem que você faça muitas coisas que não estão relacionadas ao assunto. Olhe para o Matlab, eu ficaria surpreso se a universidade não tiver isso disponível para você. Considere uma linguagem de script como Python. Considere enfaticamente escolher uma linguagem funcional como Haskell - o paradigma é de natureza muito matemática e provavelmente se encaixaria nos seus problemas como uma luva. Em resumo, explore algumas outras linguagens / paradigmas. Mesmo que eles não se tornem uma ferramenta permanente em seu currículo, eles o tornarão um programador melhor.
Você também pode querer examinar alguns designs de algoritmos. Eu suspeito que, depois de ter conseguido o emprego, você já esteja relativamente disposto a aceitar isso, mas os algoritmos são incrivelmente importantes ao fazer análises numéricas. Na verdade, eu suspeitaria, existem recursos especificamente voltados para algoritmos de análise numérica.
Nunca perca de vista seu objetivo principal ao escrever o código. Você precisa fazer as coisas. Tornar-se um programador melhor é um método para fazer isso. Selecionar as ferramentas certas para o trabalho é outra.
fonte
Primeiro, "elegante" é um termo relativo. A abstração pode parecer elegante para você, mas para outro aficionado por C, pode parecer desnecessário. De qualquer forma, para responder sua pergunta, tente postar seu código para revisão em http://codereview.stackexchange.com .
Discutindo do ponto principal, alguns conselhos não solicitados com base em minha própria experiência. Se você pode fazer todo o seu trabalho com apenas C, por que deseja codificá-lo de maneira abstrata? Com isso, você deseja permitir que outras pessoas reutilizem seu código? Se você realmente tem um motivo sólido para mudar para C ++, vá para a abstração e aprenda os conceitos de C ++ e OO. Caso contrário, abandone a ideia. Na minha humilde opinião, você não deveria ter como objetivo que seu código seja mais legível e seus resultados científicos reproduzíveis do que fornecer abstrações OO? Eu próprio tive esse tipo de obsessão para aprender OOPS e codificar "elegante". Mas o C ++ levará tempo para dominar. Você precisará aprender o gerenciamento de memória, pois a coleta de lixo não é automática no C ++. Siga meu conselho, já que trabalhei em um laboratório de pesquisa e perdi muito tempo aprendendo C ++ e OO,
fonte
Considerando sua menção à falta de tempo para estudar teoria.
Se você analisou seu código antigo depois de alguns meses e se perguntou "que tipo de idiota escreveu esse código", você está progredindo.
Como você progrediu? Vendo um código melhor escrito por outras pessoas. Uma pessoa nunca sabe o valor do código de 'elegância' ou 'bom', a menos que o veja agregando valor ao seu trabalho. Em vez de ler a teoria, eu o incentivaria a manter os olhos abertos ao código escrito por outras pessoas em seu campo de trabalho. Mantenha seus olhos abertos para os conceitos discutidos no stackoverflow (tag C ++). Passar apenas quinze minutos por dia dessa pesquisa pode expô-lo aleatoriamente a conceitos que podem ajudá-lo. Ele pode mostrar um código melhor escrito que o seu código. É quando você acompanha a Wikipedia e descobre mais sobre ela. Esse aprendizado que surge por curiosidade será muito mais duradouro e útil para você do que a teoria que você esquecerá quando acordar no dia seguinte.
Considere também experimentar linguagens como MATLAB ou Python.
fonte
Como físico que me tornou programador, achei minha formação em física mais útil na formação das metáforas certas para entender os conceitos de software. Essa perspectiva também tornou a programação de aprendizado mais divertida para mim e me ajudou a desenvolver o senso de "elegância" no software, pelo qual você parece se esforçar.
Descrevi o papel importante e subestimado das metáforas e analogias no software na minha coluna CUJ "Padrões de pensamento - nomes, metáforas, melhor programação e política da linguagem" . Por exemplo, os conceitos OO de herança de classe são frequentemente comparados com a passagem de características dos pais para os filhos de uma família. Esta é uma analogia incorreta. A analogia correta para a herança de classe é a classificação biológica de organismos (por exemplo, uma classe RedRose é um tipo de Flor e uma Flor é um tipo de Planta).
Ou, por exemplo, considere o conceito de software de uma máquina de estado hierárquica. Uma boa metáfora aqui é o conceito de um sistema quântico ligado, como o átomo de hidrogênio. Como você se lembra, os estados de um átomo são numerados por três números quânticos | n, l, m>, exatamente porque estão "aninhados" (hierárquicos). Essa metáfora mostra como entender que estados aninham dentro de estados (exatamente como estados de momento angular (l) aninham nos estados de energia (n)) e também você vê imediatamente que o aninhamento de estados é sempre reflexo de alguma simetria do sistema.
Outra analogia interessante da física é o "modelo de computação ator", que ultimamente foi redescoberto devido às CPUs com vários núcleos e à computação distribuída na "nuvem". Achei útil e divertido pensar em eventos trocados por atores estatais (também conhecidos como objetos ativos) como bósons virtuais, como fótons no QED ou glúons no QCD. Essa metáfora explica a natureza assíncrona fundamental da comunicação, o processamento de eventos de execução até a conclusão (salto quântico) e o encapsulamento rigoroso de objetos ativos, que só podem interagir entre si por meio de artefatos intermediários explícitos.
De qualquer forma, o desenvolvimento de uma metáfora do sistema é uma prática recomendada no XP (eXtreme Programming) e, como físico, você terá uma vantagem em encontrar boas metáforas. Você também ganhará um senso de "elegância", porque seu software herdará a integridade conceitual das boas metáforas aplicadas.
fonte
Posso dizer-lhe que os maiores ganhos que obtive em termos de como abordo a solução de problemas foram alcançados através do aprendizado de linguagens funcionais e analisadores. Ambas as descobertas foram feitas por acidente. Então, estou lhe dizendo agora, se você é realmente sério em se tornar um programador melhor, precisa aprender sobre as várias técnicas envolvidas na criação de um compilador, por exemplo, analisadores e geradores de analisadores, e precisa aprender a compor computações com ordem superior funções.
Um excelente recurso para o analisador e o compilador é o PL101: Crie sua própria linguagem de programação . Ainda não encontrei uma boa introdução à programação funcional, mas ouço coisas realmente boas sobre o SICP .
fonte
Um graduado em Ciência da Computação não sabe codificar bem quando se forma; eles não são tão procurados quando saem da universidade. Somente se eles obtiverem a experiência.
A resposta para sua pergunta é que você precisa aprender Design Patterns. Programei em Java, .NET e agora trabalho como programador PHP, Javascript e MySQL. A propósito, o .NET possui um nível muito grande de abstração, por exemplo, ASP.NET. Isso significa que você pode pular o aprendizado da abstração. Idiomas como Perl, PHP, etc. têm um baixo nível de abstração.
Leia Head First Design Patterns, é um bom livro. É um livro bastante abrangente. Isso é tudo o que você precisará.
fonte