Czy wszystkie problemy z programowaniem mają problemy z algorytmem? [Zamknięte]

13

Podoba mi się, jak „Wprowadzenie do algorytmów” Cormena i in. przekazuje wiedzę. Jednym z powodów jest to, że wszystko ma związek z problemami programistycznymi, a książka nie jest zaimplementowana w żadnym konkretnym języku programowania. Ta niezależność językowa zapewnia ogólne skupienie się na pomysłach.

Więc moje pytanie brzmi, jak mówi tytuł. Czy każdy możliwy do rozwiązania problem programistyczny można rozwiązać, myśląc w ten algorytmiczny sposób? Bez względu na język, dziedzinę itp.? Jeśli tak, proszę podać argumenty, w przeciwnym razie podać argumenty!

Nie wdrożyłem wielu złożonych programów z graficznym interfejsem użytkownika, AI, grafiką itp. Ale czy tego rodzaju problemy są również kwestią wymyślenia dobrych algorytmów?

Wittgenstein
źródło
6
Najczęstszym problemem dla programisty, imho, jest: „och, to właśnie miałeś na myśli? Teraz rozumiem. Nie jest to jednak to, co zaimplementowałem, przepraszam”. Czy to problem z programowaniem?
keppla
1
To pytanie jest bardzo podobne.
back2dos,
Musisz zrobić raport z klientem, opisać jego wymagania i na tej podstawie musisz zaprojektować, przetestować, wdrożyć, przefakturować, zoptymalizować i utrzymywać oprogramowanie. Potrzebujesz środowisk do testowania, opracowywania, wdrażania, uruchamiania i mierzenia oprogramowania. W tym systemie indywidualny algorytm jest tylko szczegółem implementacji.
inf3rno
@Keppla (plus jeden) ope, jest to problem z wymaganiami, podstawowa przyczyna wszystkich nieszczęść oprogramowania
Mawg mówi przywrócić Monikę

Odpowiedzi:

29

To zależy od tego, jak zdefiniujesz „Problem z programowaniem”.

W rzeczywistych projektach odpowiedź jest zdecydowanie NIE. Większość problemów to nawet nie problemy techniczne, ale problemy z komunikacją, niejasne wymagania itp.

Następnie masz całe przedmioty klas problemów, które nie wymagają prawie żadnych algorytmów. Na przykład GUI są często łatwe do „programowania”, ale faktycznym problemem jest dobry projekt (z punktu widzenia użyteczności, nie tylko wyglądu).

Istnieją jednak pola, w których problemy są z natury bardziej algorytmiczne. Na przykład AI jest głównym przedmiotem, w którym algorytmy są rdzeniem. Grafika może wymagać intensywnego algorytmu, ale zależy to od tego, co dokładnie oznacza „Programowanie grafiki”.

Ogólnie, jeśli problem, który rozwiązujesz programowo, jest odpowiedni dla reprezentacji matematycznej, to wchodzisz w obszar algorytmu. Oczywiście jest to tylko przybliżony wskaźnik, ponieważ możesz tworzyć modele matematyczne dla prawie wszystkiego. Ale w przypadku większości rzeczy zwykle nie rozważałbyś tego.

Ostatni przykład: jeśli problemem jest utworzenie interfejsu GUI, który umożliwia wprowadzanie danych dla obiektów biznesowych, nie zastanawiałbyś się zbyt wiele nad sformułowaniami matematycznymi. Jeśli jednak problemem jest utworzenie GUI, który dynamicznie się zmienia i przenosi elementy na podstawie pewnej wartości ważności, istnieje większe prawdopodobieństwo, że skończy się na modelu matematycznym i implementacji algorytmicznej.

