konto usunięte

Temat: C# - początki, dobra książka

Piotr Arendarski:
Ja mam pytanie trochę innego typu ale nie chcę zakładać nowego wątku.
Od września zaczynam studia informatyczne w Danii po angielsku i chciałbym już zacząć programować w C#... a nie mam doświaczenia zuełnie.

Mam 2 pytania:
1. Czy od razu zacząć studiować literaturę anglojęzyczną ?
2. Jeśli tak to... czy w ogóle warto przed studiami samemu się uczyć żeby nie mieć problemów z egzaminami.
Odpowiedzi na takie pytania są zawsze takie same - to zależy.

Zależy do czego Ci jest potrzebny ten C#:

Jeśli C# wykorzystujesz jako narzędzie które przy okazji pomoże zautomatyzować jakieś zadanie dla niewielkiej grupki użytkowników - np wykonać jakieś wewnętrzne (organizacyjne) obliczenia, ułatwić jakiś proces, to prawie każda książka jest dobra - nawet taka jak "naucz się C# w 21 dni".

Jeśli natomiast chciałbyś na szerszą skalę zajmować się programowaniem, tworzyć systemy używane przez większa liczę użytkowników i żyć z tego, to w ogóle odradzam C# jako pierwszy język.

Języki takie jak C#, Java, PHP czy inne podobne 3GL-y, przez to, że ukrywają wiele tego co się dzieję pod maską uczą programistów złych nawyków. Nauczenie się takiego języka jako pierwszego jest na prawdę krzywdą dla programisty.

Nie twierdzę, że ludzie którzy od tego zaczęli są kiepskimi programistami. Niektórzy z nich robią naprawdę fajne rzeczy. Problem jest taki, że te rzeczy które robią - jakby zaczęli od innej platformy - robiliby jeszcze lepiej, wydajniej, bezpieczniej. Wyostrzyła by im się czujność na wiele rzeczy i by znali koszty różnych operacji.

Jeżeli druga opcja Ciebie dotyczy to szczerze polecam rozpoczęcia drogi od C albo C++.
W takich środowiskach nauczysz się jak naprawdę działa pamięć (wbrew pozorom - sporo programistów ma z tym problemy), wiedziałbyś, że tak naprawdę, operację które wykonujesz jednym operatorem w 3GL-u to tak naprawdę masa roboty i że jak będziesz tak tego używać przy większych obciążeniach to będą problemy wydajnościowe.

Przy takim C/C++ nabierzesz też więcej dyscypliny w swoim kodzie, nauczysz się, że.... mógłbym wymieniać bez końca ;-)

Dopiero po tym, jak zrozumiesz te mechanizmy, wtedy przesiądź się na C#. Z tym, że wtedy nauka składni C# zajmie Ci jeden dzień a reszta to będzie poznawanie bibliotek.

PozdrawiamKarim Agha edytował(a) ten post dnia 30.12.09 o godzinie 07:51
Michał K.

Michał K. .NET Developer

Temat: C# - początki, dobra książka

Nic dodać, nic ująć. ;-)

konto usunięte

Temat: C# - początki, dobra książka

Dziękuję za wyczerpującą odpowiedź.
Chciałbym w przyszłości być coś na kształt Quantitative Developer (połączanie matematyki, finansów i informatyki)więc jak mniemam powinienem zacząć od C++.

Rozumiem że z C# i C++ to tak jak ktoś chce się zacząć uczyć ekonometrii, statystyki nie ucząc się wcześniej matematyki...

konto usunięte

Temat: C# - początki, dobra książka

