title: Co to jest konserwacja oprogramowania?

text: Jestem programistą hobbystą, więc nie mam doświadczenia zawodowego. Ludzie tutaj często mówią o utrzymaniu oprogramowania w pracy. Autor tego pytania mówi o wykonywaniu 90% utrzymania i 10% rozwoju w swojej pracy. Moje pytanie brzmi: czym właściwie jest „konserwacja oprogramowania”? Czy chodzi głównie o naprawianie błędów? Jeśli tak, to czy to oznacza, że ludzie spędzają większość czasu w pracy naprawiając błędy? A może „konserwacja” obejmuje inne rzeczy niż naprawianie błędów?


title: Czy podwójne zabezpieczenie hasłem jest bezpieczne dla uwierzytelniania administratora?

text: Przeglądałem niektóre z moich poprzednich kodów i obejrzałem jedną z moich tablic administracyjnych, które stworzyłem. Ustawiłem to tak, aby administrator musiał zdefiniować/wprowadzić 2 hasła do swojego konta. Czy to naprawdę jest podwójnie bezpieczne, czy też uległem złudzeniu? Wygląda na to, że naprawdę trudno jest wymusić dopasowanie nazwy użytkownika i 2 haseł po stronie klienta. Mam to ograniczone do 100 prób, psie...


title: Jak sprawić, by zarządzanie nietechniczne było bardziej realistyczne, jeśli chodzi o tworzenie oprogramowania?

text: Zarządzam małym wewnętrznym zespołem programistycznym dla dużej organizacji. Rozwijamy się zarówno dla klientów wewnętrznych, jak i zewnętrznych. Uważam, że niemożliwe jest edukowanie nietechnicznej kadry kierowniczej na temat znaczenia pracy zespołowej, testowania itp. Jednak najtrudniejszą rzeczą jest sprawienie, aby osoby nietechniczne zrozumiały, czego realistycznie oczekiwać od nas w zakresie biegania równoczesne projekty i harmonogramy itp. Zdecydowanie nadal jest to przypadek, w którym ludzie myślą, że wystarczy nacisnąć kilka przycisków, a aplikacje same się zbudują. Czy ktoś zna prosty szablon uzasadnienia biznesowego dla menedżerów nietechnicznych, który uzasadnia inwestycję w czas mojego zespołu?


title: Mobile Web Framework, który kontroluje tylko renderowanie i przejścia stron

text: Od jakiegoś czasu korzystam z jQueryMobile i są w nim pewne rzeczy, które mi się podobają, a innych nie. Najpierw podam trochę tła. Mam lekką aplikację mobilną, która ma kilka konfiguracji i 6 stron. Idealnie chciałbym załadować wszystkie strony do DOM (często wchodzą ze sobą w interakcję i strony będą przełączane z tą samą częstotliwością). Aplikacja będzie publikować dla niektórych JSON co **_n_** sekund i odświeżać wartości na stronie (tak, jest to przede wszystkim aplikacja do wyświetlania informacji). z frameworkiem jQuery Mobile jedyną prawdziwą rzeczą, którą lubię, jest łatwość posiadania ustandaryzowanego interfejsu użytkownika na wszystkich urządzeniach i przeglądarkach, naprawdę nie używam zbyt wiele innych elementów poza frameworkiem, poza podstawową nawigacją po stronie są zaznajomieni z ramami; potrzebuję jedynie wielostronicowego projektu bare-bone). Dlaczego chcę odejść od jQueryMobile, to jego waga. Nie tylko musisz dołączyć bibliotekę mobilną, ale także podstawowe biblioteki jQuery. Nie podoba mi się to, ponieważ nie używam jQuery nigdzie indziej na stronie. Jakieś sugestie dotyczące lekkich frameworków mobilnych, które mają podobny rendering jak jQueryMobile?


title: Blog programisty - Jak często powinienem publikować?

text: Postanowiłem napisać bloga, aby zobaczyć, czy pomoże mi, a może nawet innym, jako programistom, a także pomóc zainwestować w społeczności programistów. Ponieważ dopiero zacząłem, mam mnóstwo pomysłów, ale nie byłem pewien, czy powinienem pisać artykuły o wszystkich tych pomysłach naraz, czy też bardziej regularnie je rozdzielać. Domyślam się, że nie będzie miało znaczenia, jeśli napiszę je szybko, ale obawiałem się, że moje inne treści zostaną utracone za nowszą zawartością i że mógłbym wyczerpać zawartość zbyt szybko, zanim wymyślę więcej tematów. Czy powinienem więc pisać je najszybciej, jak to możliwe, czy publikować je wolniej i regularnie?


title: Dlaczego sygnatury funkcji PHP są tak niespójne?

text: Przeglądałem kilka funkcji PHP i nie mogłem nie zauważyć następujących rzeczy: <?php function foo(&$var) { } foo($a); // $a jest "utworzone" i przypisane do null $b = array(); foo($b['b']); var_dump(array_key_exists('b', $b)); // bool(true) $c = nowa klasa StdClass; foo($c->d); var_dump(właściwość_istnieje($c, 'd')); // bool(true) ?> Zwróć uwagę na funkcję `array_key_exists()` i `property_exists()`. W pierwszym pierwszym parametrem jest nazwa właściwości (klucz dla tablicy), w drugim drugim parametrem. Intuicyjnie można by oczekiwać, że mają podobny podpis. Może to prowadzić do zamieszania, a czas opracowywania może zostać zmarnowany na wprowadzanie tego typu poprawek. Czy PHP lub jakikolwiek inny język nie powinien rozważyć ujednolicenia podpisów powiązanych funkcji?


title: Dzienniki zdarzeń po stronie serwera za pośrednictwem bazy danych lub zapis do pliku?

text: Zajmuję się tworzeniem aplikacji webowej oraz API, z którego korzysta aplikacja webowa. Próbuję ustalić, czy lepiej jest rejestrować zdarzenia (określać ścieżkę, która prowadzi do błędu, a także określić, czy witryna została naruszona) w bazie danych, czy po prostu zapisując do pliku. Z jednej strony nie chcę zapychać mojej bazy danych zapytaniami za każdym razem, gdy muszę zarejestrować błąd. Z drugiej strony nie chcę przekopywać się przez gigantyczny plik dziennika zdarzeń / błędów. Myślę o przejściu w tryb ponownego zapisu, gdy plik/tabela osiągnie 10 000 lub 100 000 zdarzeń. Znam ogólne czynniki, które powinienem wziąć pod uwagę: 1. Wydajność (zarówno DB, jak i ogólne – w moim przypadku używam PHP i Postgresa) 2. Łatwość odnalezienia ścieżki, którą użytkownik wybrał, aby utworzyć błąd (jestem prawie pewne, że DB jest do tego lepsze) 3. Skalowalność - Czy jest to to samo rozwiązanie, którego będę używał z 20 użytkownikami, jak z 100 000 użytkownikami? Czy możesz mi powiedzieć, jak te dwa możliwe rozwiązania pasują do powyższego - naprawdę myślę, że najważniejszym dla mnie jest wydajność. Jak trudne jest zapisywanie do pliku w porównaniu z zapisywaniem do bazy danych i jeśli każde pojedyncze zdarzenie i polecenie wysłane przez użytkownika (a będzie ich wiele) jest rejestrowane (przed limitem ponownego zapisu), które rozwiązanie będzie ostatecznie szybciej?


title: Czy istnieje korelacja między modnymi słowami a umiejętnościami?

text: Właśnie przeszliśmy przez cykl rekrutacyjny i jedną rzeczą, która mnie uderzyła, był fakt, że ankietowani, którzy rzucali w nas każdym modnym słowem na świecie, zwykle oceniali nas najniżej. Daliśmy im prosty problem projektowy i zapytaliśmy, jak do niego podejdą. Ludzie, którzy naszkicowali prosty przebieg procesu na tablicy, byli zazwyczaj tymi, którzy robili wrażenie. Te, które cofnęły się, a potem powiedziały coś w stylu „To wygląda jak typowy wzór xxx. To interesujący paradygmat i prawdopodobnie wymaga przesunięcia fazowego w twojej obecnej metodologii” generalnie nie zrobiły wrażenia.


title: Jakie są zalety BDD dla samodzielnego programisty?

text: Znalazłem te linijki poniżej o zaletach BDD (Behavior Driven Development) > Eksperci dziedzinowi określają, czego potrzebują w programie w sposób, którego > programiści nie mogą błędnie zinterpretować (a przynajmniej nie tak bardzo, jak w większości innych > podejść ). Czy oprócz tego są jeszcze jakieś zalety? Jeśli pracuję sam (nie mam kontaktu z menedżerami, którzy mogliby pisać funkcje BDD), czy muszę używać BDD?


title: Porady dotyczące kariery: zostań przy PHP lub rozpocznij nową karierę w czymś innym (.Net?)

text: Planuję przenieść się do Nowego Jorku za 6-12 miesięcy, więc jestem zmuszona znaleźć nową pracę. Kiedy planuję rozpocząć życie w innym mieście, to chyba też dobry moment, żeby pomyśleć o zmianach w karierze. Znalazłem wiele różnych opinii na temat PHP vs .Net vs Java i to nie jest tutaj temat. Nie chcę rozpoczynać nowej walki o to, który język jest lepszy. Znajomość języka programowania nie jest najważniejsza dla programisty. Aby być naprawdę dobrym programistą, musisz znać OOP, wzorce projektowe, testowanie... a język jest tylko narzędziem, które sprawi, że coś się wydarzy. Wracając do mojego pytania. Mam mieszane doświadczenie w IT - 1 rok jako pomocnik IT (administracja i wsparcie Windows), około 2 lata doświadczenia w programowaniu wbudowanym (VB.Net 2005) i od 2 lat pracuję z PHP/MySQL. Współpracowałem ze sklepem internetowym Magento, asystowałem przy kilku projektach w Symfony, modyfikowałem kilka stron na Drupalu. Moje główne obawy to: 1. Czy nadal podnoszę swoje umiejętności w zakresie PHP m.in. aby zacząć uczyć się niektórych ważnych frameworków PHP, takich jak Zend, Symfony może zdobyć jakiś certyfikat PHP. 2. A może zacznę uczyć się .NET lub Java. Jestem bardziej zaznajomiony z .NET, więc prawdopodobnie wybiorę go, jeśli wybór będzie padł między .NET a Javą (lub możesz mnie przekonać do wyboru Javy :). Jeśli chodzi o karierę, nie wiem, jaki jest najlepszy wybór. Nauka nowego frameworka i języka jest bardziej czasochłonna niż doskonalenie moich dotychczasowych umiejętności w PHP. Ale z .NET masz wiele możliwości (rozwój Windows 7 Phone, Silverlight, WPF) i prawdopodobnie większe szanse na znalezienie lepszej pracy. Według moich badań prace w PHP są gorzej opłacane niż w .NET (popraw mnie, jeśli się mylę). Ale jeśli zacznę teraz z .NET, jestem dopiero początkującym i moja pensja będzie niska. Potrzebuję co najmniej 2 lat doświadczenia w jakimś języku, żeby chociaż spróbować znaleźć pracę, która w Nowym Jorku kosztuje więcej niż 50-60 tys. Moim głównym celem na najbliższe 2-3 lata jest znalezienie pracy w kategorii $60-80k. Nie zrozum mnie źle, nie ścigam tylko pieniędzy, ale pieniądze są ważnym czynnikiem, gdy próbujesz założyć rodzinę. Mam 27 lat i czuję, że nie ma zbyt wiele miejsca na złe decyzje dotyczące mojej kariery, więc każda porada będzie mile widziana. **Aktualizacja** Dziękuję wszystkim za poświęcenie czasu na pomoc w rozwiązaniu mojego problemu. Wszystkie odpowiedzi i komentarze były bardzo pomocne. Postanowiłem pozostać przy PHP, ale także nauczyć się C# i Silverlight 4. Zobaczymy, dokąd zaprowadzi mnie życie.


title: Pomoc w wyjaśnieniu formalnego oświadczenia dotyczącego czasu działania algorytmów

text: Czytam co następuje w książce o algorytmach (a konkretnie Cormena): > To znaczy, że interesuje nas to, jak czas działania algorytmu > wzrasta wraz z rozmiarem danych wejściowych w limicie, jako rozmiar danych wejściowych > wzrasta bez ograniczeń. Nie rozumiem, co oznacza wyrażenie: „z wielkością wejścia w limicie”. Do czego odnosi się limit? **AKTUALIZACJA:** Zwróć uwagę, że w tym miejscu książki (wczesne podstawy rozdziału 2) nie ma formalnej definicji ani wzmianki o dużym O lub innej notacji asymptotycznej, z wyjątkiem niejasnego odniesienia do notacji Theta. Jakaś pomoc?


title: Kiedy byłby najlepszy czas na rozpoczęcie portowania kodu własnego projektu?

text: Jeśli mam osobisty projekt programistyczny, który planuję przenieść w innym języku, aby mógł działać w innych środowiskach, czy lepiej byłoby rozpocząć przenoszenie kodu tak szybko, jak to możliwe i pracować jednocześnie nad dwiema wersjami? A może znacznie spowolniłoby to moją produkcję i czy powinienem poczekać, aż skończę niektóre kluczowe elementy programu?


title: Przekształć formułę matematyczną w kod (przecięcie linia-linia)

