Nie jestem dobrym programistą (logika), jak mam to naprawić? [Zamknięte]


50

Ok, więc oto mój problem:

Pracuję dla dużej firmy, niektórzy jak dostali pracę (szczerze mówiąc, ponieważ rozmowa była łatwa). Nie chodzi o to, że nie znam swoich rzeczy, jestem całkiem dobry w zrozumieniu języka Java, to biblioteki itp.

Ale kiedy próbuję rozwiązać jakiś problem logiczny, naprawdę trudno mi znaleźć rozwiązanie.

Na przykład, conversion of decimal to romankiedy zobaczyłem rozwiązanie, stwierdziłem, że jest to prosty problem. Ale nie byłem w stanie go wdrożyć po 1-2 godzinach prób!

Czuję się głupia i nie warto być inżynierem oprogramowania. Umiejętności rozwiązywania łamigłówek powinny przyjść natywnie do świetnego programisty. Ale kiedy próbuję rozwiązać niektóre zagadki, nie jestem w stanie znaleźć rozwiązania i po prostu google go w górę! .... i nienawidzę tego!

Kiedy pojawia mi się problem (jak implementacja funkcji xyz) w pracy, jestem dość szybki i szanuję go w tym miejscu pracy, ale wcale nie jestem z tego dumny. Ponieważ, gdy próbuję rozwiązać jakiś matematyczny lub logiczny, trudny problem, grzebię się. Nadal czuję, że uwielbiam to, co robię (jako inżynier), ale bardzo mi przykro, że nie jestem w stanie rozwiązać trudnych problemów logicznych, które wymyślili moi przyjaciele.

