Czy programista powinien rozumieć protokół TCP / IP i sposób, w jaki routery zarządzają żądaniami? [Zamknięte]

15

Miałem dzisiaj rozmowę kwalifikacyjną na stanowisko Job jako programista w ważnej witrynie. Zadali mnóstwo pytań związanych z językiem programowania, na które udało mi się odpowiedzieć bez problemów, ale potem zaczęli zadawać pytania o to, w jaki sposób żądania TCP / IP były wysyłane, kiedy wysłałem żądanie na moim komputerze do serwera WWW. Otrzymałem te treści jako student, ale nie pamiętam ich dobrze, ponieważ pracuję głównie przy tworzeniu stron internetowych, moje pytanie brzmi:

Czy jako programista, pracujący głównie nad aplikacjami internetowymi, muszę mieć rozległą wiedzę na temat protokołu TCP / IP i sposobu, w jaki routery zarządzają żądaniami, czy może to dla mnie tylko wiedza z czarnej skrzynki?

Yannis
źródło
Czy chcieli wiedzieć więcej o tym, jak żądania TCP / IP są tworzone na poziomie koncepcyjnym, czy też chcieli poznać szczegóły? TCP / IP jest używany pod maskami za każdym razem, gdy komunikujemy się w sieci. Osobiście uważam, że bardzo ważne jest zrozumienie, jak wszystko działa pod maską, przynajmniej na poziomie koncepcyjnym. Pomoże to dostrzec problemy, a często nawet opracować lepsze rozwiązania.
Parag

Odpowiedzi:

25

Ten rodzaj wiedzy jest bardzo przydatny bardzo rzadko.

Na przykład, gdy zespół operacyjny konfiguruje witrynę produkcyjną za routerem / zaporą ogniową / modułem równoważenia obciążenia, który jest skonfigurowany nieco inaczej niż w środowisku testowym, i pojawia się problem z tym związany, dobrze pomoże ci to zauważyć szybko i rozmawiaj z operacjami, zamiast kopać w poszukiwaniu jakiegoś dziwnego kodu. Jeszcze lepiej posłuży ci zrozumienie ich języka podczas rozmowy.

Ale tak naprawdę nie rozumiem, dlaczego ludzie przywiązują tak dużą wagę do tych rzeczy w wywiadach, szczególnie gdy dotyczy to młodszego programisty. Z pewnością nie jest to niezbędna wiedza dla wszystkich w zespole i można się tego nauczyć.

pdr
źródło
2
Dobra uwaga dla młodszych programistów, ale nie jestem pewien, o jaką pozycję poziomuje @forgotmynick, o którą się ubiegają :-)
Dean Harding
@Dean - Fair point. Zakładam, że ludzie, którzy odnoszą się do tego, kiedy byli studentami, nie byli w wieku 5+ lat. Ale masz rację, nie zawsze tak jest.
pdr
1
Przynajmniej wiedząc, co się dzieje, gdy routery po cichu przerywają połączenia, są naprawdę miłe w środowisku produkcyjnym. Ugryziony przez to więcej niż raz.
@pdr - Nie zgadzam się. Ten rodzaj wiedzy jest przydatny, gdy chcesz wiedzieć, dlaczego tak długo trwa lub dlaczego aktualizacje dokonane w Twojej witrynie nie pojawiają się w przeglądarkach użytkowników. Każdy, kto ma odrobinę wiedzy o sieci, znałby odpowiedź: buforowanie. Osobiście, jako konsultant, sprawiłem, że naprawianie sh * głupich rzeczy było głupio proste (i bardzo kosztowne dla firmy) rzeczy, których ludzie unikaliby, gdyby znali te rzeczy. To nie jest tak, że ta nauka rakietowa czy mechanika kwantowa też. Chodzi mi o to, nie ma wymówki, żeby jr dev nie wiedział o tym (szczególnie jeśli pochodzi z CS).
luis.espinal
@ luis.espinal - Szczerze mówiąc, nie sądzę, żebym w ogóle zrzucił buforowanie w tej samej kategorii. To nie jest praca w sieci, to przeglądarka. Zgadzam się z Tobą, że buforowanie (przeglądarka lub serwer) jest czymś, co każdy musi zrozumieć, ponieważ jest prosty, ale ma wiele problemów. Ale TCP / IP?
pdr
16