text: Mam trudności z przekształceniem formuły matematycznej w kod. Mogę to łatwo rozwiązać na papierze, ale trudno mi przełożyć to na formę kodu. Czy ogólnie można wprowadzić formułę matematyczną _bezpośrednio_ do programu, a jeśli nie, to jak można ją przenieść? Weźmy na przykład twierdzenie Pitagorasa: `a² + b² = c²`. Mając „a” i „b” zdefiniowane w kodzie, łatwo jest zastosować tę formułę. c = sqrt(pow(a, 2) + pow(b, 2)) Obecnie mam trudności z wprowadzeniem do mojego programu przecięcia linia-linia, które rozwiązałem na papierze. Zakładając, że linia jest zdefiniowana jako `L:O + a * D`, można znaleźć przecięcie dwóch linii, ustawiając je jako równe. L1: O1 + a * D1 L2: O2 + b * D2 => O1 + a * D1 = O2 + b * D2 Używając długopisu, miałbym już zdefiniowane wartości i mogę rozwiązać równanie, dzieląc równanie na trzy podrzędne -równania i zastosowanie prostego podstawienia (mam nadzieję, że możesz przeczytać moje pismo odręczne): ![tutaj podaj opis obrazka](http://i.stack.imgur.com/APIIP.jpg) ## Mój aktualny problem... to tego podstawienia nie da się zastosować algorytmicznie, albo nie wiem jak to zrobić. Równanie `L1 = L2` musi zostać przekształcone w uogólnioną formułę, którą można bezpośrednio przetłumaczyć na kod (np. `a² + b² = c²`), ale nie wiem jak. Miałem nadzieję na wyjaśnienie krok po kroku (jako odpowiedź lub link), jak dojść do formuły/algorytmu, którego szukam. Wiem, że istnieje wiele stron internetowych, które opisują przecięcie dwóch linii, ale chciałbym zrozumieć, jak znaleźć algorytm **z matematycznego punktu wyjścia**.


title: TDD — na zewnątrz a od wewnątrz

text: Jaka jest różnica między budowaniem aplikacji **Outside In** a budowaniem jej **Inside Out** przy użyciu TDD? Oto książki, które czytałem o TDD i testowaniu jednostkowym: Test Driven Development: Przykładowe Test-Driven Development: Praktyczny przewodnik: Praktyczny przewodnik Rzeczywiste rozwiązania do tworzenia wysokiej jakości frameworków PHP i aplikacji Test-Driven Development w Microsoft. Wzorce testowe NET xUnit: Refaktoryzacja kodu testowego Sztuka testowania jednostkowego: z przykładami w rozwijającym się oprogramowaniu obiektowym .Net, prowadzonym przez testy\---> Ten był naprawdę trudny do zrozumienia, ponieważ JAVA nie jest moim podstawowym językiem :) Prawie wszyscy wyjaśnili ogólnie podstawy TDD i testowanie jednostkowe, ale z niewielką wzmianką o różnych sposobach tworzenia aplikacji. Kolejną rzeczą, którą zauważyłem, jest to, że większość tych książek (jeśli nie wszystkie) ignoruje fazę projektowania podczas pisania aplikacji. Skupiają się bardziej na szybkim pisaniu przypadków testowych i umożliwieniu, aby projekt pojawił się sam. Jednak natknąłem się na akapit we wzorcach testowych xUnit, który omawiał, w jaki sposób ludzie podchodzą do TDD. Istnieją dwie szkoły **Na zewnątrz** i **Na zewnątrz**. Niestety książka nie rozwija więcej na ten temat. Chciałbym wiedzieć, jaka jest główna różnica między tymi dwoma przypadkami. Kiedy powinienem używać każdego z nich? Dla początkującego TDD, który z nich jest łatwiejszy do zrozumienia? Jakie są wady każdej metody? Czy są jakieś materiały, które omawiają ten temat konkretnie?


title: Budowanie frameworka RPC

text: Jestem ciekawy, co jest potrzebne do zbudowania prostego i solidnego frameworka RPC. Przyjrzałem się tylko kilku frameworkom ruby, ale wszystkim im w jakiś sposób brakuje. To, czego chcę od frameworka RPC, to jakiś mechanizm rejestracji/odkrywania i prosta architektura wtyczek. Prawie wszystkie frameworki udostępniają prosty mechanizm wtyczek, ale nie znalazłem takiego, który zapewnia prosty mechanizm wykrywania. Jedynym, który zapewnia coś w zakresie odkrywania, jest MCollective, ale ma on swój własny zestaw problemów, na które natknąłem się, próbując go używać w pracy. Więc jak trudno byłoby zbudować jeden od podstaw przy użyciu gniazd tcp, a może 0MQ? Jakieś problemy, o których powinienem wiedzieć przed rozpoczęciem tego projektu?


title: Projekt RowKey NoSQL (Azure Table Storage) dla uporządkowanych danych

text: Przechowuję duże ilości danych GPS w tabelach do przechowywania. Każda partycja może dotrzeć do 1 miliona podmiotów. Każda jednostka GPS wstawiona do tabeli jest w rzeczywistości sekwencyjna względem poprzednio wprowadzonych danych, więc kolejność ma znaczenie. Czasami muszę wykonać następujące zapytanie: > _**Pobierz poprzednie/następne 3 jednostki GPS z bieżącej jednostki (w obrębie tej samej partycji)._** Opcje dla projektu RowKey: 1. **Utwórz inkrementującą liczbę całkowitą. ** Ale jak mogę śledzić aktualny rozmiar tabeli? Nie ma sposobu, aby uzyskać liczbę wierszy tabeli lub uzyskać ostatnio wstawiony wiersz. 2. **Użyj DateTime Ticks.** Ale jak uzyskać poprzednią/następną encję za pomocą tików? Używam zestawu SDK w wersji 2.0 w C#.


title: Nie otrzymujesz wynagrodzenia za przepracowane godziny?

text: Czytałem więc z poprzedniego wątku o tworzeniu aplikacji vs. Tworzenie gier: Jeśli miałbyś wybrać Tworzenie gier vs Tworzenie aplikacji, co wybierzesz? Co zaprowadziło mnie na tę stronę: EA: The Human Story Wiele z nich mówiło o programistach pracujących około 85 godzin tygodniowo i nieotrzymujących wynagrodzenia za nadgodziny, czy coś takiego. Dostaję zapłatę za 40 godzin. Czy to normalne w przypadku większości producentów oprogramowania? Mam na myśli to, że tam, gdzie pracuję, jestem tylko początkującym facetem, ale dostaję nadgodziny i wszystko powyżej 40 godzin jest uważane za to. Ale skłoniło mnie to do myślenia „Cholera jasna”, nigdy nie mógłbym tego zrobić. Mój WOLNY czas jest dla mnie ważny. Ale czy jest to powszechne w większości firm programistycznych? A może jest to raczej rzadkość dla niektórych typów (tworzenie gier itp.)? Bo mnie to przestraszyło! Jak rozumiem, że muszę poświęcić kilka dodatkowych godzin na projekt ... ale jak 80! to niedorzeczne.


title: Jaki jest najlepszy sposób na nauczenie się tworzenia bezpiecznych aplikacji?

text: Chciałbym zająć się bezpieczeństwem komputerowym w mojej karierze. Jakie są najlepsze sposoby na nauczenie się bezpiecznego programowania? Wydaje mi się, że oprócz podręczników i zajęć z tego przedmiotu, być może nauka „hakowania” byłaby jednym z najlepszych sposobów na naukę. Powodem, dla którego tak myślę, jest myśl, że najlepszym sposobem na nauczenie się, jak powstrzymać kogoś przed robieniem tego, czego nie chcesz, jest poznanie tego, co jest w stanie zrobić. Jeśli tak jest, to pojawia się kolejne pytanie: Jak byś podszedł do nauki hackowania w sposób etyczny? Zdecydowanie nie chcę łamać prawa ani wyrządzać krzywdy w moich poszukiwaniach.


title: Ankieta dotycząca frameworków internetowych Haskell

text: Istnieje kilka frameworków internetowych dla Haskella, takich jak Happstack, Snap i Yesod, a prawdopodobnie jeszcze kilka. W jakich aspektach różnią się od siebie? Na przykład: * funkcje (np. tylko serwer lub skrypty klienckie, łatwa obsługa różnych rodzajów baz danych) * dojrzałość (np. stabilność, jakość dokumentacji) * skalowalność (np. wydajność, poręczna abstrakcja) * główne cele Również, jakie są przykłady rzeczywiste witryny/aplikacje internetowe korzystające z tych platform? Wielkie dzięki.


title: Co zwrócić z metodami Async CRUD

text: Chociaż istnieje podobne pytanie skupione na Javie, dyskutowałem z wykorzystaniem obiektów Task. Jaki jest najlepszy sposób obsługi zwrotów z metod CRUD (i podobnych)? Typowe zwroty, które widzieliśmy na przestrzeni lat to: * Void (brak zwrotu, chyba że istnieje wyjątek) * Boolean (Prawda w przypadku sukcesu, Fałsz w przypadku niepowodzenia, wyjątek w przypadku nieobsłużonego błędu) * Int lub GUID (Zwraca identyfikator nowo utworzonych obiektów, 0 lub null w przypadku niepowodzenia, wyjątek w przypadku nieobsłużonego niepowodzenia) * Zaktualizowany obiekt (wyjątek w przypadku niepowodzenia) * Obiekt wynikowy (obiekt zawierający identyfikator manipulowanego obiektu, pole logiczne lub status ze wskazanym sukcesem lub niepowodzeniem, informacje o wyjątku, jeśli taki wystąpił, itd.) Obawa pojawia się, gdy zaczęliśmy przenosić się do korzystania z funkcji asynchronicznej C# 5, a to zrodziło pytanie, jak powinniśmy obsługiwać zwroty CRUD na dużą skalę. W naszych systemach mamy wszystkiego po trochu w odniesieniu do tego, co zwracamy, chcemy, aby te zwroty były ustandaryzowane... Teraz pytanie jaki jest zalecany standard? Czy istnieje jeszcze zalecany standard? (Zdaję sobie sprawę, że musimy określić nasz standard, ale zazwyczaj robimy to, patrząc na najlepsze praktyki, sprawdzając, czy ma to dla nas sens, i od tego momentu, ale tutaj nie znajdujemy zbyt wiele do pracy)


title: Zbliżamy się do SICP w Clojure zamiast w Scheme

text: Jestem studentem trzeciego roku studiów licencjackich w programie inżynierii oprogramowania i wpadłem na pomysł przeczytania SICP doradcy, aby uzyskać głębsze i bardziej fundamentalne zrozumienie zasad kryjących się za całym tym oprogramowaniem, które tworzymy. Zasugerował, aby nie uczyć się Scheme, aby ukończyć książkę (ponieważ nie jest to tak powszechne, jak współczesne dialekty Lisp), ale zamiast tego wykonać ćwiczenia w Clojure. To już trudna książka, jeśli spróbuję jej ćwiczeń w bardziej nowoczesnym Clojure, jak to zadziała? Na przykład nie mogę znaleźć żadnych prawdziwych rozwiązań, składnia, której uczą dla Scheme, jest inna itp.


title: Wskaźniki ANSI C uszkodzone wartości

text: Pracuję nad ANSI C i mam pewne problemy ze wskaźnikami. To znaczy, że po punkcie w moim programie wartości wskaźnika zmieniają się bez mojej ingerencji, jest to coś w rodzaju nadpisywania ich. Wiem, że może się to zdarzyć w C, ale będąc początkującym, nie mogę znaleźć na to lekarstwa. Czy istnieje prosty sposób na rozwiązanie tego problemu? Jak rozumiem, wiele osób zmierzy się z podobnymi problemami. Dziękuję wam za odpowiedzi, były bardzo pomocne, rzeczywiście problem z pamięcią został rozwiązany przez przydzielenie większych bloków pamięci !!! Jeszcze raz dziękuję!!!!


title: Następna potęga 2 dla liczby (w poszukiwaniu lepszego sposobu na „bit-twidling”)

text: Zastanawiam się tylko, czy istnieje _lepszy_ (tj. szybszy?) sposób na uzyskanie następnej potęgi 2 dla danej liczby niż następna (może jakiś _lepszy_ rodzaj hackowania "bit-twiddling" jest możliwy?) ... static size_t npow2 (rozmiar_t n) { n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; powrót n + 1; } Dziękuję za twoje pomysły.


title: Importowanie danych z Google Analytics

text: Planuję zbudować aplikację internetową z wieloma różnymi publicznymi serwerami HTTP; na każdym z nich będzie zainstalowany Google Analytics (GA). Chciałbym stworzyć aplikację "dashboard", która konsoliduje dane GA na jednym ekranie. Przeglądałem dokumentację tego tak zwanego GA API, ale nie mogę powiedzieć, jaki jest efekt końcowy GA API: * Czy GA API pozwala mi robić dokładnie to, czego oczekuję? Lub... * Czy API GA robi coś zupełnie innego (np. pozwala mi udostępniać moje dane w Google+ lub coś innego dziwnego) Ponieważ API może być używane do CRUD wszelkiego rodzaju danych, myślę, że pytam, w jaki sposób GA API idzie: czy służy do odpytywania (odczytywania) danych z 1 instancji serwera, czy do modyfikowania danych na tych serwerach lub gdzie indziej? Z góry dziękuję!


title: W jakiej kolejności tworzysz warstwy programu?

text: Podobało mi się pytanie o ulubioną warstwę programu: Jaka jest twoja ulubiona warstwa programu do pracy? W jakiej kolejności je budujesz, czy też różni członkowie zespołu jednocześnie opracowują odpowiadające im części?


title: Co to są odroczone wywołania zwrotne?

text: Rozumiem ideę wywołania zwrotnego, w którym przekazuję funkcję do innej funkcji, a następnie ta funkcja korzysta z dostarczonej funkcji do woli. Mam problemy ze zrozumieniem odroczonych wywołań zwrotnych, nawet po googlowaniu. Czy ktoś mógłby podać proste wyjaśnienie, proszę? Programuję w Ruby, ale znam też trochę C/C++, ale przede wszystkim byłem doświadczonym programistą asemblerowym. Zastanawiam się więc, czy jest to trochę jak stos adresów wywołań zwrotnych, które są wyskakiwane? Mam nadzieję, że nauczę się jquery lub node.js, a te odroczone wywołania zwrotne wydają się integralną częścią obu. Rozumiem podstawowe zasady wątkowania (choć obiekt mutex przyprawia mnie o ból głowy ;)


title: Programowanie oparte na testach dla złożonych gier

text: W wolnym czasie koduję grę, ale w programowaniu nadal jestem początkującym. Przykro mi, jeśli to pytanie jest nie na temat lub jeśli okaże się, że nie pomoże nikomu innemu, ale miejmy nadzieję, że tak będzie. Spędziłem dużo czasu czytając książki o projektowaniu kodu, a także różnych metodologiach i podejściach do kodowania. W trakcie tych badań ciągle spotykam się z koncepcją Test Driven Development. Ludzie, którzy opowiadają się za tym pomysłem, zwykle wydają się bardzo pasjonatami. Wierzę, że może to pomóc w szybkości i wydajności pisania oprogramowania. Czas jest bardzo cennym zasobem, więc wolałbym nauczyć się robić wszystko jak najlepiej, niż przedzierać się bez poszerzania wiedzy o rzemiośle programistycznym. W każdym razie, być może dlatego, że jestem początkującym, nie wyobrażam sobie, jak zastosować programowanie oparte na testach w grach. Znalazłem kilka artykułów na ten temat, ale nie były one zbyt pomocne. Większość przykładów testów jednostkowych, które widziałem, to bardzo proste przykłady schematów lub przykłady z oprogramowania, które wcale nie przypomina gry. W moim własnym kodowaniu staram się podejść do tego z podobnym nastawieniem do programowania opartego na testach, chociaż jestem pewien, że nie kwalifikuje się to jako TDD. Piszę minimalną ilość kodu, aby spróbować zaimplementować jakąkolwiek funkcję, którą dodaję do gry, a następnie natychmiast testuję grę, aby sprawdzić, czy działa. Jeśli coś nie dzieje się tak, jak zamierzałem, natychmiast wprowadzam zmiany, aby zbliżyć się do tego, czego chcę. Jeśli nie działa lub jest uszkodzony i nie mogę znaleźć błędów, czytając kod, przechodzę przez metody w debugerze, aż znajdę nieoczekiwane zachowanie, a następnie je usuwam. To, co próbuję powiedzieć, to to, że ciągle testuję grę, prawie po każdej kolejnej zmianie. Testowanie napędza mój rozwój. „Test jednostkowy” tkwi w mojej głowie, bo np. wiem, co ma robić jednostka w mojej grze, więc testuję, żeby się upewnić, że to robi, a jeśli nie, to od razu staram się to naprawić . Przejdźmy do mojego aktualnego pytania. Jak napisać testy jednostkowe dla złożonej gry? Przez złożoność mam na myśli wiele wyłaniających się aspektów rozgrywki, takich, że mięso rozgrywki wyłania się z interakcji między wieloma różnymi elementami w grze w połączeniu z wyborami gracza. Na przykład RPG typu roguelike z proceduralnym światem. Jakie testy jednostkowe można by napisać dla takiej gry? Jak można zastosować programowanie oparte na testach do takiej gry?