Karim Agha:
Języki takie jak C#, Java, PHP czy inne podobne 3GL-y, przez
to, że ukrywają wiele tego co się dzieję pod maską uczą programistów złych nawyków.
nie ukrywają ale abstrahują a to jest bardzo istotna różnica.
C++ może nauczyć złych nawyków pisania destruktora w .NET. Książki o C++ nic nie wiedzą o .NET więc nie skorygują tego rodzaju różnic.
Jeżeli druga opcja Ciebie dotyczy to szczerze polecam rozpoczęcia drogi od C albo C++.
A ja mogę ironicznie dorzucić używając twojej argumentacji, że krzywdę robią sobie ci, którzy zaczynają od języków C/C++. Jak ktoś chce poznać budowę komputera to powinien rozpocząć pracę w assemblerze albo jeszcze wcześniej.
W takich środowiskach nauczysz się jak naprawdę działa pamięć (wbrew pozorom - sporo programistów ma z tym problemy),
i znowu się nie zgodzę: jak ktoś chce to może w C# nauczyć się odpowiednio korzystać z pamięci bez nawiązań do C++. Oto książka która tłumaczy te kwestie:
CLR via C#, Jeffrey Richter - powiedz, co byś od siebie dodał w temacie pamięci o czym autor nie wspomniał? Może po prostu trzeba uczyć się z dobrych źródeł.
Dorzućmy jeszcze np. pozycje Petzolda z .NET - nic nie nawiązuje do czasów C/C++ a doskonale tłumaczy wszystkie niuanse związane z boxingiem, ,value-type, stertą itp. w kontekście np. kosztownych obliczeń 3D

Dzisiejszy problem z pamięcią to np. takie pisanie softu, aby program skalował się na wiele procesorów/chmurę; za czasów C++ nie było to priorytetem i jest wiele softu napisanego w tamtych czasach, który wymaga ustawienia processor affinity - ciekawe dlaczego, jeżeli ten C++ to taka doskonała platforma umożliwiająca zrozumienie zasady działania pamięci?

wiedziałbyś, że tak naprawdę, operację które wykonujesz jednym operatorem w 3GL-u to tak naprawdę masa roboty
a np. prosta pętla for w C++ to masa roboty w assemblerze - warto to wiedzieć czy nie? Kto decyduje o tym, na jakim poziomie trzeba przerwać naukę i dlaczego akurat nauka C++ jest dobra, a nauka assemblera już nie?

Na zakończenie do Piotra:
Moje zdanie jest takie: trzeba uczyć się nowoczesnych narzędzi pracy z dobrych źródeł tak, aby w miarę szybko stać się dobrym programistą czyli takim, który rozwiązuje realne problemy biznesowe wyrabiając się jednocześnie w terminie i budżecie. Nauka C++ może pomóc, może zaszkodzić, ale na pewno zajmie trochę czasu, który można spożytkować lepiej, a .NET można się nauczyć bez retrospekcji z XX wieku:)
Szymon P.

Szymon P. Databricks, Azure
Data Factory, MS SQL
SERVER

Temat: C# - początki, dobra książka

Pozwolę sobie wtrącić swoje 3 grosze, choć moja opinia może być niemiarodajna bo naukę rozpocząłem już od C# (a nie jak poprzednicy) od strukturalnego C i C++ gdzie są te okropne wskaźniki ;)

W każdym razie nie zgodzę się z opinią, że C# nie daje wystarczającej bazy wiedzy i warto zacząć o C/C++ wszystko się na świecie zmienia i programowanie też ewoluuje. Dawniej pisało się wiele skomplikowanych programów np. żeby sczytać plik od początku do końca, a teraz wystarczy wykorzystać jedną metodę - koła drugi raz nie wymyslicie i programowanie również zmierza bardziej do tego żeby umieć wykorzystać odpowiednie metody zawarte w pakiecie .NET bądź w innych systemach, które się wykorzystuje i moim zdaniem C# daje jak najbardziej odpowiednie podstawy i to świetny język (choć ma swoje wady, ograniczony tylko tam gdzie jest. NET)

Platforma .NET to zupełnie inne spojrzenie na programowanie i moim zdaniem wszystko ewoluuje i programowanie właśnie obecnie zmierza do czegoś takiego jak .NET. Nie wiem czy rozumiecie do czego zmierzam? Tak tak, jest ograniczona na razie tylko dla windows (choć jest już mono dla linuxów) ale chodzi mi o koncepcję (wspólne środowisko uruchomieniowe CLR, wspólna biblioteka klas i typów) TO WSZYSTKO JEST NIEZALEŻNE OD JĘZYKA, W KTÓRYM PROGRAMUJE PROGRAMISTA ... co prawda zależne jeszcze od OSa, ale chyba za niedługo microsoft i inne firmy podejmą działania aby coś takiego jak .NET działało na każdym OSie