Moja osobista opinia jest taka, że web developer powinien wiedzieć, jak protokoły niskopoziomowe działa. Szczególnie HTTP, ale także (przynajmniej podstawy) TCP / IP. W zależności od złożoności witryny może się okazać, że będziesz musiał spojrzeć na zrzuty śledzenia HTTP, a nawet tcpdumpdzienniki, w którym to przypadku będziesz potrzebować przynajmniej wiedzy na temat TCP / IP.

To, czy kiedykolwiek będziesz musiał obejrzeć tcpdump, zależy w dużej mierze od szczegółów twojej witryny. Na przykład, jeśli masz dużą witrynę z dużą liczbą użytkowników i serwerów rozproszonych w wielu centrach danych, wykonujących stosunkowo dużą liczbę żądań (np. Ajax, szczególnie żądania w stylu komety), to tcpdumpmoże być coś, co „ Będę musiał spojrzeć.

Jeśli wszystko, nad czym pracujesz, to witryna intranetowa lub coś dość prostego, wiedza może nie być tak ważna, ale myślę, że znajomość rzeczy niskiego poziomu zawsze będzie pomocna.

Dean Harding
źródło
3
lol ... nie nazwałbym http protokołem niskiego poziomu
Pemdas
2
@Permdas: wszystko jest względne. HTTP jest wyższy niż TCP, ale niższy niż (powiedzmy) SOAP.
Dean Harding,
1
SOAP jest bardziej zależny od implementacji niż protokół. Niestety jego implementacje są tak blisko siebie, że nazywają to „protokołem”
kagali-san
HTTP: tak. TCP / IP: podstawowe zrozumienie tego, jak i dlaczego wykonuje niektóre operacje na wyższym poziomie, jest prawdopodobnie w porządku. Wątpię, aby w środowisku tworzenia aplikacji internetowych potrzebna była (lub zbyt często przydatna) dogłębna wiedza
Andy Hunt
7

Zawsze dobrze jest zrozumieć, jak zachowują się warstwy pod kodowaną warstwą, choćby dlatego, że jest to bardzo przydatne, gdy próbujesz debugować względnie złożony problem i musisz zrozumieć, dlaczego Twoja aplikacja ma nieoczekiwane problemy z wydajnością w sieci WAN lub dlaczego nie działa w przypadku użytkowników korzystających z NAT itp. Może być również nieoceniony, gdy musisz być w pokoju, omawiając problem z programistami, administratorami serwera WWW, administratorami sieci i administratorami bazy danych, aby móc mówić i rozumieć język, którym posługują się wszyscy inni, i zadawać inteligentne pytania. Im bardziej rozumiesz różne szczegóły implementacji, tym bardziej prawdopodobne jest, że będziesz w stanie zbudować skalowalną witrynę, na przykład:

To powiedziawszy, istnieje wyraźny punkt malejących zwrotów, w którym więcej informacji na temat abstrakcji, czyli 6 warstw abstrakcji od kodu, który piszesz, raczej nie uczyni cię lepszym programistą. Będzie to w pewnym stopniu zależeć od tego, co rozumiesz przez „rozbudowany”. Zrozumienie podstawowych zasad zarządzania żądaniami przez routery jest czymś, co może być bardzo przydatne, ale zrozumienie, w jaki sposób można skonfigurować różne routery w celu ustalania priorytetów dla różnych rodzajów ruchu, prawdopodobnie nie jest szczególnie przydatne, chyba że pracujesz nad aplikacją, której administratorzy sieci prawdopodobnie chcieliby dławić.

Ale nawet jeśli nie jest to szczególnie praktyczne, silni programiści są zainteresowani różnymi warstwami stosu i zwykle dowiadują się o nich, nawet jeśli nie ma wyraźnej korzyści z tego. Zazwyczaj spodziewałbym się, że programista, który dogłębnie rozumie, jak działają relacyjne bazy danych lub jak działa sieć, będzie silniejszy niż programista, który ogranicza się do wiedzy o samych technologiach programowania. Oczywiście nie jest to idealna korelacja, ale warto zapytać.

Justin Cave
źródło
+1 za „Może być również nieoceniony, gdy musisz być w pokoju, omawiając problem z programistami, administratorami serwera WWW, administratorami sieci i administratorami bazy danych, aby móc mówić i rozumieć język, którym mówią wszyscy inni i zadawać inteligentne pytania ”
Parag
5

