Pierwsze kroki w nowym(starym) dużym projekcie w C?

0

Witam, jestem doświadczonym programista, ale ostatnio otrzymałem zadanie specjalne w firmie. Moje doświadczenie to głownie c# i języki skryptowe. Doświadczenie z C to jedynie krotki epizod na studiach.

Z racji braku ludzi muszę zając się aplikacja która ma kilkanaście modułów/pod-projektów napisanych w języku C które komunikują się ze sobą i innymi aplikacjami w rożny sposób. Cala aplika jest masywna, a ludzie którzy się nią opiekowali zostali zwolnieni, zostali tylko tacy którzy potrafią przeprowadzić implementacje wg instrukcji.

Moje zadania:

  • dowiedzieć się co z każdy modułów robi i napisać dokumentacje,
  • przepisać wszystko lub opakować w bardziej nowoczesny język programowania np. go lang
  • uprościć proces implementacji.

Co zrobiłem dotychczas:

  • zainstalowałem Code Blocks,
  • zidentyfikowałem kod źródłowy dla każdego z modułów w repozytorium,
  • odświeżyłem wiedzę z C,
  • jestem w trakcie zdobywania dostępu do środowiska testowego i aplikacji produkcyjnej.

Moje pytania:

  1. Jakie powinny być moje pierwsze kroki atakując taka aplikacje?,
  2. Czy IDE ma znaczenie i czy Code Block będzie odpowiedni w moim przypadku?,
  3. W kodzie źródłowym dla żadnego z modułów nie znalazłem żadnego pliku projektowego (*.proj) są tylko *.c i i *.h czy to znaczy ze powinienem wygenerować projekt w Code Blocks na podstawie jakiegoś templetu?,
  4. Czy kompilator ma znaczenie? Jak mam to znaleźć z jakiego kompilatora dotychczas korzystali programiści? Czy można to w jakiś sposób zidentyfikować na serwerze lub inaczej?,
  5. Jakie dodatkowe pytania powinienem zadać i na co być przygotowanym?

Z góry dzięki za pomoc!

0

1. Debuggowanie i czytanie kodu. Postaraj się go zrozumieć i rozrysować sobie warstwy, moduły, komponenty i ich powiązania.
2. IDE ma o tyle znaczenie, że powinno ułatwiać Ci to, co robisz w punkcie 1. Jeśli Code Blocks Ci to ułatwi (mi by nie ułatwiło, polecam Visual Code, Visual Studio, ew. Sublime) to ok.
3. Poszukaj plików CMakeLists, Makefile, mk, one są głównie odpowiedzialne za budowanie. Nie uwierzę w to, że cały system, który zastałeś nie ma przygotowanego systemu budowania. To byłoby szaleństwo stawiać taki system przy odziedziczonym sporym projekcie...
4. Kompilator ma znaczenie choćby ze względu na platformę, na której system ma działać.
5. Bądź przygotowany na brak obiektowości i próbę uzupełnienia tego braku - mam tu na myśli wielkie struktury, tokeny, próby zaimplementowania modelu obiektowego jezykiem, który obiektowy nie jest.

0
Bartosz36 napisał(a):

1. Debuggowanie i czytanie kodu. Postaraj się go zrozumieć i rozrysować sobie warstwy, moduły, komponenty i ich powiązania.
2. IDE ma o tyle znaczenie, że powinno ułatwiać Ci to, co robisz w punkcie 1. Jeśli Code Blocks Ci to ułatwi (mi by nie ułatwiło, polecam Visual Code, Visual Studio, ew. Sublime) to ok.
3. Poszukaj plików CMakeLists, Makefile, mk, one są głównie odpowiedzialne za budowanie. Nie uwierzę w to, że cały system, który zastałeś nie ma przygotowanego systemu budowania. To byłoby szaleństwo stawiać taki system przy odziedziczonym sporym projekcie...
4. Kompilator ma znaczenie choćby ze względu na platformę, na której system ma działać.
5. Bądź przygotowany na brak obiektowości i próbę uzupełnienia tego braku - mam tu na myśli wielkie struktury, tokeny, próby zaimplementowania modelu obiektowego jezykiem, który obiektowy nie jest.

Dziękuję za wyczerpującą odpowiedz!
Ad. 4
4.1 Aktualnie platforma to Red Hat Linux 5, a docelowa ma być Oracle Eneterprise Linux 12.
4.2 Czy są jakieś metody które mi pozwolą zidentyfikować użyty kompilator?
4.3 Czy jeśli użył bym kompilatora innego niż ten który był użyty dotychczas mogłoby to mieć negatywny wpływ na wydajność systemu?
4.4 Czy jest jakiś kompilator który powinienem brać pod uwagę bardziej niż inny np. GCC, CLANG?