title: Mam stary projekt, nad którym pracuję, jak powinienem poprawić jego strukturę?

text: Mam nieco stary projekt PHP, nad którym pracuję dla klienta (myślę, że został uruchomiony około 5 lat temu), w dużym stopniu korzysta z przestarzałej funkcji `mysql_query`, co jest nie tylko dlatego, że jest przestarzałe, ale także dlatego, że może również otworzyć dziury w zabezpieczeniach. Projekt wydaje się też nie mieć zbyt wiele struktury, myślę, że oryginalny programista miał jakąś metodę podczas pracy nad nim, ale nie ma dokumentacji i nie jestem w stanie skontaktować się z nim w sprawie wspomnianego projektu. W trakcie przerabiałem zapytania do bazy danych na PDO i próbowałem trochę posprzątać, ale to dość duży projekt (kilkaset plików php) i nie chcę też wydawać dużo czasu na restrukturyzację tego wszystkiego odciąga od czasu, jaki został mi przydzielony na to każdego miesiąca. Co powinienem zrobić? Czy przepisanie byłoby dobrym pomysłem? A może powinienem po prostu spróbować przerobić obecny projekt na coś ładniejszego?


title: Kwadratowe ikony Androida

text: Utworzyłem ikonę paska akcji dla aplikacji na Androida, nad którą pracuję i wydaje się, że zmniejsza moją ikonę. Chodzi o to, że to nie jest kwadratowa ikona. Szerokość jest większa niż wysokość. Czy naprawdę MUSZĘ podać kwadratowe ikony, czy istnieje obejście tego problemu? Naprawdę nie chcę rezygnować z moich ikon tylko z tego powodu...


title: Jakie są kluczowe różnice między obsługą OOP w Javie i Pythonie?

text: Jedynym językiem, jakiego kiedykolwiek używałem, jest Java. Bardzo mi się podoba, ale zdecydowałem, że czas nauczyć się innego języka :) . Interesuje mnie nauka Pythona. Wydaje się, że to dobry wybór, ponieważ jest częściowo podobny do Javy (np. obsługa OOP oparta na pełnej klasie), a częściowo bardzo różny (np. typowany dynamicznie). Czytałem kilka samouczków i zaczynam uczyć się podstaw. Niektóre z tego, co do tej pory przeczytałem, są mylące i zaczynam myśleć, że być może istnieją poważne różnice w implementacji OOP w tych dwóch językach. Chcę mieć jasny obraz tego: proszę wyjaśnić kluczowe różnice w obsłudze OOP między dwoma językami.


title: Asynchroniczny język sieciowy

text: Szukam odpowiedniego sposobu na wykonywanie zapytań internetowych do baz danych i wyświetlanie wyników w czasie rzeczywistym. Dane będą używane w interfejsie dla personelu, więc nie może być żadnych blokad ani opóźnień, ponieważ czas jest kluczowym czynnikiem. Do tej pory używałem PHP na zapleczu systemu. Jednak teraz, kiedy doszedłem do interfejsu, trochę utknąłem. Javy (android) używałem wcześniej asynchronicznie, a najlepiej po podobnej metodzie przetwarzania wywołań. Z tego co wyczytałem nie ma obecnie sposobu na używanie php naprawdę asynchronicznie. **Jaki** jest dobry język internetowy do tego celu? lub jakie są moje dostępne opcje?


title: Czy podczas rozmowy kwalifikacyjnej lepiej jest zakodować brutalne rozwiązanie trudnego pytania, czy też poświęcić rozmowę na dokładne zbadanie pytania?

text: Czasami pytania podczas rozmowy kwalifikacyjnej są trudne, niezależnie od tego, czy osoba przeprowadzająca rozmowę ma taką intencję, czy nie. Może to sprowadzać się do wyboru, czy wykorzystać ograniczony czas rozmowy, aby zakodować brzydkie, nieefektywne, brutalne rozwiązanie, czy też spędzić czas na zrozumieniu każdego aspektu problemu z ankieterem. Na przykład problem 91 w Project Euler można rozwiązać za pomocą niezbyt trudnego rozwiązania siłowego polegającego na obliczeniu każdego możliwego trójkąta, napisaniu testu isRightTriangle() i złożeniu wszystkich trójkątów, które przeszły test, do zestawu. Ale dwie pary współrzędnych X/Y tworzą rozwiązanie O(x^4) o wysokiej stałej wartości. Przyjaciel i ja właśnie wymyśliliśmy rozwiązanie, które jest znacznie bardziej eleganckie i wydajne, ale spędziliśmy nad nim 3 godziny i narysowaliśmy dziesiątki diagramów, przetestowaliśmy wiele formuł, zbadaliśmy wiele podejść itp. Nie każde pytanie podczas rozmowy kwalifikacyjnej jest sprawiedliwe . Również to, co jest łatwe dla jednej osoby, może być trudne dla innej. Jeśli ktoś zmaga się z pytaniem, czy byłbyś pod większym wrażeniem brutalnego, brzydkiego rozwiązania, które działa? Lub doskonałe zrozumienie problemu i dążenie do eleganckiego rozwiązania, ale bez kodowanego rozwiązania? Czy istnieje zasada, że po 20 minutach powinieneś po prostu zacząć kodować bez względu na wszystko?


title: Jak wymusić ocenę w Haskell?

text: Jestem stosunkowo nowy w Haskell i próbuję nauczyć się, jak różne akcje można wykonywać po kolei za pomocą notacji do. W szczególności piszę program do testu porównawczego algorytmu (funkcji) foo :: [String] -> [String] W tym celu chciałbym napisać funkcję taką jak import System.CPUTime benchmark :: [String] -> IO Integer benchmark inputList = do start <- getCPUTime let r = foo inputList end <- getCPUTime return (end - start) -- Wymagana możliwa konwersja. Ostatnia linia może wymagać przeliczenia (np. na milisekundy), ale to nie jest temat tego pytania. Czy jest to właściwy sposób mierzenia czasu potrzebnego do obliczenia funkcji foo na jakimś argumencie inputList? Innymi słowy, czy wyrażenie `foo inputList` zostanie całkowicie zredukowane przed wykonaniem akcji `end <- getCPUTime`? Czy też `r` będzie powiązany tylko z thunk `foo inputList`? Mówiąc ogólnie, jak mogę zapewnić, że wyrażenie zostanie całkowicie ocenione przed wykonaniem jakiejś akcji?


title: Dlaczego F# Core definiuje ogólne typy tablic?

text: Właśnie zauważyłem, że przestrzeń nazw FSharp.Core zawiera ogólne typy tablic o maksymalnie 4 wymiarach, tj. Core.[]<'T>, Core.[,]<'T> itp. C# i VB wydają się dobrze sobie radzić z System.Array — chociaż nie jest dla mnie jasne, w jaki sposób radzą sobie z obsługą silnie typowanych wyspecjalizowanych typów tablic, takich jak int[], string[]. Wydaje mi się, że staje się to wtedy dwoma pytaniami: * W jaki sposób C# obsługuje silnie wpisane wyspecjalizowane typy tablic, takie jak int[] oparte na nieogólnym System.Array? * Biorąc pod uwagę, że C# udaje się to zrobić, dlaczego F# definiuje ogólne typy tablic?


title: Jak przetestowałbyś funkcję „Wyznacz trasę” w Mapach Google?

text: (Wyobrażam sobie, że byłoby to dobre pytanie podczas rozmowy kwalifikacyjnej, ale w moim przypadku jest bardziej pragmatyczne.) Mamy dużą i złożoną aplikację, która modeluje niezwykle długi i wyrafinowany proces reakcji chemicznej między dziesiątkami składników chemicznych. Jesteśmy na etapie projektowania Testów Akceptacyjnych dla aplikacji, ale nieco zniechęca nas niewykonalna liczba możliwych ścieżek testowania. Przyszło mi do głowy, że nasza sytuacja jest bardzo podobna do tego, z czym musiał się zmierzyć zespół programistów Google Maps, gdy przyszedł czas na przetestowanie algorytmu planowania trasy w funkcji „Wyznacz trasę”. Oczywiście nie mogli przetestować (zweryfikować i zweryfikować) każdej możliwej trasy. Jak więc nabrali pewności, że ich aplikacja zadziała w każdej sytuacji? A ponieważ nie oczekuję, że dowiem się, jak _oni_ to zrobili, pozwólcie, że zapytam: jak _być_ zaprojektować zestaw testów z odpowiednim pokryciem kodu, aby upewnić się, że dana aplikacja jest solidna - kiedy jest to dosłownie niemożliwe zbadać każdą potencjalną ścieżkę w systemie? To, czego szukam, to zasady, których użyłbyś do rozbicia trudnego do rozwiązania problemu na mniejsze, wykonalne części, których suma daje zadowalające oszacowanie całości: „Nie mogę przetestować wszystkiego, ale mogę to przetestować , to i to – i to wystarczy”. Nie szukam podejścia, które jest "potwierdzone, poprawne", ale raczej takie, które jest _rozważne_ , biorąc pod uwagę ograniczenia budżetowe/czasowe w świecie rzeczywistym. (Używam przykładu Google Maps jako czegoś w rodzaju folii, aby uzyskać odpowiedzi, które są tak konkretne, jak to możliwe.)


title: Przekazywanie funkcji do innych funkcji jako parametrów, zła praktyka?

text: Jesteśmy w trakcie zmiany sposobu, w jaki nasza aplikacja AS3 komunikuje się z naszym zapleczem i jesteśmy w trakcie wdrażania systemu REST, który ma zastąpić nasz stary. Niestety programista, który rozpoczął pracę, jest teraz na długoterminowym zwolnieniu lekarskim i został mi przekazany. Pracuję nad tym przez ostatni tydzień i rozumiem ten system, ale jest jedna rzecz, która mnie martwi. Wydaje się, że jest dużo przekazywania funkcji do funkcji. Na przykład nasza klasa, która wykonuje wywołanie do naszych serwerów, przyjmuje funkcję, którą następnie wywoła i przekaże obiekt, gdy proces jest zakończony i błędy zostały obsłużone itp. Daje mi to „złe przeczucie”, w którym czuję, że jest okropna praktyka i mogę wymyślić kilka powodów, ale chcę mieć jakieś potwierdzenie, zanim zaproponuję przeróbkę systemu. Zastanawiałem się, czy ktoś miał jakieś doświadczenie z tym możliwym problemem?


title: Czy rubin żelazny w Silverlight jest realną alternatywą dla C#?

text: Słyszałem dużo szumu na temat języków Iron.. Piszę głównie linie aplikacji biznesowych w c# i nie podoba mi się obecnie c#. Czy IronRuby jest wystarczająco dojrzały i szybki, aby można go było teraz używać w Silverlight? A może dostanę telefon w środku nocy od rozzłoszczonego klienta, ponieważ aplikacja Silverlight, od której zależą, jest błędna/niezbyt powolna?


title: W jakim języku został utworzony program Visual Studio 2010?

text: Aby wyprodukować wtyczkę i łatwo ją włączyć (scalić) z Visual Studio 2010. Zastanawiałem się, w jakim języku Microsoft ją stworzył? Aby zaoferować nasz produkt firmie Microsoft, musimy wiedzieć, który język lepiej zintegrować z Visual Studio. Czy to czysty C++? Mój przyjaciel powiedział mi, że jest napisany w C#.


title: Czy Twoje fizyczne środowisko programistyczne jest zorganizowane?

text: Więc pytanie brzmi: gdziekolwiek usiądziesz i wykonasz swoją magię, czy jest to schludne i zorganizowane, czy też chaotyczne i w nieładzie? Czy uważasz, że Twój poziom organizacji jest zgodny liniowo z Twoją obecną pozycją w projekcie? (tj. projekt jest na dobrej drodze, a życie jest dobre, kilka błędów i ważne kamienie milowe zostały osiągnięte, biurko jest wystarczająco czyste, aby wykonać operację mózgu lub projekt jest daleko od toru, błędy latają wszędzie, a moje biurko to śmietnik)


title: Czy uważasz, że to dobry pomysł, aby inżynierowie oprogramowania musieli przez jakiś czas pracować jako inżynierowie zapewniania jakości?

text: Wierzę, że tak. Czemu? 1. Spotkałem wielu inżynierów oprogramowania, którzy uważają, że są w jakiś sposób lepsi od inżynierów QA. Myślę, że może pomóc ugasić to przekonanie, jeśli przez jakiś czas będą wykonywać pracę inżyniera QA i zdadzą sobie sprawę, że jest to unikalny i cenny zestaw umiejętności. 2. Im lepiej inżynier oprogramowania testuje własne programy, tym mniej czasu ponosi jego kod podczas przechodzenia przez resztę cyklu życia oprogramowania. 3. Im więcej czasu inżynier oprogramowania spędza na myśleniu o tym, jak program może się zepsuć, tym częściej bierze pod uwagę te przypadki podczas ich tworzenia, redukując w ten sposób błędy w produkcie końcowym. 4. Definicja „kompletności” opracowana przez inżyniera oprogramowania jest zawsze interesująca... jeśli spędził trochę czasu jako inżynier ds. kontroli jakości, może ta definicja będzie bardziej pasowała do definicji projektanta oprogramowania. Zauważ, że powyższą sugestię robię z myślą o krótkim czasie, ponieważ zdaję sobie sprawę, że ktoś pracuje na stanowisku, które nie jest stanowiskiem, na które jest zatrudniony, jest zdecydowanie receptą na utratę tego programisty. Co wszyscy myślicie?