Szczery
źródło
2
Najwyraźniej zależy to również od tego, jak zdefiniujesz „Algorytm”. Powiedziałbym, że bardzo niewiele problemów wymaga nowych algorytmów, ale ponieważ program komputerowy ma tylko dwie części - algorytmy i struktury danych - wszystkie problemy wymagają pewnych algorytmów, nawet jeśli algorytmy te są trywialne. Algorytm nie jest modelem matematycznym, to sekwencja instrukcji.
philosodad
To prawda w najściślejszym tego słowa znaczeniu, ale ja, na przykład, nie akceptuję i++jako naszego nowego pana… algorytmu… eerm….
Frank
Ale co, jeśli nie wiemy o dodaniu. Wtedy wprowadzenie dodatku byłoby wielką innowacją w naszych badaniach algorytmów! I tak dalej, aż napotkamy coraz bardziej złożone algorytmy.
CMCDragonkai
8

Co rozumiesz przez programowanie problemu?

Według Wikipedii:

Programowanie komputerowe (często skracane do programowania lub kodowania) to proces projektowania, pisania, testowania, debugowania i utrzymywania kodu źródłowego programów komputerowych.

co oznacza, że ​​programowanie jest z natury większe niż tłumaczenie algorytmów przez kod.

Aby dać przykład, problem programistyczny, który mam teraz, polega na tym, że muszę poradzić sobie ze starszym kodem źródłowym spaghetti, dodając testy jednostkowe, a następnie refaktoryzując je . Polega także na dodawaniu komentarzy w odpowiednich miejscach, znormalizowaniu wielkich liter w nazwach itp. Nie ma nic wspólnego z algorytmami.

W ten sam sposób wiele zadań programistów nie ma związku z algorytmami. Przykład: internacjonalizacja. W ten sam sposób wiele aplikacji (na przykład CRUD) nie używa algorytmów zbyt często w kodzie źródłowym (nie mówiąc o podstawowym kodzie frameworka).

Teraz, jeśli zakładasz, że w „problemie programistycznym”, „programowanie” jest synonimem tłumaczenia algorytmów przez kod, to tak, logicznie każdy problem byłby problemem algorytmicznym: A × n = B × njeśli A = B.

Arseni Mourzenko
źródło
Istnieje różnica między zadaniem a problemem . Problem nie polega na dodawaniu testów jednostkowych ani utrzymywaniu starszego kodu, jest to rozwiązanie problemu znajdującego się w podstawie kodu, a nie samego zachowania programu, które kod reprezentuje za pomocą algorytmów.
zxcdw
Twoje zadanie, zgodnie z opisem, nie zmienia zachowania programu. Przypuszczalnie jest to praca przygotowawcza do pewnych innych zmian, które mogą, ale nie muszą obejmować algorytmów. Nie sądzę, aby ktokolwiek nigdzie płacił tylko za refaktoryzację działającego kodu przez cały dzień.
MarkJ
6

Myślę, że odpowiedź jest zdecydowanie nie . Algorytmy to tylko elementy składowe o wiele większego zestawu umiejętności.

Mam dyplom z CS, specjalizujący się w AI

Tam podstawowym problemem, przynajmniej tak, jak to widziałem, było znalezienie dobrych reprezentacji dla informacji. Reprezentacje te powinny próbować dobrze pasować do struktur wiedzy znajdujących się w głowach ludzi i powinny ułatwiać dokonywane na nich manipulacje i zmiany.

Jeśli chodzi o codzienne programowanie, oznacza to, że podstawowym problemem jest określenie właściwego języka specyficznego dla domeny (DSL) dla danej sytuacji. Istnieje wiele sposobów tworzenia list DSL. Zwykłe programowanie, w którym definiowane są klasy, zmienne i metody, w rzeczywistości tworzy DSL, ponieważ pozwala ci mówić rzeczy (mapować struktury mentalne na kod), których nie można by powiedzieć bez nich.

Algorytmy są również ważne, ale są tylko częścią historii.

Mike Dunlavey
źródło
5

Przypuszczam, że można powiedzieć, że wszystkie programy komputerowe są algorytmami, ponieważ przepisuje się sekwencję instrukcji, aby osiągnąć pożądany rezultat. Jednak niektóre z najtrudniejszych problemów nie polegają na komunikowaniu programu na komputerze, lecz na przekazywaniu programu ludziom, którzy będą testować i modyfikować oprogramowanie.

Innymi słowy, komputery nie dbają o to, czy Twój kod jest całkowicie niezrozumiały dla ludzi. Tak czy inaczej, będą dobrze działać. Wyzwanie polega na tym, aby kod był wystarczająco jasny, aby wszelkie błędy wyróżniały się jak obolały kciuk.

