Mosty, inżynieria oprogramowania i Bóg

Oryginalny post: Bridges, Software Engineering, and God

Autor: Jeff Atwood

Bazując na tym, ile razy spotkałem się z tym porównaniem podczas mojej kariery, mogłoby się wydawać, iż budowanie mostów oraz tworzenie oprogramowania są ze sobą w jakiś sposób powiązane:

[..] mój ojciec, który jest "prawdziwym" inżynierem, przyjechał do mnie z wizytą na parę dni. Rozmawialiśmy dziś wieczorem o istocie prawdziwej inżynierii i staraliśmy się zrozumieć czy tworzenie oprogramowania zbliża się do takiego poziomu dojrzałości, jaki osiągnęły na przykład inżynieria mechaniczna czy chemiczna. (Brad Abrams)

[..] tworzenie oprogramowania jest niedojrzałą dziedziną inżynierii, która jawi się tym, iż nie potrafimy stworzyć gotowych rozwiązań z prawdziwego zdarzenia. "Klasyczna" inżynieria, jak na przykład budowa mostów, zapór i innych struktur, opanowała technikę specyfikowania komponentów do tego stopnia, że potrafią być one opisane jedynie kilkoma parametrami. W sztuce inżynierii oprogramowania jeszcze tego nie wynaleźliśmy. (Kees Leune)

"Nasze standardy zostały nieodpowiednio obniżone poprzez nasze codzienne doświadczenia", powiedział Ken Jacobs, wiceprezes strategii produktu firmy Oracle. "Musimy doprowadzić inżynierię oprogramowania do takiego stopnia dojrzałości, jaki posiadamy w przypadku budowania mostów i budynków. Nie oczekujemy tego, że każdego dnia może runąć jakiś budynek."

Uważam takie dyskusje za maksymalnie frustrujące, ponieważ nie sądzę, iż budowanie mostów ma cokolwiek wspólnego z tworzeniem oprogramowania.* To zwodnicze porównanie. Tworzenie oprogramowania jest niczym budowa mostów, jeśli budujesz most na Jowiszu, z nowych materiałów, używając narzędzi, które nie istniały pięć lat temu.

butterfly bridge

Tradycyjne rodzaje inżynierii, typu budowa mostów, opierają się na bożych zasadach -- fizyce. Zasadach, które są niezmienne od milionów lat. "Inżynieria" oprogramowania oparta jest natomiast na tym, co zostało wymyślone na początku lat '80 przez paru kolesi, którzy uważali, że mieli dobry pomysł. Nie posiadamy luksusu pracy w dobrze znanym wszechświecie. Bóg nie wynalazł platformy x86. To czyni, iż porównanie z tradycyjną inżynierią jest co najwyżej mizerne. Więcej niż połowa rzeczy, które znam będzie nieaktualna w przeciągu dziesięciu lat; czy jakikolwiek inżynier lądowy może tak powiedzieć?

B. Jacobs, w artykule "Informatyka" to nie nauka oraz "inżynieria oprogramowania" to nie inżynieria, przedstawia, iż oprogramowanie jest bardziej jak matematyka:

Tak więc jeśli inżynieria fizyczna jest nauką stosowaną, a projektowanie oprogramowania nie podąża tym samym schematem, to czym jest projektowanie oprogramowania? Być może jest matematyką. Matematyka nie jest nieodłącznie związana ze światem fizyki. Niektórzy spornie twierdzą, iż jest inaczej, ponieważ niekoniecznie musi to być prawdą w hipotetycznym bądź prawdziwym, alternatywnym wszechświecie, który może posiadać reguły o wiele dziwniejsze, niż możemy to przewidzieć, ale z przyczyn praktycznych możemy ogólnie założyć niezależność od znanych praw fizyki, natury, biologii, itd.

Najbardziej użyteczną rzeczą w matematyce jest możliwość tworzenia niemal nieograniczonych modeli. Mogą one odzwierciedlać znane prawa natury, bądź prawa wymyślane przez matematyków. Matematyka posiada magiczną własność tworzenia alternatywnych wszechświatów wraz z alternatywną rzeczywistością. Jedyną zasadą jest to, że te modele muszą być wewnętrznie spójne: nie mogą być sprzeczne samym sobie. (Cóż, może mogą, ale zazwyczaj wtedy są mniej użyteczne, tak jak programy, które się wywalają.)

Oprogramowanie bardzo przypomina matematykę i być może oprogramowanie jest matematyką zgodnie z niektórymi definicjami. Fakt iż za pomocą oprogramowania możemy tworzyć alternatywną rzeczywistość jest wyraźny w świecie gier. Gry dostarczają rozrywki poprzez tworzenie wirtualnej rzeczywistości, która w różnym stopniu odzwierciedla prawdziwą rzeczywistość, ale również nagina ją niekiedy w interesujący sposób. Popularnym przykładem jest gra The Sims, która symuluje społeczne interakcje, a nie tylko fizykę, która jest obecna w większość gier "akcji".

