Czy istnieje zalecany sposób komunikowania programowania naukowego / inżynieryjnego programistom języka C?

16

Mam dużo kodu MATLAB, który musi zostać przeniesiony do C (szybkość wykonania jest kluczowa dla tej pracy) w ramach procesu zaplecza dla aplikacji sieci web. Kiedy próbuję zlecić ten kod deweloperowi języka C, zakładam (popraw mnie, jeśli się mylę), że kilku programistów języka C również rozumie kod MATLAB (rzeczy takie jak indeksowanie i zarządzanie pamięcią są różne itp.). Zastanawiam się, czy są jacyś programiści C, którzy mogliby polecić mi procedurę postępowania w celu jak najlepszego komunikowania się z kodem?

Na przykład, czy powinienem podać kod MATLAB i wyjaśnić, co robi wiersz po wierszu? Lub powinienem tylko podać matematykę / algorytm, wyjaśnić go prostym językiem angielskim i pozwolić programistowi C wdrożyć go z takim zrozumieniem na swój własny sposób (np. Czy mogę założyć, że programista rozumie, jak pracować ze złożoną matematyką (tj. Wyobrażony liczby), jak wygenerować histogramy, wykonać FFT itp.)?

Czy jest lepsza metoda? Spodziewam się, że nie jestem pierwszym, który musiałby to zrobić, więc zastanawiam się, czy jakikolwiek programiści C natknęli się na tę sytuację i mogą podzielić się wszelkimi konwencjonalnymi poglądami, w jaki sposób chcieliby przenieść to zadanie?

Z góry dziękuję za wszelkie komentarze.

gkdsp
źródło
3
próbowałeś właśnie użyć MCK do konwersji kodu Matlab na c? myślę, że tomcc -c matlabfile.m
Will Tate
4
Zatrudniając programistę, określ, że musi on rozumieć zarówno kod C, jak i kod Matlab. Biorąc pod uwagę nacisk na szybkość, prawdopodobnie powinieneś używać C ++ zamiast C (z pewną ostrożnością, nigdy nie jest wolniejszy, a często szybszy).
Jerry Coffin
3
@willytate: Wymaga to posiadania kompilatora Matlab, nie generuje on szczególnie wydajnego kodu i istnieją pewne ograniczenia co do kodu, który można skompilować.
Jonas
3
Jeśli wykonujesz programowanie obiektowe w C, nie tylko pozbawiasz się możliwości, aby kompilator przeprowadził dodatkowe kontrole bezpieczeństwa typu, ale pozbawiasz kompilatora możliwości wykonania pewnych rodzajów optymalizacji, których nie można łatwo wyrazić w C. Ponadto użycie C ++ zwiększa szanse na wykorzystanie funkcjonalności z biblioteki napisanej przez kogoś mądrzejszego od ciebie.
3
Czy większość czasu spędza na właściwym algorytmie lub na majstrowaniu przy plikach, IO i analizie? Przeciętny koder C nie będzie w stanie napisać FFT i kodu matrycowego, który będzie prawie konkurował z implementacją MATLAB. Jeśli parsowanie, operacje we / wy i manipulowanie plikami to czas, w którym program spędza czas, to programista C powinien się na tym skoncentrować i napisać kod kleju, który wywołuje funkcje z bibliotek MATLAB. Jeśli wąskim gardłem jest rozkład FFT / rozkład macierzy / rozwiązywanie ODE, musisz znaleźć programistę C z dużym doświadczeniem w zakresie metod numerycznych.
Charles E. Grant,

Odpowiedzi:

15

Znajduję się w podobnej sytuacji jak Ty, ponieważ mam również ludzi, którzy przenoszą mój kod Matlab do C ++.

Wiele zależy od złożoności kodu, a także od poziomu umiejętności programisty C / C ++ i od zrozumienia, co mają zaimplementować - im lepsze i im lepiej rozumieją problem, tym bardziej niezależnie mogą pracować.