2

Współczuje. Nie ma nic gorszego niż "legacy code", który trzeba zrozumieć.

  1. Jakie powinny być moje pierwsze kroki atakując taka aplikacje?,

Ja bym zaczął od pytania do szefów, czy mogą dostarczyć cokolwiek na temat tej aplikacji.
Co to ma robić, jakie są wymagania (czy są w ogóle gdzieś spisane).

Jeśli nie, to testuj aplikację, by zrozumieć jako użytkownik co ma robić. Im więcej zdobędziesz wiedzy domenowej tym lepiej.

Po drugie zacząłbym od testów.
Jeśli są, jakieś testy, to już coś, jak są dobre to już masz powody do świętowania.

  1. Czy IDE ma znaczenie i czy Code Block będzie odpowiedni w moim przypadku?,

IDE nie ma znaczenia (polecam CLion - płatny)

  1. W kodzie źródłowym dla żadnego z modułów nie znalazłem żadnego pliku projektowego (.proj) są tylko .c i i *.h czy to znaczy ze powinienem wygenerować projekt w Code Blocks na podstawie jakiegoś templetu?,

Jeśli faktycznie projekt ma jedynie *.h i *.c to niezły kwiatek, a w kodzie można oczekiwać ich dużo więcej

  1. Czy kompilator ma znaczenie? Jak mam to znaleźć z jakiego kompilatora dotychczas korzystali programiści? Czy można to w jakiś sposób zidentyfikować na serwerze lub inaczej?,
    

Kompilator teoretyczni nie ma znaczenia. W praktyce są czasami małe różnice (szczególnie jak ktoś używa rozszerzeń standardów), więc mogą zaistnieć małe problemy. Nie spodziewałbym się jednak blockerów z tego powodu

  1. Jakie dodatkowe pytania powinienem zadać i na co być przygotowanym?
  • Czy mają jakieś szkolenia z używania tego programu, względnie szkolenia dotyczące wiedzy w domenie tej aplikacji
  • co chcą naprawdę?
  • Czy chcą dopisać testy do istniejącego kodu?
  • Ile czasu możesz poświecić jedynie na czytanie kodu?
  • Kto może ci pomóc?
  • Ile czasu?
  • czy są pewni, że ktoś nie mający praktyki z C powinien sam przejmować projekt?

To, że ktoś wciska legacy kod w C osobie od C#, IMO to jest bardzo słaba sytuacja, wskazująca na brak kompetencji menadżerów.
Jednym z obowiązków developera/inżyniera jest umiejętność mówienia NIE we wczesnej fazie. Dlatego zastanów się czy nie powiedzieć NIE.
Pamiętaj, że na końcu jeśli projekt upadnie, to menadżerowie wskażą palcem na ciebie.

0

Nie jestem programistą ale ja bym zatrudnił po prostu programistę C i to takiego co pisze bez IDE.

0
blank2 napisał(a):

Nie jestem programistą ale ja bym zatrudnił po prostu programistę C i to takiego co pisze bez IDE.

Znajomość Emacs-a lub VIM-a nie czyni nikogo dobrym specjalistą.

0