Czuję się zdemoralizowany :(

TL; DR: Rozumiem rzeczy z praktycznego punktu widzenia (wdrażanie funkcji w naszym produkcie), ale kiedy próbuję pracować nad problemem z powiedzmy ProjectEuler, źle SUCK! I muszę wyostrzyć swój mózg!

Tak więc moje pytania to:

  1. Jak powinienem to naprawić? Czy powinienem zacząć od rozwiązywania (i zmuszania się do) projektowania problemów eulera? Nawet jeśli zajmie mi kilka godzin, aby rozwiązać niektóre podstawowe problemy ?
  2. Czy powinienem wrócić do podstaw i uczyć się podstawowych matematyki?
  3. Naprawdę nie lubię układania puzzli. Ale chcę sprawić, by było to dla mnie zabawą! I myślę, że jeśli lepiej je zrozumiem, spodoba mi się!

PS: Nigdy nie kształciłem się w CS (mój student był elektrykiem). Ale to nie usprawiedliwia bycia szczęśliwym programistą.

Dzięki!


3
Jeśli rozwiązywanie puzzli nie jest dla ciebie zabawne, po co zawracać sobie tym głowę!
V4Vendetta,

3
To nie jest fajne, ponieważ mam trudny czas na jego rozwiązanie. Jeśli będę w tym dobry, to na pewno mi się spodoba!
Jan

1
Zawsze można spróbować to (ostrzeżenie poważnie wciągająca, jeśli w rozwiązaniu zagadki)
Benjol

2
Nic nie przychodzi natywnie. Nawet najbardziej podstawowe umiejętności wymagają nauki. Polecam rachunek różniczkowy i mechanikę klasyczną jako place zabaw do treningu wymaganych umiejętności, ale wiele innych przedmiotów (w tym całkowicie nie matematyczne) może zrobić to samo.
SK-logic

3
@John Potwierdzony. To był trudny problem. Nie powinieneś czuć się źle, jeśli nie możesz go rozwiązać w ciągu 5 minut. Półtorej godziny, aby to zrobić, po przeczytaniu Wiki o cyfrach rzymskich i tylko przez porównanie jej wyników z wynikami innej implementacji udało mi się naprawić błąd. Myślałem (podobnie jak wiele innych), że IL jest prawidłową liczbą. Źle. XXXIX to właściwy numer. Dodatkowo musiałem obserwować inne implementacje, aby go zoptymalizować (wcześniej buforowałem II, III, XX, XXX itd., Ale to jest bezużyteczne). Nie czuj się źle!
xanatos,

Odpowiedzi:


24

Po pierwsze, to wspaniałe, że postrzegasz to jako słabość swoich umiejętności. W rzeczywistości wiesz, gdzie musisz poprawić, co znacznie ułatwia to i wskazuje, że jesteś lepszy niż myślisz.

Uważam, że twoim głównym problemem, który widziałem wiele razy wcześniej, jest to, że nie masz „zestawu narzędzi do rozwiązywania problemów”. Co robisz w obliczu problemu? Jak sobie radzisz z jego rozwiązaniem? Jestem powolny w matematyce, ale ponieważ wiem, jak korzystać z małych narzędzi matematyki razem, sprawdziłem rachunek różniczkowy.

Oprócz pracy nad rozwiązywaniem problemów musisz także sprawdzić, jakie narzędzia i umiejętności przyniesiesz na stół. Jeśli planujesz pracować nad nową funkcją w pracy, czy po prostu usiądziesz bez IDE, bez debuggera, dokumentacji, internetu i kodu źródłowego? Oczywiście nie!

Istnieją narzędzia do rozwiązywania problemów, po prostu ich nie znasz .... jeszcze . Artykuł na Wikipedii zawiera linki do technik rozwiązywania problemów. Ale najważniejszym narzędziem jest metoda naukowa . Artykuł w Wikipedii zawiera pragmatyczne podejście:

  1. Zdefiniuj pytanie
  2. Zbierz informacje i zasoby (obserwuj)
  3. Stwórz hipotezę wyjaśniającą
  4. Przetestuj hipotezę, przeprowadzając eksperyment i gromadząc dane w powtarzalny sposób
  5. Przeanalizuj dane
  6. Interpretuj dane i wyciągaj wnioski, które stanowią punkt wyjścia do nowej hipotezy
  7. Opublikuj wyniki
  8. Ponowny test (często wykonywany przez innych naukowców)

Wszystkie problemy można rozwiązać w ten sposób! Jednak wiele osób nie przechodzi przez te kroki. To jest jak programista, który odmawia przetestowania swojego kodu. W ogóle. Będzie miał problemy ze stwierdzeniem, że błędy nawet istnieją.

Wreszcie, drugim podstawowym narzędziem do rozwiązywania problemów jest rozbicie go za pomocą prostych kroków. Na przykład pierwszy problem w przykładach projektu Eulera :

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.

Mamy tutaj dwa fakty i problem. Fakt pierwszy pokazuje, jak zdefiniować wielokrotność trzech lub pięciu poniżej 10. Wszystkie 3 * 1,3 * 2,3 * 3,5 * 1 są prawidłowe. 5 * 2 nie jest, ponieważ jest równe 10. Zatem fakt dwa mówi nam, że dodajemy je razem, aby otrzymać 23.

Tak więc mamy już metodę znajdowania wartości i możemy je dodać, aby otrzymać naszą sumę. Oczywiście możemy spojrzeć na fakty i zastosować proste odwrócenie kolejności. 3, 5, 6 i 9 są wielokrotnościami 3 lub 5. To znaczy 3% 3, 5% 5, 6% 3, 9% 3 daje mod zerowy. Innym podejściem byłoby przejście od 999 do 1 i moduł każdej liczby z 3 i 5. Zbierz listę wartości i dodaj je razem.

Sugerowałbym sztukę programowania unix jako doskonały przykład użycia małych narzędzi w świecie programowania. Łączenie ich razem pozwala rozwiązywać bardzo złożone problemy i nie mogę policzyć, ile razy te koncepcje mi pomogły.


19

Wielu programistów jest także naturalnymi „łamigłówkami”, ale programowanie to znacznie więcej. Gdyby wszyscy programiści koncentrowali się na rozwiązywaniu interesujących problemów algorytmicznych, mielibyśmy mnóstwo oprogramowania, które mogłoby rozwiązać fajne problemy, ale żaden z nich nie byłby użyteczny ani możliwy do utrzymania.

Uważam, że w mojej pracy jest stosunkowo niewiele wyzwań typu „układanie puzzli”. Większość wyzwań dotyczy bardziej studiowania starego kodu, uczenia się nowego API, projektowania architektury jakiegoś komponentu w taki sposób, że ludzie nie będą go przeklinać za trzy lata. Wszystko to jest trudne, ale nie tyle logiczne. Z drugiej strony mam kolegów, którzy spędzają większość czasu na myśleniu o algorytmach optymalizacji kompilatora i którzy są w tym bardzo dobrzy.

Myślę, że ważne jest, aby programiści nieustannie zastanawiali się nad tym, „jak mogę być lepszy w tym, co robię?”, Ale bycie dobrym programistą niekoniecznie wymaga od Ciebie doskonałego rozwiązywania łamigłówek.

Osobiście rozwiązuję zagadkę rozwiązując „tajemnicze skrzynki” .


Ale wiele gorących startupów stresuje się TYLKO umiejętnościami rozwiązywania zagadek. Weź facebooka. Jeśli nie jestem dobry w rozwiązywaniu zagadek, nawet nie kwalifikuję się do złożenia wniosku!
Jan

6
Facebook ma robota-łamigłówkę jako pierwszą kontrolę, aby uniknąć konieczności przeglądania tysięcy CV. Jeśli naprawdę chcesz pracować dla FB, musisz być w stanie rozwiązać tego rodzaju problemy, ale jest wiele innych dobrych miejsc do pracy.
JesperE,

fantastyczna odpowiedź. uspokaja mnie również ... =]
Hartley Brody

