Power projects

15

Hej,
na HN[1] pojawił się wpis z bloga[2], w którym autor opisuje, że najwięcej o programowaniu (w C++) dowiedział się pisząc własną, minimalistyczną VM. Komentujący dorzucili parę własnych pomysłów na "power projects" czyli projekty, które nie tylko uczą nas podstaw języka czy technologii, ale mocniej rozwijają nasze programistyczne skille. Coś dla osób, które już coś umieją, pracują, ale chciałyby oderwać od klepania formatek czy CRUDów. Przykłady:

Tracks I've done and suggested to friends and colleagues as learning experiences:

  • Compression (lossless, lossy, image, audio, texture, video)
  • Languages (bytecode interpreter, AST interpreter, parser/lexer for a simple language, simple JIT, understanding instruction scheduling)
  • DSP programming (writing programs for fast, branchless math)
  • Comfort with binary and binary formats (start with packfiles .zip/.tar, move onto reverse engineering simple formats for e.g. games)
  • Understanding the difference between RAM and address spaces (e.g. understanding virtual memory, mmap, memory-mapped IO, dynamic linking, the VDSO, page faulting, shared memory)
  • Device drivers (easier on Linux, understanding userspace/kernel interaction, ioctls, how hardware and registers work, how to read spec sheets and hardware manuals)
  • Graphics (modern software rasterizer that's not scanline-based, understanding 3D and projective transforms, GPU programming and shaders, basic lighting (reflection and illumination) models, what "GPU memory" is, what scanout is, how full scenes are accumulated all along the stack)
  • A database (transaction, lock managers, buffer/IO management, etc).
  • An MVC web framework.
  • A GUI validation library.
  • A JavaScript UI library.
  • An iteratee implementation.
  • An Erlang-style actors library in another language.
  • Implementing for-yield, async-await, etc on top of delimited continuations.
  • Interpreters, typecheckers, code generators.
  • Some of an ECMAScript implementation.
  • Concurrent data structures: futures/promises, queues, etc.
  • A simple roguelike game.

Robiliście coś w tym stylu, co? Jak na was wpłynęło? Inne pomysły? Otwieram dyskusję.

  1. https://news.ycombinator.com/item?id=12553591
  2. http://gpfault.net/posts/most-important-project.txt.html
0

Ciekawy temat i same pomysły również. Warto się czasem brać za takie projekty, żeby nie stać w miejscu.

Robiliście coś w tym stylu, co? Jak na was wpłynęło? Inne pomysły? Otwieram dyskusję.

Tak ambitnych projektów jak wymienione nie robiłem, ale w ramach samorozwoju napisałem kilka niedużych bibliotek dla Javy i Androida.
Moim celem było stworzenie narzędzi, które będę mógł sam wykorzystywać i których inni będą mogli używać, podszkolenie się z podstaw Javy, statycznej analizy kodu, TDD i RxJavy, nauka technologii, których wcześniej nie znałem (np. BLE), nauka wrzucania projektów na Maven Central (wbrew pozorom nie jest to takie proste na samym początku). Ciekawie zaczyna też się robić, gdy takie projekty zaczynają swój cykl życia, ktoś zaczyna z nich korzystać i np. wychodzi nowa wersja Androida lub nowa wersja bibliotek, od których zależy nasz projekt. Wtedy trzeba dostosować bibliotekę do nowszej wersji nie naruszając API i zachowując kompatybilność wsteczną. Mam też w planach parę innych projektów. M.in. projekt wykorzystujący jedną z moich wcześniejszych bibliotek dodatkiem w postaci z procesora adnotacji i generacji kodu. Problemem jest głównie czas i energia. Czasem po pracy lub w weekend ciężko się do takich rzeczy zmobilizować ;).

Chciałbym się kiedyś wziąć za takie niskopoziomowe projekty jak te, o których napisałeś i najlepiej w językach, których nie znam lub które znam słabo, ale musiałbym najpierw trochę więcej poczytać.

2
  • Napisałem interpreter Brainfucka, jak i kompilator BF do CIL/MSIL - poznałem MSIL, dowiedziałem się jak to wszystko działa o poziom niżej, jak generować kod na bieżąco z aplikacji itp.;
  • Pisałem własny prosty protokół sieciowy, potem go wykorzystałem do przesyłania danych w prototypowej swojej aplikacji, a potem użył go mój znajomy w swojej pracy inżynierskiej;
  • Reverse-engineering jakiegoś cudzego formatu danych też kiedyś robiłem, niestety już nie pamiętam dokładnie o co chodziło;
  • Swój pseudo-MVC-framework zrobiłem w PHP... jak chyba każdy programista PHP?
