Page 15 of 23

Estymowanie czasu

W dzisiejszym artykule omawiam tajemną sztukę estymowania czasu. Wiele osób ma do siebie pretensje, że nie potrafi poprawnie przewidzieć wymaganego czasu na zadanie i projekt. Prawdopodobnie zapominają oni jakie jest znaczenie słowa estymata. Aby rozjaśnić temat wychodzę od statystyki i pewnych faktów o estymatorach, a następnie formułuję wnioski dotyczące estymowania czasu.  Nie należy tego traktować jako żadne tezy naukowe, tylko zwykłe dostrzeżenie analogii. W dalszej części te pseudonaukowe rozważania zderzają się z rzeczywistością i opisuję częste problemy z estymacją czasu.

Continue reading

Exceptiony w mikrokontrolerach

Kiedy w programie na PC nastąpi exception, aplikacja zakończy się z błędem. W skrajnym przypadku dostaniemy blue screena i komputer się zresetuje. Wyjątki są obsługiwane przez system operacyjny. W mikrokontrolerach nie mamy dostępu do takich zaawansowanych funkcjonalności. Jednak w dalszym ciągu możemy wykonać dzielenie przez 0 lub odwołać się do null pointera. W tym artykule omówię w jaki sposób obsługiwać exceptiony w mikrokontrolerach. Zacznę od ogólnej procedury, następnie skupię się na detalach specyficznych dla procesorów PIC32 i Cortex-M.

Continue reading

O wskaźnikach i rzutowaniu w C

Zmienne programu są w pamięci reprezentowane jako pewien ciąg bitów. Dla komputera nie ma znaczenia, czy ten ciąg to liczba, string, struktura, czy cokolwiek innego. Pisząc programy definiujemy typy zmiennych i to na te typy rzutowane są wartości bitowe.

Języki wyższego poziomu jak np. C#, czy Python oddzielają tą implementację za pewną warstwą abstrakcji. Twórcy tych języków doszli do wniosku, że program nie powinien polegać na konkretnej reprezentacji bitowej. Możemy oczywiście za pomocą odpowiednich funkcji uzyskać dostęp do takiej bitowej reprezentacji, ale czynność ta celowo została utrudniona.

C jest jednak starszym językiem wyznającym zasadę, że programista wie co robi. Dlatego w C mamy łatwy dostęp do reprezentacji bitowej. Możemy używać wskaźników, czy rzutować typy na inne. Efektem jest większa wydajność wynikowych programów za cenę wolniejszego developmentu. Sprawdzanie błędów w C jest bardzo ubogie i nawet doświadczony programista może łatwo strzelić sobie w stopę.

W tym wpisie pokażę kilka potencjalnie niebezpiecznych fragmentów kodu oraz omówię jak radzi sobie z nimi standard MISRA C oraz jak to rozwiązano w C++.

Continue reading

Konwersja typów przy operacjach arytmetycznych w C

Aby wykonać operację arytmetyczną w  C, kompilator musi dysponować dwoma operandami tego samego typu. Jeżeli programista o to wcześniej nie zadbał, konwersja jest wykonywana niejawnie. Na przykład:

  • Zmienna o mniejszym rozmiarze jest konwertowana do większego np. uint8 na uint32, czy float na double.
  • Zmienna bez znaku jest konwertowana na zmienną ze znakiem.
  • Zmienna int jest konwertowana na float.

Konwersje typów są również wykonywane przy operacjach przypisania. Możemy na przykład do zmiennej uint przypisać liczbę ujemną. Możemy również do niej przypisać wynik operacji arytmetycznej, gdzie czasem wartość jest dodatnia, a czasem ujemna. Takie konwersje są dobrym miejscem do powstawania różnego rodzaju błędów i nieoczywistych, czy wręcz niezdefiniowanych zachowań.

Continue reading

Podsumowanie roku 2017

Koniec roku to czas, kiedy wszyscy piszą podsumowania, więc pora i na mnie. Ten rok upłynął mi pod znakiem otwierania się na świat. Postanowiłem ze swoimi przemyśleniami wyjść do szerszej publiczności, a także zacząłem bardziej interesować się, co mają do powiedzenia inni.

 

Continue reading

Zrównoważone tempo i negatywne skutki nadgodzin

W praktykach Extreme Programming (XP) możemy przeczytać, że tydzień pracy programisty powinien wynosić 40 godzin. Możliwe są sporadyczne nadgodziny (kilka razy w roku), ale nigdy nie powinny występować przez dwa tygodnie pod rząd. Praktyka ta nosi nazwę Sustainable Pace, czyli zrównoważone tempo. Zgodnie z XP zespół powinien pracować w stałym tempie, które jest w stanie utrzymywać w nieskończoność. Nadgodziny są symptomem poważniejszych problemów z projektem i to nimi należy się zająć.

Może się wydawać, że to jakieś mrzonki osób oderwanych od rzeczywistości i roszczeniowa postawa programistów, którzy mają za dobrze. Jednak moim zdaniem ta zasada ma głęboki sens i warto się nad nią głębiej zastanowić.

Continue reading

Relacja z code::dive

W dniach 14-15 listopada byłem na konferencji code::dive we Wrocławiu. Jest ona głównie poświęcona C++, ale dodatkowymi tematami miały być Rust, Go, Embedded, IoT, Security, czy Python. Wstęp jest darmowy, ale liczba miejsc jest ograniczona. Swoje zgłoszenie wysłałem dosyć późno i byłem pewny, że się nie załapie. Jednak w ostatniej chwili zwolniły się jakieś miejsca i dostałem swoją wejściówkę. Mogłem więc wybrać ciekawsze pozycje w agendzie i wyruszyć w drogę.

Continue reading