Problem z nauką programowania

0

Cześć

Chciałbym zapytać o umiejętność programowania.

Przeczytałem część 'podstawy programowania' z książki pt.'Automate the boring stuff with Python'. Mam wrażenie, że rozumiem w takim podstawowym stopniu jak działają pętle, ify, po co są te import module i różne funkcje lub metody na danych.

Wiem, że to są bardzo podstawowe rzeczy i chciałbym przerobić jakieś bardziej dogłębne pozycje, żeby zrozumieć różne struktury i zasady rządzące nawet nie konkretnie Pythonem, ale programowaniem. Tylko, że...

Problem pojawia się jak biorę się za jeden z zaległych projektów właśnie z tej książki. Pierwsze trzy rozdziały poszły bez problemu. Od list mam problem z każdym projektem po kolei. Umiem napisać jakąś tam część kodu, ale do tej pory całkiem bezbłędnie i sam rozwiązałem tylko jeden z trzech projektów z działu 'lists'. Nie wiem w czym jest kłopot. Książkę przerabiam niecałe 2 tygodnie. To jest kwestia jakiegoś wrodzonego braku umiejętności myślenia potrzebnego do programowania? To można jakoś rozwinąć? Możecie mi coś polecić? Jakieś konkretne strony z zadaniami?

Przykładowo, jakiś papier-kamień-nożyce napisałem bez problemu. Natomiast przez 1.5h próbowałem rozwiązać takie zadanie i w końcu odpuściłem, wygooglowałem kod i sobie go zwizualizowałem, rozumiem dlaczego tak to działa, ale nie mogłem na to wpaść..

3

To chyba normalne, o ile nie trafiłeś w odpowiednie miejsce w spektrum aspergera lub nie jesteś gościem, który od dziecka tłukł matmę i ma odpowiednio ustawiony mózg. Z czasem przejdzie, albo nie przejdzie i się będziesz męczył. Nikt Ci nie odpowie. Ja jestem z tych co się męczą, ale można z tym żyć, pracować, nawet wykonywać jakieś taski i dostawać wypłatę lepszą niż na magazynie, nawet jej wielokrotność :P

0

To ja moze polece klasykiem: Why Learning to Code is So Damn Hard

Jakieś konkretne strony z zadaniami?

Hyperskill
https://www.hackerrank.com/
https://leetcode.com/

2

@icantcode: Moim zdaniem jak nie wiesz jak czegoś rozwiązać przez dłuższy czas to podglądanie z internetu nie jest takim złym pomysłem. Z biegiem czasu coraz rzadziej będziesz musiał to robić. Będziesz sobie przypominać, że już kiedyś rozwiązywałes podobny problem. Niestety jest to długa droga i łatwo się zniechęcić.

Ps. Tylko nie zrozum tego jako nauki na pamięć. Chodzi o to, że szukasz jak ktoś to rozwiązał i starasz się zrozumieć.

1

Może spróbuj jeszcze raz to przeczytać i zrozumieć, wytłumaczyć samemu sobie. Sam miałem problem ze zrozumieniem list jednokierunkowych i ogólnym działaniem wskaźników w C++. Jednak w pewnym momencie, gdy ćwiczyłem i więcej czytałem, doszło do mnie o co w tym wszystkim chodzi i kolejne zagadnienia drzew/grafów były o wiele prostsze. Tak samo z nauką asemblera, przerobić kilka prostych zadań aż załapie się, o co w tym chodzi :D Spróbuj podejść do problemu na inne sposoby. Po prostu niektóre rzeczy muszą się poukładać w głowie.

2

Python chociaż jest łatwym jezykiem to niestety nie jest gwarancją łatwej i skutecznej nauki. W pythonie problem jest taki, że większość rzeczy jakie warto znać jest niewidoczne dla osoby początkującej. Po prostu Python wprowadza uproszczenia, podejmuje decyzje za osobę, ukrywa złożoność (ona nie znika!) i efekt jest taki, że łatwo jest osiągnąć coś co działa, a z drugiej strony nie wiadomo z czego to wynika :-)

Ja zacząłem od C++, bo i tak nie miało to dla mnie znaczenia. Innych języków nie znałem, wtedy kojarzyłem jedynie, że Pascal i Delphi jest dla leszczy[0]. Nieświadomy byłem, że C++ jest złożony i wymagający. Po prostu brałem przykłady, które były stosunkowo proste i ciekawe więc przepisywałem, modyfikowałem i doczytywałem na temat rzeczy, które wydawały mi się dziwne i jednocześnie ciekawe. C++ jest bogaty w szczegóły, ciężko jest je przegapić i żeby iść do przodu trzeba się nad nimi pochylić, doczytać, sprawdzić, chwilę pomyśleć.