Co ciekawe, techniczne rzeczy, których nauczyłem się na studiach na temat algorytmów, od dawna przyćmiewają tego, czego nauczyłem się od tamtego czasu. W tym momencie, jeśli chciałbym uzyskać stopień naukowy trzeciego stopnia, który pomógłby mi w mojej pracy, byłby to kompozycja angielska.

Karl Bielefeldt
źródło
2

Większość problemów programistycznych to w rzeczywistości problemy administracyjne z systemem.

To trochę nieporadna odpowiedź, ale stwierdziłem, że jest to prawda częściej, niż można by się spodziewać. Nie wiem, ile razy napotkałem awarie, ponieważ DNS był źle skonfigurowany na maszynie testowej, nadal działa przestarzały proces, który blokuje procesor / pamięć / porty, program działa z niewłaściwym identyfikatorem użytkownika, a zatem ma niewłaściwy uprawnienia, dysk został niepoprawnie podzielony na partycje i zabrakło miejsca, zainstalowano niewłaściwą wersję pliku konfiguracyjnego itp.

Prawidłowe działanie algorytmów to zwykle tylko niewielka część problemu. Resztą problemu jest uruchomienie programu do rozwiązywania rzeczywistych problemów w prawdziwym świecie.

Znaki Stuarta
źródło
„Poprawne działanie algorytmów to zwykle tylko niewielka część problemu”. Problemy na kaggle.com NIE pasują do tego opisu.
Gandalf
Zgadzam się, po prostu umieściłem je w kategorii „hydraulika”. Praca z innymi programistycznymi usługami, API i czasami frameworkami to po prostu połączenie rzeczy, tak jak ktoś inny uważał, że powinny działać.
JeffO
2

Sądzę, że tak, wszystkie problemy programistyczne można rozwiązać przez algorytmiczne myślenie. W końcu algorytm to tylko zestaw instrukcji, które mówią komputerowi, co ma robić.

Biorąc niektóre z powyższych przykładów

Na przykład GUI są często łatwe do „programowania”, ale faktycznym problemem jest dobry projekt (z punktu widzenia użyteczności, nie tylko wyglądu).

Jeśli chodzi o programowanie, a nawet projektowanie, które znają wzorce / reguły, które prowadzą do skutecznych projektów GUI, które są przyjazne dla użytkownika i wydajne. Reguły te można zredukować do algorytmu, którego przestrzeganie powinno pomóc w tworzeniu przyjaznego dla użytkownika interfejsu graficznego. W rzeczywistości faktyczne kroki umieszczania elementów sterujących w interfejsie GUI można również zredukować do algorytmu

Aby dać przykład, problem programistyczny, który mam teraz, polega na tym, że muszę poradzić sobie ze starszym kodem źródłowym spaghetti, dodając testy jednostkowe, a następnie refaktoryzując je. Polega także na dodawaniu komentarzy w odpowiednich miejscach, znormalizowaniu wielkich liter w nazwach itp. Nie ma nic wspólnego z algorytmami.

Ale sposób podejścia do dodawania testów jednostkowych można opisać algorytmem takim jak

  1. Zidentyfikuj nowy test jednostkowy
  2. Napisz test jednostkowy
  3. Zastosuj algorytm normalizacji wielkich liter
  4. Zastosuj algorytm komentarzy

Przykład: internacjonalizacja To doskonały przykład rozwiązania algorytmicznego. Najprościej jest wyszukać znane słowo w słowniku i zastąpić je inną formą językową. (Oczywiście rzeczywiste życie obejmuje zdania i kontekst, a algorytm może obejmować kroki w celu weryfikacji z native speakerem, ale podstawy są prawdziwe)

Problem z większością odpowiedzi Tak jest taki, że ludzie myślą o algorytmach w kategoriach QuickSort, Sortowanie bąbelkowe zamiast zestawu instrukcji, które redukują pełny, niejasny opis problemu do zestawu jasno zdefiniowanych logiki / reguł.

Armitage
źródło