Pergunta

Você sabe que determinada parte do seu código que é essencial para o projeto, mas vai levar muito tempo para fazê-lo? Você já teve a sensação de que você prefere trabalhar em outra coisa (provavelmente menos importante) ou não o código em tudo, em vez de trabalhar nessa parte? Essa besta de tentar tão duro para evitar e usar todos os truques preguiçoso você sabe para atrasar a sua implementação inevitável?

Agora, eu sou provavelmente apenas ser preguiçoso, mas eu sempre tive de lidar com um código como esse. Escrever algo que eu não me sinto como a escrita (e é pior se você está fazendo isso para se divertir e não ser pago!). Um grande sistema que vai demorar muito tempo para obtê-lo em uma fase em que você receber de volta qualquer resultado útil ou indicação de que trabalhar. Como você começar a programar algo assim? A maioria das pessoas provavelmente sugerem dividir e conquistar e técnicas arquitetônicas semelhantes, mas isto não é sobre como fazê-lo; é sobre como você obter-se iniciado em fazê-lo. O que é os primeiros passos que você tomaria?

Foi útil?

Solução

Eu vou contar uma história de um caso em que isso aconteceu comigo.

Eu queria implementar um novo algoritmo de decisão frametype para x264 que usou programação dinâmica para a frente (o algoritmo Viterbi). Mas ia ser complicado, confuso, feio, e assim por diante. E eu realmente não queria fazê-lo. Tentei penhorar fora do projeto para o Google Summer of Code, mas por algum tipo de terrível má sorte, a um aluno que tínhamos que simplesmente socorrida em seu projeto ... foi o aluno que escolheu esse projeto.

Assim, após dois meses de queixar-se e esquivando-lo, eu finalmente comecei a trabalhar no algoritmo. E aqui está como eu fiz isso.

Em primeiro lugar, eu falei com o outro desenvolvedor, que aparentemente já tinha algumas idéias sobre como fazê-lo. Nós conversamos sobre isso e ele explicou-me até que eu compreendia plenamente o processo do ponto de vista algorítmico. Este é o primeiro passo de qualquer projeto:. Entender o algoritmo por trás dele tão bem que você pode Pseudocódigo a coisa toda

Então, eu falei para outro colega meu. Fomos até um quadro branco e esbocei-lo até ele entendeu também. Ao explicar para outra pessoa, ganhei me entender. Este é o segundo passo: explicar o algoritmo para alguém tão bem que que pode Pseudocódigo-lo. Esta é uma emulação do processo de programação, já que a programação é uma forma de "explicar" um algoritmo para o computador.

Então, eu escrevi um simples protótipo Java que utilizou valores falsos arbitrárias para a função de custo e foi o único a ser usado para testar a pesquisa de Viterbi. Eu terminei, e verificou-lo contra uma busca exaustiva - que combinava perfeitamente. Minha programação dinâmica foi correta. Esta é a terceira etapa:. Escrever a forma mais simples possível do algoritmo no mais simples ambiente possível

Então eu portado para C, língua nativa de x264. Funcionou novamente. Esta é a quarta etapa:. Porta que simples forma do algoritmo para o ambiente completo

Então, finalmente, eu ter a função de custo falso com o verdadeiro. Depois de algum bughunting e fixação, funcionou. Este é o passo final:. Integrar o algoritmo completamente com o ambiente

Este processo levou apenas uma semana, mas a partir da perspectiva de mim no início do projeto, foi completamente assustador e eu não poderia obter-me a mesmo de começar - ainda por dividi-lo no passo a tal por passo processo, eu era capaz de não só fazê-lo , mas fazê-lo muito mais rápido do que eu esperava.

E os benefícios foram muito além x264; Agora eu entendo Viterbi tão completamente que agora eu posso explicar isso aos outros ... e esses outros podem beneficiar muito com isso. Por exemplo, um dos desenvolvedores ffmpeg está usando uma adaptação do meu algoritmo e código para otimizar a resolver um problema um pouco diferente:. Colocação cabeçalho ideal em arquivos de áudio

Outras dicas

Geralmente eu amo a, parte grande complexo. Eles são as peças que realmente se estendem um desafio e me forçar a considerar cuidadosamente o que estou fazendo. É todos os pequenos pedaços, tediosas que eu não gosto. No entanto, quando se trata de fazer qualquer coisa que eu fui adiando eu encontrar um simples pedaço de conselho importante:
APENAS FAÇA-O !!!
A sério, uma vez que é iniciado é muito mais fácil ao fim. Eu sempre acho que eu colocar as coisas fora até que eu comece a eles, então de repente eu achar que, agora que eu comecei, não é tão ruim quanto eu havia imaginado, e olhar, é quase feito!

