Czy powinienem iść dalej w Javę czy nauczyć się kolejnego?

0

Pytanie w temacie:
Czy powinienem iść dalej w Javę czy nauczyć się kolejnego?

Jest troszkę na wyrost, ponieważ jestem jeszcze na etapie nauki tego języka. Niemniej jednak jest to bardzo ciekawy wątek, który można poruszyć. Bo co potem? Bardzo dużo ludzi (znajomi oraz na forach) mówią o nauce drugiego języka programowania. Natomiast bardzo ciekawa jest odpowiedź z tego wątku:
https://www.quora.com/Should-I-go-deeper-into-Java-or-start-on-a-second-programming-language

Don't learn "yet another programming language". I'd suggest getting a firm understanding of computer architecture, compilers, and programming language design instead. It's more important to understand how your programs control the underlying machine. Learning a specific language will become a simple task thereafter.

Don't get me wrong -- it's certainly useful to learn multiple programming languages (just like with human languages). But studying the principles of programming languages might be a better investment of your time than learning the syntax and specific constructs of a language.

W takim razie chciałem zapytać:

  1. Co Wy o tym sądzicie? Taką ogólną wypowiedź bym prosił ;)
  2. Jeśli zdecydować się na zgłębianie architektury i projektowania języków programowania itd. to od czego zacząć? Może i tutaj są jakieś "must-read" książki?

Miło będzie jak odpowiecie w punktach ;)

Pozdr :)

2

Jeśli będziesz robił to co cię ciekawi to będziesz robił to najwydajniej. Więc w sumie wybierz sam. Ale z mojej strony polecam nauczenie się TDD od razu na początku przygody z programowaniem - TDD się bardzo przydaje, a ciężko się na niego przerzucić jeśli się długo kodzi bez stosowania TDD. Stąd polecam np książkę Kenta Becka: http://helion.pl/ksiazki/tdd-sztuka-tworzenia-dobrego-kodu-kent-beck,tddszt.htm
Jak trochę poćwiczysz TDD to zabierz się za pisanie jakiegoś własnego projektu, także z zastosowaniem TDD. Dzięki temu:

  1. Utrwalisz TDD.
  2. Po napisaniu dużej ilości kodu we własnym projekcie będziesz miał wiele okazji, by dorzucić do niego jakieś technologie i je potrenować na "żywym organizmie", zamiast przerabiać same trywialne przykłady.
0

@Wibowit Tak. Rozumiem, że są takie rzeczy jak TDD, DDD i jeszcze sporo innych wartych ogarnięcia, ale zastanawiałem się właśnie tak jak napisał tam ten gość na forum. Czyli może warto zgłębić jak języki programowania (w tym przypadku Java) działa pod spodem? Jak to się odbywa? Nie wiem czy tłumaczę, bo jeszcze nauki Javy trochę przede mną, ale zastanawiam się co potem :) Bo faktycznie uczenie się kolejnych języków nie będzie problemem kiedy będę miał dobrze opanowane ogólne pojęcia nie tylko z samego języka (jak polimorfizm, enkapsulacja itd.)

Rozumiesz mnie co chcę przekazać? :)

0

mimo, że jestem nowicjuszem to wydaje mi się że lepiej jest być w jednej konkretnej rzeczy baaardzo dobrym niż byc z kilku rzeczy średnim/dobrym

0
D3X napisał(a):

@Wibowit Tak. Rozumiem, że są takie rzeczy jak TDD, DDD i jeszcze sporo innych wartych ogarnięcia, ale zastanawiałem się właśnie tak jak napisał tam ten gość na forum. Czyli może warto zgłębić jak języki programowania (w tym przypadku Java) działa pod spodem? Jak to się odbywa? Nie wiem czy tłumaczę, bo jeszcze nauki Javy trochę przede mną, ale zastanawiam się co potem :) Bo faktycznie uczenie się kolejnych języków nie będzie problemem kiedy będę miał dobrze opanowane ogólne pojęcia nie tylko z samego języka (jak polimorfizm, enkapsulacja itd.)

Rozumiesz mnie co chcę przekazać? :)

Warto zgłębić to jak to działa pod spodem. Jak działa zarządzanie pamiecią w Javie, jak wydajnie pisać współbieżne aplikacje, etc. Warto wiedzieć dlaczego coś zrobiłeś i jak działa (nawet w zarysie) niż po prostu korzystam z X, bo widziałem taki przykład w książce :)

0

nauka nowego jezyka zanim nabierzesz troche doswiadczenia jako koder nie zaprocentuje zbytnio. wez tak na powaznie pokoduj cos z rok-dwa (ekspolorujac javowe i ogolnie programistyczne tematy) i potem sie bierz za nastepne.
mysle ze analogia jezyki programowania vs jezyki obce nie jest zbyt trafna, jest jedynie pare naciaganych podobienstw. to bzdura ze nie mozna byc dobrym w wielu jezykach programowania i ze trzeba wymasterowac jeden ale tak jak napisalam - mysle ze warto przez chwile sie skupic na jednym zeby zalapac o co chodzi, potem juz leci z gorki :)

1