Firma zwolniła wszystkie osoby które potrafiły skompilować i ogarnąć masywny ważny projekt w firmie ??
Nie no doskonała decyzja. Życzę powodzenia, będzie Ci potrzebne, bo niestety c++ jest takim specyficznym językiem, że samo ogarniecie cpp i h to mały pikuś.
Projekt jest w rh5 czyli pisały go pewnie jeszcze leśne dziadki.
Problemy których się możesz spodziewać to

  1. Jak to zbudować (Zakładam ze w takim starym crapie, na cmake'ki sconsy czy inne conany nie ma co liczyć, wiec zapewne make, jak nie make to zostaje modlitwa)
  2. Czym to zbudować (kompilator w teorii nie ma znaczenia, ale słyszałem o starych projektach w niektórych finansówkach w krk że bazowały na bugach w gcc3.X) (zapewne gcc defaultowe w rh5 lub takie jakie zobaczysz zainstalowane pod /opt/rh/devtoolset)
  3. Gdzie to zbudować. (chcesz to zbudować pod code blockiem, ale rozumiem pod rh5? a nie pod windowsem)
  4. Jak ogarnąć dependencje (I tu będziesz miał największy problem)
  5. Jak to poprawnie zdeployowac/uruchomić.

Podsumowując. Biorąc pod uwagę że robisz w c#, należy iść po podwyżkę, dużą podwyżkę, bo czeka Cię męka.
A szefowie firmy chyba postradali lekko zmysły zwalniając autorów. Kto normalny tak robi.

Dodatkowo:

4.1 Aktualnie platforma to Red Hat Linux 5, a docelowa ma być Oracle Eneterprise Linux 12.

Hmm Oracle linux 12?? Nie ma czegoś takiego. Przecież Oracle Linuxy mają wersjonowanie zgodne z rhel z którego bazują. Więc max to 7.X.
Chyba że chodzi ci o SuSE Linux Enterprise Server 12. A to by była bardzo duża zmiana.

4.2 Czy są jakieś metody które mi pozwolą zidentyfikować użyty kompilator?

readelf -p .comment Binarka
Jeśli było zbudowane w gcc powinieneś znaleźć tam wersje.
Ale to w czym to było zbudowane to mały problem. Ważniejsze jak to było zbudowane. W sensie z jakimi flagami. I jak były zbudowane depenencje.
Coś przewiduje piekło. :P

4.3 Czy jeśli użył bym kompilatora innego niż ten który był użyty dotychczas mogłoby to mieć negatywny wpływ na wydajność systemu?

Tak może.
Ale bardziej i na pewno będzie miał wpływ zmiany systemu.
Wydajność nawet pomiędzy rhelami o jeden major potrafi się sporo różnić.

4.4 Czy jest jakiś kompilator który powinienem brać pod uwagę bardziej niż inny np. GCC, CLANG?

Nie. Na 99% zbudowane to było w gcc.

0
Code Hooligan napisał(a):

ludzie którzy się nią opiekowali zostali zwolnieni

Tak się zastanawiam, zostali zwolnieni, czy uciekli, bo mieli dość projektu, który napisali.
Biorąc pod uwagę okoliczności, to stawiam na to drugie.

0
Bartosz36 napisał(a):

3. Poszukaj plików CMakeLists, Makefile, mk, one są głównie odpowiedzialne za budowanie. Nie uwierzę w to, że cały system, który zastałeś nie ma przygotowanego systemu budowania. To byłoby szaleństwo stawiać taki system przy odziedziczonym sporym projekcie...

Jak się okazuje miałem dostęp do niewłaściwego repozytorium, skleiłem "screenshota": https://ibb.co/SsZSHkC, okazuje się ze są pliki odpowiedzialne za build:

  1. pliki xml w folderze o nazwie „ant” zakładam ze to pliki konfiguracyjne dla Apache Ant ale nie mam pewności,
  2. „Makefile” z folderu z innymi plikami *.c to wspominany plik kompilacyjny,
  3. compiler.flags – jest w nim wzmianka o GCC, czy to config specyficzny dla tego kompilatora?
MarekR22 napisał(a):

To, że ktoś wciska legacy kod w C osobie od C#, IMO to jest bardzo słaba sytuacja, wskazująca na brak kompetencji menadżerów.
Jednym z obowiązków developera/inżyniera jest umiejętność mówienia NIE we wczesnej fazie. Dlatego zastanów się czy nie powiedzieć NIE.
Pamiętaj, że na końcu jeśli projekt upadnie, to menadżerowie wskażą palcem na ciebie.

Pracuje w sporej korporacji w której decyzje są podejmowany na bardzo wysokim szczeblu co często uderza bezpośrednio w takie male mrówki jak ja, czy mógłbym odmówić? Jasne- konsekwencji z tego powodu tez nie miałbym żadnych. Zostałem poproszony o podjecie się tego problemu bo ktoś zdecydował, ze potencjalnie zmarnuje mniej czasu niż inni :)
Napisałem ten post bo liczę na szybszy start, chce zdobyć tyle wiedzy i rad i spostrzeżeń ile się da aby mój własny „research” był bardziej efektywny, dzieki wam mam szanse zmarnowac mniej czasu.

amd napisał(a):

Podsumowując. Biorąc pod uwagę że robisz w c#, należy iść po podwyżkę, dużą podwyżkę, bo czeka Cię męka.
A szefowie firmy chyba postradali lekko zmysły zwalniając autorów. Kto normalny tak robi.

Bonusy i awanse są na koniec roku więc na pewno ten wysiłek echem nie przejdzie, aktualnie pracuje c# i js wcześniej liznąłem pythona, ruby, golang, swift - to tylko kolejne wyzwanie. Robota która trzeba zrobić, kokosy za darmo nie spadają, przynajmniej mi:).