Ponieważ bezpośrednie tłumaczenie kodu Matlab na C / C ++ może nie być najskuteczniejszym sposobem radzenia sobie z problemem, sugeruję, abyś dobrze komunikował, co to jest wejście, co powinien zrobić kod i co powinien zwrócić jako wynik. Powinieneś także podać sposoby przetestowania kodu, aby upewnić się, że działa poprawnie - zarówno jako pomoc w debugowaniu, jak i jako środek kontroli jakości. Ponadto powinieneś podać i wyjaśnić kod Matlab jako przybliżoną wytyczną, w jaki sposób można osiągnąć wynik.

Powinieneś być w stanie założyć, że programista wie, jak zbudować program i jak korzystać z narzędzi do debugowania. Jednak niekoniecznie możesz założyć, że programista wie, jak posiadać określoną wiedzę, powiedzmy statystyki lub optymalizację (matematyczną). W związku z tym debugowanie tych części będzie znacznie szybsze po wprowadzeniu danych.

Może pomóc zaplanować regularne spotkania z programistą, aby „małe rzeczy”, które mogą wydawać się nieco dziwne dla programisty, ale które zasygnalizują ważne problemy, mogą zostać przekazane, zanim przerodzą się w duże problemy.

Jonas
źródło
+1 za posiadanie prawidłowych wyników testowania oprogramowania. Przenoszenie kodu z Matlaba do C / C ++ jest wystarczająco trudne, nie wiedząc, jak powinny wyglądać wyniki.
rjzii
12

Nie twierdzę, że dotyczy to ciebie, ale: Większość ludzi, którzy kodują tylko w MATLAB, pisze zły kod. Bardzo źle, ze słabym formatowaniem, strukturą i dokumentacją.

W takim przypadku jedynym łatwym sposobem na użycie kodu MATLAB jest uruchomienie go w celu weryfikacji wyników z przeniesionego kodu. Próba odtworzenia kodu MATLAB bez dodatkowej dokumentacji jest czymś, co należy podjąć tylko wtedy, gdy oryginalny autor kodu MATLAB nie żyje lub jest w śpiączce. Z drugiej strony dobrze napisany artykuł matematyczny na temat algorytmu jest zwykle o wiele bardziej pomocny niż własna implementacja doktoranta.

Aby ułatwić osobie przenoszącej Twój kod:

  1. Zmodyfikuj kod, aby upewnić się, że operacje są podzielone na różne funkcje. Styl MATLAB typu „jedna funkcja na plik” powoduje, że funkcje są zbyt długie i obejmują zbyt wiele operacji. Upewnij się również, że zduplikowany kod jest wyciągany do funkcji pomocniczych, nawet jeśli spowoduje to powstanie większej liczby plików, niż normalnie chciałbyś pracować dla projektu MATLAB.

  2. Wyjaśnij wszystkie magiczne liczby lub stałe użyte w kodzie oraz warunki, w których są one ważne.

  3. Dokumentuj struktury danych swojego kodu. Styl „wszystko jest matrycą” w MATLAB-ie jest bardzo różny od większości języków i często oznacza, że ​​struktury danych są zdefiniowane pośrednio przez sposób korzystania z macierzy. Programista AC będzie musiał dowiedzieć się, jak skonfigurować różne struktury i przydzielić niezbędne tablice, więc upewnij się, że jasne jest, jakie znaczenie i struktury wewnętrzne mają twoje zmienne.

  4. Udokumentuj algorytmy używane w kodzie. W szczególności upewnij się, że jasne jest, co się dzieje, gdy używasz skomplikowanych funkcji i operatorów z całą tablicą, i upewnij się, że programista C ma dostęp do referencji na temat algorytmów używanych przez dowolne funkcje przybornika lub standardowe funkcje biblioteki, które są bardziej skomplikowane niż Funkcje BLAS.

  5. Dokumentuj wszystko, co zrobiłeś, aby kod był niezawodny, na przykład sprawdzanie poprawności danych wejściowych i obsługę błędów. Sposób, w jaki go zaimplementowałeś, jest prawdopodobnie bardzo różny od tego, jak trzeba to zrobić w C. Naukowcy piszący kod MATLAB rzadko zadają sobie trud, aby dowiedzieć się czegoś takiego jak obsługa wyjątków. Jeśli nie zrobiłeś nic, aby Twój kod był niezawodny, to przynajmniej udokumentuj, co można zrobić z nieprawidłowymi danymi wejściowymi, błędnymi lub częściowymi danymi.

  6. Upewnij się, że osoba przenosząca kod jest w stanie porównać dane wyjściowe z oryginalnym kodem MATLAB i, jeśli to możliwe, zapewnić dokładny zestaw danych wejściowych i poprawne dane wyjściowe.

  7. Jeśli osoba dokonująca przenoszenia nie zna analizy numerycznej, musisz nadzorować proces przenoszenia i upewnić się, że przejrzałeś i rozumiesz kod C. Będzie to bardzo edukacyjne dla was obojga.