0
Ktos napisał(a):
  • Pisałem własny prosty protokół sieciowy, potem go wykorzystałem do przesyłania danych w prototypowej swojej aplikacji, a potem użył go mój znajomy w swojej pracy inżynierskiej;

Masz jakieś źródła ?

Pozdrawiam

0
Narror napisał(a):
Ktos napisał(a):
  • Pisałem własny prosty protokół sieciowy, potem go wykorzystałem do przesyłania danych w prototypowej swojej aplikacji, a potem użył go mój znajomy w swojej pracy inżynierskiej;

Masz jakieś źródła ?

To było coś prostego na zasadzie "jeden bajt długość, reszta dane", tylko opakowane w wygodną bibliotekę dla Windows 8/Windows Phone, potem zaimplementowane w C++ do komunikacji z Windows Phone właśnie. Na miano "protokołu" niekoniecznie zasługuje. Jakaś wersja (nie pamiętam czy finalna i działająca) jest na moim GitHubie: https://github.com/ktos/SocketService/blob/master/TcpSocketService/SldpSocketService.cs

BTW, co mi przypomniało również, że napisałem kiedyś (na zaliczenie) szybką i nędzną (bez TLS, ignorowanie niektórych <presence>) implementację serwera XMPP (plus chyba ze dwóch XEP) w Javie 1.6 na socketach.

0

Z rozwojowych zajęć polecam Reverse engineering, a dokładniej crackowanie aplikacji :)
Dobra metoda na nauczenie się ASM przynajmniej do czytania czy też jak faktycznie wygląda struktura aplikacji. Generalnie na czym polega łamanie zabezpieczeń triali/serial code'ów i jak one są tworzone. Przy okazji tego można popisać serial code generatory albo pobawić się z DLL injection i stworzyć własnego trainera, albo i własny interfejs do cudzej aplikacji.
Przy okazji rozwija to też inne podejście do programowania, nie na zasadzie co zrobić żeby zadziałało, ale co można zrobić by to zepsuć :D

0

Na studiach pisałem kompilator, stos sieciowy, bazę danych, rozproszonego shella. W domu pisałem sterownik do Windowsa, alokator pamięci dla dotneta i bibliotekę do ILP (w planach jest jeszcze solver, ale muszę się trochę podoktoryzować z tematu).

Zasadniczo każdy z tych projektów pozwolił mi na głębsze zrozumienie tematu i nacięcie się na ciekawe problemy. Przykładowo pisząc stos sieciowy byłem względnie zielony, znałem teorię i wiedziałem, co jest do napisania, ale i tak nadziałem się na problem z kolejnością bajtów w kablu (a byłem świadom istnienia tej kwestii). Za to pisanie bazy danych (podstawowy DQL bez podzapytań, z joinami, filtrowaniem, agregacją, sortowaniem, projekcją) poszło mi bardzo szybko, bo miałem za sobą kilka książek o bebechach serwerów SQL i wiedziałem, jak to implementują inni.

0

Jak ktos chce sobie napisac kompilator to polecam kurs:
https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about

0

Niedawno kupione: https://pragprog.com/book/bhwb/exercises-for-programmers

(może nie tak ambitne projekty ja ww, ale do nauki języka jak znalazł)

2

Od dwóch lat robię takie power projecty związane z JavaScript/HTML/CSS (nie chodzi mi, że napisane w tych technologiach, tylko że napisałem projekty analizujące sam kod źródłowy JS/HTML/CSS innych projektów).

  • najpierw zrobiłem analizer dyrektyw AngularJS (i robiłem drzewko zależności, która dyrektywa wywołuje którą).
  • potem chciałem zrobić edytor strukturalny HTML/CSS (tj. edytor, w którym się edytuje kod w postaci drzewa: ), jednak projektu nie zrobiłem w końcu do końca
  • gdzieś w międzyczasie zrobiłem wtyczkę do Atoma, która wyciąga dane z pliku, który aktualnie programista edytuje i pokazuje po boku listę funkcji/obiektów/zmiennych i pozwala na szybsza nawigację: https://atom.io/packages/atom-lupa . wtyczka ta pozwala również na semantyczne wyszukiwanie kodu w całym projekcie.
  • teraz natomiast robię coś pomiędzy przeglądarką kodu a debuggerem dla JavaScriptu. Będzie on pozwalał na zobaczenie wszystkiego co się dzieje w programie i na wizualizację tego w postaci drzewka, wykresu, diagramu czy nawet w postaci zwykłej listy/zrzutu danych.
  • przy okazji projektu zrobiłem semantyczne podświetlanie dla JavaScriptu (każda zmienna innym kolorem): https://twitter.com/hex13code/status/787297360787435520