Co do kolegi od studiów w Danii powiem już krótko i treściwie:
Zawsze warto się dodatkowo samemu douczać czegokolwiek!

konto usunięte

Temat: C# - początki, dobra książka

maciek kański:
nie ukrywają ale abstrahują a to jest bardzo istotna różnica.
C++ może nauczyć złych nawyków pisania destruktora w .NET. Książki o C++ nic nie wiedzą o .NET więc nie skorygują tego rodzaju różnic.

Ale za to książki o C# informują swoich czytelników o tych zmianach.
A ja mogę ironicznie dorzucić używając twojej argumentacji, że krzywdę robią sobie ci, którzy zaczynają od języków C/C++. Jak ktoś chce poznać budowę komputera to powinien rozpocząć pracę w assemblerze albo jeszcze wcześniej.
i znowu się nie zgodzę: jak ktoś chce to może w C# nauczyć się odpowiednio korzystać z pamięci bez nawiązań do C++. Oto książka która tłumaczy te kwestie:
CLR via C#, Jeffrey Richter.

Widzisz, ja tą książkę przeczytałem (przyznam - świetna pozycja).
W niej jest sporo o pamięci o tym jak faktycznie dzieją się rzeczy w programach napisanych w C#. Istotną jednak różnicą pomiędzy C# a C++ jest taka, że wiedza która jest w tytułach pokroju CLR via C# nie jest niezbędna do napisania nawet dużego systemu.

Można napisać cały system w C# nie widząc połowy rzeczy opisanych w tej książce.
W C++ jednak, bez posiadania takiej wiedzy ani rusz. Nic nie napiszesz bez znajomości wskaźników, ich arytmetyki i całej otoczki pamięciowej, dlatego programista C++ jest zmuszony do tego aby umiał takie rzeczy - co owocuję wydajniejszym kodem (oczywiście kiepscy programiści zdarzają się wszędzie, dlatego mówmy o tych średnich i wzwyż).

To że taka wiedza nie jest niezbędna nie znaczy, że jest niepotrzebna. Jest potrzebna po to aby pisać optymalne rozwiązania.

Absolutnie nie uważam, że należy pisać wszystko w C++. Wręcz przeciwnie - C# jest o wiele bardziej produktywnym środowiskiem programistycznym niż C++, tylko wypadałoby wiedzieć co się robi.
Dzisiejszy problem z pamięcią to np. takie pisanie softu, aby program skalował się na wiele procesorów/chmurę; za czasów C++ nie było to priorytetem i jest wiele softu napisanego w tamtych czasach, który wymaga ustawienia processor affinity - ciekawe dlaczego, jeżeli ten C++ to taka doskonała platforma umożliwiająca zrozumienie zasady działania pamięci?

I tutaj posłużę się przykładem:
http://msdn.microsoft.com/en-us/magazine/ee335693.aspx
(nie musisz czytać całości, zobacz tylko wykresy oraz ostatni akapit).
Jak widać, nawet sam Microsoft, w przypadku kiedy priorytetem jest skalowność oraz wydajność systemu ucieka od .NET.
Nie dlatego, że .NET jest wolny, bo przecież C# jako język nie jest wiele wolniejszy od C++ (a czasem nawet wydajniejszy gdy JIT optymalizuje go w locie). A dlatego, że po prostu nie wszystko da się mieć pod kontrolą jeżeli chodzi o C# i .NET.
Masz za duży narzut ze strony CLR, masz ograniczenia które nakłada i rzeczy które abstrahuję/ukrywa a które są ważne (najlepszy przykład - String).
a np. prosta pętla for w C++ to masa roboty w assemblerze - warto to wiedzieć czy nie? Kto decyduje o tym, na jakim poziomie trzeba przerwać naukę i dlaczego akurat nauka C++ jest dobra, a nauka assemblera już nie?
Nauka assemblera też jest dobra i tutaj odpowiedź jest taka sama jak na pytanie Piotra - to zależy.
Zależy od tego w jaki sposób wykorzystujemy programowanie.

Na zakończenie do Piotra:
Moje zdanie jest takie: trzeba uczyć się nowoczesnych narzędzi pracy z dobrych źródeł tak, aby w miarę szybko stać się dobrym programistą czyli takim, który rozwiązuje realne problemy biznesowe wyrabiając się jednocześnie w terminie i budżecie.