Dividir para conquistar não é apenas sobre estruturação de código, ele também funciona como uma abordagem para fazer um projeto conceitualmente administrável. Se eu tiver um tempo difícil de começar em um projeto quase sempre porque é a grande e assustador . Ao dividir em pedaços conceitualmente gerenciáveis, torna-se menos assustador.

Eu também acredito em " tracer balas ", conforme descrito pelos programadores pragmáticos. Reduzir o projeto para o absolutamente simples "prova de conceito" possível das peças do núcleo, por exemplo, sem UI, casos especiais, tratamento de erros e assim por diante. Talvez o seu apenas algumas rotinas do núcleo com a Unidade-testes associados. Com isso, você tem conquistado as partes assustadoras, e pode construir a partir do núcleo.

Basicamente, o truque para começar (pelo menos para mim) é: Não comece em todo o projecto. Iniciar em uma pequena parte (de preferência núcleo) e construir a partir daí. Se eu ainda ter um tempo difícil começar, é porque a pequena parte eu decidi sobre ainda é grande, então eu tenho que dividir e reduzi-lo ainda mais.

Eu concordo com você que muitas peças grandes e importantes de um software não são divertido de escrever. Eu costumo começar o meu dia de desenvolvimento com algumas coisas menores, como a adição de um recurso aqui, ou corrigir um bug lá. Quando é hora, eu começo com a grande parte, mas quando eu simplesmente não consigo ver a coisa mais, eu fazer algo diferente. Isso é tudo muito bem se você ainda obter tudo feito na hora. E lembre-se de que pode tornar as coisas mais fácil se você conversar com outras pessoas sobre que grande besta antes que você está fazendo isso, enquanto você está fazendo e depois que você fez. Isto não só irá libertar sua mente, mas você também vai obter a opinião de outras pessoas a partir de um ponto a menos de vista subjetivo. Planejando tais coisas juntos também ajuda.

Engraçado, eu sou o contrário. Quando eu começar a lidar com um problema, eu ir para os grandes primeiros. O cerne do problema é geralmente o que me interessa.

Se eu estou fazendo um projeto para mim, eu geralmente não podia ser incomodado para implementar todos os bits difusos em torno das bordas, para que eles nunca ter feito. Se eu estou fazendo algo de verdade, eu finalmente chegar a todos os bits difusos, mas não é a minha parte favorita.

Eu acho que existem duas questões aqui.

Em primeiro lugar está realmente começando. Como você diz, que pode ser bastante complicado. Pessoalmente eu só começar em qualquer bit, apenas para obter algo no papel / tela. Provavelmente será a edição errado e necessidade, mas, em geral, é mais fácil criticar do que criar, mesmo em seu próprio trabalho.

Depois, há o processo real de resolver problemas difíceis. Há um grande livro chamado "blockbusting conceitual", que discute as várias formas de abordar problemas. Eu aprendi muito sobre como eu abordar a resolução de problemas e os meus pontos cegos usando esse livro. Altamente recomendado.

I tentar estabelecer uma metáfora para o que o sistema está tentando fazer. Eu sempre me sinto mais confortável quando eu posso descrever o comportamento em termos de uma metáfora.

Eu, então, abordá-lo a partir de um ponto de desenvolvimento orientado a testes de visão, ou seja, começar a descrever o que o sistema precisa fazer através da criação de testes que irá verificar o comportamento correto.

HTH.

aplausos,

Rob

A parte mais difícil do projeto vai de não ter nada feito para a primeira linha. Basta colocar nada no papel se este processo começou e é incrível a rapidez com que o resto pode fluir a partir daqui.

Eu sou um fã do " e conquistar " -tipo aproximar-me.

Quando há uma grande tarefa em particular em um enforcamento sistema em cima de mim, deixo o computador, tomar uma caneta e papel, e quebrar a tarefa para fora em todos os seus componentes lógicos e de fluxo de trabalho.

Em seguida, tomar cada uma dessas tarefas, e quebrar o para baixo nas funções mais básicas / chamadas necessário.

Eu posso então colocar em métodos stub que eu acho que vou precisar. e carne-los um por um. Neste ponto cada um desses "sub-tarefas" não é maior do que as tarefas de desenvolvimento menores que orbitam o mesmo projeto, para sentir como um enforcamento tarefa muito menos onerosa sobre mim.

Eu costumo resolver este tipo de problemas em casa usando uma caneta e um pedaço de papel .. Eu imagino que o algoritmo e / ou fluxo lógico e, em seguida, toco (no papel!) As classes e rascunhos do método e quando eu chegar em frente a / o computador que posso fazer muito mais fácil ... Provavelmente é só me ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top