9

Pozwól, że cię ostrzegę, im więcej wiesz, tym bardziej zdajesz sobie sprawę, jak mało wiesz.

Po prostu nie zniechęcaj się tym. Ucz się i staraj się pracować w obszarach, o których wiesz, że brakuje.

Teraz przejdź do twojego pytania. Moją sugestią byłoby rozpoczęcie pracy nad problemami związanymi z projektem eule r.

Moje powody są proste, zacznij od najpopularniejszego pytania, są to zwykle łatwiejsze problemy do rozwiązania.

Gdy napotkasz problem, spróbuj go rozwiązać, pracuj nad nim sam, spróbuj różnych podejść. Sposób działania euler projektu pozwala sprawdzić i przetestować swoją odpowiedź.

Jeśli zdecydujesz, że nie możesz rozwiązać tego problemu, rozpocznij badanie problemu (nie szukając odpowiedzi). Nie próbuj ponownie.

Po rozwiązaniu problemu euler projektu ma sekcję, w której pokazują najlepsze odpowiedzi dla każdej implementacji języka. Przejrzyj ich odpowiedź w preferowanym języku, zrozum ich rozwiązanie i sposób myślenia.

Teraz zamknij udzieloną odpowiedź i spróbuj ponownie, dopóki nie rozwiążesz jej ponownie.

Jeśli ćwiczysz wystarczająco dużo, logika i myślenie o rozwiązaniu tych problemów stanie się dla ciebie łatwiejsze.


4

Większość zadań programistycznych nie wymaga dużo logiki. Ale to może nie być praca, którą lubisz.

Jako ogólną wytyczną spróbuj nauczyć się algorytmów i struktur. Mogę doradzić w podręczniku Skiena's The Algorytm Design. Po ich poznaniu zaczniesz kategoryzować problemy. Wygląda to bardzo podobnie do problemu podróżujących sprzedawców, tutaj mogę użyć drzewa, tutaj mogę użyć wyszukiwania binarnego ...

Project Euler ma szeroką gamę zagadek. Wiele z nich jest wykonalnych z podstawową wiedzą matematyczną. Inne są łatwiejsze do rozwiązania, jeśli znasz kilka z tych algorytmów.


2