Zgadzam się w 100%.
Nauka C++ może pomóc, może zaszkodzić, ale na pewno zajmie trochę czasu

Owszem zajmie trochę czasu, pomoże ale nie zaszkodzi.

który można spożytkować lepiej, a .NET można się nauczyć bez retrospekcji z XX wieku:)

Bez retrospekcji z XX wieku? :-) 90% algorytmów których używasz teraz (przeszukiwań, sortowań, grafów, itd..) zostały wymyślona w latach 60-80 ;-)

konto usunięte

Temat: C# - początki, dobra książka

Po pierwsze dzięki za ciekawą dyskusję:)
Karim Agha:
I tutaj posłużę się przykładem:
http://msdn.microsoft.com/en-us/magazine/ee335693.aspx
Jak widać, nawet sam Microsoft, w przypadku kiedy priorytetem
jest skalowność oraz wydajność systemu ucieka od .NET.
czytałem w wersji papierowej i nawet zdążyłem się nad tym zastanawiać - właśnie nie nawet Microsoft ale tylko Microsoft musi to użyć w swoich specyficznych zastosowaniach opisanych we wspomnianym akapicie.
Teraz ja bym chciał od Ciebie praktyczny przykład z projektu, w którym migracja WCFa na WWSa skróciła by czas i budżet projektu. Twierdzę, że realia biznesowe okażą, że lepiej postawić dodatkowy komputer z IISem aby WCFa przeskalować. Dodatkowa maszynka to koszt 10 dni pracy programisty C++ - jeżeli projekt jest duży to w te 10 dni wiele się nie wykoduje/przetestuje/wdroży plus jeszcze zarządzanie zmianą w przyszłości w hybrydowym środowisku - przemyśl, czy te słupki jesteś w stanie przelać na praktyczne zastosowanie czyli takie, za które ktoś Ci zapłaci (czyli nie akademicki/hobbystycznie) - na pewno tak, jeżeli pracujesz dla Microsoftu w Irlandii:)
90% algorytmów których używasz teraz (przeszukiwań, sortowań,
grafów, itd..) zostały wymyślona w latach 60-80 ;-)
zostały wymyślona, zaimplementowana i nic tu po nas - możemy je wykorzystać w każdym języku programowania.

XX wiek kojarzy mi się z wielokrotnym odkrywaniem koła, tj. ciągłym programowaniem jak czyli w jaki sposób mamy coś zrobić. Obecnie - dla mnie od C# 3.0/F# - aby efektywnie pisać soft nie musimy tracić czasu na zastanawianie się jak działa elementarny algorytm/procesor, ale skupiamy się na tym co chcemy osiągnąć. A do programowania funkcjonalnego to C#/F# się nadaje, nie C++.

Przykładem w różnicy pokoleniowej jest to, że w 'starych' algorytmach unikało się rekursji, bo zwiększała ona call stack który mógł się kiedyś wysypać. A .NET oferuje nam tail opcode który jest wykorzystywany na pewno w F# i jednak rekursję używać można bez ograniczeń (przyznam, że sam się jeszcze nie przyzwyczaiłem do tego podejścia).
Sam przyznasz, że algorytm zapisany rekursywnie jest lepiej zrozumiały dla człowieka, co ostatecznie ułatwia produkcję kodu. A kiedyś trzeba było zamieniać algorytm rekursywny na odpowiednika, tracąc na to sporo czasu, albo spełniając oczekiwania wykładowcy:)

Odnośnie wykładowców i popularności C++ na uczelniach: wykładowcy to ludzie, którzy sami uczyli się w czasach C/C++ albo wcześniej i dobrze znają ten język. Na dodatek C++ pozostaje niezmienny od dobrych kilku/kilkunastu lat, więc nie trzeba się uczyć nowych rzeczy, można wykładać ten sam materiał latami.
A w C# to co rok/dwa należałoby zmienić treść wykładów, laborek itd. i po prostu nisko opłacanej kadrze akademickiej niezbyt się chce robić darmową reklamę technologiom Microsoftu (poniekąd słusznie :)