title: Struktura projektu: gdzie umieścić logikę biznesową

text: Przede wszystkim nie pytam gdzie jest logika biznesowa. To było zadawane wcześniej i większość odpowiedzi, które przeczytałem, zgadza się, że należy do modelu: Gdzie umieścić logikę biznesową w projekcie MVC? Jaka część logiki biznesowej powinna istnieć w warstwie kontrolera? Jak dokładna jest „Logika biznesowa powinna być w usłudze, a nie w modelu”? Po co umieszczać logikę biznesową w modelu? Co się stanie, jeśli mam kilka rodzajów pamięci? Jednak ludzie nie zgadzają się co do sposobu, w jaki ta logika powinna być rozłożona na klasy. Wydaje się, że istnieją trzy główne nurty myślowe: 1. Gruby model z logiką biznesową wewnątrz klas ~~entity~~. 2. Anemiczny model i logika biznesowa w klasach "Service". 3. To zależy. Wszystkie są dla mnie problematyczne. Pierwsza opcja jest tym, czego trzyma się większość Fowlerites. Problem z grubym modelem polega na tym, że czasami funkcja logiki biznesowej jest nie tylko powiązana z klasą, ale zamiast tego używa kilku innych klas. Jeśli na przykład tworzymy sklep internetowy, powinna istnieć funkcja obliczająca sumę zamówienia. Moglibyśmy pomyśleć o umieszczeniu tej funkcji w klasie Order, ale tak naprawdę logika musi korzystać z różnych klas, nie tylko danych zawartych w klasie Order, ale także w klasie User, klasie Session i może Tax klasa, klasa kraju lub karta podarunkowa, płatność itp. Niektóre z tych klas mogą znajdować się w klasie zamówienia, a inne nie. Przepraszam, jeśli przykład nie jest zbyt dobry, ale mam nadzieję, że rozumiesz, o co mi chodzi. Umieszczenie takiej funkcji w klasie Order złamałoby zasadę pojedynczej odpowiedzialności, dodając niepotrzebne zależności. Logika biznesowa byłaby rozproszona w klasach encji, co utrudniałoby jej znalezienie. Druga opcja to ta, którą zwykle stosuję, ale po wielu projektach nadal mam wątpliwości, jak nazwać klasę lub klasy trzymające logikę biznesową. W mojej firmie zwykle tworzymy aplikacje działające offline. Użytkownik jest w stanie wykonywać całe transakcje w trybie offline, więc wszystkie walidacje i reguły biznesowe powinny być zaimplementowane w kliencie, a wtedy zwykle istnieje wątek w tle, który synchronizuje się z serwerem. W każdym projekcie mamy więc zwykle następujące klasy/pakiety: * Model danych (DTO) * Warstwa dostępu do danych (trwałość) * Warstwa usług sieci Web (zwykle jedna klasa na WS i jedna metoda na metodę WS). Teraz, jeśli chodzi o logikę biznesową, jakie jest standardowe podejście? Jedna klasa trzymająca całą logikę? Wiele zajęć? (jeśli tak, jakie kryteria są używane do dystrybucji logiki między nimi?). A jak je nazwać? FooManager? FooService? (Wiem, że ta ostatnia jest powszechna, ale w naszym przypadku jest to złe nazewnictwo, ponieważ warstwa WS zwykle zawiera klasy o nazwie FooWebService). Trzecia opcja jest prawdopodobnie właściwa, ale jest też pozbawiona jakichkolwiek przydatnych informacji. Podsumowując: * Nie podoba mi się pierwsze podejście, ale zgadzam się, że mogłem nie być w stanie w pełni zrozumieć jego zen. Jeśli więc opowiadasz się za modelami grubymi jako jedynym i uniwersalnym rozwiązaniem, zapraszamy do zamieszczania linków wyjaśniających, jak zrobić to we właściwy sposób. * Chciałbym wiedzieć, jakie są standardowe konwencje projektowania i nazewnictwa dla drugiego podejścia w językach OO. W szczególności nazwy klas i struktura pakietów. Byłoby również pomocne, gdybyś mógł dołączyć linki do projektów Open Source pokazujących, jak to się robi. Z góry dziękuję.


title: Jak mogę ocenić, czy projekt jest szczególnie złożony, czy po prostu powoli go podnoszę?

text: Robię niewielkie postępy w dużym projekcie. Źródło jest ogromne, wiele warstw obiektów, kod makaronu, podwójne diamentowe wykresy wielokrotnego dziedziczenia, niedopracowane funkcje zamrożone po odejściu oryginalnego autora i nikt nie wie, dlaczego wiele jego fragmentów zostało zaprojektowanych tak, jak było. Przypuszczam więc, że każdy kompetentny programista miałby problem z rozpracowaniem tego wszystkiego na tyle dobrze, aby naprawić błędy, dokończyć niedopracowane rzeczy i dodać nowe funkcje. Ale podejrzewam, że idę wolniej niż typowy programista. Jak ocenić, czy źródło jest wyjątkowo złe, a ja po prostu radzę sobie tak dobrze, jak ktokolwiek mógłby, w przeciwieństwie do źródła typowego dla takiego projektu, a ja jestem po prostu nierozgarnięty lub niewystarczająco wykwalifikowany?


title: Czy powinienem używać WADL do opisywania mojego RESTful API?

text: Mam zamiar rozpocząć projekt, który w szerokim zakresie wykorzystuje podejście zgodne z RESTful. Oznacza to, że wykorzystuje HATEOAS i udostępnia zasoby w sposób, który pozwala na ogólną eksplorację przez klienta. Chciałbym zapewnić opis moich punktów końcowych w sposób, który umożliwiłby automatyczne generowanie aplikacji klienckich w wielu różnych językach. Rozumiem, że w przypadku usług internetowych opartych na SOAP mogę używać WSDL i że najwyraźniej istnieje WSDL2, który zapewnia lepszą definicję czasowników HTTP używanych z REST. Jednak widzę wiele artykułów poruszających się tam iz powrotem na temat jego użyteczności. Czy więc powinienem używać WADL, aby umożliwić zewnętrznym generatorom kodu szybkie zbudowanie klienta dla mojej aplikacji internetowej, czy też jest oczekiwany lepszy standard?


title: Jak zrefaktoryzować niezliczoną ilość podobnych klas

text: Mam do czynienia z podobnymi klasami A1, A2, ..., A100. Wierzcie lub nie, ale tak, jest około stu klas, które wyglądają prawie tak samo. Żadna z tych klas nie jest testowana jednostkowo (oczywiście ;-) ). Każda z tych klas to około 50 linijek kodu, co samo w sobie nie jest zbyt wiele. Wciąż jest to zbyt dużo zduplikowanego kodu. Rozważam następujące opcje: 1. Pisanie testów dla A1, ..., A100. Następnie dokonaj refaktoryzacji, tworząc abstrakcyjną klasę bazową AA. _Pro_ : Jestem (prawie) całkowicie bezpieczny dzięki testom, że nic nie idzie źle. _Con_: Dużo wysiłku. Powielanie kodu testowego. 2. Pisanie testów dla A1, A2. Wyabstrahowanie zduplikowanego kodu testu i użycie abstrakcji do stworzenia pozostałych testów. Następnie utwórz AA jak w 1. _Pro_: Mniejszy wysiłek niż w 1, ale z zachowaniem podobnego stopnia bezpieczeństwa. _Con_ : Uważam, że uogólniony kod testowy jest dziwny; często wydaje się… niespójny (czy to właściwe słowo?). Zwykle wolę wyspecjalizowany kod testowy dla specjalistycznych klas. Ale to wymaga dobrego projektu, który jest moim celem całej tej refaktoryzacji. 3. Najpierw pisanie AA, testowanie go z klasami mock. Następnie dziedziczenie kolejno A1, ..., A100. _Pro_ : Najszybszy sposób na wyeliminowanie duplikatów. _Con_ : Większość klas Ax wygląda bardzo podobnie. Ale jeśli nie, istnieje niebezpieczeństwo zmiany kodu poprzez dziedziczenie po AA. 4. Inne opcje... Na początku wybrałem 3. ponieważ klasy Axe są do siebie bardzo podobne. Ale teraz nie jestem pewien, czy jest to _właściwa_ droga (z perspektywy entuzjastów testów jednostkowych).


title: Parsowanie źródła witryny

text: Chcę utworzyć aplikację i może przesłać ją do sklepu Play, ale nie jestem pewien, czy to, co robi moja aplikacja, jest legalne, czy nie. Pobieram źródło strony ze strony internetowej, aby uzyskać potrzebne informacje. Na przykład, jeśli ściągnę stronę o piosence „Ramble On” Led Zeppelin i przeanalizuję źródło tej strony, aby uzyskać nazwę utworu, może link do obrazu i tekstu. Czy byłoby to nielegalne, czy też mogę wyświetlać te informacje moim użytkownikom bez żadnych problemów? Witryna mówi również, że jest to „otwarty styl „wiki” […]. Jest całkowicie zbudowany przez użytkowników takich jak ty i używany codziennie przez fanów i programistów”.


title: Ilość roboczogodzin na napisanie sieci społecznościowej

text: Mam wielkie marzenia o napisaniu kolejnego Facebooka (nierealistyczne, wiem) i jestem w fazie planowania, gdy mówimy, i mam ochotę użyć do tego frameworka php i ile godzin rozwoju by mi to zaoszczędziło. Jeśli w ogóle? Czy nierealistyczne jest też, aby jedna osoba samodzielnie kodowała całą sieć społecznościową? Jaka jest największa aplikacja, którą ktokolwiek sam napisał? Powinienem również zaznaczyć, że mam pracę dzienną, więc jest to późne noce i wieczory. I partnerki w ciąży do radzenia sobie :)


title: C++ XML Parsing: Sugestie dotyczące podejścia do analizowania i przechowywania danych

text: Zastanawiam się nad stworzeniem aplikacji C++ do parsowania xml (przy użyciu frameworka rapidxml) i chciałbym uzyskać porady, jak do tego podejść. Plik, który chcę przeanalizować, to plik gry XML, który definiuje zestaw dodatków do statku kosmicznego („stroje”), które mają kilka wspólnych atrybutów (takich jak nazwa i koszt), ale także należą do różnych kategorii. Na przykład: Naprawiono broń: zasięg, szybkostrzelność Broń wieży, zasięg, szybkostrzelność, prędkość obrotu wieży Dopalacze: modyfikator przyspieszenia, prędkość spalania paliwa itp. itd. Istnieje co najmniej 5 klasyfikacji strojów (i powiedzmy 3 lub 4 stroje, które należą do każdej kategorii), a niektóre, takie jak broń, mają kilka wspólnych atrybutów, ale nie z innymi kategoriami, takimi jak dopalacze. Chcę napisać kod parsowania do obsługi każdego typu obiektu i przechowywania jego danych w obiektach. Chcę również zminimalizować ilość kodu, który muszę przepisywać (tj. Używać dobrego stylu OOP, aby móc dodawać nowe kategorie lub poprawiać istniejące w przyszłości). **Jak najlepiej do tego podejść?** Już rozpocząłem program, ale chciałbym mieć wpływ na najlepsze podejście. Ponieważ jest to naprawdę szerokie pytanie, dam ci kilka moich przemyśleń/konkretnych pytań, abyś mógł zobaczyć, czego szukam: * Czy powinienem mieć podstawową klasę o nazwie „strój” i użyć dziedziczenia, aby dostosować parsowanie dla każdego konkretnego kategoria (tj. „broń stała”)? Czy powinienem mieć wiele poziomów dziedziczenia dla podobnych kategorii (np. „Broń”). Jak mogę zminimalizować przepisywanie kodu, abym musiał pisać tylko określone procedury dla każdej kategorii? * Gdzie mam obsłużyć błędy: w 'stroju', czy w klasach pochodnych? Ile potrzebuję obsługi błędów? * Jak mogę później łatwo uzyskać dostęp do tych obiektów? Czy powinienem utworzyć obiekt listy z wektorem zawierającym każdy obiekt? Jak mogę uzyskać dostęp do każdego obiektu według nazwy? Każdy wkład jest doceniany; nie musisz podawać kompletnego i wyczerpującego podsumowania, jak to zrobić (chociaż byłoby to miłe :P).


title: Które z nich obejmuje drugie: obiektowe zorientowanie na klasy czy dziedziczenie prototypowe?

text: W tym wykładzie: http://www.youtube.com/watch?v=hQVTIJBZook, Douglas Crockford twierdzi, że obiektową orientację klasową można przedstawić w kategoriach dziedziczenia prototypowego. Konstrukcja, którą podaje jest mniej więcej taka: var theObject = function() { var private1 = ...; zmienna prywatna2 = ...; ... return { public1: ..., public2: ..., ... }; }; Twierdzi również, że nie jest odwrotnie: dziedziczenia prototypowego nie można na ogół zakodować wyłącznie za pomocą konstrukcji opartych na klasach. Myślałem o tym od jakiegoś czasu i wydaje mi się, że oba twierdzenia są błędne. 1. Rzekome "kodowanie" obiektowej orientacji opartej na klasach jest błędne z operacyjnego punktu widzenia semantyki. W typowym języku obiektowym opartym na klasach zmienne i funkcje składowe są _wiadome_, że istnieją, więc można ich używać bezpośrednio. Prototypowe „kodowanie” polega na testowaniu _w czasie wykonywania_, czy element jest obecny w obiekcie/tabeli mieszającej. Ergo, semantyka jest inna. 2. Dziedziczenie prototypowe faktycznie _może_ być zakodowane w opartym na klasach języku obiektowym. Jako przykład użyję C++, ale można użyć dowolnego innego języka obiektowego opartego na klasach. struct prototypowa { std::shared_ptr<prototypowa> baza; std::unordered_map<std::string, boost::any> członkowie; boost::any & operator [] (const std::string & key) { auto it = members.find (klucz); if (it == members.end ()) { if (podstawa) return (*podstawa) [klucz]; else throw std::logic_error { "Nie znaleziono członka." }; } w przeciwnym razie zwróć *it; } }; Czy moja analiza jest błędna? Czy czegoś mi brakuje?


title: git/svn hooki dla projektów PHP/Zend

text: tylko dlatego, że myślę, że nie wykorzystujemy jeszcze pełnego potencjału wszystkich możliwości: Jakich hooków przed/po zatwierdzeniu (np. PHPUnit, PHPDoc) używacie na swoich serwerach Git/SVN zespołu? Do tej pory używamy skryptu minifikacyjnego (niestety tylko usuwa niepotrzebne spacje i komentarze oraz łączy pliki), PHPDoc, PHPUnit i to już. Jakieś dobre pomysły, które mogą być również przydatne?