Zależy od budowanej witryny. W przypadku małych / średnich witryn podstawowa znajomość protokołu TCP / IP jest prawdopodobnie dobra.

Jeśli pracujesz w najlepszej witrynie (pod względem ruchu), bardzo ważna jest szczegółowa znajomość podstawowych protokołów sieciowych i infrastruktury. Pomoże ci często podejmować dobre decyzje projektowe.

Eric J.
źródło
3

Moim zdaniem musisz ogólnie wiedzieć, w jaki sposób bity docierają z aplikacji na serwer iz powrotem, szczególnie na stanowisko programistyczne. W programowaniu nie ma czarnych skrzynek; wyciekają wszystkie abstrakcje .

Ryan Michela
źródło
2

Czy jako programista, pracujący głównie nad aplikacjami internetowymi, muszę mieć rozległą wiedzę na temat protokołu TCP / IP i tego, w jaki sposób routery zarządzają żądaniami, czy to dla mnie tylko wiedza z czarnej skrzynki?

IMO, fakt, że jesteś programistą (zakładam, że masz doświadczenie w CS) powinien wiedzieć o tych rzeczach. W szczególności, jeśli zajmujesz się tworzeniem stron internetowych. Jak wspomniałem w jednym z moich komentarzy, zrobiłem sh * obciążenia w opłatach za konsultacje, naprawiając naprawdę głupie błędy popełniane przez ludzi, którzy nie znają podstaw architektury sieci / Internetu.

ZOMG, zmiany, które wprowadziłem na mojej stronie, nie są wyświetlane, proszę o pomoc! * ZOMG, profile ludzi się krzyżują, ponieważ gdzieś są buforowane sesje, proszę, pomóż! * ZOMG, mamy bezpieczną zawartość dla uwierzytelnionych użytkowników, ale ludzie mogą do nich dotrzeć z zakładką i nie pojawia się nigdy krwawy ekran uwierzytelniania, plz teh Wsparcie!

... i tak dalej i tak dalej ... niestety ...

Między aplikacją internetową a przeglądarką użytkownika jest mnóstwo rzeczy: aplikacja, karta sieciowa aplikacji, router i być może zapora ogniowa, następnie wewnętrzna karta sieciowa serwera http, następnie serwer http, następnie serwer poczty wychodzącej serwera HTTP, a następnie inna router, a na pewno zapora ogniowa. Następnie urządzenie buforujące i ewentualnie urządzenie SSL. Następnie przejdź do Internetu z większą liczbą routerów i serwerów buforujących, a następnie do przeglądarki użytkowników (i jej wewnętrznej pamięci podręcznej).

Zillion rzeczy może pójść nie tak, a jeśli nie masz wystarczającej wiedzy na temat sieci, protokołów sieciowych, systemów operacyjnych / sysadmin i architektury internetowej, będziesz zagubiony i na łasce swojego działu IT OPs (ponieważ większość programistów nie mają dostępu do infrastruktury ani nie wiedzą, gdzie szukać podczas rozwiązywania problemów). W najgorszym przypadku stanie się naprawdę kiepskim programistą.

Aspekt programistyczny tworzenia stron internetowych to tylko jeden aspekt. Jego pomyślne wykonanie opiera się na innych umiejętnościach (w szczególności na administrowaniu sieciami i systemach), których nie można uznać za coś oczywistego ani ślepo powierzonych operacjom informatycznym. Nie oznacza to, że musisz być odpowiedzialny za rozwiązywanie problemów z siecią / systemem operacyjnym, ale

za. Musisz wiedzieć, co może pójść nie tak na poziomie sieci / systemu operacyjnego, abyś mógł współpracować i poprowadzić IT OPS, który nigdy nie będzie w stanie dokładnie poznać Twojej aplikacji. b. Taka wiedza pozwala tak zaprojektować system, aby unikał, a przynajmniej poprawiał i z wdziękiem radził sobie z takimi błędami.

Programowanie to tylko jeden aspekt inżynierii i rozwoju. Nie może to być twoja podstawowa umiejętność i naprawdę odnieść sukces na dłuższą metę w rozwoju przedsiębiorstw w ogóle, a zwłaszcza w rozwoju sieci, to są rzeczy, o których musisz wiedzieć. I szczerze mówiąc, są to rzeczy, których należało się nauczyć (bardzo mocno) w szkole lub w drodze samokształcenia przed ukończeniem szkoły (lub bezpośrednio po wejściu na rynek pracy).