@D3X:
Ja w dużej mierze wiem jak działa Java pod spodem. Kiedyś przez wiele lat klepałem w czystym asemblerze i ręcznie optymalizowałem pod rozszerzenia procesora (typu MMX czy SSE2), deasemblowałem i łamałem programy (jakoś łatwiej mi było w taki sposób to robić niż przy użyciu debuggera), poznawałem architektury procesorów x86 (nawet zacząłem tłumaczyć tutoriale Agnera Foga na polski, ale nie opublikowałem tego), poczytałem o sposobie działania Garbage Collectora w Javie, poczytałem o optymalizacjach w JVMie (typu dynamiczna dewirtualizacja funkcji, dynamiczna deoptymalizacja, gdy poprzednie optymalizacje przestają się sprawdzać dla nowych danych, sprawdzanie zasięgu obiektów i alokowanie ich na stosie zamiast stercie jeśli się da, dynamiczne wklejanie funkcji w miejsce wywołania, itp itd). Rzeczy do ogarnięcia jest bardzo dużo i jeśli chciałbyś dobrze poznać temat od podszewki to musiałbyś posiedzieć nad tym wiele lat.

Z drugiej strony jednak doświadczenie z TDD zaprocentuje od razu, gdy zaczniesz tworzyć nietrywialne programy. Samo TDD jest w pewnym stopniu wyznacznikiem profesjonalizmu - programiście płaci się przede wszystkim za działający kod, a TDD pozwala na efektywne testowanie (i tanie, bo w pełni zautomatyzowane) i stabilny rozwój oprogramowania. Im szybciej przyzwyczaisz się do TDD tym lepiej, bo stare nawyki ciężko zmieniać.

O architekturze procesora przypominam sobie, gdy trzeba mocno zoptymalizować program pod kątem szybkości. Zdarza się to jednak bardzo rzadko w pracy komercyjnej. Jako hobby bardzo często, bo lubię sobie zakodzić jakiś algorytm sortowania czy kompresji, ale takich rzeczy się w pracy nie robi (korzysta się z gotowców).

Jeśli już bardzo chcesz schodzić na niski poziom to możesz zdeasemblować sobie bajtkod Javowy. Możesz to zrobić używając narzędzia javap, które jest dostępne w JDK. Wycinek z manuala:

EXAMPLE
       Compile the following DocFooter class:

           import java.awt.*;
           import java.applet.*;

           public class DocFooter extends Applet {
                   String date;
                   String email;

                   public void init() {
                           resize(500,100);
                           date = getParameter("LAST_UPDATED");
                           email = getParameter("EMAIL");
                   }

                   public void paint(Graphics g) {
                           g.drawString(date + " by ",100, 15);
                           g.drawString(email,290,15);
                   }
           }


       The output from the javap DocFooter.class command yields the following:

           Compiled from "DocFooter.java"
           public class DocFooter extends java.applet.Applet {
             java.lang.String date;
             java.lang.String email;
             public DocFooter();
             public void init();
             public void paint(java.awt.Graphics);
           }


       The output from javap -c DocFooter.class command yields the following:

           Compiled from "DocFooter.java"
           public class DocFooter extends java.applet.Applet {
             java.lang.String date;
             java.lang.String email;

             public DocFooter();
               Code:
                  0: aload_0
                  1: invokespecial #1                  // Method
           java/applet/Applet."<init>":()V
                  4: return

             public void init();
               Code:
                  0: aload_0
                  1: sipush        500
                  4: bipush        100
                  6: invokevirtual #2                  // Method resize:(II)V
                  9: aload_0
                 10: aload_0
                 11: ldc           #3                  // String LAST_UPDATED
                 13: invokevirtual #4                  // Method
            getParameter:(Ljava/lang/String;)Ljava/lang/String;
                 16: putfield      #5                  // Field date:Ljava/lang/String;
                 19: aload_0
                 20: aload_0
                 21: ldc           #6                  // String EMAIL
                 23: invokevirtual #4                  // Method
            getParameter:(Ljava/lang/String;)Ljava/lang/String;
                 26: putfield      #7                  // Field email:Ljava/lang/String;
                 29: return

             public void paint(java.awt.Graphics);
               Code:
                  0: aload_1
                  1: new           #8                  // class java/lang/StringBuilder
                  4: dup
                  5: invokespecial #9                  // Method
            java/lang/StringBuilder."<init>":()V
                  8: aload_0
                  9: getfield      #5                  // Field date:Ljava/lang/String;
                 12: invokevirtual #10                 // Method
            java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
                 15: ldc           #11                 // String  by
                 17: invokevirtual #10                 // Method
            java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
                 20: invokevirtual #12                 // Method
            java/lang/StringBuilder.toString:()Ljava/lang/String;
                 23: bipush        100
                 25: bipush        15
                 27: invokevirtual #13                 // Method
            java/awt/Graphics.drawString:(Ljava/lang/String;II)V
                 30: aload_1
                 31: aload_0
                 32: getfield      #7                  // Field email:Ljava/lang/String;
                 35: sipush        290
                 38: bipush        15
                 40: invokevirtual #13                 // Method
           java/awt/Graphics.drawString:(Ljava/lang/String;II)V
                 43: return
           }

Porównując bajtkod z kodem źródłowym możesz z czasem nabrać intuicji jak kod Javowy będzie kompilował się do bajtkodu. Potem np będziesz mógł wziąć inny język na JVMa, np Scalę i porównać jak Scala kompiluje się do bajtkodu oraz porównać w czym jest podobna do Javy, a w czym różna jeśli chodzi właśnie o tą postać niskopoziomową.

0

A tak swoją drogą używa ktoś w ogóle w pracy DDD? Czy to tylko w teorii wydaje się dobre a w praktyce ciężko zrealizować?

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