O OpCode.Tail krótko i zwięźle:
http://www.redmountainsw.com/wordpress/archives/clrs-t...
zmotywowany dyskusją postaram się w zbliżających się wolnych dniach porównać efektywność przeszukiwania drzewa w C++ vs TailCall :)
Szymon P.

Szymon P. Databricks, Azure
Data Factory, MS SQL
SERVER

Temat: C# - początki, dobra książka

Karim zgadza się, że w C++ bez wskaźników i wielu innych rzeczy ani rusz i że większość skomplikowanych algorytmów już została wymyślona ........ i w tym sęk po co babrać się w czymś co już zostało wymyślone i opakowane w klasę, metodę czy cokolwiek. Własnie moja wypowiedź miała to na celu, że wszystko ewoluuje i programowanie RÓWNIEŻ i w chwili obecnej aby efektywnie programować nie trzeba nawet znać tak wielu skomplikowanych rzeczy jak wcześniej, więc po co się cofać skoro właśnie ideą jest aby pewne rzeczy uprościć

Panowie poza tym przypominam Wam, że topic dotyczył książek dla początkujących do C#, a nie różnic pomiędzy C++ i C#

Pozdrawiam i wszystkiego najlepszego w nowym roku (oby był jeszcze lepszy niż obecny)

Szymon

konto usunięte

Temat: C# - początki, dobra książka

Szymon P.:
Karim zgadza się, że w C++ bez wskaźników i wielu innych rzeczy ani rusz i że większość skomplikowanych algorytmów już została wymyślona ........ i w tym sęk po co babrać się w czymś co już zostało wymyślone i opakowane w klasę, metodę czy cokolwiek. Własnie moja wypowiedź miała to na celu, że wszystko ewoluuje i programowanie RÓWNIEŻ i w chwili obecnej aby efektywnie programować nie trzeba nawet znać tak wielu skomplikowanych rzeczy jak wcześniej, więc po co się cofać skoro właśnie ideą jest aby pewne rzeczy uprościć

To, że jest dużo rzeczy już gotowych i zaimplementowanych w różnych bibliotekach, nie znaczy, że nie trzeba wiedzieć jak działają. Uważam, że jako programista nie można być ograniczonym do tego co jest opakowane w klasach w swojej pracy.

Po pierwsze: co jeśli będziemy potrzebować odrobinę zmodyfikowanej wersji algorytmu? musimy znać implementacją oryginalnego algorytmu żeby mieć co modyfikować.

Po drugie: nie znając implementacji, nie jesteśmy w stanie ocenić koszt obliczeniowy danej operacji. Istnieje ryzyko, że użyjemy nieoptymalnego algorytmu do danego problemu.

Po trzecie: to jest trochę jak z pisarzami :) żaden pisarz nie napiszę Ci dobrej książki nie przeczytawszy wcześniej ich masę - nie miałby takiego zasoby słów aby napisać dobrą książkę. Z kodem jest podobnie - jak będzie trzeba coś wymyślić nowego, opracować rozwiązanie jakiegoś problemu, to mając już w głowie parę algorytmów wiadomo w ogóle czego szukać, z jakiej strony się za dany problem zabierać.

maciek kański:
Teraz ja bym chciał od Ciebie praktyczny przykład z projektu, w którym migracja WCFa na WWSa skróciła by czas i budżet projektu. Twierdzę, że realia biznesowe okażą, że lepiej postawić dodatkowy komputer z IISem aby WCFa przeskalować.

Zgadza się. Osobiście jeszcze nie zdarzyło mi się mieć takie wymagania biznesowe, że migracja z WCF-a na WWS przyniosłaby prawdziwe korzyści.
Nie twierdzę również, że powinniśmy pisać w C++. C# jest o wiele produktywniejszym językiem niż C++. Sam większość moich projektów piszę w C#.

Twierdzę jednak, że wypada znać to środowisko i wiedzieć co się dzieję pod maską - dlatego wcześniej napisałem, że po nauce C++ łatwo można się na C# przesiąść.
Dodatkowa maszynka to koszt 10 dni pracy programisty C++ - jeżeli projekt jest duży to w te 10 dni wiele się nie wykoduje/przetestuje/wdroży plus jeszcze zarządzanie zmianą w przyszłości w hybrydowym środowisku - przemyśl, czy te słupki jesteś w stanie przelać na praktyczne zastosowanie czyli takie, za które ktoś Ci zapłaci (czyli nie akademicki/hobbystycznie) - na pewno tak, jeżeli pracujesz dla Microsoftu w Irlandii:)

