Gorzej Programowanie mogłoby być gorsze? Programowanie wciąż przechodzi swoją ewolucję. Narzędzia, języki, biblioteki nie są idealne. Mimo to warto być wdzięcznym za to, co mamy. Łatwo narzekać na obecne czasy, gdy człowiek nie jest świadomy tego, jak programowanie wyglądało kiedyś. 

Każdy miał swoje najgorsze doświadczenia. Każdy ma swój najgorszy język programowania? Warto jednak się zastanowić i rozszerzyć swoją perspektywę.

Co to znaczy najgorsze doświadczenie? Co to znaczy najgorszy język programowania?

Kto pamięta ASP.NET Web Forms. Framework oparty na opuszczaniu kontroli i uczeniu się cyklu zdarzeń aplikacji. Co można zrobić w zdarzeniu Page_Load, a co w Page_Init? Programowałem w ASP.NET WEB FORMS dwa lata i osiem miesięcy i cieszę się, że nie muszę już do tego wracać. Nie mówmy nawet o frameworku ASP.NET AJAX jako alternatywie do JavaScriptu sprzed ery jQuery.

Mamy w końcu rok 2017? ASP.NET MVC stał się standardem, istnieje już tak długo, że rzeczywiście można go spotkać w firmach. Programowanie wciąż się zmienia w ASP.NET i widać postępy. Nie jest ono idealne, ale idzie do przodu.

Programowanie wciąż mogłoby być gorsze? Gdzie więc są te najgorsze doświadczenia? Najgorsze języki programistyczne? Niektórym do głowy przychodzi język programowania Java. Zwłaszcza gdy jest on wciąż porównywany z C#? Java jest  w porządku językiem. Moje przygody z Androidem ostatecznie nie były tak traumatyczne, jak patrzę na to przez pryzmat swoich wszystkich doświadczeń. Poza tym ten kto zna historię ten wie, że dzięki temu, że Java stała się tak popularna powstał język C#. Microsoft stworzył język J#, który był wersją ich Javy. Prawa autorskie firmy SUN jednak wymusiły na Microsofcie stworzenie nowego oddzielnego języka programowania.  

Mówiąc o najgorszych językach programowania, to kiedyś do  głowy przychodził mi język PHP.  Mnóstwo funkcji, dziwne nazewnictwa. Dziwna obiektowość wnikająca z tego, że PHP nie w każdej wersji było obiektowe. Legion bibliotek i frameworków sprawiających wrażenie, że nigdy nie korzystasz z gołego PHP i zawsze trzeba poznawać go na nowo. Mój nastrój emocjonalny do PHP sprawił, że ten blog nie jest stworzony na WordPress-ie tylko napisany w C#. 

Moja jednak osobista opinia jest przestarzała. Oparta na moim dwutygodniowym doświadczeniu z 2010 roku.  Nie mam pojęcia jak wygląda język PHP teraz i patrząc na swoich kumpli, którzy wybrali tę ścieżkę, to widzę w tym trochę sensu. W końcu znając PHP możesz zostać królem systemów CMS i różnych silników blogowych.

PHP to nie moje podwórko, ale legendy głoszą, że ci programiści ewoluują do programistów Ruby albo Pythona. Czas płynie i wszystko się zmienia, jednak PHP nie jest tym najgorszym językiem programowania. PHP nie jest tym dnem.

A JavaScript? JavaScript to był osobisty koszmar dla mnie. W CV deklarowałem się jako .NET WebDeveloper a JavaScript był skrywany dla mnie żelazną tajemnicą. Nienawiść do języka JavaScript wynika z tego, że musisz go znać, nieważne czego uczyłeś się wcześniej. JavaScript jest wszędzie i – co więcej – obsesja na puncie tego języka nie maleje.  

Liczba bibliotek w JavaScript nie maleje. Co pół roku ktoś deklaruje nowy pomysł na zarządzanie tym JavaScriptem do tego stopnia, że sam obecnie nie mam pojęcia co się dzieje w świecie WebDev. Nie da się za tym nadążyć. Angular jeden i dwa, a zaraz cztery. ReactJS? Nowy standard EcmaScript? Jakiś nowy system paczek? Jak programować w JavaScript w roku 2017 oto jest pytanie?