Tyle mi wystarczyło, aby krok po kroku zorientować się jakim poj*banym język jest jest C++, bo programowanie w nim to jednocześnie narkotyk, a z drugiej strony masochizm, ale po drodze miałem duży przegląd haseł, schematów i informacji, który umożliwił mi przejścia na inne języki, bo to co C++ oferuje jest widoczne, ciężko to przegapić, a to co poznasz w pewnym sensie jest nadzbiorem tego co można zobaczyć np. w javie czy pythonie.

Ogólnie C++ ma jeszcze 2 atuty wpływające na rozwój:

  1. C++ pomoże Ci stać się bardziej wnikliwym w czasie pisania kodu + wymusi na Tobie abyś radził sobie z coraz dziwniejszymi przypadkami. To wzmacnia samodzielność i skill to tworzenia własnych obejść.
  2. Ludzie programujący w C++ są trochę inni. Nie powiem, że rozsądnie zarządzają swoim czasem, bo tego nie robią, ale mają więcej wiedzy na temat tego jak działa komputer i rzeczy jakie idą z nim w parze. Kontakt z takimi ludźmi chociaż jest irytujący to bywa bardziej pouczający niż setka filmików na youtube.

Natomiast Pythona to polecam jak:

  1. koncentrujesz się na czymś innym niż programowanie (np. jakieś badania itp), wtedy python jest tylko marginalnym dodatkiem
    2) świadomie chcesz ścinać tzn. wiesz, że nie ma sensu przepłacać i wybierasz możliwie słaby język, w którym da się napisać system. Wtedy python redukuje Ci koszty, a różnica czasu stanowi wtedy dla Ciebie czysty zysk. Takie optymalizacje to Ty rób jak nauka zejdzie na dalszy plan. Natomiast na początku to ucz się tak, aby poszerzać horyzonty.

[0] - z czasem kupiłem też ksiązkę Adama Boducha o Delphi z ciekawości. Samo Delphi ogólnie jest do przyjęcia, Delphi upraszcza robienie okien, ale materiały jakie były wtedy dostępne utrudniały mi pojęcie obiektowości z poziomu Delphi, ale poza fajnym kreatorem tym to ciężko było mi wskazać jakieś inne dodatkowe atuty. Raczej koncentracja na tym jednym temacie bez jakiś udziwień, co w sumie też stanowi jakąś wartość dodatnią.

3

@pprog123: nie zgadzam się w temacie nauki od C++. Stawiałbym na C jeśli już, potem wedle woli można iść C++ (lub nie, i też będzie to ok): będzie tak samo blisko jak nie bliżej sprzętu, uniknie się skomplikowania i nauczenia się pisania w kiepskim C++ także.
Pascal też jest dydaktycznie całkiem OK, ale chyba obecnie trochę nie do końca ma sens "rynkowy"?

Natomiast zgoda, że Python faktycznie jest na tyle prosty, że łatwo w nim napisać działające dziadostwo, ew. jest fajnym dodatkiem do innej dziedziny - tu nie ma sporu.

2
p_agon napisał(a):

To ja moze polece klasykiem: Why Learning to Code is So Damn Hard

Jakieś konkretne strony z zadaniami?

Hyperskill
https://www.hackerrank.com/
https://leetcode.com/

Załączam swoją wersję wykresu z artykułu powyżej, moja krzywa narysowana tak orientacyjnie, kolorek niebieski

screenshot-20210814161942.png

2
icantcode napisał(a):

Natomiast przez 1.5h próbowałem rozwiązać [takie zadanie]

To trzeba było próbować przez 3 godziny. Albo przez 3 dni. Nauka programowania wiedzie przez frustrację i tyranię złych kodów.
Przy czym jak coś ci nie wychodzi jednym sposobem, to próbujesz drugim. Albo robisz przerwę na douczenie się podstaw itp.

wygooglowałem kod i sobie go zwizualizowałem, rozumiem dlaczego tak to działa, ale nie mogłem na to wpaść..

To też często jest rozwiązanie. Jak czegoś nie rozumiesz, to patrzysz, jak inni do tego podchodzą. Pewne podstawowe techniki trzeba poznać podpatrując je u kogoś / czytając w książkach, bo jeśli nie masz wielkiej programistycznej intuicji i wiedzy, to możesz na nie nie wpaść.

3

