Profesjonalny programista

0

Mimo moich całkiem niezłych projektów na GitHub https://github.com/jonkipro, wyłożyłem się dzisiaj całkowicie podczas testów rekrutacyjnych z algorytmiki do jednej z Wrocławskich korporacji. To była moja jedna z nielicznych szans na zaczęcie czegoś interesującego w moim życiu, a ja to tam spieprzyłem. Nie dałem rady rozwiązać ani jednego z 3 testów na Codility. 2 były mega trudne, jedno trochę mniej. Jestem całkowicie zdołowany. Uświadomiłem sobie jak niewiele wiem i jak dużo muszę jeszcze się nauczyć. Jednak po zastanowieniu się na sensem życia, nie mogę tego tak łatwo odpuścić i się rozpłakać. Postanowiłem, że inaczej podejdę do nauki programowania. Teraz, po krótkiej analizie timelapsu mojej przygody z programowaniem, jestem świadomy jak wiele podstaw ominąłem, podczas gdy tylko dążyłem do rozpoczęcia pisania programów okienkowych, a potem web. Patrząc na moje projekty brakuje w nich jakiejkolwiek czystości, wydajności, wzorców projektowych. Są pisanie całkowicie bez żadnego przygotowania. Nie przeczytałem nigdy ani jednej książki z programowania. Nie analizowałem profesjonalnych kodów. Szukałem tylko w necie potrzebnych mi elementów i łączyłem je potem bez żadnej analizy. Dlaczego tak, a nie inaczej? Czy będzie to wydajne? Nigdy nie użyłem w moich projektach np. generyków. Dlaczego? Bo tylko kiedyś z grubsza przeczytałem co to jest i tyle. Z powodu mojej niewiedzy o nich, nie wiedziałem jak to sensownie wykorzystać w programach. Mimo, że ich zastosowanie poprawiłoby wydajność kodu i przejrzystość. Chwytałem się tylko łatwych wersji kodu. Gdy trafiałem w internecie na bardziej skomplikowany kod, to od razu odpuszczałem go sobie i szukałem innych łatwiejszy wersji. Przykładowo w moich projektach wykorzystywałem Spring Security do logowania i rejestracji. Wydawało mi się, że znam go dobrze. Nawet to sobie wmawiałem. A mimo to nawet nie wiem o co chodzi z takimi podstawowymi pojęciami jak tokeny. Wiem tylko, że jest to jakiś identyfikator zalogowanego użytkownika i tyle. Potem wychodzi taki amator, który gubi się przy podstawowych pojęciach. Nie pamiętam kiedy ostatni raz obejrzałem lub przeczytałem jakikolwiek cały poradnik. Czekałem tylko na nazwę klasy, jakieś metody, jedno zdanie co robimy i już. Dodawałem takie elementy do moich projektów, mimo, że nie wiedziałem do końca jak one działają. Mimo mojej długiej znajomości z programowaniem znam tylko jeden najpopularniejszy wzorzec projektowy, a inne znam tylko z nazwy. Czy ktoś taki nadaje się na Juniora? Chyba tylko do polewania kawy. Mogę przestrzec innych jak to potem wychodzi nieznajomość podstaw. Musiałem się wyżalić.

Polecacie jakieś dobre książki do programowanie w Java, jakieś do pisania czystego kodu(niekoniecznie musi być to związane z Java) i do algorytmiki. Chciałbym przeczytać jakieś bardzo dobre książki, które uświadomią mi na czym polega pisanie dobrego profesjonalnego kodu, tak jak to robią najlepsi.

0

Pokaż te straszne zadania, to coś Ci znajdziemy do nauki.

0