Twoje poprzednie doświadczenia z innym językiem w ogóle się nie przekładają na to, co spotkasz w JavaScript. Twoje doświadczenia z Javą i C# mogą cię wywieść w pole w JavaScripcie. Istnieje tyle pułapek w tym języku, że można stworzyć na ten temat serię oddzielnych wpisów.

Czy JavaScript jest tym najgorszym doświadczeniem? Nie! Programowanie wciąż może być gorsze.

A CSS? Zaraz CSS nie jest językiem programowania? Mimo to też obrywa, w końcu jego użycie wydaje się takie proste, ale ostatecznie to on decyduje o wyglądzie strony. Taka skomplikowana logika oparta na niezbyt użytecznych zasadach. Nie mówiąc o ciągłym śledzeniu co w danej przeglądarce działa albo nie działa. Safari teraz to nowe IE i zawsze jest do tyłu. Wygląd strony internetowej jest niestety ważniejszy niż to, co się dzieje w głębi. Nikogo nie interesuje ziemia, tylko kwiat. SASS i LESS jako tako starają się ogarnąć ten bałagan, ale warto sobie zadać pytanie, czy będzie jakaś wartość dodana z tego, że proces tworzenia styli dostanie swój poziom abstrakcji i kompilacji.

CSS nie jest taki straszny. Pamiętaj jednak aby nie tworzyć stylów pod id elementów HTML. Programowanie wciąż może być gorsze.

Objective-C? Co prawda teraz na iPhone można programować w języku Swift, ale miałem okazję programować w tym języku.

NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
// or @"yyyy-MM-dd hh:mm:ss a" if you prefer the time with AM/PM 
NSLog(@"%@",[dateFormatter stringFromDate:[NSDate date]]);

Moje skojarzenia z Objective-C są proste. Wskaźniki, o których trzeba pamiętać. W tym języku nie ma NullPointerException . Jeśli czegoś nie ma, to się po prostu to nie wykona. 

Dużo nawiasów kwadratowych. Spójrz na ten fragment kodu. Cokolwiek byś nie zrobił coś musi być zwarte w nawiasach kwadratowych. Język wydaje się wyjątkowo nieczytelny. Wynika to z tego, że jego składnia nie opiera się na znanych językach jak C++, Java czy Pascal. Tylko opiera się on na języku Smalltalk.

Swoją drogą język SmallTalk wygląda tak.

|myArray|

myArray := #('a' 'b' 'c' ).
myArray do:[:each |
    Transcript show: each.
    Transcript cr.
].

Objective-C nie jest jednak najgorszym doświadczeniem programistycznym? Po trzech miesiącach przywykłem do składni i stwierdziłem, że jest to sympatyczny język. Jeśli chodzi o programowanie na telefony IPhone, to większy problem miałem ze środowiskiem XCODE i zrozumieniem jak StoryBoard działa. Więcej czasu spędziłem na elementach graficznych w XCODE niż na pisaniu kodu Objective-C? Sam język nie jest więc wisienką mojej tortury, jeśli chodzi o aplikacje na telefony IPhone.  

VBScript/Visual Basic 6. Dla Dinozaurów programowanie VBScript to dobry język. Mimo to nie będę ukrywał, dostaję gęsiej skórki na widok słowa “Dim”.

'Method 1 : Using Dim
Dim arr1()    'Without Size

'Method 2 : Mentioning the Size
Dim arr2(5)  'Declared with size of 5

'Method 3 : using 'Array' Parameter
Dim arr3
arr3 = Array("apple","Orange","Grapes")

VBScript jest wciąż używany w arkuszach Excel. Pisze się w nim makra. Przyznam, jednak gdy ktoś prosił mnie o pomoc, to odmówiłem i śmiało powiedziałem, że C# nie ma nic wspólnego z VBScript. Jesteśmy blisko koszmarnych doświadczeń z piekła rodem, ale to nie to.