Robiliście coś w tym stylu, co? Jak na was wpłynęło? Inne pomysły? Otwieram dyskusję.

  1. Zrodziło się we mnie poczucie mocy związanej z tym, że to ja panuję nad kodem, a nie on nade mną. Np. ostatnio zaś miałem problem z debugowaniem pewnego projektu, aż rodziło to we mnie frustrację. Więc postanowiłem rozwiązać problem raz a dobrze - czyli zrobić narzędzie do ogólnego debugowania projektów JS. Tak samo z innymi projektami. Jest to dla mnie próba zapanowania nad materią pod tytułem kod.

  2. potwierdziło się u mnie to, co Linus powiedział:
    "Bad programmers worry about the code. Good programmers worry about data structures and their relationships."
    Staram się korzystać z takich samych struktur danych wszędzie, dzięki temu wszystko jest ze sobą kompatybilne w wielu miejscach programu, niczym klocki Lego. Tego się nauczyłem na błędach (wcześniej musiałem refaktoryzować ostro kod, jak zmieniłem strukturę danych albo konwertować z jednej na drugą ciągle, bo jeden moduł korzystał z innej niż drugi).

  3. Uczę się prostoty. Czasem muszę do tej prostoty dotrzeć dopiero. Po którymś przepisaniu projektu od początku wreszcie piszę najprostszą możliwą rzecz, pozbywam się błędnych założeń. Kiedyś chciałem zaprojektować cały system z góry na dół, teraz staram się pisać prosto i uniwersalnie, bez wielkich designów.

  4. pozbywam się dogmatów i paradygmatów. Programowanie OOP nie jest takie fajne wcale, funkcyjne jest lepsze, ale też nie zawsze, bo ma wadę, że trzeba kopiować wszystko przy każdej zmianie, więc czasem programowanie proceduralne jest lepsze. Ostatnio też napisałem rozwiązanie, którego kod miejscami bardziej przypomina kod assemblera niż wysokopoziomowy język (np. wszystko opiera się na kilku stosach). Wszystkie paradygmaty mogą być okej w pewnych sytuacjach.

0

Do Power Projects dorzuciłbym GC np. dla C++.

0
Afish napisał(a):

Na studiach pisałem kompilator, stos sieciowy, bazę danych, rozproszonego shella. W domu pisałem sterownik do Windowsa, alokator pamięci dla dotneta i bibliotekę do ILP (w planach jest jeszcze solver, ale muszę się trochę podoktoryzować z tematu).

Zasadniczo każdy z tych projektów pozwolił mi na głębsze zrozumienie tematu i nacięcie się na ciekawe problemy. Przykładowo pisząc stos sieciowy byłem względnie zielony, znałem teorię i wiedziałem, co jest do napisania, ale i tak nadziałem się na problem z kolejnością bajtów w kablu (a byłem świadom istnienia tej kwestii). Za to pisanie bazy danych (podstawowy DQL bez podzapytań, z joinami, filtrowaniem, agregacją, sortowaniem, projekcją) poszło mi bardzo szybko, bo miałem za sobą kilka książek o bebechach serwerów SQL i wiedziałem, jak to implementują inni.

Jaką książkę poleciłbyś o bazach danych, czy to ogólnie czy może konkretnie o np. MSSQL?

0

Complete Book Ullmana, Guide to SQL Standard C. J. Data, a potem to już konkretnie pod jakąś bazę, pod MS SQL na przykład Mastering SQL Server 2008 Michael Lee, Querying Microsoft SQL Server 2012 Itzik Ben-Ganm, Microsoft SQL Server 2012 Internals Kalen Delaney.

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