Jak ktoś słyszał jak działa samochód, wsiądzie pierwszy raz do auta to szybko wykombinuje jak nim pojechać. Wie że trzeba przekręcić kluczyk, odpalić auto. Nawet jeśli nie umie używać sprzęgła, słyszał o nim i pewnie zaraz wykombinuje jak ruszyć z miejsca, choćby miał jechać na ręcznym.
Z drugiej strony są ludzie, których wiedza kończy się na przekręceniu kluczyka. Tym będzie ciężej. Są jeszcze ci, których wiedza jest jeszcze mniejsza, dla nich to wszystko będzie katorgą. Jesteśmy rdzennymi Aborygenami żyjącymi tradycyjnym życiem, próbującymi jednak zmienić to życie i pierwszy raz pojechać. Będzie ciężko, ale też jesteśmy ludźmi i jak trzeba będzie to wykombinujemy jak pojechać, a jak jednak nie będziemy wiedzieli jak to zrobić to nic złego w tym nie będzie jak spojrzymy jak ktoś inny robi to samo.

2
ToTomki napisał(a):

Z drugiej strony są ludzie, których wiedza kończy się na przekręceniu kluczyka.

Mnie niepokoi, że coraz częstsza jest postawa "po co uczyć się programowania, skoro są frameworki". Później ludzie piszą w tych frameworkach, ale ciągle mają jakieś bugi czy inne problemy wynikające z nieznajomości choćby języka programowania, w którym piszą (np. ludzie potrafią pisać w React bez znajomości podstaw JavaScriptu).

Ale to by się nadawało na osobny wątek typu "pisanie we frameworkach bez nauki programowania - hit czy kit?".

2

@icantcode: Programowanie jest super. :) Najbardziej, jak już rozumiesz, jak to wszystko działa. Do tego długa droga – przynajmniej z mojej perspektywy.

Nie wiem, czy powinienem Ci coś radzić, bo ja cały czas mam w głowie, ile rzeczy jeszcze z programowania nie umiem, które powinienem umieć (co do których uważam, że powinienem).

A co robię na naszym portalu? Czytuję na mikroblogu wpisy o technologiach, których nazwy nie widziałem pewnie ani razu. W szczególności komentarze bywają pomocne, bo dają pewien kontekst – a kontekst znacznie pomaga w zrozumieniu. Czego żałuję, to tego, że u mnie "zrozumieć" to nie to samo, co "zapamiętać".

Nie robię tego "po coś", ale "ponieważ". Ponieważ dobrze jest wiedzieć, gdzie się jest. Jak powstał FORTRAN, czemu architektura x86 tak się nazywa, czy bajt to zawsze 8 bitów. Zagadnienia niepowiązane bezpośrednio, ale zaryzykuję, choć nie programuję w Pythonie: jestem pewien, że ten język silnie opiera się na doświadczeniach poprzednich języków oraz na przypadkach użycia programów w nich pisanych. Możesz też poczytać o Go (Golangu) – czemu w ogóle powstał. Moim zdaniem jego przypadek wyraźnie pokazuje pewien sposób myślenia w programowaniu.

Jeśli miałbym coś konkretnie radzić: jak już zrozumiesz, jak działa dany kod, staraj się po trochu zrozumieć tzw. "całość". Co się dzieje podczas preprocessingu, interpretacji, kompilacji, linkowania czy wykonywania (wybór tych kroków zależny od technologii). Czemu takie polecenie kompiluje, a nie inne. Skąd konsola wie, co zrobić, jak wpiszesz polecenie i naciśniesz ENTER?

I! Nie wszystko naraz.

wygooglowałem kod i sobie go zwizualizowałem

Co masz na myśli przez "zwizualizowanie" kodu?


UPDATE

Tak sobie myślę, że wyżej napisałem z perspektywy osoby, która chce umieć programować w danej technologii, a nie zagadnienia z danej domeny – czyli w zasadzie Twój przypadek (ważniejsza jest logika kodu niż język).

Mam nadzieję, że choć trochę te informacje okażą się pomocne. Myślę, że znajomość zagadnień okołoprogramistycznych, a także budowy języków programowania, pomoże trochę i w tworzeniu algorytmów.

Co może pomóc więcej? Być może rozmyślanie nad tym, jak coś działa. Dlaczego ten kod jest napisany tak, a nie inaczej. Dlaczego w ogóle ktoś go napisał? Co chce przez ten kod pokazać? Czy to kod napisany możliwie prosto, by było go łatwo zrozumieć początkującym? Czy może chciał powiedzieć, że tak się w ogóle da napisać (a nie w każdej technologii wszystko się da)? Czy może to chciał pokazać, jak elegancko można zaprojektować tzw. abstrakcje w programie – albo jeszcze coś innego mu przyświecało.

Możesz zobaczyć, co to jest domena (nie znalazłem strony na polskiej Wikipedii). To pojęcie w pewnym sensie konkretyzujące "sens" danego programu.

Jeśli coś niejasne, co napisałem, to nie wahaj się pytać – ja chętnie doprecyzuję. :)

4

@icantcode: weź inną książkę, albo od razu kilka

3