amd napisał(a):

Hmm Oracle linux 12?? Nie ma czegoś takiego. Przecież Oracle Linuxy mają wersjonowanie zgodne z rhel z którego bazują. Więc max to 7.X.
Chyba że chodzi ci o SuSE Linux Enterprise Server 12. A to by była bardzo duża zmiana.

Tak dokładnie chodzi o SUSE® Linux Enterprise Server 12, mój błąd napisałem nieprecyzyjnie.

MarekR22 napisał(a):
Code Hooligan napisał(a):

ludzie którzy się nią opiekowali zostali zwolnieni

Tak się zastanawiam, zostali zwolnieni, czy uciekli, bo mieli dość projektu, który napisali.
Biorąc pod uwagę okoliczności, to stawiam na to drugie.

Ludzie zostali zwolnieni, aplikacja, a w zasadzie zbiór aplikacji należących do tego projektu powstały mniej więcej w 1995r, bylo duzo innych opcji w tym czasie, ale nie znam jeszcze kodu na tyle żeby rozważać dlaczego C został użyty.
W każdym razie firma popadła w głęboki kryzys, aplikacja jest bardzo stabilna nie ma w sumie żadnych „tiketow”/bugow, dziennych zgłoszeń, jest z kategorii „vital application”.
Czasami żeby uchronić firmę przed bankructwem podejmowane są kroki które nie koniecznie wydaja się logiczne, plotki krążą ze dużo ludzi było nadpłacanych.

W związku z tym ze komponenty napisane w języku C są niezwykle stabilne, niekoniecznie wszystko musi być przepisane. Założenie jest takie żeby zrozumieć co one robią i wtedy zdecydować czy je opakować w coś innego co ułatwi ich deployment, czy może ostatecznie przepisać na nowy nowocześniejszy język co pozwoli na tańszy „maintanace”, latwiejsze znalezienie ludzi którzy będą mogli to otrzymywać i rozwijać.

W każdym razie doceniam każdą z waszych rad. Dzięki wielkie!.

0

Jak się okazuje miałem dostęp do niewłaściwego repozytorium, skleiłem "screenshota": https://ibb.co/SsZSHkC, okazuje się ze są pliki odpowiedzialne za build:

  1. pliki xml w folderze o nazwie „ant” zakładam ze to pliki konfiguracyjne dla Apache Ant ale nie mam pewności,
  2. „Makefile” z folderu z innymi plikami *.c to wspominany plik kompilacyjny,
  3. compiler.flags – jest w nim wzmianka o GCC, czy to config specyficzny dla tego kompilatora?

Tak wygląda że budowane antem. (Nietypowo, ale zawsze jakoś łatwiej to będzie ogarnąć.)
Poza tym jak są takie rzeczy Makefile i compiler flags to nie wygląda to tak źle.

Pracuje w sporej korporacji w której decyzje są podejmowany na bardzo wysokim szczeblu co często uderza bezpośrednio w takie male mrówki jak ja, czy mógłbym odmówić? Jasne- konsekwencji z tego powodu tez nie miałbym żadnych. Zostałem poproszony o podjecie się tego problemu bo ktoś zdecydował, ze potencjalnie zmarnuje mniej czasu niż inni :)
Napisałem ten post bo liczę na szybszy start, chce zdobyć tyle wiedzy i rad i spostrzeżeń ile się da aby mój własny „research” był bardziej efektywny, dzieki wam mam szanse zmarnowac mniej czasu.

Ma sens.

Tak dokładnie chodzi o SUSE® Linux Enterprise Server 12, mój błąd napisałem nieprecyzyjnie.

Boje się że tutaj będzie największy problem. Bo często dev takich apek lubią korzystać z headerów systemowych. I teraz jeżeli autorzy tak zrobili, to możliwe że nie będzie takie łatwe przeportowanie tego na SuSe.

Twoim pierwszym celem powinno być

  1. Przeczytanie bdeRELEASE.doc
  2. Próba zbudowania/uruchomienia na rh5
  3. Próba zbudowania/uruchomienia na SuSe

Ludzie zostali zwolnieni, aplikacja, a w zasadzie zbiór aplikacji należących do tego projektu powstały mniej więcej w 1995r, bylo duzo innych opcji w tym czasie, ale nie znam jeszcze kodu na tyle żeby rozważać dlaczego C został użyty.

W 95 C był chyba na topie.