Tak, ale robiąc coś, nic nie stoi na przeszkodzie zrobienia tego w sposób optymalny i dobry. Mając wiedzę na temat prawdziwych działań naszego środowiska, można już na poziomie projektowania i implementacji zrobić to w sposób optymalny nie wykorzystując więc czasu programistów.

To zależy na jakim etapie produkcji uwzględnimy optymalizację. Jeśli pod koniec - to rzeczywiście, nie ma co się w to bawić bo to tylko dodatkowy koszt. Ale jak jest uwzględniania od początku to nie daję żadnego obciążenia dla projektu.
Z tym jest podobnie jak z bezpieczeństwem aplikacji - jeśli od początku piszemy system i na każdym etapie myślimy o bezpieczeństwie (walidacje, filtracje, itd..) to nie obciążamy zbytnio projektu a zbieranie się pod koniec owszem i wtedy nawet już nie można osiągnąć takich wyników jak w pierwszej opcji.
zostały wymyślona, zaimplementowana i nic tu po nas - możemy je wykorzystać w każdym języku programowania.

Jesteśmy inżynierami :) nasz zawód wymaga od nas wymyślania nowych rzeczy. Zobacz teraz jak przebiega proces kształcenia informatyków.
Zanim nie nauczą Cię przeszukiwania binarnego, to uczą Cię jak pracować na grafach, a jeszcze przedtem, uczą teorii grafów po to aby potem móc spojrzeć na problem z szerszej perspektywy.

I ostatnia sprawa - zauważcie, że firmy które robią naprawdę solidny software, to w swoich rozmowach kwalifikacyjnych pytają głównie o algorytmikę a nie o platformę. Polecam też wpis na blogu Joela Spolskiego - http://www.joelonsoftware.com/articles/GuerrillaInterv...

Jak i również w necie można znaleźć listy pytań z rozmów kwalifikacyjnych takich firm jak Microsoft, Google. w 90% pytają właśnie o to jak coś działa od środka, o implementację algorytmów i nie tylko z tego względu, że te firmy tworzą frameworki co implementują algorytmy.

Ale się rozpisałem :-) nic tak nie pomaga na sylwestrowego kaca jak długi post :-)

PozdrawiamKarim Agha edytował(a) ten post dnia 02.01.10 o godzinie 01:06

konto usunięte

Temat: C# - początki, dobra książka

Po co książki skoro jest msdn?
Ze swojej strony odradzam C# Porady i metody Jamsa , Wright 600 stron żeby opanować podstawy podstaw - strata czasu.

konto usunięte

Temat: C# - początki, dobra książka

Zgadzam się w stu procentach z Krzysztofem.
Nauka C# i myślę że jakiegokolwiek innego języka z książki to tak jak czytanie o jeździe na rowerze. Można znaleźć kilka przydatnych informacji ale nic nie zastąpi praktyki. Więc jeśli ktoś zna choćby podstawy programowania w innym języku. Wystarczy zainstalować Visual studio (wersja 2010 jest obecnie darmowa),
uzupełnienie składni jest wręcz idealne dla początkujących. Następnie zaczynamy pisać proste programy posiłkując się bazą msdn w której jest wszystko. Na początku wystarczy konsola i wszelkie operacje na intigerach i stringach. Jak już się poczujemy dobrze w temacie przechodzimy do form i w końcu do ASP. Po 3 miesiącach takich ćwiczeń po kilkanaście godzin tygodniowo napisałem natywny odtwarzacz plików mp3 z obsługa tagów i playlist. Dlatego wydaje mi się że taka metoda nauki jest najbardziej owocna. Oczywiście jeśli ktoś nigdy nie miał styczności z obiektowością to bez "oczytania" tego tematu się nie obejdzie ale wydaje mi się ze sieć jest dysponuje potężnym i wyczerpującym omówieniem tego tematu.Grzegorz Zalewski edytował(a) ten post dnia 16.02.10 o godzinie 23:16

Następna dyskusja:

[ASP.NET] Początki ..




Wyślij zaproszenie do