Pamiętasz pliki bat w systemie Windows. Pisanie plików bat dla systemu DOS moim zdaniem jest jednym trudniejszych wyzwań w świecie programowania. Jak na ironię w gimnazjum było to jedno z pierwszych doświadczeń programistycznych w szkole.

Ten kod jednak trudno nazwać programowaniem. Spójrz na to i powiedz, czy wiesz co tutaj się dzieje?

@ECHO On
rem C:\WINDOWS\SMARTDRV.EXE 
C:\WINDOWS\SMARTDRV.EXE 2038 512
PROMPT $p$g
PATH C:\DOS;C:\WINDOWS;C:\LWORKS;C:\EXPLORER.4LC
SET TEMP=C:\DOS
MODE LPT1:,,P >nul
C:\DOS\SHARE.EXE /F:150 /L:1500
C:\WINDOWS\mouse.COM /Y
cd windows
WIN

Przy takim kodzie nawet PowerShell wygląda dobrze. Czy to jest to? Nie.

Idziemy więc dalej.

Cold Fusion? Pamiętasz ten twór. Na studiach (2009-2010 r.) znałem jednego fana tego rozwiązania i namawiał bym porzucił ASP.NET Web Forms i spróbował swoich sił w Cold Fusion. Po instalacji programów Adobe i po 2 godzinach stwierdziłem, że coś jest nie tak w tym pomyśle i porzuciłem to.  

Cold Fusion to język programistyczny służący do generowania stron internetowych. Rozwiązanie miało swoje uroki, ale patrząc na składnię wydawało się to trochę jasne, co w nim odrzucało.

<cfscript>
    myQuery = queryNew("id,user");
    queryAddRow(myQuery);
    querySetCell(myQuery, 'id', '1');
    querySetCell(myQuery, 'user', 'Jeff');
    queryAddRow(myQuery);
    querySetCell(myQuery, 'id', '2');
    querySetCell(myQuery, 'user', 'John');
    queryAddRow(myQuery);
    querySetCell(myQuery, 'id', '3');
    querySetCell(myQuery, 'user', 'Steve');
</cfscript>

<cfloop query="myQuery">
    #myQuery.id# #myQuery.user#<br />
</cfloop>

Kod wyglądający jak tagi HTML mający w sobie logikę jak pętle. Widać, że język powstał bardziej dla grafików niż dla programistów. Ostatecznie nie dał on rady w wyścigu technologicznym i został zapomniany.

Zapewne się zastanawiasz jak nisko musimy zejść, aby naprawdę rozmawiać o najgorszych rozwiązaniach. Każdy język ma swoje wady. Przykładowo języki Oracla PL/SQL są ciężkie w debugowaniu. Nie mówiąc o tym, że nie trawię mieszania obiektowości z językiem proceduralnym wyglądającym jak PASCAL.  Jezus Maria zapomnijmy o tym, co pisałem o Javie, PHP, JavaScript, Objective-C , to jest język, którego nie rozumiem do dzisiaj.

Jest jednak coś gorszego? Musimy się cofnąć do przeszłości?

Tylko do jakiego momentu? Co powiesz na język Fortran?

      program circle
      real r, area, pi
      parameter (pi = 3.14159)
 
c This program reads a real number r and prints
c the area of a circle with radius r.
 
      write (*,*) 'Give radius r:'
      read  (*,*) r
      area = pi*r*r
      write (*,*) 'Area = ', area
 
      stop
      end

Kod wygląda jak prymitywny PASCAL. To jednak nie jest ten Fortran, który był używany w czasach zimnej wojny. To akurat jego wersja 90-95, która została dostosowana do innych języków programowania.

program  loop
implicit none     
integer  :: i
do  i=0,20
    print  *,i
end  do
end  program loop

Wyciągnijmy jakiś gorszy przykład z jego pierwszej wersji.

FORTRAN IV

Jak na język powstały w roku 1957 moim zdaniem nie jest tak źle. Zawsze wygląda to ciekawiej niż pisanie kodu w Asamblerze.