Założenie iż oprogramowanie jest matematyką jest bez wątpienia bardziej wiarygodne. Ale tak jak Rory, nie jestem przekonany, iż matematyka i oprogramowanie są podobne:

Gdy dorastałem, pamiętam jak ludzie mówili: "jeśli lubisz programowanie, to z pewnością pokochasz matmę". Zawsze myślałem, że ci ludzie byli całkowicie stuknięci. O ile jest coś wewnętrznie podobnego w pewnych rodzajach matematyki i programowania, o tyle obie dziedziny różnią się w dużo większej mierze niż są do siebie podobne.

Dzięki matmie, i nie mówię tu o szalonej filozofii teorii liczb typu "Czy liczby w ogóle istnieją?", ale o praktycznych zastosowaniach, otrzymujemy konkretne odpowiedzi. Dostajesz albo poprawny wynik albo nie.

Jeśli chodzi o kodowanie, najlepsze na co możesz mieć nadzieję, to zrobić coś dobrze. Z tak wieloma możliwościami osiągnięcia tego samego efektu określenie, czy osiągnąłeś cel, zależy bardzo od wrażliwości prawej półkuli mózgowej, ponieważ nie ma nikogo (poza [kolejnym bardziej doświadczonym programistą]), kto mógłby Ci powiedzieć, czy zrobiłeś coś dobrze czy nie.

Jeśli zignorujesz swoją prawą półkulę mózgową, i mówię tu tylko ogólnie o abstrakcji i estetyce, to możesz naklepać jakiś kod, który może działać, ale piekłem może okazać się jego utrzymanie. Jeśli skupisz się tylko na prawej półkuli, możesz mieć coś, co działa, ale jest całkowicie nieefektywne i specyficzne, i jesteś jedyną osobą na Ziemii, która rozumie ten kod i potrafi go utrzymać.

W przeciwieństwie do matematyki, poprawność oprogramowania nie może być obiektywnie oraz formalnie zweryfikowana. Ani nawet jakość rozwiązania.

Tworzenie oprogramowania bez wątpienia jest profesją, ale nie sądzę, abyśmy mogli się zbyt wiele nauczyć od matematyki czy tradycyjnej inżynierii, jak to się zazwyczaj zakłada. Natomiast możemy się wiele nauczyć od siebie nawzajem. Naszym największym wyzwaniem jest rozprzestrzenianie dobrych praktyk wśród innych programistów, a nie dostosowywanie procesów z niepokrewnych branż. Polecam przejrzenie ostatniego wywiadu ze Stevem McConnell'em w celu poznania jego myśli na temat tego, jak branża tworzenia oprogramowania poszła do przodu w ciągu ostatnich 10 lat -- i jak ją ulepszać.

* Niemniej jednak, fajnie jest budować mosty za pomocą oprogramowania!

Data publikacji oryginału: 22 maja, 2005

13 komentarze:

Anonimowy pisze...

nie działa link z ostatniego wywiadu ze Stevem McConnell'em

rafek pisze...

Rzeczywiście, transkrypty nie są dostępne. Niemniej jednak nadal można wysłuchać tego wywiadu: http://itc.conversationsnetwork.org/shows/detail82.html

kotek pisze...

świetny artykuł, bardzo lubię czytać devblogi, a ostatnio coś mało było do poczytania ;-)

co do porównania programowania do budowania mostów - świat, w którym buduje się oprogramowanie ciągle się zmienia; ja sam zaczynałem od assemblera, potem uczyłem się programowania strukturalnego, jeszcze potem obiektowego; program napisany np. pod windows musi działać na jego wszystkich wersjach, a im bardziej jest on skomplikowany tym bardziej jest to niemożliwe, to tak jakby zbudować most w Kalifornii, a potem przenieść go na Syberię - nie powninien się zawalić ani tu, ani tu

Tomasz Kowalczyk pisze...

Jeff jak zwykle na poziomie - bardzo trafny artykuł, szczególnie podobało mi się porównanie: "Tworzenie oprogramowania jest niczym budowa mostów, jeśli budujesz most na Jowiszu, z nowych materiałów, używając narzędzi, które nie istniały pięć lat temu.". To powinno pokazać "niekumatym" po jak cienkim lodzie chodzą próbując napisać cokolwiek sensownego, co będzie działało i będzie przydatne.

batman pisze...

