Ensinando-me, como físico, a me tornar um programador melhor [fechado]

17

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?

user787267
fonte
12
Uma pergunta: como você sabe que seu código é eficiente?
Matsemann
Eu já vi muitas pessoas dizendo não ao C ++ como primeira linguagem OO. Estou aprendendo java e encontrei os tutoriais em vídeo de Mark Dexter aqui eclipsetutorial.sourceforge.net/totalbeginner.html , eles são muito bons e ensinam você da maneira TDD. Verifique também o Head First Java, é muito bom para encobrir o Java da maneira OO.
25412 Garv
4
@ DeveloperDon, a computação era uma parte central da física antes mesmo de haver computadores eletrônicos. Os cálculos foram feitos à mão ou em calculadoras mecânicas. Desde a Segunda Guerra Mundial, os físicos estão profundamente envolvidos no software. Se você está calculando o retorno de um cometa, simulando a produção de nêutrons em uma reação em cadeia nuclear ou analisando gigabytes de dados procurando sinais do Bóson de Higgs, você precisa fazer muitas análises de números. Em 1974, a primeira metade do meu primeiro ano de laboratório de física foi dedicada ao ensino do FORTRAN.
Charles E. Grant
1
@DeveloperDon Quando os físicos do CERN, por exemplo, obtêm dados, obtêm dados de milhões de colisões de partículas. Você precisa de um computador para lidar com essa quantidade de informações. Considere também uma área como a física do estado sólido, na qual você tenta entender as propriedades macroscópicas de um material a partir das interações microscópicas dos átomos. Nesse sistema, um único elétron sente a repulsão / atração de bilhões de núcleos e elétrons - e para descrever esse sistema com precisão, é necessário um computador rápido e algoritmos eficientes (e algumas boas aproximações às equações fundamentais).
user787267
1
Talvez você deva mudar sua linguagem de C / C ++ para Python para ter mais tempo? O Python é freqüentemente usado por cientistas , existem módulos como o NumPy - pacote para computação científica com Python ou SciPy . Se você precisar da velocidade do C / C ++ no Python e usar o Cython , ele permitirá que você use tipos e estruturas de C / C ++ para obter uma velocidade semelhante ao C / C ++, também é fácil integrar-se às bibliotecas C / C ++ existentes usando o Cython.
Czarek Tomczak

Respostas:

20

Lembre-se de que não tenho tempo para ler vários volumes de 1000 páginas sobre programação abstrata.

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 .

Charles E. Grant
fonte
Obrigado pelos links, vou dar uma olhada. Eu sei que não vou me tornar um guru de codificação em um fim de semana, mas espero melhorar gradualmente com o tempo - especialmente se eu buscar inspiração fora da física (como muitos dos físicos que conheço não se importariam menos com boas práticas de codificação).
user787267
1
Eu acrescentaria python em ferramentas como a contagem legível
Xavier Combelle
2
+1 por sugerir código completo. É realmente a melhor coisa que a operação pode ler para resolver o problema em questão.
JW01
9

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
MentorNet parece muito interessante - vou dar uma olhada. Foi uma transição difícil do físico para o engenheiro de software?
User787267
@ user787267 Como estava interessado em programação (e já era um programador amador), fiquei motivado a fazer a transição como parece, assim não achei difícil o lado técnico. O que levou mais tempo para entender o problema foi o wetware: entender meu lugar em uma equipe de projeto maior e quem era especialista em uma grande mudança em relação à codificação do "lobo solitário" que eu estava fazendo antes.
5

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:

"Eu preciso gastar tempo com física real"

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:

  • Aplicação com hardware, sistemas embarcados.
  • Projeto existente que você deseja como ponto de partida.

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?

DesenvolvedorDon
fonte
4

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.