title: Ortogonalność testów jednostkowych a zwięzłość testów jednostkowych

text: Piszę testy jednostkowe systemu sterowania do gry wideo. System ma kilka zachowań (unikaj tego obszaru z powodu A, unikaj tego obszaru z powodu B, każde dodając trochę kontekstu do mapy regionu. Oddzielna funkcja analizuje mapę i wytwarza pożądany ruch. I' mam problem z podjęciem decyzji, jak napisać testy jednostkowe dla zachowań.Jak sugeruje TDD, interesuje mnie tylko, w jaki sposób zachowania wpływają na pożądany ruch.Na przykład unikanie-ze względu na powód-A powinno skutkować odsunięciem się od sugerowania złej pozycji.Nie obchodzi mnie, jak i dlaczego zachowanie dodaje kontekst do mapy, tylko to, że pożądany ruch jest oddalony od pozycji.Więc moje testy dla każdego zachowania konfigurują zachowanie, sprawiają, że zapisuje się do map, a następnie wykonuje funkcję analizowania mapy, aby wypracować pożądany ruch.Jeśli ten ruch spełnia moje specyfikacje, jestem zadowolony.Jednak teraz moje testy zależą od prawidłowego działania obu zachowań i funkcji analizowania mapy.Jeśli funkcja parsowania nie działa, to Dostałbym setki nieudanych testów, a nie kilka. Wiele przewodników po pisaniu testów sugeruje, że to zły pomysł. Jednak jeśli testuję bezpośrednio na wyjściu zachowań, wyśmiewając mapę, to z pewnością zbyt mocno łączę się z implementacją? Jeśli uda mi się uzyskać ten sam pożądany ruch z mapy, stosując nieco inne zachowanie, testy nadal powinny zaliczyć. Więc teraz cierpię na dysonans poznawczy. Jak najlepiej ustrukturyzować te testy?


title: Przechowywanie wykresów za pomocą json i db

text: Mam aplikację Rails 4 związaną z wykresami. Te wykresy muszą być przechowywane i nie jestem pewien, jak najlepiej to zrobić. Po pierwsze, aplikacja ma bazę danych SQLite w fazie rozwoju i PostgreSQL w produkcji. Chciałbym mieć wykresy w JSON, ale można to osiągnąć na kilka sposobów. Również te wykresy będą manipulowane za pomocą jakiegoś interfejsu. Myślałem o rozwiązaniu graficznym i surowym w JSON. Mam kilka alternatyw dla realizacji: 1. Przechowuj pliki JSON wykresu bezpośrednio w db. (jak?) 2. Przechowuj wykresy w bazie danych z tabelami (wykres, krawędzie, wierzchołki) (prawdopodobnie nie...) 3. Przechowuj wykresy w bazie danych z tabelami i zbuduj parser, aby manipulować w formacie JSON. Jakie są twoje rekomendacje?


title: Jak mogę nauczyć się efektywnie korzystać ze Smarty?

text: Mam pewne doświadczenie w PHP4, ale po zapoznaniu się z obiektowymi częściami PHP, mam trudności ze zrozumieniem, jak korzystać z silnika szablonów Smarty. Oficjalna dokumentacja wydaje się wymagać poziomu wiedzy, którego jeszcze nie mam, więc nie wydaje się to dobrym miejscem na rozpoczęcie. Co muszę wiedzieć, aby przejść do tworzenia szablonów Smarty? Lub jeśli Smarty nie jest już standardowym systemem szablonów PHP, jak mam się zająć szablonami?


title: Jakie funkcje otrzymało c od c++?

text: Jakie funkcje zostały dodane do C, które były pierwotnie w C++? Kiedy gdzie dodali i z jakiego powodu (co gdzie argumenty za/przeciw)? Czym różnią się w C od C++? Czy funkcje powstały w C++, czy w innym języku? Przykłady (rozwiń dalej): const, prototypy funkcji, niejawne wyjście(0);


title: Jak być Agile, gdy nowa praca wciąż wpływa na ukończoną pracę?

text: Projekt, nad którym pracuję, polega na przeskanowaniu istniejącej strony internetowej. Funkcjonalność pozostanie taka sama, zmienia się tylko styl. Innymi słowy, nie modyfikuję HTML, tylko pliki CSS. Witryna jest dość złożona i zawiera dziesiątki stron. Zalogowani użytkownicy mogą pełnić wiele różnych ról, a w zależności od ich roli zawartość strony i strony, które mogą oglądać, jest różna. Używamy Git i Github. Próbuję napisać CSS, który działa jako komponenty, więc gdy te same elementy formularzy, nagłówki itp. pojawiają się na wielu stronach, są spójne. W większości przypadków działa to dobrze. Niestety, format i nazwy klas w HTML są czasami niechlujne i nieprzewidywalne. Kiedy coś naprawię na jednej stronie, to może zepsuć inną. Praca jest również trudniejsza, ponieważ nikt nie zna dokładnie wszystkich odmian, które są możliwe ze względu na role użytkownika; w związku z tym stale znajduję nowe odmiany w miarę postępów. Robię postępy, umieszczając wiele komentarzy w moim CSS. Jeśli potrzebuję usunąć regułę CSS, skomentuję ją, abym nadal mogła ją zobaczyć w narzędziach dla programistów Chrome, i umieszczę komentarz w CSS, mówiący, dlaczego ją usunąłem i dla której strony to zostało zrobione. Oznacza to, że jeśli na innej stronie zamierzam dodać regułę, która naprawi inny problem, jest większa szansa, że zobaczę, jak zepsuje pierwszą stronę. Dzięki temu mogę albo znaleźć inne rozwiązanie, które będzie działać dla obu stron, albo mogę dostosować stronę do zastąpienia. To działa dla mnie całkiem dobrze. Gdybym miał wolną rękę i jedynym celem było ukończenie projektu w terminie, to ta metoda byłaby w porządku. Jednak mój menedżer stara się zminimalizować ryzyko, dzieląc pracę na obszary, które należy ukończyć na sprint. Jest to sprzeczne z moim podejściem do rzeczy, ponieważ moje style typograficzne wpłyną na wszystkie inne strony w witrynie. Inną kwestią jest to, że różni interesariusze chcą podpisać się pod każdą sekcją w miarę moich postępów. Problem polega na tym, że po skończeniu sekcji może się to zmienić, jeśli zmienię CSS, który ma na nią wpływ wraz z nową sekcją, nad którą pracuję. Poprosiłem interesariuszy o szybkie nieoficjalne podpisanie etapów (np. na sprint) i ostateczne oficjalne podpisanie pod koniec projektu, ale spotyka się to z oporem. Rozumiem, dlaczego byłoby to bardziej ryzykowne, ale jedynym sposobem zagwarantowania, że podpisana sekcja nie ulegnie zmianie, jest dostosowanie WSZYSTKICH przyszłych zmian do konkretnych stron. Oprócz tego powiedziano mi, że wszystkie prace, które wypchnę do repozytorium Git, powinny być gotowe do uruchomienia i jako takie nie powinny zawierać żadnych komentarzy do kodu. Jest to dla mnie ryzykowne, ponieważ nie będę wiedział, dopóki nie skończę strony, czy kiedykolwiek skorzystam z tych komentarzy, czy nie. Czy ktoś inny był w podobnej sytuacji i zdołał znaleźć kompromis, który zadziałał dla mojego podejścia do rozwoju, a także pragnień kierownictwa i interesariuszy, aby mieć bardziej zwinne podejście? Bardziej zwinny przepływ pracy działa świetnie, gdy możesz podzielić pracę na komponenty i wiesz, że raz coś zostanie zrobione, nie będzie to miało wpływu na przyszłe prace. Jednak charakter tego projektu sprawia, że jest to trudne do osiągnięcia.


title: Jak dobrze świeżo upieczony absolwent powinien znać język?

text: Jestem studentem CS i mam zaledwie kilka miesięcy do ukończenia studiów. Potrafię pisać programy, ale korzystam z wielu podręczników. To prawie 50% pisania/50% czytania (może nawet więcej czytania). Chciałbym zapytać, ile trzeba znać języka (technologii, metody itp.), aby w swoim CV powiedzieć, że go znasz? Z góry dziękuję. PS Czuję się nieswojo, aby nauczyć się do perfekcji tylko jednej technologii, ponieważ ogranicza to moje dalsze możliwości.


title: Jak komentarze wyrażane są w gramatykach języka programowania?

text: Uczę się budować parsery za pomocą gramatyk, ale utknąłem próbując wyrazić komentarze, ponieważ mogą pojawić się niemal wszędzie. Oznacza to, że komentarze można usunąć ze strumienia tokenów przed przeprowadzeniem analizy. Czy to standardowa praktyka, czy komentarze są zawsze/często określane w gramatyce?


title: Testowanie w celu zapobiegania kaskadowym błędom

text: Wczoraj na Twitterze pojawił się „kaskadowy błąd”, jak opisano w tym poście na blogu: > „Kaskadowy błąd” to błąd, którego efekt nie ogranicza się do > konkretnego elementu oprogramowania, ale jego efekt „spływa kaskadowo” na inne elementy > również. Widziałem tego rodzaju błąd, oczywiście na mniejszą skalę, w niektórych projektach, nad którymi pracowałem. Mogą być trudne do zidentyfikowania w środowiskach deweloperskich/testowych, nawet w środowisku programistycznym opartym na testach. Moje pytania brzmią... Jakich strategii używasz, poza podstawowymi testami TDD i standardowymi testami regresyjnymi, aby zidentyfikować i zapobiec potencjalnym problemom, które mogą wystąpić tylko w środowisku produkcyjnym? Czy występowanie takich problemów wskazuje na załamanie procesu tworzenia oprogramowania, czy po prostu produkt uboczny złożonych systemów oprogramowania?


title: SSIS: Ile czasu zwykle zajmuje przyśpieszenie pracy nowego pracownika?

text: Jestem programistą SQL samoukiem, który pracował dla małych i średnich firm. Większość mojego doświadczenia to pisanie instrukcji SQL do raportowania, szorowania danych, a nigdy w sformalizowanym dziale IT. W mojej ostatniej pracy zaplanowałem i wykonałem pełną migrację oraz napisałem wszystkie nowe procesy biznesowe i przeszkoliłem użytkowników końcowych. W większości jestem przyzwyczajony do bycia ekspertem, jeśli chodzi o opracowywanie rozwiązań bazodanowych, ale dzieje się tak tylko dlatego, że nikt w pokoju nigdy nic nie wiedział o bazach danych. Teraz pracuję z zespołem programistów jako programista interfejsu SSIS. W większości nie jest to nauka o rakietach, ale trudno mi nadążyć. W bazie danych dużo się dzieje, a pakiety, które tworzymy, są dość skomplikowane. Większość pierwszego miesiąca spędziłem na studiowaniu systemu, a nie na kodowaniu. Czy to normalne? Jeśli tak, to jak długo potrwa, zanim będę produktywna i wniosę znaczący wkład. Jestem przyzwyczajony do szybkiego biegu i możliwości wniesienia wkładu od samego początku. Ile czasu zwykle zajmuje przyśpieszenie pracy nowego pracownika?


title: Łączenie przeglądu kodu z metrykami zaufania

text: Nie mam szansy brać tego w pracy. Ale podoba mi się pomysł **przeglądu kodu**. Zwłaszcza internetowego przeglądu kodu open source, takiego jak Gerrit Code Review. Uwielbiam to, co **Metryki zaufania** zrobiły dla forów i witryn opartych na zbiorowej inteligencji w Internecie, takich jak stackexchange, reddit i wikipedia. Czy byłoby możliwe połączenie tych dwóch i opracowanie systemu zarządzania projektami typu open source. Coś, co kończy się głównie na społeczności. Być może coś w rodzaju Wikipedii z kodem do projektu. Tam, gdzie zgłaszający stają się popularni/zaufani dzięki wielu łatkom, które zostały pozytywnie ocenione przez innych i zaakceptowane do bagażnika. Popularni/zaufani autorzy otrzymują łatki szybciej/łatwiej. Szukam opinii na temat tego pomysłu, a może wskazówek, gdzie to zostało zrobione wcześniej, jeśli tak jest. Może to pozostawić głównemu maintinerowi niewiele więcej do zrobienia niż: * kłócić się o kierunek projektu poprzez szybkie śledzenie lub zawetowanie określonych łat. * rozstrzyganie sporów w przypadku zerwania testów CI lub samodzielne ich naprawianie. Czy projektowanie przez społeczność jest gorsze niż projektowanie przez komisję?


title: Algorytm rozwoju uczenia się

text: To dość ogólne pytanie. Znam trochę Perla i Pythona i chcę nauczyć się programowania bardziej dogłębnie, aby jak tylko się o tym przekonać, mogę zacząć tworzyć aplikacje, a następnie strony internetowe. Chciałbym poznać algorytm (kolejność kroków :)), który mógłby opisać moje podejście do nauki programowania w ogóle. Zamieściłem małe pytania na Perl/Python i otrzymałem wielką pomoc od wszystkich. Uwaga: - Nie śpieszę się do nauki. Wiem, że to wymaga czasu i to jest w porządku. Proszę podać wszelkie sugestie, które uważasz za słuszne. Proszę też nie zmuszać mnie do nauki Lispa, Haskella itp. - jestem początkującym.


title: raportowanie błędów na poziomie funkcji: łączyć / łączyć błędy, czy nie?

text: Jaki jest Twoim zdaniem najlepszy sposób na radzenie sobie (w czasie wykonywania) sytuacji, gdy **więcej niż jeden** parametr wejściowy do funkcji jest niepoprawny. Widzę dwa sposoby. Pierwszy - po prostu zwraca pierwszy błąd (poprzez podniesienie wyjątku lub w inny sposób obsługiwany przez język programowania) mówiący, że pierwszy z błędnych parametrów jest błędny. Alternatywnie funkcja może sprawdzić wszystkie parametry, połączyć wszystkie komunikaty o błędach w jeden i zwrócić go jako jeden. Albo może być jakieś inne podejście. Jakie byłyby twoje preferencje i dlaczego? Dziękuję Ci.


title: Quicksort i środkowy obrót