Nie ma książek, które uświadomiłyby jak pisać dobry kod, gdyby były to wpisywałoby się takie w CV :). Dobrze programować nauczysz się tylko przez doświadczenie i jak sam zauważyłeś musisz myśleć nad tym co robisz, a nie kopiować byle co - to zdecydowanie pierwszy punkt jaki musisz zmienić. Jeśli chodzi o pozycje, które mogą ułatwić proces zdobywania doświadczenia i uświadomić na co zwracać uwagę to pierwsze po co bym sięgnął to "Clean Code" Uncle Boba (Robert C. Martin), który w Polsce wydany jest pod nazwą "Czysty Kod". Jeśli chcesz poprawić myślenie i algorytmikę to Koziołek tutaj kilka dni temu polecał swój wpis https://koziolekweb.pl/gdzie-trenowac-swoje-umiejetnosci/ myślę, że mogłoby pomóc potrenować czysty język na sam początek. No i właśnie, znajomość czystego języka to podstawa. Dopóki nie dowiesz się co to chociażby refleksje, czy generyki to nie będziesz wiedział jak to się dzieje, że jakiś framework działa, czy dlaczego przy generykach często są różne ograniczenia.

Do algorytmiki to Wprowadzenie do algorytmów Cormena jest pewnie jedną z lepszych pozycji, ewentualnie książki Knutha, ale tam to bardziej matematyka i teoria, tylko nie wiem czy jest sens wszystko czytać. Każdy programista powinien ogarniać czym różni się drzewo od listy, co kiedy zastosować, jak obliczyć złożoność funkcji, ale niekoniecznie musi umieć na pamięć implementację kopca Fibonacciego, czy dowodów złożoności. Nie mówiąc już o algorytmach mrówkowych, czy genetycznych, które są fajną ciekawostką naukową potrzebną w bardzo specjalistycznych zastosowaniach, ale mało przydatną w pracy przeciętnego Kowalskiego.

A tak na koniec. Nie rób tragedii. Przechodząc każdą nieudaną rekrutację wiesz na czym skupić się w przyszłości. Niezbyt często zdarza się, żeby w pierwszej rekrutacji trafić do dobrej firmy bez żadnych problemów. Nie jestem z Wrocławia, ale na 100% nie jest to jedyna firma, jeśli zawaliłeś jedną rekrutację to spróbuj do innej firmy. Po każdej zapisuj sobie czego jeszcze nie umiesz i postaraj się nadrobić zaległości. W najgorszym przypadku zwiedzisz kilka firm, ale będziesz miał całą bazę tego z czego musisz się douczyć i to będzie na pewno lepsze niż nasze rady nie znając sytuacji :). A swoją drogą Codility potrafi być trudne i jest specyficzne. Sprawdza myślenie typowo matematyczno-algorytmiczne, które nie zawsze jest potrzebne do pracy w takim stopniu.

1

Chwytałem się tylko łatwych wersji kodu. Gdy trafiałem w internecie na bardziej skomplikowany kod,
to od razu odpuszczałem go sobie i szukałem innych łatwiejszy wersji.

Skomplikowane nie jest przeciwieństwem łatwości. Raczej są dwie opozycje:
łatwy - trudny
prosty - skomplikowany

Skomplikowany kod to zwykle kod słabej jakości, kod powinien być prosty (bo taki się lepiej utrzymuje).
Jednak nie musi być koniecznie łatwy dla osoby nieprzygotowanej, bo może zawierać pewne techniki, algorytmy, koncepcje czy elementy języka, które niekoniecznie każdy nowicjusz zna.

To czego szukasz, to raczej nie skomplikowany kod (z czytania spaghetti kodu nie wyniesiesz nic pozytywnego, prędzej przestrogę jak nie należy pisać), a raczej wytłumaczenie Dlaczego tak, a nie inaczej?

Nie przeczytałem nigdy ani jednej książki z programowania

To zacznij. Poza klasykami, które wszyscy polecają (np. Czysty Kod) fajnie jest poczytać coś o robieniu gier, nawet jeśli gier nie robisz. Np. "Perełki programowania gier" to inspirująca seria.

Co do algorytmów, tu masz np. wizualizacje różnych algorytmów, może lepiej zrozumiesz:
http://www.cs.usfca.edu/~galles/visualization/Algorithms.html

0

otworzyłem 3 losowe klasy i widzę, że przecież używasz wzorców projektowych - chociażby Builder.

1