użytkownik23748
źródło
Zgadzam się z twoją oceną techniczną i robisz dobre rzeczy (1 - 7), ale myślę, że reklama hominem na górze na temat „większości ludzi, którzy kodują tylko w MATLAB” była niepotrzebna i nieprawdziwa.
5
Z mojego doświadczenia wynika, że ​​większość osób, które używają MATLAB jako jedynego języka programowania, to osoby stosujące matematykę, dla których programowanie jest na ogół jedynie środkiem do celu. Nie mają motywacji, by troszczyć się o praktykę programowania i dbają tylko o pisanie poprawnego kodu, a nie dobrego lub pięknego kodu. Kiedy dzielą się swoim kodem, zwykle jest to przeznaczone do użycia, ale nie do odczytu - zawsze jest papier do wyjaśnienia kodu. Jeśli uważasz, że jest to obraźliwe (i nie ma tak być), po prostu brakuje Ci perspektywy ludzi, którzy nie dbają o to.
4
Z mojego doświadczenia wynika, że ​​zły kod jest pisany głównie przez ludzi, którzy piszą kod jednorazowy, tj. Kod, który będzie używany (czytany) przez jedną osobę dla jednego problemu. Język programowania nie ma znaczenia. A dla mnie, jako osoby programującej głównie w Matlabie, ad hominem wydaje się być obraźliwy.
Jonas
Jako EE mam przede wszystkim pisać MATLAB i zgadzam się z tobą. Zachęca do bardzo okropnego stylu kodowania, bez określania zakresu, przestrzeni nazw, organizowania w struktury danych lub dobrego nazewnictwa zmiennych. Po zrozumieniu wektoryzacji tak naprawdę nie zawracamy sobie głowy komentowaniem któregokolwiek z wynikowych sprytnych cudów jednowierszowych. Tylko gigantyczna kupa brzydkiego, nieefektywnego kodu.
Milind R
4

Języki programowania są znacznie łatwiejsze do odczytania niż do pisania. Większość programistów C z odrobiną doświadczenia powinna być w stanie dobrze odczytać kod Matlab z dostępem do referencji, a zwłaszcza z dostępem do programisty Matlab, aby odpowiedzieć na ich pytania. Kod jakiegokolwiek rodzaju jest znacznie mniej dwuznaczny niż większość wymagań, z których musimy skorzystać.