text: Boli mnie głowa, kiedy rozumiem quicksort ze środkowym obrotem. Znalazłem wiele wyjaśnień na temat używania najbardziej lewego lub prawego najbardziej, ale niewiele na temat środkowego. Czy mogę je bezpiecznie założyć?: 1. Jeśli lewy i prawy wskaźnik spotykają się w tej samej pozycji, oznacza to, że element na tej pozycji znajduje się w końcowej pozycji posortowanej, więc mogę podzielić listę na dwie części bez uwzględniania tego elementu (długość listy1 + długość listy2 = długość listy -1). 2. Jeśli lewy i prawy przecinają się (czyli lewy > prawy), oznacza to, że żaden element nie znajduje się jeszcze w końcowej pozycji posortowanej, więc muszę podzielić listę na dwie części, używając jako granicę lewą i prawą (długość listy1 + długość listy2 = lista długość). Czy to jest poprawne? Dziękuję. **Aktualizacja** : Powodem, dla którego chcę użyć środkowego obrotu, jest zaimplementowanie „algorytmu mediany”, który zwiększa szybkość QS. W tej technice oś jest wybierana przez przybliżenie średniej wartości listy: http://www.brpreiss.com/books/opus4/html/page500.html


title: Nazewnictwo metod logicznych Afirmatywna vs. Negatywna

text: Czy metody logiczne powinny zawsze przyjmować formę twierdzącą, nawet jeśli będą używane tylko w formie przeczącej? Powiedzmy, że chciałem sprawdzić, czy jednostka istnieje przed jej utworzeniem, moim argumentem jest to, że pierwsza forma poniżej jest lepsza niż druga forma, niezależnie od tego, czy metoda jest kiedykolwiek używana w formie twierdzącej. Podsumowując, uważam, że `if(!afirmatywny)` jest łatwiejszy do odczytania niż `if(negative)`. Mam kolegę, który się nie zgadza, myśli? **Pierwszy formularz:** int entity_id = 42; if(!entity_exists(entity_id)) create_entity(entity_id); **Drugi formularz:** int entity_id = 42; if(entity_not_exist(entity_id)) create_entity(entity_id);


title: Czy wzorce projektowe pomogą mi w tym przypadku?

text: niedawno dostałem zadanie znalezienia kombinacji danego słowa. Na przykład powiedzmy, że dane słowo jest **jak** wtedy możliwe odpowiedzi to liek,lkie i tak dalej. To musi być zaimplementowane w dowolnym języku, nie ma to znaczenia, ale zasada jest taka, że nie używamy wbudowanych funkcji/API do znajdowania kombinacji. I chyba wiemy, że wzorce projektowe służą do rozwiązywania każdego problemu za pomocą danego rozwiązania. Na przykład Information Expert to wzorzec projektowy. Teraz moje pytanie brzmi, czy istnieje jakiś wzorzec projektowy do znajdowania kombinacji? Lub do tego typu rzeczy Wzorce projektowe nie będą pasować i powiedzą, że muszę nauczyć się dobrego algorytmu do znajdowania rozwiązania. Więc jaka jest różnica między algorytmem a wzorcami, oba próbują rozwiązać problem w dobry, efektywny sposób, prawda? Nie wiem, czy mój pogląd jest poprawny, czy nie, proszę poprawić, jeśli się mylę!


title: Czy mogę używać Dependency Injection bez łamania enkapsulacji?