Bardzo wierzę, że dopiero zacząłeś swoją przygodę z programowaniem, więc po pierwsze, jeśli zajmie ci to trochę czasu, aby zrozumieć i zrobić to dobrze, wydaje się, że to nie problem. Jedyną różnicą jest to, że przy każdej próbie uczysz się czegoś takiego jak WoW! ! ostatnia rzecz, którą zrobiłem, w ogóle nie ma sensu, ponieważ potrzebowałem dziesiętnych, a nie podwójnych

Jeśli rozwiązywanie łamigłówek Cię nie interesuje, nie szukaj w tym celu głowy, pojawiają się inne logiczne problemy, gdy poznasz swoją bazę kodu, możesz popracować nad nimi i przedstawić wszelkie sugerowane zmiany mentorowi lub potencjalnemu klientowi . (nie martw się, jeśli popełnisz jakiś błąd, pomogą ci dowiedzieć się, dlaczego twoja metodologia jest wadliwa, więc bądź uważnym obserwatorem i trafnym słuchaczem)

Ułożenie się zajmie trochę czasu, a być może zaczniesz strzelać do wszystkich cylindrów. Nie trzeba dodawać, że należy unikać szukania rozwiązania w google lub SO, włożyć trochę wysiłku od końca i uruchomić przeglądarkę tylko wtedy, gdy masz wątpliwości lub absolutnie nieświadomy


1

Przede wszystkim, wiedząc, że twoja słabość jest prawdziwą siłą, dlatego wiesz, czego się uczyć, aby uzyskać lepszą grę.

Radzę przeczytać wiele kodów, które rozwiązują problemy logiczne. Każdy ma swój styl rozwiązywania łamigłówek, czytanie kodu może wskazać sposób, w jaki możesz się tego nauczyć. Ponadto znajomość kodu prawdopodobnie wskazuje również na teorię matematyczną, która opisuje problem, więc po drodze poznasz również podstawowe problemy.

Na zdrowie, Carlo


1

Myślę, że powinienem do tego dodać.

Jak już zaznaczono wybraną odpowiedź, znajomość swojej słabości jest ogromną zaletą, a istnieją pewne podstawowe narzędzia do nauki technik rozwiązywania problemów. Moim zdaniem w odpowiedzi brakuje jednak po prostu znalezienia sposobów na ćwiczenie trudnych problemów - dużo. Bądź uparty, by w pełni zakończyć każdy problem, który próbujesz. Czytanie kodu, dużo kodu, jest dobre, podobnie jak czytanie książek na temat rozwiązywania problemów, ale pisanie kodu jest prawie ważniejsze.

W pewnym sensie dzielimy tę samą słabość (choć nie jest tak zła, jak myślisz). Aby ćwiczyć umiejętności rozwiązywania problemów, zawsze pracuję nad jakimś problemem Euler lub HackerRank projektu. Jeśli to łatwy problem, wybieram 7 języków programowania i staram się rozwiązać je we wszystkich. W przypadku trudniejszych problemów mogę wybrać 3 języki, które bardzo się od siebie różnią, aby rozsądnie spędzić czas na problemie. Po znalezieniu rozwiązania szukam wszystkich rozwiązań i upewniam się, że je rozumiem. Jeśli nie rozumiesz jakiegoś rozwiązania, zawsze możesz wysłać wiadomość do StackOverflow lub prawdopodobnie nawet tutaj do Programmers Stack Exchange lub czegoś innego i jestem pewien, że na stronie jest ktoś, kto mógłby odpowiedzieć na twoje pytanie (rzadko się zdarza, że ​​nie ma).

Zasadniczo jednak upewnij się, że ćwiczysz, a nie tylko czytasz i dużo ćwiczysz. Podobnie jak sport, jasne myślenie wymaga czasu i wysiłku.

Inną rzeczą, którą możesz zrobić, aby pomóc ci w sposobie myślenia o problemach, jest napisanie zestawu testów dla problemów, które najpierw rozwiążesz. Nie można napisać dobrego testu na problem bez jego pełnego zrozumienia. Jeśli robisz to dla różnych języków, ma to tę zaletę, że uczysz różnych technik testowania w tym samym czasie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.