Temat: 2 lata doświadczenia - ale skąd je wziąc?
Ostatnie zdanie w poście Dawida jest kwintesencją rzeczywistości :) Rozwiązuje się "rzeczywiste problemy w rozsądnym biznesowo" ("ASAPem" :]) czasie, w średnich technologiach (!), ze średnią wydajnością projektowanych rozwiązań.
Najlepiej chyba nie kombinować zbytnio, tylko na studiach uczyć się myślenia algorytmicznego (i mieć wrednego laboranta, który zmusi do tego), a na projekty zaliczeniowe z języków wysokiego poziomu wyszukiwać sobie zagadnienia rozproszone (sieciowe), z wielodostępem do serwisu i bazy i obowiązkowo - uprawieniami (tu można np. się wprawiać w programowaniu aspektowym). No i pisać OOP (wzorce!), dokumentując system UMLem, a nie "proceduralnie z klasami". Uczyć się także podejścia "klockowego". Często podejście typu "napisz klasy, a generowanie bazy zostaw frameworkowi ORM i nawet tam nie zaglądaj, zapomnij, że piszesz jakiekolwiek DDLe!" jest nie tylko wystarczające, ale i pożądane. Niestety, ze studiów często wynosi się paskudny zwyczaj myślenia, że ERD jest częścią OOP...
Możesz szukać pracy w małych firmach informatycznych, zaliczając potem produkt, który robisz, na studiach. Ja tak robiłem i wszyscy byli zadowoleni, tzn. ja i laborant, któremu mogłem coś ciekawego opowiedzieć :) Naprawdę nie wszędzie potrzeba tych 2 lat na początku. A jak nie znajdziesz jednak, to napisz kolejny (!) sklep internetowy. Albo hardkor - system rejestracji na zasoby, np. przewóz (samoloty, pkp). Zamodeluj to najpierw, a potem spróbuj napisać w MVC z użycie ORMa. To już da Ci wiele frajdy i roboty, o ile nie podejdziesz do tego "eee, to na razie za skomplikowane, to oleję" (w normalnej pracy tak się nie da). Już samo postawienie serwera, bazy danych, frameworka, skonfigurowanie uprawnień... A potem, podczas rozmowy kwalifikacyjnej - masz przynajmniej jakieś "portfolio".
Do świata algorytmiki wchodzi się w takich przypadkach raczej rzadko (o ile nie są to specjalistyczne zagadnienia numeryczne), a częściej trzeba sobie radzić np. z architekturą rozproszoną (kolejki komunikacji), wielodostępem z lockowaniem optymistycznym, zagadnieniami DDD (kompletnie inny świat, dla wprawnych w OOP), modularności i elastyczności rozwiązania (czyli dobra znajomość OOP). I to nieraz z dużą i świadomą rezygnacją z wydajności i szybkości, bo np. nie jest czynnikiem krytycznym w relacji do elastyczności. I to też wymaga cholernego myślenia i kreatywności. To nie znaczy, że jak ktoś nie siedzi godzinami nad grzebaniem w tablicach i indeksach, to nie jest "true". Choć tak się straszy studentów. Jest w tym trochę racji, bo być "algorytmicznym kretynem" to jednak ujma, która w dodatku w końcu się odbije czkawką, nawet składaczowi klocków. Nigdy nie wiesz, kiedy trzeba będzie jednak coś zoptymalizować w sposób bardziej wyrafinowany. Może położyć Cię głupi raport w SQL z "mocno relacyjnej" bazy danych, gdzie jeszcze między SELECT a FROM będzie sporo kodu... Nie będzie to co prawda "problem komiwojażera", ale spędzisz nad tym niejedną godzinę.
Jeśli umie się myśleć wzorcami, to brak klasycznych umiejętności algorytmicznych (to wbrew pozorom nie to samo :) ) staje się mniej dotkliwy. Zawsze można poświęcić trochę czasu za zaimplementowanie w krytycznych miejscach wzorca strategii i - zgodnie z regułą YAGNI - na
chwilę obecną (tzn. dla bieżących zestawów danych, gdy np. są to jeszcze tysiące, a nie miliony rekordów) zaprogramować mało wyrafinowane, mało wydajne, ale działające zadowalająco rozwiązanie i wydać wersję (a zatem - zarabiać). Potem w razie potrzeby rozbudowuje się podpinając wydajniejszy algorytm, a nie ruszając poprzedniego. I tego warto się uczyć na studiach, mając czas, bo potem umie się szybciej rozwiązywać rzeczywiste problemy. Potem zawsze znajdziesz kogoś, kto Ci napisze dobry algorytm albo kupisz bibliotekę, a jak system nie będzie elastyczny, to nawet jej nie podepniesz bez rozwalenia jego połowy.
Reasumując - wszystko zależy od tego, z czym się zamierza związać w przyszłości. Jak blisko sprzętu i "cyferek", bo ma się zacięcie researchera, bądź chce się brać udział w tworzeniu wysokowydajnych, używanych potem przez miliony silników (renderujących, obliczeniowych, etc.), to zadania z algorytmiki na wysokim poziomie, ćwiczące nieustannie intuicję i mózg - a już niekoniecznie znajomość nowych technologii, bibliotek, wzorców. I wtedy może spróbuj siły w grach? Może w systemach data mining - rozpoznanie mowy, twarzy, optymalizacja pracy świateł na skrzyżowaniach, wykrywanie stresu po głosie albo mimice twarzy... Pewnie są takie firmy :) A nawet jak nie, to będziesz mieć kupę zabawy. A może uczelnia ma jakieś granty w tym kierunku?
Jak kogoś pociągają systemy klasy ERP, modelowanie zagadnień biznesowych (czyli "piekło codzienności"), to umiejętność błyskawicznego dopasowania narzędzi do potrzeb i stosowania sprawdzonych rozwiązań na zasadzie klocków, analityczny umysł i wgryzanie się w konkretną branżę. Obecnie można powoli zapomnieć, że będzie się już tylko "koderem", coraz częściej trzeba też znać się coś na branży, w której się programuje (chyba, że komuś wystarcza taka a nie inna pensja) - a na to trzeba mieć i
czas i pojemną głowę. To zdobędziesz w dowolnej korporacji IT.
Adrian Olszewski edytował(a) ten post dnia 20.05.11 o godzinie 16:28