Powodzenia.

luis.espinal
źródło
1

Ważne jest, aby zrozumieć protokół TCP / IP i sposób, w jaki routery zarządzają żądaniami. Ale nie wiesz, potrzebujesz obszernej wiedzy na ten temat podczas wywiadu. Mniej zostało to wcześniej wyrażone. W przeciwnym razie oboje zmarnujecie czas. Brzmi jak pułapka.

Ale dla roli architekta głęboko wierzę, że ta wiedza jest ważna w każdym przypadku. Facet zapewni rozwiązania, które mogą to wykorzystać, wykorzystując lub nawet replikując architekturę w rozwiązaniu niestandardowym. Spędź weekend z Tanenbaum Networks i spokojnie!

Eduardo Xavier
źródło
1

To trudne pytanie. Tak, myślę, że każdy programista powinien posiadać podstawową wiedzę na temat TCP / IP i sposobu organizacji sieci opartych na tym protokole. Prowadzi to jednak do pytania, jak obszerna jest podstawowa wiedza.

Myślę, że nie mając do czynienia z żadnym konkretnym problemem (a zatem potrzebującym wiedzieć, jak rzeczy są naprawdę zorganizowane „tam”), programista powinien wiedzieć, co to jest pakiet i w jaki sposób pakiety są dystrybuowane przez sieć (w tym wiedzieć, jakie typy komputerów to pakiet wchodzi w kontakt). Myślę jednak, że wystarczy wiedzieć, że router dystrybuuje pakiety do wszystkich odbiorników i że przełącznik dostarcza pakiety do niektórych odbiorników. Nie wymagałbym też devlopera wszystkich tych podsieci - na pewno nie znam wszystkich szczegółów ;-) Powinienem wiedzieć, że podsieci mogą być izolowane, a pakiety muszą być kierowane z sieci A do sieci B, ale wszystkie szczegóły są zbyt wiele dla typowego programisty.

Myślę, że to trochę jak prowadzenie samochodu: powinieneś wiedzieć, dlaczego potrzebujesz silnika i dlaczego potrzebujesz paliwa, ale jako przeciętny kierowca nie musisz wiedzieć, jak obliczyć idealną mieszankę paliwa i powietrza dla procesu spalania.

perdian
źródło
0

Niewiele rzeczy jest bardziej frustrujących niż ludzie, którzy nie rozumieją, co się wokół nich dzieje. Prowadzi to do ciągłego zadawania tych samych pytań (oczywiście w nieco innej formie).

Kiedy zaczynasz powtarzać pytania, nadszedł czas, aby zajrzeć do książek. Ostatnie przykłady pytań, które otrzymałem:

  • „Jak skonfigurować sieć, jeśli xyz?” ...
  • „Jak skonfigurować sieć, jeśli abc?” ...
  • Powtarzać...

W rzeczywistości otrzymałem tyle powtarzających się pytań od ludzi, którym łatwiej było zadawać pytania niż uczyć się, zacząłem je śledzić i tworzyć slajdy Powerpoint. Teraz co około sześć miesięcy prowadzę zajęcia praktyczne. Ludzie mogą wtedy odwoływać się do slajdów, które stworzyłem. Później, kiedy pytają o coś, co omawialiśmy na zajęciach, delikatnie odnoszę się do tego i zwykle przypominają sobie, że to omówiliśmy i ponownie czytamy slajdy dla siebie. Ci, którzy to robią, lepiej uczą się przedmiotu i uważają go za cenny. To zrobiło niezwykłą różnicę w postaci mniejszej ilości przerw w moim dniu pracy.

Jeszcze jedna myśl: w prawdziwym świecie prawdziwe systemy mają tak wiele dziwactw i problemów, że niewiarygodne jest nie wiedzieć więcej niż tylko wiedza na temat konkretnej dziedziny. Każdy pomysł, jak działają podstawowe zasady, może ci tylko pomóc.

Teraz, jeśli naprawdę nie jest to, co powinieneś wiedzieć, to dobrze, nie martw się o to. Ale jeśli często zadajesz to pytanie, naucz się go. Nie pożałujesz.

Brawo za zadanie pytania. Nigdy nie przestawaj się uczyć.

kmort
źródło