Weź to zmień bo w oczy boli ;p A wzorców to masz tam dużo.

        if (result.hasErrors()) {
            if (!validator.checkUsername(registerDTO.getUsername())) {
                model.addAttribute("invalidData", true);
                model.addAttribute("textError", "The username is incorrect!");
                model.addAttribute("registerDTO", registerDTO);
                model.addAttribute("invalidUsername", true);
                return "register";
            } else if (!validator.checkEmail(registerDTO.getEmail())) {
                model.addAttribute("invalidData", true);
                model.addAttribute("textError", "The e-mail is incorrect!");
                model.addAttribute("registerDTO", registerDTO);
                model.addAttribute("invalidEmail", true);
                return "register";
            } else if (!validator.checkPassword(registerDTO.getPassword())) {
                model.addAttribute("invalidData", true);
                model.addAttribute("textError", "The password is incorrect!");
                model.addAttribute("registerDTO", registerDTO);
                model.addAttribute("invalidPassword", true);
                return "register";
            }
        }
        if (userService.checkRepeatedUsername(registerDTO.getUsername())) {
            model.addAttribute("invalidData", true);
            model.addAttribute("textError", "The given username is in the database!");
            model.addAttribute("registerDTO", registerDTO);
            model.addAttribute("invalidUsername", true);
            return "register";
        } else if (userService.checkRepeatedEmail(registerDTO.getEmail())) {
            model.addAttribute("invalidData", true);
            model.addAttribute("textError", "The given email is in the database!");
            model.addAttribute("registerDTO", registerDTO);
            model.addAttribute("invalidEmail", true);
            return "register";
        } else if (!validator.checkReenterPassword(registerDTO.getPassword(), registerDTO.getReenterPassword())) {
            model.addAttribute("invalidData", true);
            model.addAttribute("textError", "Passwords are not the same!");
            model.addAttribute("registerDTO", registerDTO);
            model.addAttribute("invalidReenterPassword", true);
            return "register";
        }


0

Nie analizowałem profesjonalnych kodów.

zacznij od analizy swojego ;)

Nigdy nie użyłem w moich projektach np. fiku-mików. Dlaczego? Bo tylko kiedyś z grubsza przeczytałem co to jest i tyle.

patrząc po wklejonym przez @Schadoow fragmencie zacząłbym nie od dodawania nowych elementów do istniejącego bałaganu, ale od sprzątnięcia tego co już jest. We wklejonym powyżej fragmencie widać np. nadmierną duplikację kodu (piszesz kilka razy to samo w ifach. Można tego uniknąć na rozmaite sposoby - choćby wyciągnąć powtarzające się linjki kodu w górę, poza ifa. Można się też zastanowić nad samym sensem robienia ifa. Jeśli tyle kodu się powtarza, to może sama abstrakcja jest zła? Może validator powinien przyjmować od razu grupę elementów i zwracać listę błędów? (nie wiem czy powinien, taki luźny pomysł).

BTW podobny temat był: Jak sie ma młotek, to wszystko wygląda jak gwóźdź - czyli architektura i dobór tools'ów

0

Cześć, jakość kodu to coś na co zwracamy dużą uwagę w PC. Zwykle polecamy książki:
https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Mam nadzieję, że będą pomocne :)

pozdrawiam serdecznie,
Ewa

1

Nie chodzi o to, że wiesz wiele albo niewiele. Chodzi o to, że nie przygotowałeś się do rozmowy kwalifikacyjnej tak jak należy. Z grubsza zawsze wiadomo, czego można sie spodziewać na rozmowie, jakich pytań albo zadań. Musisz liznąć trochę teorii, tak aby przejść rozmowę, gdy juz cię przyjmą to i tak z reguły kod jest zawsze syfiasty jeszcze bardziej niż to co masz na swoim githubie, a jeśli nawet nie, to możesz wzorować się na innych i nabywać doświawdczenia.

0
Trzeźwy Szczur napisał(a):

Nie chodzi o to, że wiesz wiele albo niewiele. Chodzi o to, że nie przygotowałeś się do rozmowy kwalifikacyjnej tak jak należy. Z grubsza zawsze wiadomo, czego można sie spodziewać na rozmowie, jakich pytań albo zadań. Musisz liznąć trochę teorii, tak aby przejść rozmowę, gdy juz cię przyjmą to i tak z reguły kod jest zawsze syfiasty jeszcze bardziej niż to co masz na swoim githubie, a jeśli nawet nie, to możesz wzorować się na innych i nabywać doświawdczenia.

Szczególnie jak na teście jest codillity :D

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