U mnie kolejność nauki była następująca: LOGO, ELI – program do układania schematów algorytmicznych, ASM, C, C++, Java, C#, Python etc.

6

Chłopie, po co CI to programowanie. Zobacz ile tu nieszczęśliwych dusz, ciesz się, że jeszcze Cię to nie wchłonęło ! :D

A tak na poważnie to nie jesteś w żadnym razie jakimś evenementem. To sport dla cierpliwych i wytrwałych.

0

wg mnie na poczatku musisz miec kompilator i IDE ktore dziala :) pozniej cala reszta

4programmers.net>Forum>Edukacja>Problem z nauką programowania

mam na mysli ogolnie programowanie

1

Dzięki za tak liczne odpowiedzi.

Przeczytałem podlinkowany artykuł i jest faktycznie bardzo trafiony. Przynajmniej ta początkowa część, dalej nie wiem, bo brakuje mi doświadczenia. :)

Mimo wszystko chcę pozostać przy Pythonie do końca książki, właśnie dokończyłem jej pierwszą część, która uczyła podstaw, składni, prostych metod. Bardzo dziękuję za rady, focus na nadchodzący tydzień - spędzić jak najwięcej czasu z kodem, projekty z książki, jakieś proste projekty i zadania z innych źródeł, będę próbował więcej googlować i korzystać z dokumentacji, bo widziałem, że jest przejrzyście wiele rzeczy opisane, automatyzację ruszę może za tydzień.

Nie chcę przerzucać się jeszcze na inne języki programowania, bo serio, ta automatyzacja strasznie mnie ciekawi, ale chcę ją jak najlepiej zrozumieć, dlatego taki tydzień z kodowaniem dla wyrobienia może pewnych nawyków będzie okej. Chcę też nauczyć się podstaw Gita i GitHuba, aby móc trzymać sobie tam narzędzia do automatyzacji. Może coś się kiedyś przyda a spis treści wygląda zachęcająco.

Chciałbym zapytać z wyprzedzeniem. Od października rozpoczynam studia informatyczne - będę miał tam programowanie w języku C oraz Asm. Chciałbym przerobić jakąś fajną książkę do C. Chciałbym nauczyć się jak najwięcej o programowaniu. Czy możecie mi polecić jakąś książkę? Chodzi o to, że nie chcę zbyt prostej pozycji, nie chcę, żeby na 300 stron była rozpisana sama składnia. Składnię pewnie można zmieścić na kilku stronach A4, bardziej zależy mi na nauce programowania niż na nauce składni.

I jeszcze zastanawiam się co z Asm? W karcie przedmiotów jest podane, że to będzie Turbo Assembler, to jest koniec lat 80tych, początek lat 90tych. Czy to będzie miało przełożenie na nowsze Assemblery?

Edit. Widziałem np.temat na Stack Overflow no i jedni polecają Prate, inni K&R, ale te książki różnią się mocno np.objętościowo. Może ktoś z Was miał z nimi styczność i jest w stanie udzielić mi jakiejś porady?

0

@icantcode: to mówisz że składnię do C zmieścisz na kilku stronach?
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
standardowo do C polecam książkę Ritchiego i Kernighana
do C++ Grębosza

0

Do C dołożę Modern C Jensa Gustedta.

0

@Silv:

Myślałem o jakiejś książce z krótkim wprowadzeniem do języka i następnie jakichś projektach, bardziej zaawansowanych rzeczach, np.w Automate było coś o zarządzaniu pamięcią, jakiś garbage collector, tam było napisane, że w przypadku Pythona nie ma potrzeby zarządzać pamięcią a w C/C++ trzeba. Też np.zmienna była najpierw definiowana jako pudełko z jakąś wartością a później jako odniesienie do miejsca w pamięci, gdzie znajduje się wartość tej zmiennej (które można sprawdzić przy użyciu id()). No i właśnie nie chciałbym czytać znowu na kilka stron o operacjach arytmetycznych typu dodawanie, odejmowanie, bardziej interesują mnie te 'głębsze' rzeczy.

@Miang:

Miałem na myśli podstawowe struktury jak pętle, tabelki z operacjami arytmetycznymi i inne podobne, nie chcę żeby to zajmowało kilkaset stron książki, bo to może się okazać staniem w miejscu.

0

Dla formalności dodam, że odnosisz się do mojego komentarza, który może trochę nieopatrznie napisałem zamiast postu. ;) (Co mnie może usprawiedliwiać, to to, że chciałem upewnić się, że dobrze rozumiem). Chyba rozumiem, co masz na myśli – chcesz eksplorować temat więcej w głąb niż wszerz (są takie algorytmy przeszukiwania grafu w głąb oraz wszerz; zresztą dobrze je znać).

1 użytkowników online, w tym zalogowanych: 0, gości: 1