Jeśli jesteś programistą, nie uważaj się za „informatyka”; informatycy tworzą te następną generację komputerów, z których niektóre wciąż są science fiction, dopóki nie powstanie właściwa mieszanka materiałów, miniatura i teoria obliczeń. To tylko początek rurociągu. Ludzie, którzy tworzą oprogramowanie tu i teraz, są „inżynierami oprogramowania”; biorą teorie i narzędzia, czasami nakładając na siebie praktyczną teorię i narzędzia w świecie rzeczywistym, aby wykorzystać moc w potencjale tego złożonego elementu elektroinicznego czarownictwa i sprawić, że robi to, co chcemy. To z kolei jedna specjalizacja w dziedzinie „inżynierii komputerowej”, która bierze teorie informatyków i stosuje je, sprzęt i oprogramowanie, do rzeczywistych rozwiązań elektronicznych użytkowników końcowych.
W IMO biznes spotyka się z teorią. W tego typu przypadkach stare powiedzenie „wróg lepszy jest wystarczająco dobry” można łatwo odwrócić, aby przeczytać „wróg wystarczająco dobry jest lepszy”. Uznanie siebie za „inżyniera” zamiast „naukowca” i zestawienie tego, co robisz z innymi dyscyplinami inżynierii, przynosi ulgę.
Powiedzmy, że klient przychodzi do ciebie, inżynier budowlany / inżynier, i prosi cię o zbudowanie mostu. Most musi rozciągać się na 20 stóp, sam się utrzymać i jedną tonę ładunku, powinien on trwać 10 lat przy rutynowej konserwacji i chcą go za miesiąc za 20 000 USD. To są twoje ograniczenia; spełniają minimalne wartości, nie przekraczając maksymalnych. Takie postępowanie jest „wystarczająco dobre” i zapewnia wypłatę. Zbudowanie mostu Golden Gate byłoby kiepską inżynierią, znacznie przekraczającą specyfikację projektu i budżet o kilka rzędów wielkości. Zwykle zjadasz przekroczenie kosztów i płacisz kary za przekroczenie czasu. Niewłaściwe byłoby też zbudowanie mostu linowego o masie 5 dorosłych mężczyzn, mimo że kosztował czas i materiały tylko 1000 USD; nie dostajesz dobrych opinii klientów i referencji,
Wracając do oprogramowania, powiedzmy, że masz klienta, który potrzebuje systemu przetwarzania plików zbudowanego do trawienia przychodzących plików i umieszczania informacji w systemie. Chcą, aby zrobiono to w ciągu tygodnia i musi obsłużyć pięć plików dziennie, około 10 MB danych, ponieważ to cały ruch, jaki obecnie otrzymują. Wasze cenne teorie w dużej mierze wychodzą z okna; Twoim zadaniem jest zbudowanie produktu, który będzie spełniał te specyfikacje w ciągu tygodnia, ponieważ robiąc to, dotrzymasz również budżetu kosztowego klienta (ponieważ materiały są na ogół kroplą w koszyku na umowę o oprogramowanie tego rozmiaru). Spędzenie dwóch tygodni, nawet dziesięciokrotnie więcej, nie jest opcją, ale najprawdopodobniej nie jest też programem zbudowanym w ciągu dnia, który może obsłużyć tylko połowę przepustowości, z instrukcją uruchomienia dwóch kopii.
Jeśli uważasz, że to przypadek marginesowy, to się mylisz; jest to codzienne środowisko większości mieszkańców. Powodem jest ROI; ten początkowy program nie kosztuje dużo i dlatego bardzo szybko się zwróci. KIEDY użytkownicy końcowi potrzebują tego, aby zrobić więcej lub przyspieszyć, kod może zostać refaktoryzowany i skalowany.
To główny powód obecnego stanu programowania; założeniem, potwierdzonym przez całą historię komputerów, jest to, że program NIGDY nie jest statyczny. Zawsze będzie wymagało uaktualnienia i ostatecznie zostanie zastąpione. Równolegle ciągłe doskonalenie komputerów, na których działają oba programy, pozwala na zmniejszenie uwagi na wydajność teoretyczną oraz zwiększenie uwagi na skalowalność i równoległość (algorytm działający w czasie N-kwadratowym, ale który można zrównoleglać, aby działał na rdzeniach N wydają się liniowe, a często koszt większej ilości sprzętu jest tańszy niż w przypadku deweloperów w celu opracowania bardziej wydajnego rozwiązania).
Ponadto istnieje bardzo prosta zasada, że każda linia kodu programisty jest czymś innym, co może pójść nie tak. Im mniej programista pisze, tym mniej prawdopodobne jest, że to, co pisze, ma problem. To nie jest krytyka czyichś „błędów”; to proste stwierdzenie faktu. Być może wiesz, jak napisać MergeSort do tyłu i do przodu w 5 językach, ale jeśli wybierzesz tylko jeden identyfikator w jednym wierszu kodu, całe Sortowanie nie będzie działać, a jeśli kompilator go nie złapie, może to zająć godziny debugowania. Porównaj to z List.Sort (); jest tam, jest skuteczny w ogólnym przypadku, a najlepsze jest to, że już działa.
W związku z tym zbudowano wiele funkcji współczesnych platform oraz założenia nowoczesnych metod projektowania:
- OOP - wbuduj powiązane dane i logikę w obiekt i wszędzie tam, gdzie poprawna jest koncepcja tego obiektu, a więc obiekt lub bardziej wyspecjalizowane wyprowadzenie.
- Wstępnie zbudowane szablony - dobre 60% lub więcej kodu to cruft składniowy i podstawy, aby program pokazywał coś na ekranie. Standaryzując i automatycznie generując ten kod, zmniejszasz obciążenie programisty o połowę, co pozwala na zwiększenie wydajności.
- Biblioteki algorytmów i struktur danych - tak jak powyżej, możesz wiedzieć, jak napisać stos, kolejkę, QuickSort itp., Ale dlaczego musisz, skoro istnieje biblioteka kodów, która ma to wszystko wbudowane? Nie przepisałbyś IIS ani Apache, ponieważ potrzebowałeś strony internetowej, więc po co implementować algorytm QuickSort lub czerwono-czarny obiekt drzewa, gdy dostępnych jest kilka świetnych implementacji?
- Płynne interfejsy - wzdłuż tych samych linii może znajdować się algorytm filtrujący i sortujący rekordy. Jest szybki, ale prawdopodobnie nie jest zbyt czytelny; zajęłoby to Twojemu młodszemu programistowi dzień, aby to zrozumieć, nie mówiąc już o dokonaniu chirurgicznej zmiany potrzebnej do sortowania na dodatkowym polu w obiekcie rekordu. Zamiast tego biblioteki takie jak Linq zastępują wiele bardzo brzydkich, często łamliwych kodów, jednym lub dwoma wierszami konfigurowalnych wywołań metod, aby zamienić listę obiektów w przefiltrowane, posortowane, rzutowane obiekty.