Non sono un buon programmatore (in logica), come devo ripararlo? [chiuso]


50

Ok, quindi ecco il mio problema:

Lavoro per una grande azienda, alcuni come hanno ottenuto un lavoro (francamente perché l'intervista è stata facile). Non è che non conosca le mie cose, sono abbastanza bravo a capire Java, sono le biblioteche ecc.

Ma, quando mai provo a risolvere qualche problema logico, trovo davvero difficile trovare una soluzione.

Ad esempio, conversion of decimal to romanquando ho visto la soluzione, ho scoperto che si tratta di un problema semplice. Ma non sono stato in grado di implementarlo dopo 1-2 ore di prova!

Mi sento stupido e non vale la pena essere un ingegnere del software. Le capacità di risoluzione dei puzzle dovrebbero arrivare in modo nativo a un grande programmatore. Ma quando provo a risolvere alcuni enigmi, non riesco a trovare una soluzione e la metto su Google! .... e la odio!

Quando mi viene dato un problema (come implementare la funzione xyz) sul lavoro, sono abbastanza veloce e rispetto per il mio posto di lavoro, ma non ne sono affatto orgoglioso. Perché quando provo a risolvere qualsiasi problema impegnativo dal punto di vista matematico o logico, armeggio. Sento ancora di amare quello che sto facendo (come ingegnere) ma sono davvero triste di non essere in grado di risolvere alcuni problemi logici difficili che i miei amici escogitano.

Mi sento demoralizzato :(

TL; DR: Capisco le cose da un punto di vista pratico (implementando funzionalità nel nostro prodotto) ma quando provo a lavorare su un problema, ad esempio ProjectEuler, SUCCO male! E ho bisogno di affinare il mio cervello!

Quindi, le mie domande sono:

  1. Come devo fare per risolverlo? Dovrei iniziare risolvendo (e costringendo me stesso a) proiettare i problemi di eulero? Anche se mi ci vogliono ore per risolvere alcuni problemi di base ?
  2. O dovrei tornare alle basi e studiare un po 'di matematica di base?
  3. Non trovo davvero divertente la risoluzione di enigmi. Ma voglio renderlo divertente per me stesso! E penso che se li capirò meglio, mi piacerà!

PS: non sono mai stato educato in CS (il mio studente non era elettrico). Ma questa non è una scusa per essere uno sviluppatore schifoso.

Grazie!


3
Se non è divertente risolvere i puzzle per te, allora perché preoccuparsi!
V4Vendetta,

3
Non è divertente perché ho difficoltà a risolverlo. Se diventerò bravo, sono sicuro che mi piacerà!
Giovanni,

1
Si può sempre provare questo (avviso, seria dipendenza se siete in di puzzle solving)
Benjol

2
Nulla viene in modo nativo. Anche le competenze più elementari devono essere apprese. Consiglierei il calcolo e la meccanica classica come campi da gioco per l'addestramento delle abilità richieste, ma molte altre materie (comprese quelle non matematiche) potrebbero fare lo stesso.
SK-logic,

3
@Giovanni confermati. È stato un problema difficile. Non dovresti sentirti male se non riesci a risolverlo in 5 minuti. Un'ora e mezza per farlo, dopo aver letto il Wiki sui numeri romani, e solo confrontando i suoi risultati con i risultati di un'altra implementazione sono stato in grado di correggere un bug. Come molti altri, ho pensato che IL fosse un numero valido. Sbagliato. XXXIX è il numero giusto. Inoltre ho dovuto guardare altre implementazioni per ottimizzarlo (ero pre-cache II, III, XX, XXX e così via, ma è inutile). Non stare male!
xanatos,

Risposte:


24

Innanzitutto, è meraviglioso vedere questo come un punto debole nelle tue capacità. In realtà sai dove devi migliorare, il che rende molto più facile farlo, e indica che sei migliore di quanto pensi.

Credo che il tuo problema principale, che ho visto molte volte prima, sia che non hai un "set di strumenti per la risoluzione dei problemi". Di fronte a un problema, cosa fai? Come si risolve? Sono lento in matematica, ma poiché so usare i piccoli strumenti della matematica insieme, ho acuito il calcolo.

Quindi, oltre a lavorare sulla risoluzione dei problemi, devi esaminare quali strumenti e abilità porti sul tavolo quando lo fai. Se avessi intenzione di lavorare su una nuova funzionalità al lavoro, ti siedi semplicemente senza IDE, senza debugger, senza documentazione, senza internet e senza codice sorgente? Ovviamente no!

Ci sono strumenti per risolvere i problemi, semplicemente non li conoscete .... ancora . L'articolo di Wikipedia contiene alcuni collegamenti a tecniche di risoluzione dei problemi. Ma lo strumento più importante è il metodo scientifico . L'articolo di Wikipedia include un approccio pragmatico:

  1. Definisci una domanda
  2. Raccogliere informazioni e risorse (osservare)
  3. Formare un'ipotesi esplicativa
  4. Metti alla prova l'ipotesi eseguendo un esperimento e raccogliendo dati in modo riproducibile
  5. Analizza i dati
  6. Interpretare i dati e trarre conclusioni che fungono da punto di partenza per nuove ipotesi
  7. Pubblica risultati
  8. Nuovo test (spesso eseguito da altri scienziati)

Tutti i problemi possono essere risolti in questo modo! Molte persone non seguono questi passaggi. È come uno sviluppatore che rifiuta di testare il suo codice. Affatto. Avrà problemi a capire che esistono bug.

Infine, l'altro strumento principale per la risoluzione dei problemi è scomporlo in semplici passaggi. Ad esempio, il primo problema negli esempi del progetto Euler :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Abbiamo due fatti e un problema qui. Il primo fatto ci mostra come definire un multiplo di tre o cinque al di sotto di 10. 3 * 1,3 * 2,3 * 3,5 * 1 sono tutti validi. 5 * 2 non è perché è uguale a 10. Quindi, due fatti ci dicono che li sommiamo per ottenere 23.

Quindi abbiamo già un metodo per trovare valori e possiamo sommarli per ottenere la nostra somma. Certo, possiamo esaminare i fatti e applicare un semplice rovescio dell'ordine. 3, 5, 6 e 9 sono multipli di 3 o 5. Cioè 3% 3, 5% 5, 6% 3, 9% 3 danno tutti una mod di zero. Quindi un altro approccio sarebbe quello di passare da 999 a 1 e modulare ogni numero con 3 e 5. Raccogliere l'elenco di valori e sommarli.

Vorrei suggerire L'arte della programmazione unix come un eccellente esempio di utilizzo di piccoli strumenti nel mondo della programmazione. Concatenarli insieme consente di risolvere problemi molto complessi e non posso contare il numero di volte in cui questi concetti mi hanno aiutato.


19

Molti programmatori sono anche "risolutori di puzzle" naturali, ma c'è molto di più nella programmazione di così. Se tutti i programmatori si concentrassero sulla risoluzione di interessanti problemi algoritmici, avremmo un sacco di software in grado di risolvere problemi interessanti, ma nessuno di essi sarebbe utilizzabile o mantenibile.

Trovo che ci siano relativamente poche sfide di tipo "puzzle-solving" nel mio lavoro. La maggior parte delle sfide riguarda più lo studio del vecchio codice, l'apprendimento di una nuova API, la progettazione dell'architettura di alcuni componenti in modo tale che le persone non lo giurino entro tre anni. Tutto questo è impegnativo, ma non tanto del tipo di puzzle logico. D'altra parte, ho colleghi che passano la maggior parte del loro tempo a pensare agli algoritmi di ottimizzazione del compilatore e che sono molto bravi in ​​questo.

Penso che sia importante per i programmatori pensare costantemente a "come posso migliorare in quello che faccio?", Ma essere un buon programmatore non richiede necessariamente che tu sia bravo a risolvere enigmi.

Personalmente, ottengo la mia soluzione per la risoluzione dei puzzle risolvendo "misteriosi geocache" .


Ma molte start-up calde SOLO stress delle abilità di risoluzione dei puzzle. Prendi facebook. Se non sono bravo a risolvere enigmi, non sono nemmeno idoneo ad applicare lì!
Giovanni,

6
Facebook ha il puzzle puzzle come primo controllo solo per evitare di dover setacciare migliaia e migliaia di CV. Se vuoi davvero lavorare per FB, allora devi essere in grado di risolvere questo tipo di problemi, ma ci sono molti altri buoni posti in cui lavorare.
JesperE,

risposta fantastica. mi mette anche a mio agio ... =]
Hartley Brody,

9

Lascia che ti avverta, più sai, più ti rendi conto di quanto poco sai.

Non scoraggiarti. Continua ad imparare e cerca di lavorare su aree che ti mancano.

Ora passiamo alla tua domanda. Il mio suggerimento sarebbe di iniziare a lavorare sui problemi relativi al progetto eule r.

Le mie ragioni sono semplici, inizia dalla domanda più popolare, questi sono normalmente i problemi più facili da risolvere.

Quando ti trovi di fronte a un problema, prova a risolverlo, lavoraci da solo, prova approcci diversi. Il modo in cui funziona l'Euler di progetto ti consente di controllare e testare la tua risposta.

Se decidi di non poter risolvere questo problema, inizia a ricercare il problema (non cerchi la risposta). No riprovare.

Una volta risolto il problema, Project Euler ha una sezione in cui ti mostrano le risposte migliori per ogni implementazione linguistica. Esamina la loro risposta nella tua lingua preferita, comprendi la loro soluzione e il pensiero che è entrato in essa.

Ora chiudi la risposta fornita e riprova da solo finché non la risolvi di nuovo.

Se ti alleni abbastanza, la logica e il pensiero per risolvere questi problemi diventeranno sempre più facili per te.


4

La maggior parte dei lavori di programmazione non richiede molta logica. Ma questi potrebbero non essere i lavori che ti piacciono.

Come linea guida generale, prova ad apprendere algoritmi e strutture. Posso consigliare il manuale The Algorithm Design di Skiena. Una volta che conosci questi, inizierai a classificare i problemi. Questo assomiglia molto al problema dei venditori ambulanti, qui posso usare un albero, qui posso usare una ricerca binaria ...

Project Euler ha una vasta gamma di puzzle. Molti di questi sono facilmente realizzabili con una conoscenza matematica di base. Altri sono più facili da risolvere quando conosci alcuni di questi algoritmi.


2

Credo fermamente che tu abbia appena iniziato il tuo viaggio nella programmazione, quindi prima di tutto se ti ci vuole un po 'di tempo per capire e capire bene, sembra che non sia un problema. L'unica differenza è che ad ogni tentativo stai imparando qualcosa come WoW! ! l'ultima cosa che ho fatto non ha alcun senso perché avevo bisogno di un decimale e non di un doppio

Se risolvere enigmi non ti interessa, non andare a caccia di teste per questo, ci sono altri problemi logici che fluttuano quando conosci la tua base di codice, puoi scegliere di lavorare su di essi e presentare eventuali modifiche suggerite al tuo mentore o al lead . (non preoccuparti se fai qualche errore ti aiuterebbero a capire perché la tua metodologia è difettosa, quindi sii un osservatore acuto e un ascoltatore adatto)

Ci vorrà un po 'di tempo per sistemarti e potrebbe darsi che potresti iniziare a sparare su tutti i cilindri. Inutile dire di evitare l'impulso di cercare una soluzione su google o SO, fare alcuni sforzi dalla tua parte e accendere il browser solo in caso di dubbi o di assoluta chiarezza


1

Prima di tutto, conoscere la tua debolezza è un vero punto di forza, quindi sai cosa studiare per ottenere un gioco migliore.

Il mio consiglio sarebbe di leggere un sacco di codice che risolve problemi logici. Ognuno ha il proprio stile nel risolvere enigmi, la lettura del codice potrebbe suggerirti un modo in cui puoi imparare a farlo. Inoltre, essere in grado di comprendere il codice probabilmente ti indica anche la teoria matematica che descrive il problema, quindi lungo la strada imparerai anche i problemi sottostanti.

Saluti, Carlo


1

Sento che dovrei aggiungere a questo.

Come la risposta scelta ha già affermato, conoscere la tua debolezza è un enorme vantaggio e ci sono alcuni strumenti di base per l'apprendimento delle tecniche di risoluzione dei problemi. Ciò che ritengo manchi nella risposta, tuttavia, è semplicemente trovare modi per mettere in pratica problemi difficili - molto. Sii testardo nel completare completamente ogni problema che provi. Leggere il codice, molto codice, è buono, così come leggere libri sull'argomento della risoluzione dei problemi, ma scrivere codice è quasi più importante.

In un certo senso, condividiamo la stessa debolezza (anche se non è così grave come pensi). Per mettere in pratica le mie capacità di problem solving, sto sempre lavorando ad alcuni problemi del progetto Euler o HackerRank. Se è un problema facile, scelgo 7 linguaggi di programmazione e provo a risolverlo in tutti. Per problemi più difficili, potrei scegliere 3 lingue molto diverse l'una dall'altra, solo per mantenere ragionevole il tempo che dedico al problema. Per tutti i problemi, una volta trovata una soluzione, cerco le soluzioni che altri hanno escogitato e mi assicuro di averle comprese. Se non capisci qualche soluzione, puoi sempre pubblicare su StackOverflow o probabilmente anche qui su Programmers Stack Exchange o qualcosa del genere e sono sicuro che ci sia qualcuno sul sito che potrebbe rispondere alla tua domanda (è raro che non ci sia).

Fondamentalmente, però, assicurati di esercitarti, e non solo di leggere, e pratica molto. Proprio come lo sport, il pensiero chiaro richiede tempo e fatica.

Un'altra cosa che puoi fare per aiutarti nel modo in cui pensi ai problemi è scrivere la suite di test per i problemi che risolvi per primi. Non è possibile scrivere un buon test per un problema senza prima averlo compreso appieno. Se lo fai per lingue diverse, questo ha il vantaggio di insegnarti diverse tecniche di test contemporaneamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.