Jeśli mają licencjat z informatyki lub inżynierii komputerowej, prawdopodobnie wezmą rachunek różniczkowy, trygonometryczny i algebrę liniową, ale może być zardzewiały. O ile nie zajmują się dużo programowaniem naukowym / matematycznym, większość programistów C będzie wiedziała, czym jest FFT, ale rzadko lub nigdy nie musiała tego robić. Twój idealny kandydat będzie miał wszystko na uwadze, ale każdy, kto ukończył studia, powinien być w stanie poradzić sobie z matematyką dzięki nowemu studium. W obu przypadkach chcesz kogoś, kto kładzie nacisk na szukanie istniejących bibliotek dla typowych operacji, gdy tylko jest to możliwe, zamiast rozwijania własnych.

Talent do optymalizacji czasu wykonywania algorytmu różni się znacznie, nawet wśród doświadczonych programistów. Polecam mieć problem z rozmową kwalifikacyjną, aby to odkryć. Pokaż kandydatom prosty, ale celowo nieefektywny algorytm i zapytaj ich, co robi. Sprawdź, czy sami podnoszą jego nieskuteczność. Zapytaj ich, jaka jest asymptotyczna złożoność i jaka powinna być. Zapytaj ich, w jaki sposób przepisali by poprawić wydajność.

Karl Bielefeldt
źródło
3

Finansowy powód nieużywania kompilatora Matlab jest dobrze zrozumiały. Możesz jednak użyć bezpłatnego konwertera scilab na C. Procedura byłaby

  • Konwertuj kod z Matlaba na Scilab za pomocą narzędzi M2SCI ,
  • Konwertuj kod Scilab na C za pomocą „Scilab 2 C” ,
  • Test krzyżowy kodów,
  • Użyj profilera, aby wyszukać wąskie gardła wymagające ludzkiego oka.

Idealnie nie jest wymagana znajomość Scilab w tym procesie i wystarczy poświęcić trochę czasu na wypróbowanie tego rozwiązania (w praktyce może nie jest to takie proste ...)

Uwaga: nie próbowałem tego, ale przewiduję rozwiązanie z podobnych powodów.

Clement J.
źródło
2

Opracuj dobry zestaw testowy, który można uruchomić w obu aplikacjach, a następnie spójrz na metryki.

Pomoże to deweloperowi przetestować kod i zapewni, że jakość jest na rozsądnym poziomie.


źródło
2

Świetny post Jonasa, zwłaszcza punkt na zapewnienie sposobu przetestowania kodu. Oto kilka dodatkowych sugestii:

  • Kod udostępniania Zastanów się nad udostępnieniem źródła MATLAB, ale bądź przygotowany na wyjaśnienie jego struktury lub innych szczegółów (od składni do osobistego stylu). Miejmy nadzieję, że programista C rozpozna koncepcje, algorytmy i matematykę wysokiego poziomu ( i mam nadzieję, że skomentowałeś swój kod ).

  • Dokumentacja. Bardzo ważne będzie posiadanie przejrzystej dokumentacji określającej projekt; w końcu jeśli dana osoba nie mówi płynnie w MATLAB, kod może nie być bardzo użytecznym odniesieniem.

  • Ćwicz umiejętności ludzi. Może to być oczywiste, jednak warto o tym pamiętać podczas współpracy, szczególnie na tego rodzaju poziomie mikro. Powinieneś więc spróbować usunąć jak najwięcej niejasności z twojego kodu / dokumentacji. W zależności od poziomu przywództwa w projekcie może się okazać, że osiągasz równowagę między kierowaniem rozwojem a pozwoleniem osobie na wniesienie własnego wkładu.

Gary
źródło
1

O ile kodery C nie używają odpowiednich bibliotek, Matlab jest znacznie lepszy w tak trywialnych sprawach jak odwracanie macierzy. Naiwny C impl. nie jest wystarczająco stabilny. Wynajem koderów C byłby kosztowny. Spróbowałbym przenieść kod Matlaba do scipy i porównać prędkość, spróbować użyć kompilatora c Matlaba lub ... po prostu wrzucić do niego więcej sprzętu - może być o wiele tańszy, prostszy, bezpieczniejszy i szybszy.

Praca
źródło