A ja będę tym, który marudzi.
Po pierwsze tematyka kuleje - programowanie można porównać ze wszystkim, a następnie stwierdzić, że jest to tak unikatowa dziedzina, że nie ma takiej drugiej na świecie, a pionierzy IT to bogowie stąpający po ziemi (litości...).
Po drugie, zauważyłem, że coraz częściej odgrzewane są kilkuletnie kotlety. Naprawdę nie ma ciwkawych bardziej współczesnych tematów?

Anonimowy pisze...

Ja uważam, że jednak trzeba mieć dobre podstawy matematyki, żeby być dobrym programistą. Nie chodzi o kochanie czy lubienie matematyki, ale o to, żeby nie reagować na nią w stylu "omg matematyka??!!", czyli po prostu trawić ją. W związku z tym uważam, że ktoś kto NIE LUBI matematyki nie jest dobrym programistą (ale z drugiej strony kogo uważamy za programistę? bo w dzisiejszych czasach nie trzeba w ogóle wiedzieć co to jest wskaźnik, zwalnianie zasobów, programowanie strukturalne - wystarczy tylko umieć wykorzystać gotowca w odpowiedni sposób, ale mniejsza o to). Co za tym idzie: jeśli matematyka Cię odrzuca i nie potrafisz zakodować prostego algorytmu/znaleźć błędów logicznych w kodzie bez użycia debuggera/ROZUMIEĆ, a nie tylko dostrzec jak coś działa no to nie jesteś dobrym programistą, a conajwyżej jesteś jednym z wielu średniaków na rynku (który ledwo co zdał matmę na studiach, albo nie poszedł na studia, no bo tam matematyką straszą).

Co do budowania mostów - zgadzam się, ale chciałbym rozszerzyć to o fakt, że ogół "tworzenie oprogramowania" oczywiście nie może zostać porównane do fizycznej budowy, ale np. stworzenie aplikacji o ograniczonej funkcjonalności może zostać porównane do budowania mostu, z tym, że nie wystarczy określić "paru" parametrów, ale raczej wiele wymagań funkcjonalnych/niefunkcjonalnych - most chyba nie ma zbyt wielu wyimaginowanych funkcji? ;)

rafek pisze...

@batman: wybór "tak starych" tematów nie jest przypadkowy. Staram się dobierać wpisy, które nadal są aktualnie i takie jeszcze długo pozostaną. Dodatkowo, inni czytelnicy mogą nie znać starszych wpisów Jeffa. Tak czy siak, dziękuję za krytykę. :)

batman pisze...

~rafek
Sprawdziłem kilka ostatnich tematów i oto moje wnioski:

Mosty, inżynieria oprogramowania i Bóg (rok 2005) - tematyka o wszystkim i o niczym. Równie dobrze można napisać tekst o zieleni drzew i też będzie aktualny.

Obycie technologiczne jest niewystarczające (rok 2004) - prawda ludowa, która pasuje do każdego zawodu, nie tylko szeroko rozumianego informatyka.

Pozłacanie (rok 2004) - tutaj masz rację. Temat w dalszym ciągu aktualny i ciekawy.

Odnoszę wrażenie, że dobierane są zbyt ogólne tematy. Ich ponadczasowość wynika głównie z racji tego, że traktują o tak szerokim pojęciu, iż można je dopasować praktycznie do każdej tematyki.

rafek pisze...

@batman: Trafne wnioski. Jeff generalnie ma tendencje do poruszania tematów ogólnych. Zastanawiałem się również nad dodaniem tłumaczeń innego bloggera.. jakieś propozycje?

batman pisze...

Nie są to blogi, ale prezentują ciekawe informacje ze świata IT:

http://techcrunch.com/
http://arstechnica.com/
http://www.zdnet.com/

Anonimowy pisze...

Civil engineering to inżynieria lądowa, a nie cywilna :)

rafek pisze...

@Anonimowy: Dzięki!

Konradzik pisze...

Nazywajmy pionierami tych 'kilku gości z lat 80', ale ja uważam, że wszystko co robimy dziś to dalej pionierka.
To się nie mieści w głowie, że istnieją firmy na świecie które rocznie wydają miliardy dolarów na tworzenie oprogramowania (zamiast postawić kilka solidnych mostów) a ciągle nie mają pewności, że produkt który tworzą będzie `na czas, na miejsce, na pewno` (wykorzystując slogan firmy kurierskiej). Wiem, że stał się postęp, powstała taka nauka jak 'inżynieria oprogramowania' i skoczył procent projektów które uważa się za udane ( w budżecie + w czasie + w specyfikacji), ale wygląda, że droga do czegoś solidnego i stabilnego jest jeszcze długa.

Prześlij komentarz

Related Posts with Thumbnails