W tamtych czasach wielkość programowania odgrywała wielką rolę, więc wyrażenie GOTO było koszmarem tamtych czasów. Fortran jednak nie zasługuje na ten tytuł. Jakby się przyjrzeć Fortran wygląda jak prymitywny język PASCAL.

Co prawda w swoich starszych wersjach wyglądał jeszcze dziwniej.

Mimo tych przykładów w programowaniu wciąż może być gorzej. Przejdźmy więc do sedna. Oto 5 języków, które naprawdę łamały głowę programistom. Oto języki, przy których doświadczysz swojego koszmarnego doświadczenia w programowaniu, w tym milenium.

A oto one:

1 : COBOL

Myślałeś, że Fortran jest tym przykładem koszmarnego języka, po którym docenisz wszystko inne, to się pomyłeś. Na temat COBOL-a jest wiele dowcipów, ale nie ma co ukrywać w systemach bankowych wciąż on istnieje.

Kto wie może w roku 9999 programiści COBOL zostaną wskrzeszeni by rozwiązać problem z rokiem 5 cyfrowym w systemach bankowych. Ten język też ma w sobie pewną klątwę, im bardziej go nie rozumiesz, tym bardziej chcesz go zrozumieć, ale to zbędne. Prawdopodobnie lepiej się pouczyć asemblera.

Oto prosty kod, który deklaruje zmienne i je wyświetla.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
   01 WS-ID PIC 9(5).
   01 WS-ADDRESS. 
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(15).
   05 WS-PINCODE PIC 9(6) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   INITIALIZE WS-NAME, WS-ADDRESS.
   INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
   DISPLAY "My name is   : "WS-NAME.
   DISPLAY "My ID is     : "WS-ID.
   DISPLAY "Address      : "WS-ADDRESS.
   DISPLAY "House Number : "WS-HOUSE-NUMBER.
   DISPLAY "Country      : "WS-COUNTRY.
   DISPLAY "Pincode      : "WS-PINCODE.

STOP RUN.

Na potrzeby tego wpisu przeanalizowałem kilka języków programowania i rzeczywiście nie wygląda to ciekawie. Przez dziesięć minut próbowałem dojść, co się stanie w kodzie poniżej:

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 2.
   
PROCEDURE DIVISION.
   A-PARA.
   DISPLAY 'IN A-PARA'
   GO TO B-PARA.
   
   B-PARA.
   DISPLAY 'IN B-PARA '.
   GO TO C-PARA D-PARA DEPENDING ON WS-A.
   
   C-PARA.
   DISPLAY 'IN C-PARA '.
   
   D-PARA.
   DISPLAY 'IN D-PARA '.
   STOP RUN.

Koszmar GOTO w połączeniu z proceduralnym maszynowym stylem. Przy takim kodzie nawet PL/SQL wygląda przejrzyście. Dobrze wiedzieć, że są źródła pomocne do nauki tego języka?

https://www.tutorialspoint.com/cobol/

Pamiętaj jednak o klątwie.

2 : Forth

Forth zawdzięcza swoją nazwę pewnemu programiście, który tworzył system operacji. Pliki z kodem wtedy miały ograniczenia do pięciu znaków, stąd ta dziwna nazwa. Forth jest określony jako asemblerowy język programowania wysokiego poziomu. Co by tłumaczyło taką składnię.

: WHILE ( -- )
  POSTPONE IF
  1 CS-ROLL ; IMMEDIATE

.. BEGIN .. WHILE .. AGAIN  THEN ..
      1        2        1      2

Oferował on możliwość zmiany kodu w trakcie jego wykonywania, co jak na rok 1970 było czymś niezwykłym.

FORTH DEFINITIONS   DECIMAL
VOCABULARY PARENTHESES
PARENTHESES DEFINITIONS ALSO