W każdym razie firma popadła w głęboki kryzys, aplikacja jest bardzo stabilna nie ma w sumie żadnych „tiketow”/bugow, dziennych zgłoszeń, jest z kategorii „vital application”.
Czasami żeby uchronić firmę przed bankructwem podejmowane są kroki które nie koniecznie wydaja się logiczne, plotki krążą ze dużo ludzi było nadpłacanych.

Tylko czy nie warto było zostawić jednego na kontrakt. W sensie zwalniamy Cie ale chętnie wykorzystamy Twoja wiedze w cenie 300PLN/h w momencie jak nie będziemy wiedzieć co robić.

Apka faktycznie wygląda na C. Więc może tak, źle nie będzie :)

0
amd napisał(a):

Jak się okazuje miałem dostęp do niewłaściwego repozytorium, skleiłem "screenshota": https://ibb.co/SsZSHkC, okazuje się ze są pliki odpowiedzialne za build:
Boje się że tutaj będzie największy problem. Bo często dev takich apek lubią korzystać z headerów systemowych. I teraz jeżeli autorzy tak zrobili, to możliwe że nie będzie takie łatwe przeportowanie tego na SuSe.

Twoim pierwszym celem powinno być

  1. Przeczytanie bdeRELEASE.doc
  2. Próba zbudowania/uruchomienia na rh5
  3. Próba zbudowania/uruchomienia na SuSe

Z tego co na szybko znalazłem to wersja 4 była kompatybilna z wersja 3, ale to było dawno, plus od wersji 4.8 kompilator zaimplementowany jest w c++.
Sprawdziłem moje "release doc" i nic nie ma żadnej wzmianki o wersji GCC.
Czy znalezienie optymalnej wersji to metoda prób i błędów zaczynając od najnowszej wersji i idąc wstecz?

0

Jeśli na tym screen shot widać wszystkie pliki, to nie jest to duży projekt (mniej niż 300 plików), więc nie jest źle.
Największe wady

  • nazwy są "oszczędne"
  • brak testów (no ale w końcu '95)
  • Dziwne, że widać zarówno pliki dla Apache Ant i Makefile (zawsze powinien być jeden system budowania)
  • ciekawe czemu służą plik w katalogu shs (nie mają rozszerzenia, poza dwoma skryptami shella).

Tak z ciekawości, co mniej więcej robi ten program?
Ma interfejs graficzny?
Czy może tylko przetwarza dane strumieniowo?
A może to jest jakaś usługa sieciowa?

Cokolwiek co pozwoli ci równolegle i automatycznie porównywać działanie starego i nowego kodu, będzie dla ciebie wielkim zbawieniem.

0
MarekR22 napisał(a):

Jeśli na tym screen shot widać wszystkie pliki, to nie jest to duży projekt (mniej niż 300 plików), więc nie jest źle.
Największe wady

  • nazwy są "oszczędne"
  • brak testów (no ale w końcu '95)
  • Dziwne, że widać zarówno pliki dla Apache Ant i Makefile (zawsze powinien być jeden system budowania)
  • ciekawe czemu służą plik w katalogu shs (nie mają rozszerzenia, poza dwoma skryptami shella).

Tak z ciekawości, co mniej więcej robi ten program?
Ma interfejs graficzny?
Czy może tylko przetwarza dane strumieniowo?
A może to jest jakaś usługa sieciowa?

Cokolwiek co pozwoli ci równolegle i automatycznie porównywać działanie starego i nowego kodu, będzie dla ciebie wielkim zbawieniem.

Tak ten projekt który wkleiłem nie jest taki duży, problem w tym ze mam takich komponentów 19 o których wiem, a może być więcej :)

To jest aplikacja do zarządzania linia produkcyjna także robi dużo rożnych rzeczy, wielowątkowo z tego co wiem (przypuszczam ze w tamtym czasie to chyba była nowinka dopiero).
Interfejs graficzny jakiś jest na samym końcu, ale jeśli chodzi o moje komponenty są to serwisy „cross” komunikujące się ze sobą, są na pewno jakieś „message queues/message brokers” itp, jest tez dużo skryptów które zarządzają tym wszystkim.

Tak jak napisałeś będę dążył do jak najszybszego opanowania istniejącego środowiska testowego/produkcyjnego oraz postawienia nowego docelowego.

0
MarekR22 napisał(a):
  • ciekawe czemu służą plik w katalogu shs (nie mają rozszerzenia, poza dwoma skryptami shella).

Pomimo braku rozszerzenia wszystkie pliki w tym folderze to skrypty shella, nie mam póki co odpowiedzi dlaczego tak jest.

1 użytkowników online, w tym zalogowanych: 0, gości: 1