Benjamin Bannier
fonte
Obrigado pelos links! Definitivamente vou investigar (mas acho que não tenho tempo para ler vários livros - embora tenha lido o C ++ acelerado no ensino médio em algum momento). Estou trabalhando em um ambiente Unix (estou usando o Vim como meu editor e gostando dele) e uso o make e o Valgrind extensivamente. Também iniciei a opção -pedantic no gcc e -Wall, pois ajuda bastante. Talvez eu devesse ter mencionado que faço computação de alto desempenho (com a biblioteca MPI para programação paralela) no supercomputador da universidade.
User787267
Também devo mencionar que o Python não é realmente uma opção, pois meu código precisa ser muito rápido - embora eu goste de plotar, por exemplo. Eu também usei muito o Matlab.
User787267
Costumo usar o Python como front-end para conversar com rotinas implementadas no meu próprio C ++. Com o Boost, isso é realmente fácil e você obtém toda a flexibilidade do Python (por exemplo, para processar dados para plotagem). Além disso, o Python é bastante interessante para a criação de protótipos. Quando sei que algo se torna crucial, posso sempre movê-lo para C ++. Como você mencionou o MPI, eu recomendaria que você passasse uma noite com o IPython com uma interface agradável para computação distribuída.
Benjamin Bannier
@ user787267 Não é mais necessariamente verdade que o Python tenha um desempenho lento - veja youtube.com/watch?v=Iw9-GckD-gQ, por exemplo. A chave é que você pode usar o Python para escrever mais rapidamente um código de trabalho que pode acelerar 1) usando numpy / scipy 2) usando Cython ou shedskin e 3) colocando apenas o algoritmo principal em um módulo C / C ++ ou FORTRAN se você realmente precisa da última melhoria de 5%. Lembre-se também, o tempo que você gasta em codificação é tempo do código já não correr, por isso pode em algum momento ser mais eficiente para ter um código -Desempenho 80% escrito em metade do tempo
Tobias KIENZLER
Normalmente, faço protótipos no Matlab para testar as coisas fáceis, mas eu queria mudar para Python por um tempo. Vou dar uma olhada nisso. Devido a grande parte do meu código já escrito em C ++, não quero alterar o idioma no meio do caminho. Embora seja verdade, você também deve considerar o tempo de programação em tempo real (e acredite em mim), não acho que seja uma desculpa para não melhorar suas habilidades de programação (gradualmente).
user787267
4

Como faço para avaliar se meu trabalho também é bom da perspectiva de um programador?

  • 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.

Caleb
fonte
3

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.

Andrzej Bobak
fonte
Ler e participar de projetos de código aberto é realmente uma boa ideia - mas algo que eu teria que fazer no meu tempo livre (mas como eu gosto de programação, isso não deve ser um problema). Uma razão pela qual desejo me tornar um programador melhor é que não tenho certeza se vou permanecer na academia. Quando meu doutorado feito, talvez eu consiga um emprego na indústria - e aqui um programador qualificado deve estar em alta demanda. Outro motivo é a satisfação intelectual de criar algo elegante / bonito - como resolver uma equação diferencial realmente difícil.
user787267
Infelizmente, a indústria exige habilidades que você normalmente não ganha no desenvolvimento acadêmico. O material que você escreverá durante suas pesquisas acadêmicas é geralmente inferior a 5% do código fonte do aplicativo comercial.
Andrzej Bobak
3

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:

  • Será fácil mudar isso?
  • Isso é facilmente testável?
  • Posso simplificar isso? Posso entender isso facilmente quando o vejo novamente em três meses?

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.

Mike Cellini
fonte
2

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,

hAcKnRoCk
fonte
1
Mas C é ainda mais não gerenciado que C ++. Em C ++, há pelo menos RAII.
Benjamin Bannier
Eu gosto de codificar, então quero me tornar um programador melhor. Sou físico primeiro e depois programador, mas isso não significa que não deva melhorar minhas habilidades de programação - afinal, se eu decidir publicar meu código junto com os resultados científicos, seria melhor ter uma boa, código legível.
user787267
2

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.

Nav
fonte
Passo bastante tempo no Stack Exchange - é um recurso inestimável para mim no meu trabalho diário. Eu usei muito o Matlab, mas é muito fácil desenvolver maus hábitos, como não pré-alocar matrizes, pois é muito indulgente.
User787267
+1 para python @ user787267 Eu realmente não pegar porque não preallocating matriz é um mau hábito
Xavier Combelle
2

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.

Miro Samek
fonte
Embora a física seja potencialmente uma fonte rica de metáforas, a intenção no XP é encontrar uma metáfora que facilite a comunicação com o cliente no local e outros membros da equipe; portanto, geralmente tendem a escolher metáforas que são mais comumente entendidas.
Pete Kirkham
2

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 .

davidk01
fonte
-5

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á.

Dmitry Makovetskiyd
fonte
Eu tenho uma idéia de por que essa resposta foi reduzida, mas talvez seja útil se os votantes negativos disseram por quê?
Pierre Arlaud 24/02