\ P-stack with relative stackpointer in cell # 0
12 CELLS CONSTANT pq
CREATE P   0 ,   PQ allot
: FRESH 0 P ! ;          \ Reset p-stack
: ?P ( p# -- )           \ Check overflow and underflow
  PQ 0 WITHIN
  IF   FRESH TRUE ABORT" Syntax Error "
  THEN ;
: p> ( -- x ) P @ DUP CELL- DUP ?P P ! P + @ ;
: >P ( x -- ) P @ DUP ?P CELL+ DUP P ! P + ! ;
FORTH DEFINITIONS
: ) ( -- ) p> 2@                ( xt imm? )
  0< STATE @ AND
  IF   COMPILE, EXIT
  THEN EXECUTE ; IMMEDIATE

: KISS ( ccc -- )
  >IN @ >R ' DROP                \ Does this word exist?
  R@ >IN ! BL WORD FIND R> >IN ! \ xt imm?
  CREATE  HERE 2 CELLS ALLOT 2! IMMEDIATE
  DOES>   >P
  BL WORD COUNT EVALUATE
  POSTPONE ) ;
: DUMMY ; IMMEDIATE

Dobrze wiedzieć, że w tym języku została napisana gra  Starflight w roku 1986. Wiatr języków wysoko poziomowych z tamtych czasów na szczęście już nas nie dotyka.  Definitywnie jest to przykład tego, że nasze czasy są dla nas bardziej łaskawe.

3 : JOSS

Kolejny język, który miał służyć za pomost między asemblerem a człowiekiem.

JOSS

Sam język jednak nie przetrwał i ciężko nawet znaleźć jego przykłady. Był on użyty do komputerów APF PeCos One, rzadkich jak biały kruk.

4 : APL

Chciałbyś zobaczyć język programowania stworzony przez kosmitów dla kosmitów w latach 60, oto język APL. Kto wie, może to rozwiązuje zagadkę z Roswell w 1947 roku.

      ∇TRY1
[1]   'Type some numbers: '
[2]   NUM ← ⎕
[3]   'You have entered' (⍴NUM) 'numbers'
[4]   'The biggest was: ' (⌈/NUM)
[5]   'The smallest was: ' (⌊/NUM)
[6]   'Total is: '(+/NUM)
[7]   'Average is:' ((+/NUM)÷⍴NUM)

A tak bardziej na poważnie język ten został stworzony w celach matematycznych. Miał on manipulować tablicami wielowymiarowymi przy pomocy wyrażeń znanych matematykom.

Do programowania w tym języku została stworzona specjalna klawiatura i systemy tak, aby te “specjalne” symbole można było pisać.

APL

W rezultacie mamy kod, który nie jest czytelny dla zwykłych śmiertelników, ponieważ nie zawiera on normalnych symboli znanych nam z klawiatury.

APL kod

Następnym razem, jeśli będziesz narzekał na kod w swoim 3D MAX-ie albo w MatLabie przypomnij sobie o egzystencji tego języka.

5 : LISP

LIPS to ten język z dowcipów programistycznych na temat ilości nawiasów. Jeśli myślałeś, że Objective-C ma manię na temat nawiasów. Wiem z faktu, że jest to nie(nie(nie(prawda))).

(prog ((x '(a b c))(y '(1 2 3))(z '(p q 10)))
(format t "x = ~a y = ~a z = ~a" x y z))

Po co jest tam tyle nawiasów? A może tam być ich więcej?:

LISP

Każda operacja w tym języku wymaga nawiasów, co rodzi taki kod.

LISP in Nutshell

Teraz te kropki w Javie i C# nie wyglądają tak źle.

90% nawiasów

Dla wielu programistów Lisp jest najgorszym językiem programowania. Trzeba jednak docenić to, że jest to oficjalnie drugi język programowania, jaki powstał zaraz po Fortranie.  

Jednak nie jest tak źle w naszym świecie programowania

Po takiej analizie można dojść do wniosku, że nasze koszmarne doświadczenia w programowaniu nie mają nic wspólnego ze współczesnymi językami programowania.

Diabeł jak zawsze tkwi w szczegółach.  W ilości wyboru, braku cierpliwości oraz czasu w pędzącym świecie.

Jakiegokolwiek języka byś teraz się uczył, to wiec, że twoje koszmary nie są jeszcze tym dnem programistycznych doświadczeń.