text: Oto moje rozwiązanie i projekty: * BookStore _(solution)_ * BookStore.Coupler _(projekt)_ * Bootstrapper.cs * BookStore.Domain _(projekt)_ * CreateBookCommandValidator.cs * CompositeValidator.cs * IValidate.cs * IValidator .cs * ICommandHandler.cs * BookStore.Infrastructure _(projekt)_ * CreateBookCommandHandler.cs * ValidationCommandHandlerDecorator.cs * BookStore.Web _(projekt)_ * Global.asax * BookStore.BatchProcesses _(projekty *_ * Program. *Bootstrapper.cs** : public static class Bootstrapper.cs { // Używam SimpleInjector jako mojego kontenera DI public static void Initialize(Container container) { container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>), typeof(CreateBookCommandHandler). Montaż); container.RegisterDecorator(typeof(ICommandHandler<>), typeof(ValidationCommandHandlerDecorator<>)); container.RegisterManyForOpenGeneric(typeof(IValidate<>), AccessibilityOption.PublicTypesOnly, (serviceType, implTypes) => container.RegisterAll(serviceType, implTypes), typeof(IValidate<>).Assembly); container.RegisterSingleOpenGeneric(typeof(IValidator<>), typeof(CompositeValidator<>)); } } **CreateBookCommandValidator.cs** public class CreateBookCommandValidator : IValidate<CreateBookCommand> { public IEnumerable<IValidationResult> Validate(CreateBookCommand book) { if (book.Author == "Evan") {Book yield return new Validation(Res) Evan nie może być Autorem!", p => p.Autor); } if (book.Price < 0) { yield return new ValidationResult<CreateBookCommand>("Cena nie może być mniejsza niż zero", p => p.Price); } } } **CompositeValidator.cs** public class CompositeValidator<T> : IValidator<T> { private readonly IEnumerable<IValidate<T>> walidatory; public CompositeValidator(IEnumerable<IValidate<T>> walidatory) { this.validators = walidatory; } public IEnumerable<IValidationResult> Validate(T wystąpienie) { var allResults = new List<IValidationResult>(); foreach (var validator w this.validators) { var wyniki = validator.Validate(instance); allResults.AddRange(wyniki); } return allResults; } } **IValidate.cs** interfejs publiczny IValidate<T> { IEnumerable<IValidationResult> Validate(T wystąpienie); } **IValidator.cs** interfejs publiczny IValidator<T> { IEnumerable<IValidationResult> Validate(T wystąpienie); } **ICommandHandler.cs** interfejs publiczny ICommandHandler<TCommand> { void Handle(TCommand polecenie); } **CreateBookCommandHandler.cs** public class CreateBookCommandHandler : ICommandHandler<CreateBookCommand> { private readonly IBookStore _bookStore; public CreateBookCommandHandler(IBookStore bookStore) { _bookStore = bookStore; } public void Handle(CreateBookCommand command) { var book = new Book { Autor = polecenie.Autor, Nazwa = polecenie.Nazwa, Cena = polecenie.Cena }; _bookStore.SaveBook(książka); } } **ValidationCommandHandlerDecorator.cs** public class ValidationCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand> { private readonly ICommandHandler<TCommand> zdobione; prywatny walidator IValidator<TCommand> tylko do odczytu; public ValidationCommandHandlerDecorator(ICommandHandler<TCommand> zdobione, walidator IValidator<TCommand>) { this.decorated = zdobione; this.validator = walidator; } public void Handle(polecenie TCommand) { var wyniki = validator.Validate(polecenie); if (!results.IsValid()) { wyrzuć nowy wyjątek ValidationException(wyniki); } zdobione.Uchwyt(polecenie); } } **Global.asax** // wewnątrz App_Start() var container = new Container(); Bootstrapper.Inicjalizuj(kontener); // więcej ładowania początkowego specyficznego dla MVC do kontenera. Jak okablowanie kontrolerów, filtrów itp. **Program.cs** // Prawie tak samo jak Global.asax Przepraszamy za długą konfigurację problemu, nie mam lepszego sposobu na wyjaśnienie tego, poza wyszczególnieniem mojego rzeczywistego problem. Nie chcę, aby mój CreateBookCommandValidator był `publiczny`. Wolałbym, aby był „wewnętrzny”, ale jeśli ustawię go jako „wewnętrzny”, nie będę mógł go zarejestrować w moim kontenerze DI. Powodem, dla którego chciałbym, aby był wewnętrzny, jest to, że jedyny projekt, który powinien mieć pojęcie o moich implementacjach IValidate<>, znajduje się w projekcie BookStore.Domain. Każdy inny projekt musi po prostu wykorzystać IValidator<>, a CompositeValidator powinien zostać rozwiązany, który spełni wszystkie walidacje. Jak mogę używać Dependency Injection bez przerywania enkapsulacji? A może robię to wszystko źle?


title: Połączenie strony serwera asp.net + strony klienta html/js/jQuery

text: Pracując z asp.net doszedłem do podejścia, które wykorzystuje usługi asp.net dla warstwy data/business logic oraz html/javascript/jquery dla warstwy UI, ponieważ nie mogłem osiągnąć wymaganego poziomu dostosowania interfejsu użytkownika z kontrolkami sieciowymi asp.net. Chociaż widziałem wiele książek opisujących użycie kontrolek internetowych asp.net i ich integrację z technologią po stronie serwera asp.net oraz tworzenie stron internetowych po stronie klienta html/js/jQuery bez połączenia z jakąkolwiek technologią po stronie serwera, nie mam widziałem jakąkolwiek książkę zajmującą się kombinacją strony serwera asp.net + strony klienta html/js/jQuery. Moje pytanie brzmi, czy takie podejście jest akceptowalne, czy też przeoczyłem jakąś rozpowszechnioną technologię, która lepiej nadaje się do realizacji takich zadań? Moim ograniczeniem jest to, że musi być on oparty na technologii po stronie serwera asp.net/mvc, ponieważ moje kierownictwo na to nakazuje.


title: Czy powinienem uzyskać licencjat z matematyki, a następnie przejść do informatyki?

text: To moje pierwsze pytanie. Kocham matematykę; Uwielbiam logikę i rozwiązywanie problemów. Jednocześnie lubię informatykę i mam nadzieję, że po uzyskaniu stopnia licencjata, tj. Zrobię doktorat z informatyki, zajmę się badaniami nad sztuczną inteligencją. Czy są jakieś korzyści płynące z posiadania mocnej znajomości matematyki podczas studiowania informatyki? Ponadto, czy byłbym w niekorzystnej sytuacji, gdybym ubiegał się o licencjat z matematyki zamiast informatyki, starając się o studia podyplomowe, aby studiować informatykę, szczególnie w instytucjach o wysokiej jakości infrastrukturze badawczej, takich jak MIT i Stanford? Ponadto, w odniesieniu do pierwszego pytania, czy mógłbyś mi powiedzieć, jakie zalety ma solidne opanowanie matematyki, jeśli takie istnieją? Dziękuję Ci.


title: Skąd pochodzi określenie „czerwone/czarne drzewo”?

text: Drzewo czerwono-czarne to jeden ze sposobów na zaimplementowanie zrównoważonego drzewa wyszukiwania binarnego. Zasady działania mają dla mnie sens, ale wybrane kolory nie. Dlaczego czerwień i czerń, w przeciwieństwie do jakiejkolwiek innej pary kolorów lub atrybutów w ogóle? Kiedy słyszę „czerwony i czarny”, pierwsze rzeczy, które przychodzą mi do głowy, to szachownice i Les Misérables, z których żadna nie wydaje się szczególnie odpowiednia w tym kontekście.


title: Dlaczego istnieje tak wiele typów numerycznych (bit, int, float, double, long)?

text: Nauczyłem się PHP, Javy i C. Teraz jestem ciekawy, dlaczego istnieje tak wiele typów danych liczbowych, takich jak bit, int, float, double i long. Dlaczego nie stworzyć tylko jednego rodzaju dla liczb? Czy są z tego jakieś korzyści? Może jeśli użyjemy liczb całkowitych do przechowywania tak małych liczb, możemy zaoszczędzić pamięć?


title: Dziwna terminologia tworzenia oprogramowania

text: Od niedawna pracuję w profesjonalnym środowisku programistycznym. Przez ten krótki czas słyszałem terminologię, o której istnieniu nigdy nie wiedziałem. Na przykład w rozmowie o statusie kilka tygodni temu jeden z naszych programistów powiedział, że „ręcznie robił” rzeczy na lewo i prawo. Kilka dni temu znowu usłyszałem nowy, w którym ktoś z naszej firmy chce "psuć karmę" jakiś nasz produkt. Czym więc jest „dziwny” termin z odpowiednią definicją lub lista terminów, które znasz, a które mogą poprawić słownictwo zawodowe nowego programisty, aby poprawić komunikację i zrozumienie procesów w miejscu pracy? Moja lista jest następująca i będę dodawał więcej, gdy się z nimi spotkam! * Hand-jobing: Kiedy programista ucieka się do jakiejś prymitywnej lub nienajlepszej metody wykonania pracy, w celu uzyskania czegoś, co działa, zwykle tymczasowo. * Karma dla psów: gdy firma używa produktu do użytku wewnętrznego, który ma lub obecnie sprzedaje swoim klientom, zwykle w celu zaoszczędzenia czasu i pieniędzy, ale także w celu okazania zaufania do własnych produktów. Na marginesie, wydaje mi się, że nie muszą to być PRAWDZIWE terminy związane z oprogramowaniem, ponieważ nigdy nie słyszałem, aby ktokolwiek "ręcznie" robił coś tak bardzo, jak on. Jednak powinno to być coś, co słyszałeś w środowisku zawodowym, czym chciałbyś się podzielić.


title: Czy perfekcjonizm jest przyjacielem czy wrogiem nowicjusza?

text: > **Możliwe powielenie:** > Gdzie wyznaczasz granicę swojego perfekcjonizmu? Widzę, że społeczność programistów jest bardzo skoncentrowana na robieniu rzeczy we właściwy sposób i osobiście chciałbym zrobić to samo, jednak czy to dobry czy zły pomysł dla nowicjusza, aby skupić się na zasadach projektowania, wzorcach projektowych i komentowaniu kodu na początku, czy lepiej pozwolić kreatywności szaleć i potencjalnie pisać niechlujny kod. Gdzie nowicjusz powinien narysować granicę?


title: Czy istnieją standardowe wytyczne dotyczące audytu oprogramowania pod kątem ewentualnego wykupu?

text: Jesteśmy w trakcie audytu firmy pod kątem ich wykupu. Jednym z kluczowych elementów tej decyzji jest oprogramowanie, które rozwijali przez długi czas. Zawsze mamy możliwość zbudowania własnego, ale wszyscy zdajemy sobie sprawę, że rozpoczęcie działalności może zająć nam więcej czasu, jeśli budujemy od zera. Moje pytanie jest dość konkretne: pochodzę ze środowiska programistycznego / PM i zostałem poproszony o wykonanie pełnego audytu oprogramowania tej firmy, czyli aplikacji webowej. Chcemy wiedzieć o tym jak najwięcej, zanim podejmiemy decyzję, czy je wykupić, a po podstawowym demo ich system wydaje się robić to, co chcemy, ale wiemy, że będziemy musieli go zmodyfikować do pewnym stopniu. Szukam szablonu lub struktury do opracowania, aby stworzyć raport końcowy. Naprawdę trudno było znaleźć coś przez Google; większość z tego, co znalazłem, to w najlepszym razie tylko podstawowe listy kontrolne. Potrzebowałbym szablonu lub frameworka, który zajmuje się infrastrukturą, projektowaniem, architekturą, hostingiem itp. Czy ktoś miał z tym doświadczenie? Byłbym bardzo wdzięczny, gdyby ktoś zechciał udostępnić mi swój szablon/framework.


title: Jak pomóc młodszym programistom, których pierwszym językiem nie jest angielski?

text: Właśnie zmieniłem pracę i teraz pracuję z młodszym programistą, którego pierwszym językiem jest kantoński. Mają dyplom z informatyki, ale pracują w swojej pierwszej roli programistycznej po wielu latach poza branżą komputerową. Przez ostatnie dwa lata pracowali w niemal całkowitej izolacji i wyrobili sobie wiele złych nawyków. Kolega programista kontraktowy również mówi po kantońsku, ale jego mówiony angielski jest dość słaby, jest też sfrustrowany podejściem juniorów do programowania i nie wie, co robić. Pomimo wspólnej pracy nad projektami w języku kantońskim, projekty są przepełnione, ponieważ brak uzgodnionego / sprawdzonego projektu oznacza, że mają one karuzelę aktualizacji, dopóki nie zostanie osiągnięte rozwiązanie. Pomimo delikatnej werbalnej zachęty, aby to zrobić, obaj nadal mają trudności z tworzeniem nawet najbardziej podstawowych dokumentów projektowych, wprowadzają odpowiednie komentarze do zameldowania (tj. nie tylko „naprawienie błędów”, „aktualizacje” itp.) i w ogóle wnoszą swój wkład do wiki projektu. Obecnie młodszy programista nie czyta blogów, książek ani zasobów technicznych. Kiedy pytam, jak stają się lepszymi programistami, mówią, że po prostu myślą więcej o swoim własnym kodzie. Są bardzo skłonni do odkrywania koła na nowo z tym, co mogę tylko hojnie powiedzieć, że są wyjątkowo pomysłowymi rozwiązaniami dobrze rozwiązanych problemów. Próbowałem im wyjaśnić zasadę KISS i SRP, ale nie jestem przekonany, że rozumieją korzyści. Szczerze mówiąc, jestem pewien, że nie potrafiłem tego dobrze wyjaśnić. Ponieważ nie jestem pewien, czy rozumienie języka angielskiego jest problemem, to jest to problem sam w sobie. Czy możesz polecić, w jaki sposób mogę im pomóc, kiedy; * Nie mówię po kantońsku i nie widzę, aby nauka była skuteczna w realistycznych ramach czasowych * Wysyłanie linków do zasobów, takich jak thedailywtf.com, wydaje się przechodzić przez ich głowy * Kupione przez nas książki o programowaniu pozostają nieprzeczytane. znaleźli następujące pytania SO, które mogą być dla nich przydatne, ale punkt drugi powyżej ma zastosowanie; * Informacje o programowaniu w Twoim języku ojczystym * Czy „angielski” przeszkadza Ci w doskonaleniu umiejętności programowania? Czy są jakieś ćwiczenia programistyczne, nad którymi moglibyśmy wspólnie pracować? Jakie są wskazówki, jak stworzyć podstawową dokumentację? Czy są jakieś kantońskie zasoby, do których mógłbym im wskazać? Doceniam, o ile łatwiej jest, gdy językiem ojczystym jest angielski. Naprawdę chcę im jak najbardziej pomóc i nie osądzać, co w innym przypadku mogłoby być postrzegane jako niechęć do doskonalenia się jako programista.


title: Jeśli zatrudnię cię na "dzień", ile godzin jest oczekiwanych?

text: Widziałem wiele porad dla niezależnych programistów, którzy zalecają podawanie stawek w okresach co najmniej jednego dnia. Oznacza to, że gdy ktoś pyta o Twoją stawkę, powiesz „500 USD dziennie”, zamiast podawać równoważną stawkę godzinową. Jeśli zgodzę się na 10 dni pracy programistycznej dla klienta w określonej stawce dziennej, ile godzin oczekuje się ode mnie dziennie? Co się stanie, jeśli zrobię 6 godzin rzeczywistego programowania w poniedziałek, a potem 8 godzin we wtorek.. czy to dwa „dni” lub „1,75 osiem godzin dziennie” czy co? Jaki jest standard?


title: Co oznacza „wdrażanie na komputerze fizycznym”

text: Zapytano mnie, czy kiedykolwiek „wdrożyłem na fizycznej maszynie” i widzę tę terminologię podczas googlowania, ale nie dostaję definicji. Co to znaczy? W jaki inny sposób ktoś mógłby wdrożyć aplikację, jeśli nie na fizycznym komputerze?


title: Jak mogę zastosować Readme Driven Development do trwającego projektu?

text: Zostałem przydzielony do projektu, którego celem jest aktualizacja istniejącego oprogramowania. To oprogramowanie zostało opracowane w sposób całkowicie _ad hoc_, co oznacza, że każda generowana dokumentacja jest przestarzała, zagmatwana i po prostu bezużyteczna. Nie chcę tworzyć z mocą wsteczną wszystkich brakujących artefaktów, ponieważ byłaby to tylko strata czasu. Baza kodu jest brzydka i naprawdę wymaga poważnej refaktoryzacji, ale to już inna historia. To, czego chcę, to zastosowanie Readme Driven Development do prowadzenia tego projektu. Zasadniczo chcę więc napisać plik Readme, który będzie dokumentował każdą znaczącą zmianę na poziomie użytkownika. Problem polega na tym, że nie mam pojęcia, jak ustrukturyzować ten dokument. Dla mnie jest całkiem jasne, że powinien mieć inny układ niż tradycyjny Readme. Bardzo chcę dokumentować zmiany, a nie aktualny stan rzeczy. Jakieś pomysły?


title: Które wzorce/architekturę zastosować do „Importowania danych, danych procesowych, eksportu wyników”

text: Zastanawiałem się, którą architekturę/wzorce wybrać dla następującego problemu podzielonego na trzy kroki: 1. Importuj opis TestScript z pliku (np. .xls, .txt) 2. Opisany proces TestScript 3. Eksportuj opis z przetworzonymi wynikami jako .xml Oto co mam do tej pory: * Importer, który czyta w xls i tworzy hierarchiczną strukturę obiektu * Parser, który tworzy abstrakcyjne drzewo składni (If,then,else,end,command) ze struktury obiektu * Processor (VisitorPattern) AST . Ten procesor tworzy instancję implementacji polecenia, wykonuje polecenie, zbiera wyniki i kontroluje przepływ (jeśli, to, w przeciwnym razie) Obecnie struktura importowanego obiektu zawiera już pole dla wyniku i może być po prostu serializowana jako xml. Ale moim zdaniem posiadanie pola wynikowego w obiektach wejściowych nie jest zbyt eleganckie. Głównym powodem, dla którego mi się to nie podoba, jest to, że nie mogę ponownie wykorzystać struktury importowanego obiektu w celu wielokrotnego przetwarzania. Cały komponent chciałbym podzielić również na trzy części: 1. Import, który tworzy hierarchiczną strukturę obiektu opisującą TestScript (zawierający parser plików i preprocesor) 2. Proces, który tworzy AST i przetwarza go 3. Eksport, który pobiera wyniki i opisy i zapisuje je Oto kilka innych warunków: * Nie każdy węzeł AST reprezentuje obiekt w strukturze obiektu (opis) * Ale każdy obiekt wynikowy jest połączony z obiektem opisu * Opis i wyniki są hierarchiczne


title: Dlaczego większość oprogramowania GNU jest napisana w języku C

text: Jestem programistą Java i rzadko piszę programy GUI w C. Zauważyłem jednak, że wiele projektów GNU, takich jak PSPP, R, Dia itp., jest pisanych w C, a nie w Javie czy C++. Osobiście mi to nie przeszkadza, ale jestem naprawdę ciekawy, dlaczego GNU tak bardzo faworyzuje C. Rozumiem, że C jest tym, który w najmniejszym stopniu wspiera programowanie obiektowe, a dzisiejsza edukacja CS naprawdę kładzie nacisk na OOP, ponieważ OOP naprawdę sprawia, że kody są bardziej przydatne do ponownego użycia. W tym przypadku, dlaczego tak wielu programistów wybiera programowanie w C zamiast w C++ lub Javie. Czy ktoś wie, dlaczego oprogramowanie GNU jest tak napisane wyłącznie w C? Czy uważasz, że oprogramowanie GNU powinno być napisane w C++ lub Javie, aby kod źródłowy był bardziej użyteczny dla ludzi? Dlaczego lub dlaczego nie?


title: Boost Software License wydaje się automatycznie przedłużać zrzeczenie się gwarancji, ale autor twierdzi, że tak nie jest

text: Oto kopia licencji na oprogramowanie Boost. Niniejszym udziela się nieodpłatnego zezwolenia każdej osobie lub organizacji, która otrzymuje kopię oprogramowania i dołączonej dokumentacji objętej niniejszą licencją („Oprogramowanie”) na używanie, powielanie, wyświetlanie, rozpowszechnianie, wykonywanie i przesyłanie Oprogramowania, oraz do przygotowywania prac pochodnych Oprogramowania i zezwalania na to osobom trzecim, którym Oprogramowanie jest dostarczane, z zastrzeżeniem następujących postanowień: Informacje o prawach autorskich w Oprogramowaniu i całe to oświadczenie, w tym powyższe udzielenie licencji, to ograniczenie i następujące wyłączenie odpowiedzialności musi być zawarte we wszystkich kopiach Oprogramowania, w całości lub w części, oraz we wszystkich pracach pochodnych Oprogramowania, chyba że takie kopie lub prace pochodne mają wyłącznie postać kodu wynikowego wykonywalnego maszynowo, generowanego przez język źródłowy edytor. OPROGRAMOWANIE JEST DOSTARCZANE „TAK JAK JEST”, BEZ JAKICHKOLWIEK GWARANCJI, WYRAŹNYCH LUB DOROZUMIANYCH, W TYM MIĘDZY INNYMI GWARANCJI WARTOŚCI HANDLOWEJ, PRZYDATNOŚCI DO OKREŚLONEGO CELU, TYTUŁU I NIENARUSZANIA PRAW. W ŻADNYM WYPADKU WŁAŚCICIELE PRAW AUTORSKICH LUB KTOKOLWIEK DYSTRYBUTOR OPROGRAMOWANIA NIE PONOSI ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK SZKODY LUB INNĄ ODPOWIEDZIALNOŚĆ UMOWĄ, CZYN CZYNNY LUB INNĄ, WYNIKAJĄCĄ Z OPROGRAMOWANIA LUB W ZWIĄZKU Z UŻYTKOWANIEM LUB INNYMI OPROGRAMOWANIEM. Drugi paragraf licencji wymaga, aby zrzeczenie się gwarancji było zachowane we wszystkich kopiach oprogramowania (z wyjątkiem czysto binarnych). Ponadto w zrzeczeniu się gwarancji zarówno „POSIADACZE PRAW AUTORSKICH”, jak i „KAŻDY DYSTRYBUTOR OPROGRAMOWANIA” są chronione przed odpowiedzialnością za szkody. Oto kopia licencji MIT. Prawa autorskie (C) <rok> <właściciele praw autorskich> Niniejszym udziela się nieodpłatnego zezwolenia każdej osobie otrzymującej kopię tego oprogramowania i powiązanych plików dokumentacji („Oprogramowanie”) na korzystanie z Oprogramowania bez ograniczeń, w tym bez ograniczenia praw do używania, kopiowania, modyfikowania, łączenia, publikowania, rozpowszechniania, udzielania podlicencji i/lub sprzedaży kopii Oprogramowania oraz zezwalania na to osobom, którym Oprogramowanie jest dostarczane, z zastrzeżeniem następujących warunków: Powyższe prawa autorskie zawiadomienie i niniejsze zawiadomienie o pozwoleniu będą dołączone do wszystkich kopii lub istotnych części Oprogramowania. OPROGRAMOWANIE JEST DOSTARCZANE „TAK JAK JEST”, BEZ JAKICHKOLWIEK GWARANCJI, WYRAŹNYCH LUB DOROZUMIANYCH, W TYM MIĘDZY INNYMI GWARANCJI WARTOŚCI HANDLOWEJ, PRZYDATNOŚCI DO OKREŚLONEGO CELU I NIENARUSZANIA PRAW. W ŻADNYM WYPADKU AUTORZY LUB WŁAŚCICIELE PRAW AUTORSKICH NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK ROSZCZENIA, SZKODY LUB INNĄ ODPOWIEDZIALNOŚĆ, CZY NA TEMAT UMOWY, CZYNNEGO CZYNNOŚCI, WYNIKAJĄCEJ Z OPROGRAMOWANIA LUB W ZWIĄZKU Z UŻYTKOWANIEM LUB INNYCH OPROGRAMOWANIE. W przeciwieństwie do tego, licencja MIT nie wymaga, aby zrzeczenie się gwarancji było zachowywane we wszystkich kopiach oprogramowania i tylko "AUTORZY LUB POSIADACZE PRAW AUTORSKICH" są chronieni przed odpowiedzialnością za szkody. Wygląda na to, że licencja na oprogramowanie Boost zapewnia lepszą ochronę przed zobowiązaniami wobec każdego, kto ma do czynienia z oprogramowaniem (nawet tych, którzy po prostu dystrybuują oprogramowanie). Ponadto licencja na oprogramowanie Boost zobowiązuje do powielania zastrzeżenia we wszystkich kopiach. Dlaczego więc autor licencji Boost wspomina w http://ideas.opensource.org/ticket/45, że licencja Boost_"nie obejmuje zrzeczenia się gwarancji na licencjobiorców, aby mogli, jeśli zechcą, podjąć takie gwarancje (np. w zamian za zapłatę)"_?


title: Czy jest coś z natury złego w mieszaniu paradygmatów w aplikacji?

text: Obecnie jestem w trakcie pisania (niestandardowej) aplikacji serwerowej Minecraft w C#. Pomyślałem, że to dobry sposób na nauczenie mnie wielu ważnych rzeczy, takich jak współbieżność, a zwłaszcza wydajność pamięci (ze względu na ogrom przestrzeni obiektów w Minecrafcie). Wczoraj w pociągu trudno mi było „wymyślić” sposób na zorganizowanie modułu sieciowego. Chciałem mieć prosty interfejs zewnętrzny, który dawałby to, co niezbędne (pozwól użytkownikom reagować na otrzymanie połączenia, otrzymanie wiadomości i zerwanie połączenia). Chciałem jednak również, aby była dość abstrakcyjna, tak aby umożliwić połączenie albo prawdziwych klientów gry, albo prostych fałszywych klientów. Zacząłem przeprojektowywać rzeczy takie jak `IConnection`, `INetworkModule`, `IConnectionFactory`, `IConnectionProtocol`, `IMessageEncoder`, `IMessageDecoder` i tak dalej. Królestwo rzeczowników w bród. Nie tylko to, ale tak naprawdę nie dostałem **nigdzie** \- po prostu czułem, że umieszczam podstawowy problem za innymi warstwami abstrakcji, ponieważ **nie miałem pojęcia, jak chcę zorganizować komunikację między tymi wszystkimi moduły**. Potem przyszła mi do głowy myśl - dlaczego po prostu nie użyję **czasowników** (akcje/funkcje/metody/cokolwiek) zamiast **rzeczowników** (typy) - skupmy się na tym, co na razie chcę osiągnąć, i podziel to później na rzeczowniki! I tak wymyśliłem coś podobnego do tego: private static Func<IDisposable> Listen( Action<TcpClient> onConnectionReceived, Action<TcpClient> onConnectionDropped, Action<TcpClient, int, byte[]> onBytesReceived, Func<bool> isOpen) { // todo: trzeba wstrzyknąć 25565 // todo: daj możliwość dostarczenia listenera // todo: refactor listener do roli interface var listener = new TcpListener(IPAddress.Any, 25565); return () => Observable.FromAsync(listener.AcceptTcpClientAsync) .DoWhile(isOpen) .Subscribe(client => { var stream = client.GetStream(); delegat ma opcję odłączenia klienta // na podstawie kryteriów, które uzna za stosowne.// powinniśmy teraz utworzyć obserwowalny do // nasłuchiwania komunikatów na tym kliencie.Observable.Defer(() => { // bufor 8kb dla każde połączenie // to jest właściwie dość mały var buffer = new byte[8024]; // możemy obsłużyć "robienie" rzeczy z tymi bajtami // wewnątrz przekazanej funkcji. W przeciwnym razie ta funkcja będzie robiła za dużo return Observable.FromAsync(ct => stream.ReadAsync(buffer, 0, buffer.Length, ct)) .Select(n => new {Read = n, Bytes = buffer}); }).Subscribe(a => { // odrzuć połączenie, jeśli nic nie zostało odczytane if (a.Read <= 0) onConnectionDropped(client); else onBytesReceived(client, a.Read, a.Bytes); }); }); } Naprawdę proste. Cóż, to znaczy nie do końca, ale w zasadzie pełni to rolę wszystkich rzeczowników (z wyjątkiem `IMessageEncoder/Decoder`, które wymieniłem wcześniej), ale tylko przy założeniu, że potrzebujemy `TcpClient` (oczywiście, że nie jest tym, czego teraz chcę, ale mogę nad tym popracować w iteracji 2!) Jednak mój problem z tym polega na tym, że nie jest to naprawdę **typowy** kod C# .. i na pewno łamie SRP w tym, że ta funkcja zwraca funkcję dla całego wykonania serwera. Ale – dla mnie ma to sens. Więc moje pytanie brzmi, czy jest jakiś prawdziwy nieodłączny minus używania funkcjonalnego paradygmatu takiego jak ten, w przeciwieństwie do tradycyjnego Królestwa Rzeczowników OOP wewnątrz C# - tradycyjnie języka wieloparadygmatycznego? A jeśli są wady, to z czym bym się zmierzył i dlaczego? Dla przypomnienia, zamierzam, aby był to OSS, więc jest jeszcze jeden problem, ponieważ niektórzy programiści mogą nie rozumieć stylu kodu, ponieważ po prostu nie jest zorientowany na OOP, tylko czyste funkcje.


title: Zachowanie zastrzeżenia jest obowiązkowe w licencji BSD-2-Clause, ale nie w licencji MIT

text: Widzę różnicę między licencjami BSD a licencją MIT. Licencje BSD wymagają zachowania pełnego wyłączenia odpowiedzialności we wszystkich redystrybucjach kodu źródłowego lub kodu binarnego. Licencja MIT tego nie wymaga. Dla Twojej wygody powielam pełną licencję BSD-2-Clause wraz z licencją MIT. Oto licencja BSD-2-Clause. BSD-2-KLAUZULA LICENCJA ==================== Prawa autorskie (c) <ROK>, <WŁAŚCICIEL> Wszelkie prawa zastrzeżone. Redystrybucja i używanie w formie źródłowej i binarnej, z modyfikacją lub bez, jest dozwolone pod warunkiem, że spełnione są następujące warunki: 1. Redystrybucja kodu źródłowego musi zawierać powyższą informację o prawach autorskich, tę listę warunków oraz następujące zastrzeżenie. 2. Redystrybucje w formie binarnej muszą zawierać powyższą informację o prawach autorskich, tę listę warunków oraz następujące zastrzeżenie w dokumentacji i/lub innych materiałach dostarczonych z dystrybucją. NINIEJSZE OPROGRAMOWANIE JEST DOSTARCZANE PRZEZ POSIADACZY PRAW AUTORSKICH I WSPÓŁCZYNNIKÓW „TAK JAK JEST” I WYŁĄCZA SIĘ WSZELKIE WYRAŹNE LUB DOROZUMIANE GWARANCJE, W TYM MIĘDZY INNYMI DOROZUMIANE GWARANCJE PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU. W ŻADNYM WYPADKU WŁAŚCICIEL PRAW AUTORSKICH LUB WŁAŚCICIELE NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK BEZPOŚREDNIE, POŚREDNIE, PRZYPADKOWE, SZCZEGÓLNE, PRZYKŁADOWE LUB WTÓRNE SZKODY (W TYM MIĘDZY INNYMI ZAKUP TOWARÓW LUB USŁUG ZAMIENNYCH; UTRATĘ KORZYSTANIA, DANYCH LUB USŁUG LUB PRZERWANIA W DZIAŁALNOŚCI) JEDNAK SPOWODOWANE I NA DOWOLNEJ TEORII ODPOWIEDZIALNOŚCI UMOWNEJ, ŚCISŁEJ LUB CZYNNEJ (W TYM ZANIEDBANIA LUB INNEGO) WYNIKAJĄCEJ Z KORZYSTANIA Z TEGO OPROGRAMOWANIA, NAWET JEŚLI JEST WSKAZANE. Oto licencja MIT. LICENCJA MIT =========== Prawa autorskie (C) <rok> <właściciele praw autorskich> Niniejszym udziela się nieodpłatnego zezwolenia każdej osobie otrzymującej kopię tego oprogramowania i powiązanych plików dokumentacji („Oprogramowanie "), bez ograniczeń w obsłudze Oprogramowania, w tym między innymi na prawach do używania, kopiowania, modyfikowania, łączenia, publikowania, rozpowszechniania, udzielania sublicencji i/lub sprzedaży kopii Oprogramowania oraz zezwalania osobom, którym Oprogramowanie jest dostarczane w tym celu, pod następującymi warunkami: Powyższa informacja o prawach autorskich i niniejsza informacja o pozwoleniu będą dołączone do wszystkich kopii lub istotnych części Oprogramowania. OPROGRAMOWANIE JEST DOSTARCZANE „TAK JAK JEST”, BEZ JAKICHKOLWIEK GWARANCJI, WYRAŹNYCH LUB DOROZUMIANYCH, W TYM MIĘDZY INNYMI GWARANCJI WARTOŚCI HANDLOWEJ, PRZYDATNOŚCI DO OKREŚLONEGO CELU I NIENARUSZANIA PRAW. W ŻADNYM WYPADKU AUTORZY LUB WŁAŚCICIELE PRAW AUTORSKICH NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK ROSZCZENIA, SZKODY LUB INNĄ ODPOWIEDZIALNOŚĆ, CZY NA TEMAT UMOWY, CZYNNEGO CZYNNOŚCI, WYNIKAJĄCEJ Z OPROGRAMOWANIA LUB W ZWIĄZKU Z UŻYTKOWANIEM LUB INNYCH OPROGRAMOWANIE. Podczas gdy licencja BSD mówi: „musi zachować powyższą informację o prawach autorskich, tę listę warunków i **następujące zastrzeżenie**”, licencja MIT wspomina tylko: „Powyższa informacja o prawach autorskich i niniejsza informacja o zezwoleniu powinny być dołączone”, tj. Licencja MIT nie wymaga dołączenia zastrzeżenia. Nie szukam porady prawnej. Jako programista chcę zrozumieć, czy z powodu tej różnicy istnieje jakikolwiek dobry powód do wydania kodu w jednej z tych licencji zamiast w drugiej.


title: Jaka jest różnica między terminami „protokół” i „standard”?

text: Uważam, że termin „protokół” jest mylący (w kategoriach informatyki). Jeśli protokół jest tylko zbiorem reguł, czy nie byłoby łatwiej, gdybyśmy zamiast tego użyli terminu „standard” (jak w „standardzie HTTP”)?


title: Stosowanie zasad SOLID

text: Jestem całkiem nowy w S.O.L.I.D. zasady projektowania. Rozumiem ich przyczynę i korzyści, ale nie stosuję ich do mniejszego projektu, który chcę zrefaktoryzować jako praktyczne ćwiczenie, aby wykorzystać zasady SOLID. Wiem, że nie ma potrzeby zmiany aplikacji, która działa idealnie, ale i tak chcę ją zrefaktoryzować, więc zdobywam doświadczenie projektowe do przyszłych projektów. Aplikacja ma następujące zadanie (właściwie to znacznie więcej, ale zachowajmy prostotę): Musi odczytać plik XML, który zawiera definicje tabeli/kolumny/widoku bazy danych itp. i utworzyć plik SQL, który można wykorzystać do stworzenia schemat bazy danych ORACLE. (Uwaga: Proszę powstrzymać się od omawiania, dlaczego go potrzebuję lub dlaczego nie używam XSLT itd., są powody, ale są one nie na temat.) Na początek zdecydowałem się przyjrzeć tylko tabelom i ograniczeniom. Jeśli zignorujesz kolumny, możesz to określić w następujący sposób: Ograniczenie jest częścią tabeli (a dokładniej częścią instrukcji CREATE TABLE), a ograniczenie może również odwoływać się do innej tabeli. Najpierw wyjaśnię, jak teraz wygląda aplikacja (bez zastosowania SOLID): W tej chwili aplikacja posiada klasę „Table”, która zawiera listę wskaźników do Ograniczeń posiadanych przez tabelę oraz listę wskaźników do Ograniczeń odwołując się do tej tabeli. Za każdym razem, gdy zostanie ustanowione połączenie, zostanie również ustanowione połączenie wsteczne. Tabela zawiera metodę createStatement(), która z kolei wywołuje funkcję createStatement() każdego ograniczenia. Wspomniana metoda sama użyje połączeń z tabelą właściciela i tabelą odniesienia w celu pobrania ich nazw. Oczywiście nie dotyczy to w ogóle SOLID. Na przykład, istnieją zależności cykliczne, które powodują rozdęcie kodu pod względem wymaganych metod „dodaj”/„usuń” oraz niektórych destruktorów dużych obiektów. Jest więc kilka pytań: 1. Czy powinienem rozwiązać zależności cykliczne za pomocą Dependency Injection? Jeśli tak, przypuszczam, że ograniczenie powinno otrzymać tabelę właściciela (i opcjonalnie przywoływaną) w swoim konstruktorze. Ale jak w takim razie mógłbym przejrzeć listę ograniczeń dla pojedynczej tabeli? 2. Jeśli klasa tabeli przechowuje zarówno stan siebie (np. nazwę tabeli, komentarz do tabeli itp.), jak i linki do ograniczeń, to czy jest to jeden czy dwa „obowiązki”, biorąc pod uwagę zasadę pojedynczej odpowiedzialności? 3. W przypadku 2. ma rację, czy powinienem po prostu utworzyć nową klasę w logicznej warstwie biznesowej, która zarządza łączami? Jeśli tak, 1. oczywiście nie byłoby już istotne. 4. Czy metody "createStatement" powinny być częścią klas Table/Constraint, czy też mam je usunąć? Jeśli tak, to dokąd? Jedna klasa menedżera na każdą klasę przechowywania danych (tj. Tabela, ograniczenie, ...)? A może raczej utworzyć klasę menedżera na link (podobnie jak 3.)? Ilekroć próbuję odpowiedzieć na jedno z tych pytań, biegam gdzieś w kółko. Problem oczywiście staje się o wiele bardziej złożony, jeśli uwzględnisz kolumny, indeksy i tak dalej, ale jeśli pomożecie mi z prostą rzeczą dotyczącą tabeli/ograniczenia, może będę mógł sam rozwiązać resztę.


title: Jaki jest dobry sposób na zresetowanie klucza podstawowego?

text: Natrafiliśmy na problem z aplikacją z kluczem podstawowym tabeli Oracle przekraczającym limity używane przez Java Integer (2 ^ 32) i jedną z sugestii jest zresetowanie tego do 1000 i ponowne rozpoczęcie. LUB zmień kod, aby zamiast tego używał Java Long (2 ^ 64). Ma to efekt domina, ponieważ ten klucz jest używany jako identyfikator również przez wiele innych systemów. I w przyszłości może dojść do powielania (w odległej przyszłości) Czy są jakieś sugestie dotyczące dobrych i złych wyników w tym podejściu?


title: Jaki jest minimalny podzbiór najlepszych/dobrze znanych praktyk w tworzeniu oprogramowania dla programisty solo?

text: Od dłuższego czasu jestem samotnym programistą w swojej pracy. Zwykle czytam artykuły i posty na temat * Systemy kontroli wersji * Ciągła integracja/dostarczanie * Metodologie rozwoju: Scrum, Waterfall, V-Model, Agile, XP, itp. * Zarządzanie projektami oprogramowania ZESPOŁY. Nie jestem zespołem, więc jaki byłby absolutnie minimalny zestaw praktyk dla jednego programisty? Rozważ następujące warunki: * Nie mam konfliktów z kodem innych osób. * Nie muszę utrzymywać drzew plików/katalogów, moje środowisko programistyczne dba o samo wersjonowanie (rozwój oparty na obrazach). * Nie ma żadnych formalnych wymagań, moi użytkownicy nie wiedzą, czego chcą i nie mają nic przeciwko temu. * Jedyną osobą, która mogłaby być zainteresowana dostarczeniem wersji lub dokumentacji, jestem ja, w zasadzie klient chce WYNIKÓW i nie dba o metodologie oprogramowania itp. Moim zdaniem nie chcę poświęcać (zbyt dużo) czasu i energii na wszystko, co nie jest bezpośrednio związane z wymaganiami klienta. Jakieś zalecenia?


title: Dlaczego (większość?) emulatorów komputerowych retro jest jednowątkowych?

text: Cały prawdziwy sprzęt komputerowy działa równolegle. Dlaczego więc większość emulatorów systemów retro (jak NES) jest jednowątkowych (czy nie mam racji?)? Masz główną pętlę i liczysz cykle procesora, a po pewnych cyklach aktywujesz inny sprzęt, taki jak PPU. To samo dotyczy IBM PC i emulacji (MDA/CGA/VGA) ? Dziękuję