title: Jak udowodnić kierownictwu, że nasi programiści mogliby pracować wydajniej?

text: **Backstory** Niecały rok temu ukończyłem studia na kierunku informatyka (z dodatkowymi kursami z inżynierii oprogramowania) oraz drugi stopień z inżynierii oprogramowania. Chciałbym myśleć, że jestem zaznajomiony z nowoczesnymi metodologiami tworzenia oprogramowania (CI, Scrum, XP itp.). **Problem** Dostałem pierwszą (i obecną) pracę w średniej wielkości firmie zajmującej się tworzeniem gier. Firma istnieje od kilku lat, ma na swoim koncie wiele udanych tytułów i jest pełna utalentowanych i oddanych ludzi. Jednak rozwój oprogramowania odbywa się całkowicie ad hoc. Używamy SVN i bugtrackera, ale poza tym jest bardzo mało planowania, żadnych automatycznych testów i trudno byłoby znaleźć diagram UML w dowolnym miejscu w biurze. Przychodzą mi na myśl dwa możliwe powody: 1. Programiści po prostu nie mają wystarczająco dużo czasu, aby robić rzeczy właściwie. Niestety wyższe kierownictwo ma tendencję do wyznaczania terminów bez konsultacji z programistami, co doprowadziło do wielu całonocnych wydarzeń. 2. Samym programistom brakuje wykształcenia/motywacji do stosowania odpowiednich technik. **Pytanie**, o którym ostatnio rozmawiałem z kierownictwem i zachęcono mnie do zaproponowania alternatyw. Myślę, że pierwszą rzeczą do zrobienia byłoby wykluczenie drugiej z wymienionych powyżej możliwości: to jest przedstawienie kierownictwu pewnych dowodów na to, że gdyby programiści mieli więcej miejsca do wytchnienia, mogliby stać się znacznie bardziej produktywni. Jednak nie jestem do końca pewien, jak się do tego zabrać. Moim najlepszym pomysłem do tej pory jest przeprowadzenie ankiety wśród programistów na temat znanych im metodologii tworzenia oprogramowania, a także ich stosunku do jakości kodu i tym podobnych. **tl;dr** **Jak mogę ocenić, czy nasi programiści są w stanie/chęć zastosować nowoczesne metody tworzenia oprogramowania i udowodnić kierownictwu, że prowadzi to do zwiększenia produktywności?** * * * **EDYTUJ** I oczywiście nie udało mi się właściwie przedstawić mojego punktu widzenia, więc pozwólcie, że trochę omówię sytuację. **Po pierwsze** , jestem w pełni świadomy, że wygląda to jak jasnooki świeżo upieczony absolwent próbujący ratować świat swoją edukacją w l33t i zmieniając nikczemny sposób działania tych zrzędliwych starych skamielin, którzy po prostu nie wiedzą nic lepszego. Rozumiem też, że zawsze istnieje różnica między teorią a praktyką, a to, czego uczą w szkole, nigdy nie jest tym, co dzieje się w prawdziwym życiu. Właśnie dlatego jestem tutaj niesamowicie ostrożny, próbując wyczuć obecną sytuację, zamiast ładować _"Hai przebraniu, od teraz wszyscy zróbmy testy jednostkowe!"_ **Drugi**, @ psr podnosi bardzo dobry punkt. Pozwolę sobie wymienić kilka powodów, dla których uważam, że jest miejsce na ulepszenia: * Nasz starszy programista, który jest trochę indywidualistą, ale ostatecznie utalentowanym i rozsądnym facetem, zgadza się, że w tym momencie historii firmy powinniśmy mieć więcej wdrożone wyrafinowane i powtarzalne procesy rozwoju. * Jeden z programistów, który jest znacznie bardziej doświadczony ode mnie i używa nowoczesnych metod, zgadza się ze mną, że moglibyśmy być bardziej produktywni, gdybyśmy skorzystali z niektórych z nich. * W niektórych przypadkach łączenie funkcji podczas całonocnej nocy, a następnie polowanie na wszystkie błędy zajmuje absurdalnie dużo czasu; Nie wyobrażam sobie, żeby robienie rzeczy w inny sposób mogło być gorsze. * Brak planowania, projektowania, refaktoryzacji i dokumentacji prowadzi do niskiej jakości kodu. Co być może ważniejsze, prowadzi to do tego, że programiści zapominają, jak działa ich własny kod w ciągu kilku miesięcy (podczas gdy wciąż pracują nad tym samym projektem!) i nie mogą się o tym dowiedzieć poza próbami i błędami lub przedzieraniem się przez spaghetti. * **Nawet zarządzanie cierpi** , ponieważ jedyną wymierną miarą postępu w projekcie jest liczba nierozwiązanych błędów. Ale ponieważ wszystko może się zepsuć w dowolnym momencie (z powyższych powodów), jest to bardzo niewiarygodna liczba. **Po trzecie** , tak naprawdę nie wierzę, że moim kolegom brakuje wiedzy o nowoczesnych metodach lub chęci ich stosowania, po prostu w tym momencie nie mogę tego wykluczyć jako możliwości. Z tego powodu przyjechałem tutaj z pytaniem, jaki jest najlepszy sposób, aby dowiedzieć się, co wiedzą (oczywiście poza długimi wywiadami osobistymi). **Po czwarte** , nie traktuj zbyt poważnie tych komentarzy na temat UML i testów automatycznych, to tylko przykłady. Faktem jest, że kod jest tworzony na podstawie kaprysów projektantów/wyższego kierownictwa bez żadnego projektu oprogramowania i jest testowany tylko przez kilku facetów naciskających przyciski, aby sprawdzić, czy coś się zepsuje. Być może nadal noszę okulary przyciemniane na różowo, wydane na uniwersytecie, ale wydaje mi się, że to projekt garażu w najlepszym wydaniu. **tl;dr** **Naprawdę bardzo się staram nie być z tego powodu arogancki, ale zarówno moi koledzy programiści, jak i kierownictwo wydają się wyrażać pragnienie bardziej przewidywalnych i produktywnych sposobów tworzenia oprogramowania. Jak znaleźć rozwiązanie, które ułatwiłoby przejście?**


title: Jakie są najpopularniejsze algorytmy sortowania w praktyce?

text: Chociaż podejrzewam, że odpowiedź na to pytanie może brzmieć w stylu „popularność nie ma znaczenia, każdy algorytm ma swoje wady”, interesuje mnie lista popularnych algorytmów sortujących stosowanych w praktyce. Przeglądałem stronę Wikipedii na temat algorytmów sortowania i chociaż nie ma tam zbyt wielu algorytmów, nadal nie widzę, aby wszystkie z nich były używane. Na przykład, z pewnością sortowanie przez wybór nie byłoby używane w praktyce, ponieważ ma `O(n^2)`, prawda? Więc które są często używane w praktyce?


title: Co znajduje się w twoim przyborniku podczas projektowania aplikacji wokół Model-View-Controller (MVC)?

text: Istnieje wiele świetnych wyjaśnień dotyczących wzorca projektowego Model-View-Controller, ale mam problem ze znalezieniem dobrych zasobów pokazujących, jak go używać w praktyce. Więc kiedy uruchamiasz nową aplikację (nieważne, co to jest), co znajduje się w twoim zestawie narzędzi? Na przykład zasugerowano, że korzystanie z diagramów współpracy UML ( http://www.objectmentor.com/resources/articles/umlCollaborationDiagrams.pdf ) może być przydatne podczas projektowania aplikacji wokół MVC, chociaż nie jestem pewien dokładnie, jak i dlaczego może tak być...? Więc co znajduje się w twoim zestawie narzędzi dla MVC?


title: Jak mogę poszerzyć swoją wiedzę z zakresu programowania stron internetowych?

text: Byłem poza szkołą przez około 3,5 roku i pracowałem w środowisku .NET wykonując prace C# UI (WinForms/WPF/Silverlight) oraz trochę prac w Javie, po stronie serwera. W sumie nie zajmowałem się tworzeniem stron internetowych. Chcę poszerzyć swoją wiedzę o wiedzę internetową. Moja firma korzysta ze stosu Spring, więc podążałem tą ścieżką, aby miała wartość w moim obecnym miejscu pracy. Nie robią absolutnie żadnego użytku z Ruby/Rails, ale to pozwoliłoby mi nauczyć się języka zamiast stosu. Myślałem o przejściu na ścieżkę ASP, z której firma również intensywnie korzysta, ponieważ znam C# i środowisko .NET. Jestem zwolennikiem tego, co MS wniósł na stół, więc wyjście ze środowiska .NET jest zarówno interesujące, jak i ekscytujące. Nie jestem pewien, czy unikam ASP, aby po prostu poszerzyć mój bank wiedzy... więc w oparciu o powyższą wiedzę, jaką drogę wszyscy byście wybrali? Co ma największą wartość w dłuższej perspektywie? ŻMIJA? Stos wiosenny? Rubin/szyny? Coś jeszcze, co ignoruję...? Wszystkie informacje są bardzo mile widziane, dzięki.


title: GitHub: Czy istnieją zewnętrzne narzędzia do zarządzania listą problemów a zaległością projektu?

text: Niedawno zamieściłem jeden z moich projektów1 na GitHubie i kiedy badałem możliwości strony, zauważyłem, że ma całkiem przyzwoitą sekcję śledzenia problemów. Chcę użyć tej sekcji, aby a) inni ludzie mogli zgłaszać błędy, jeśli chcą oraz b) inni ludzie mogą zobaczyć, które błędy są mi znane. Jednak, jak zauważyli inni, lista problemów nie może mieć priorytetów w celu utworzenia zaległości projektu. Na razie mój backlog jest plikiem tekstowym, ale chciałbym móc go zintegrować, aby te same informacje nie były przechowywane w różnych miejscach. Posiadanie w pełni uporządkowanej listy, którą również praktykujemy w pracy, było bardzo przydatne, ponieważ mogę otworzyć jeden plik, zacząć od wiersza 1 i odpalić 2 lub 3 elementy za jednym posiedzeniem bez konieczności wracania do pełnych spraw/ wiadro opowieści. GitHub tego nie oferuje. To, co oferuje GitHub, to bardzo ładne i czyste API, dzięki czemu problemy można łatwo wyeksportować do czegokolwiek innego. Szukałem, czy istnieją inne strony internetowe (takie jak Trello), które integrują się z problemami GitHub, ale nic nie znalazłem. Czy ktoś wie o takim produkcie, usłudze lub narzędziu offline? Ci, którzy korzystają z GitHub, jakie masz doświadczenie w zarządzaniu zaległościami? Nienawidzę pomysłu ręcznego zarządzania dwiema rozłączonymi listami, jak niektórzy ludzie robią ze stronami projektów Wiki. * * * 1 - czy bezwstydne wtyczki nie są dozwolone na tej stronie? Przeszukano, ale nie znalazłem jednoznacznej odpowiedzi. Jeśli to zła praktyka, ZATRZYMAJ SIĘ i nie czytaj dalej Jako programista miałem dość nawigowania do tego samego zestawu folderów 30 razy dziennie, więc napisałem małe, automatycznie zwijane narzędzie, które przykleja się do pulpitu i pozwala łatwy dostęp do folderów, z których stale korzystasz.


title: Repozytoria stron trzecich w Subversion; lokalne mody?

text: Tworzę małą aplikację jako interfejs do obsługi funkcji, monitorowania, uruchamiania testów jednostkowych przez Internet itp. Zostanie to sprawdzone w Subversion. Chcę dołączyć aplikację innej firmy, która jest również dostępna za pośrednictwem Subversion. Jak dotąd wolę odwoływać się do zdalnego repozytorium, aby ułatwić aktualizacje, szczególnie gdy dokonałem lokalnych modyfikacji. Teraz chcę, aby aplikacja innej firmy była rozpowszechniana razem z aplikacją nadrzędną. Zewnętrzne elementy Subversion są niedostępne, ponieważ nie mogę zatwierdzić moich lokalnych modów. Wydaje się, że `git svn` ma potencjał, ale nie jestem pewien co do szczegółów. (Wydaje się to brudne mieć katalog .git z metadanymi svn przechowywanymi w repozytorium svn.) Więc jak radzisz sobie z modyfikacjami projektów Subversion, w których nie możesz się zaangażować? Jestem całkiem otwarty na każdą kombinację git i svn, najlepiej pozwalając, aby kod działał w naszym istniejącym repozytorium Subversion. **Aktualizacja:** Obecnie badam gałęzie dostawców, co jest bardziej konwencją niż funkcją. Istnieje narzędzie o nazwie `svn_load_dirs.pl`, które pomaga w tym procesie.


title: Najlepsze praktyki dotyczące generowania kodów polecających?

text: Wdrażam program skierowań w witrynie i zastanawiam się, czy istnieje najlepsza praktyka w zakresie tego, jak powinny wyglądać kody skierowań. Zakładam, że skoro nie chcemy nadmiernie długich kodów polecających, nie możemy po prostu użyć identyfikatora GUID lub czegoś podobnego, więc będę musiał sprawdzić wygenerowane kody polecające, aby zapewnić unikalność?


title: Jak poradzić sobie ze śladem błędów?

text: Z każdym wydaniem nasz ślad błędów wciąż się powiększa. Są to ważne błędy, jednak musimy również napisać nowe funkcje, aby pozostać w konkurencji. Ponadto te funkcje będą częściej używane niż poprawki; i zapewnić lepszy zwrot z inwestycji. Jak inni inżynierowie i właściciele produktów radzą sobie z tą sytuacją?


title: Jak korzystać z kodu z porzuconych projektów github

text: Niedawno natknąłem się na projekty github, z których mógłbym naprawdę skorzystać, ale wydaje się, że zostały porzucone, z wieloma problemami i ważnymi żądaniami ściągnięcia, być może ze 100+ forkami. Często nie ma alternatywnego projektu. Czy używam kodu tak, jak jest? Czy wybieram widelec i ignoruję innych? Czy ręcznie ściągam kod z żądań ściągnięcia? Jak? Czy jest jakaś szansa, że ja lub ktokolwiek inny mógłby jakoś zorganizować i wystartować tam, gdzie skończył oryginalny koder?


title: Czy licencjonowanie jest problemem dla podmodułów Git?

text: Na przykład: projekt na licencji MIT chce uprościć proces budowania dla swoich użytkowników, włączając część łańcucha narzędzi GNU (którym jest oczywiście GPL) jako podmoduł. * Czy można to zinterpretować jako uczynienie projektu MIT „dziełem pochodnym” łańcucha narzędzi GNU? * Czy uwzględnienie projektu jako modułu podrzędnego Git (lub podobnego mechanizmu - może nawet skryptu Bash, który go pobiera) liczy się jako „redystrybucja” tego projektu? * A jeśli Makefile również zbudował podprojekt? Moim zdaniem (i chyba większości ludzi) odpowiedź na te pytania to wyraźne „nie”. Bardziej interesuje mnie słuchanie precedensów i norm dotyczących tego zagadnienia niż omawianie naszych własnych interpretacji prawa autorskiego. Czy znasz jakieś projekty open-source, które mają podmoduły na niezgodnych licencjach? Czy znasz kogoś, kto celowo ich unikał i dlaczego to zrobił? * * * Dla wyjaśnienia dla osób nie korzystających z Git: Moduły podrzędne nie powodują włączenia zawartości, są jak "wskaźniki" do innego repozytorium. W podanym przeze mnie przykładzie, kiedy sklonowałeś projekt MIT i uruchomiłeś `git submodule init`, Git automatycznie pobrał kod GNU z repozytorium GNU.


title: Jak mogę zreplikować zachowanie IntelliJ + JIRA + SVN za pomocą Eclipse?

text: Niezdolność IntelliJ do nadążania za aktualizacjami SVN stała się dla mnie przeszkodą. Moim głównym powodem używania IntelliJ jest jego integracja z listami zmian JIRA i SVN. Mój preferowany przepływ pracy wygląda następująco: 1. Zidentyfikuj problem JIRA do pracy 2. Rozpocznij pracę nad problemem JIRA za pomocą wtyczki Atlassian 3. IDE/wtyczka automatycznie tworzy listę zmian SVN dla tego zadania. Używa numeru sprawy i tytułu jako nazwy listy zmian. 4. Pracuj nad problemem. 5. Oderwij się do pracy nad innym problemem. 6. Zatrzymaj pracę nad pierwszym wydaniem, rozpocznij od drugiego. 7. Utworzona zostaje nowa lista zmian dla drugiego wydania. Jak powielić ten przepływ pracy w środowisku Eclipse?


title: Najlepszy mechanizm generowania kluczy licencyjnych

text: Jakie metody/biblioteki/narzędzia sugerowaliby ludzie do generowania kluczy licencyjnych (te piękne AAAAA-AAAAA-AAAAA-AAAAA-AAAAA rzeczy, które umieszczasz podczas rejestracji oprogramowania)? Masz jakieś problemy, na które należy zwrócić uwagę podczas ich wdrażania? (W tej chwili interesuje mnie to jako ogólna rzecz, a nie specyficzna dla języka, więc po prostu określ, jakiego języka używasz, jeśli twoje rozwiązanie jest specyficzne dla języka).


title: Projektowanie testów jednostkowych dla systemu stanowego

text: ## Wstęp Test Driven Development został spopularyzowany po ukończeniu szkoły iw branży. Próbuję się tego nauczyć, ale niektóre ważne rzeczy wciąż mi umykają. Zwolennicy TDD mówią wiele rzeczy, takich jak (dalej określane jako „zasada pojedynczej asercji” lub **SAP** ): > Od jakiegoś czasu zastanawiałem się nad tym, jak testy TDD mogą być tak proste, jak > ekspresyjne i jak elegancki, jak to możliwe. W tym artykule omówimy nieco > jak to jest, aby testy były tak proste i rozłożone, jak to tylko możliwe: dążenie do > pojedynczego potwierdzenia w każdym teście. Źródło: http://www.artima.com/weblogs/viewpost.jsp?thread=35578 Mówią też takie rzeczy (odtąd określane jako „zasada metody prywatnej” lub **PMP**): > Generalnie nie nie testuje jednostek prywatnych metod bezpośrednio. Ponieważ są > prywatne, rozważ je jako szczegół implementacji. Nikt nigdy nie zadzwoni do jednego z nich i nie będzie oczekiwać, że zadziała w określony sposób. >> Zamiast tego powinieneś przetestować swój publiczny interfejs. Jeśli metody, które wywołują twoje > metody prywatne, działają zgodnie z oczekiwaniami, zakładasz przez rozszerzenie, że twoje > metody prywatne działają poprawnie. Źródło: Jak testujecie metody prywatne? ## Sytuacja Próbuję przetestować stanowy system przetwarzania danych. System może robić różne rzeczy dla dokładnie tego samego fragmentu danych, biorąc pod uwagę jego stan przed otrzymaniem tych danych. Rozważ prosty test, który buduje stan w systemie, a następnie testuje zachowanie, które dana metoda ma przetestować. * SAP sugeruje, że nie powinienem testować „procedury budowania stanu”, powinienem założyć, że stan jest taki, jakiego oczekuję od kodu budowania, a następnie przetestować jedną zmianę stanu, którą próbuję przetestować * PMP sugeruje, że nie można pominąć tego kroku "budowania stanu" i po prostu przetestować metody, które zarządzają tą funkcjonalnością niezależnie. Rezultatem mojego rzeczywistego kodu były testy, które są nadęte, skomplikowane, długie i trudne do napisania. A jeśli zmiany stanów ulegną zmianie, testy muszą zostać zmienione... co byłoby w porządku przy małych, wydajnych testach, ale niezwykle czasochłonne i mylące z tymi długimi, rozdętymi testami. Jak to się zwykle robi?


title: Obliczenia sieciowe

text: Jestem prawie pewien, że ktoś już o tym pomyślał i dokładnie go zbadał, ale mam problem ze znalezieniem jakichkolwiek materiałów, a nawet słów kluczowych do wyszukania dla pomysłu, o którym ostatnio myślałem. Zastanawiałem się nad koncepcją, w której w systemach rozproszonych rzeczywiste obliczenia i przetwarzanie miałyby miejsce w sieci, a nie na węzłach (serwerze lub kliencie) w drodze od źródła do miejsca przeznaczenia. Tam, gdzie routery sieciowe oprócz routingu pakietów sieciowych do następnego węzła, dopóki nie zostaną dostarczone do miejsca docelowego, będą również wykonywały pewne wbudowane instrukcje w tych pakietach. Na przykład pakiet sieciowy zostałby podzielony na dwa obszary: dane i instrukcje (+ kilka nagłówków) A kiedy router kieruje pakiet do następnego routera, wysyła przekształcony pakiet zgodnie z osadzonymi instrukcjami: +---- ------------------+ |Nagłówki pakietów sieciowych| +----------------------+ | SLOT DANYCH 1 | | GNIAZDO DANYCH 2 | | .......... | | SLOT DANYCH N | +----------------------+ | Przyrost slotu 1 | | SLOT3 = SLOT1 + SLOT2| +----------------------+ | instrukcja pkt | +----------------------+ Aby pakiety sieciowe dotarły do miejsca przeznaczenia, część tego (w zależności od liczby pętli do przejścia) byłyby już obliczane (powiedzmy, że dekodowano dźwięk itp.), odciążając oba punkty końcowe. Routery są do tego technicznie zdolne. Przetwarzają dane w oparciu o wartości pakietów sieciowych - np. wybierają, gdzie wysłać następny pakiet na podstawie nagłówka IP. Nic nie stoi na przeszkodzie, aby były wykorzystywane jako „prawdziwa chmura”, prawda? Każdy router wykonałby jeden pakiet lub kilka instrukcji z tego pakietu (i aktualizował wskaźnik instrukcji) w zależności od swoich zasobów sprzętowych i możliwości. Tak więc pakiet sieciowy byłby ramką stosu, a nie tylko pakietem sieciowym. Oczywiście z tym modelem wiąże się cała klasa problemów, takich jak prawidłowe partycjonowanie danych (lub nawet możliwość takiego działania), ale wszystko to opiera się na starych koncepcjach z heterogenicznego przetwarzania i programowania funkcjonalnego. Czy ktoś mógłby wskazać mi jakieś badania, materiały lub projekty, które dotyczą podobnych koncepcji? Dziękuję!


title: Eksperymentowanie z „dużymi danymi” i redukcją map

text: Myślałem o trochę poeksperymentowaniu z użyciem mapreduce i tak na zestawie danych musimy sprawdzić, czy możemy w jakikolwiek sposób z niego skorzystać. Którą trasę powinienem wybrać, jeśli chcę móc natychmiast, bez większych modyfikacji, wdrożyć moje odkrycia w jakimś systemie sieciowym/chmury, aby sprawdzić, czy jest jakaś dodatkowa korzyść ze skalowania w chmurze.


title: Trwała pamięć masowa dla Apache Mesos

text: Niedawno odkryłem coś takiego jak Apache Mesos. To wszystko wygląda niesamowicie we wszystkich tych demach i przykładach. Z łatwością mogłem sobie wyobrazić, jak można ubiegać się o pracę bezpaństwowców – to naturalnie pasuje do całej idei. Bot, jak radzić sobie z długotrwałymi zadaniami, które są stanowe? Powiedzmy, że mam klaster składający się z N maszyn (i to jest zaplanowane przez Marathon). I chcę tam uruchomić serwer postgresql. To wszystko - na początku nie chcę nawet, aby była wysoce dostępna, ale po prostu pojedyncze zadanie (właściwie zdokeryzowane), które obsługuje serwer postgresql. Jak by to zorganizować? Ograniczyć serwer do konkretnego węzła klastra? Użyć jakiegoś rozproszonego FS?


title: Jak napisać wymagania dla konkretnego modułu?

text: Jestem zaznajomiony z pisaniem specyfikacji wymagań oprogramowania, ale nie jestem do końca pewien, jak napisać wymagania dla konkretnego modułu. Powiedzmy, że muszę opracować system rezerwacji i będzie moduł do przeprowadzania walidacji. Teraz SRS jest już dostępny dla całego systemu, ale przed zaprojektowaniem (specyfikacja API i diagramy klas) modułu Walidacja, jaki byłby format pisania wymagań dla tego modułu.


title: AJAX czy gniazda sieciowe do komunikacji klient-serwer?

text: Niedawno wziąłem udział w kursie AngularJS i, szczerze mówiąc, podobały mi się koncepcje strony internetowej, która pobiera json w celu obsługi kolejnych żądań, jednak nadal czuję, że JavaScript jest zbyt wolny dla tego, co chcę zrobić na serwerze. Niedawno zostałem zatrudniony do budowy serwisu aukcyjnego online. Zbudowałem dwie makiety, jedną w AngularJS, a drugą w PHP. Strona PHP jest znacznie szybsza przy początkowym ładowaniu i obsłudze dużych żądań, ale strona oparta na AngularJS jest znacznie bardziej responsywna na jednoczesne żądania, a pisanie frontendu JavaScript i HTML jest znacznie łatwiejsze, więc pomyślałem, że może po prostu zrobię odpowiednik do AngularJS przy użyciu PHP, JS i HTML, co daje mi to, co najlepsze z obu światów. Idąc do przodu we wdrażaniu projektu, zacząłem zastanawiać się, czy AJAX był odpowiednim narzędziem do pracy. Wygląda na to, że mógłbym użyć prostego serwera websocket node.js jako pośrednika między JS po stronie klienta i PHP, przekazując polecenia od klienta przez websocket do serwera, a następnie przekazując dane z powrotem. Czy rozważyłbyś tę przedwczesną optymalizację, a jeśli nie, to czy usunięcie narzutu HTTP naprawdę zrobi dużą różnicę pod względem przepustowości i rozmiaru żądania?


title: Czy lepiej byłoby mieć dodatkowe kontrole, czy byłaby to strata czasu?

text: Twoim zdaniem, czy uważasz, że to strata czasu na sprawdzanie, czy wiesz, że nie ma możliwości, aby tam było/nie było, czy też po prostu umieściłbyś to tam na wypadek błędu lub czegoś takiego? Na przykład poniżej sprawdza, czy przycisk jest widoczny, a następnie muzyka jest odtwarzana, ale nie ma możliwości wyświetlenia tego przycisku bez odtwarzania muzyki: if (buttonVisible) if ([odtwarzana muzyka] == true) // jest zawsze prawdziwe, jeśli przycisk jest widoczny [muzyka stopPlaying];


title: Potrzebujesz pomocy w wyjaśnieniu projektu gry na Androida

text: Mam zamiar stworzyć grę Kakuro (Cross-Sums) na Androida i mam odpowiedni algorytm. Ale wydaje mi się, że nie mogę dobrze zrozumieć części dotyczącej interakcji z użytkownikiem, tj. Zagadka jest bardzo duża. Tak więc tylko część jest pokazywana użytkownikowi w zależności od urządzenia (np. smartfon HVGA vs tablet XGA). Powinien być przewijalny. Aby było to bardziej zrozumiałe, zobacz poniższe obrazy: ![Siatka wyrenderowana na smartfonie](http://i.stack.imgur.com/4FuiJ.png) ![Siatka wyrenderowana na tablecie](http:/ /i.stack.imgur.com/rZPWy.png) Więc o co proszę: Czy znasz odpowiednią metodę podejścia do tego? Mam na myśli projekt lub konstrukcję, która zapewni takie zachowanie? Proszę zauważyć, że jestem zupełnie nowy w programowaniu gier i nie wiem nic o płótnach itp. (ale mam doświadczenie w tworzeniu aplikacji). Tak więc każda pomoc była naprawdę doceniana.


title: Jak utrzymać stany?

text: Posiadam aplikację WinForm z oknem wyświetlania, które może pokazywać geometrię 3D. Mam inną kontrolkę, na której mam szereg opcji włączania/wyłączania różnych elementów w moim oknie wyświetlania. Jednak stan wyświetlania tych elementów zmienił się w wielu miejscach w moim kodzie. Czy istnieje wzorzec projektowy lub inny przykład struktury kodu w celu utrzymania stanów?


title: Przechowywanie zarchiwizowanych danych indeksowych

text: Używamy RavenDB jako naszego magazynu danych dla informacji transakcyjnych i działa dobrze dla danych, które są obecnie "w użyciu". Zbieramy również zdarzenia audytu, gdy ludzie korzystają z naszej aplikacji, gdzie każde zdarzenie wygląda mniej więcej tak: * Typ, data, podsumowanie itp. - całkiem standardowe * Powiązane identyfikatory dokumentów (może być jeden, może być 5) Jako magazyn dokumentów, Raven robi świetna robota polegająca na ich indeksowaniu, abyśmy mogli zadawać pytania typu „znajdź wszystkie zdarzenia związane z dokumentem XYZ”. Niestety, ponieważ dane są gromadzone w czasie, te zdarzenia audytu mogą stanowić 90% danych przechowywanych w naszej bazie danych – i są one rzadko używane. Chcielibyśmy wydobyć te dane z Ravena i umieścić je w jakimś bardziej odpowiednim miejscu. Jakie inne rozwiązania pamięci masowej istnieją do przechowywania setek tysięcy zdarzeń typu audytu? Chętnie poświęcimy szybkość, aby zaoszczędzić na kosztach przechowywania i indeksowania.


title: Czy interfejsy biznesowe powinny być częścią warstwy modelu?

text: Czy w aplikacji korporacyjnej zorientowanej na usługi nie jest antywzorcem mieszanie interfejsów API usług (zawierających interfejs, od którego zależą użytkownicy zewnętrzni) z obiektami modelu (jednostki, niestandardowe obiekty wyjątków itp.)? Według mnie Usługi powinny zależeć tylko od warstwy Modelu, ale nigdy nie powinny być z nią mieszane. W rzeczywistości mój kolega powiedział mi, że nie ma sensu go rozdzielać, ponieważ klient potrzebuje obu. (interfejsy modelu i usługi) Ale zauważam, że za każdym razem, gdy klient prosi o jakieś zmiany, jak dodanie nowej metody w jakimś interfejsie (oznacza nową usługę), warstwa modelu musi być również dostarczona... Zatem klient, który nie jest zainteresowany ten „dodatek” jest ograniczony do zainteresowania tą aktualizacją Modelu... aw przypadku dużych aplikacji korporacyjnych wiadomo, że ten rodzaj dostarczania jest bardzo ryzykowny... Jaka jest najlepsza praktyka? Oddzielne usługi (tylko interfejsy tak) i modele obiektów lub wymieszaj to ?


title: "Wszystko jest mapą", czy robię to dobrze?

text: Obejrzałem wykład Stuarta Sierry „Thinking In Data” i wziąłem z niego jeden z pomysłów jako zasadę projektowania w tej grze, którą tworzę. Różnica polega na tym, że on pracuje w Clojure, a ja pracuję w JavaScript. Widzę kilka głównych różnic między naszymi językami w tym: * Clojure jest idiomatycznie funkcjonalnym programowaniem * Większość stanów jest niezmienna Zaczerpnąłem pomysł ze slajdu "Wszystko jest mapą" (od 11 minut, 6 sekund do > 29 minut). Oto kilka rzeczy, które on mówi: 1. Za każdym razem, gdy widzisz funkcję, która przyjmuje 2-3 argumenty, możesz zamienić ją w mapę i po prostu przekazać mapę. Jest to wiele zalet: nie musisz się martwić o kolejność argumentacji 2. Nie musisz martwić się o dodatkowe informacje. Jeśli są dodatkowe klucze, to nie jest nasz problem. Po prostu przepływają, nie przeszkadzają. 3. Nie musisz definiować schematu 2. W przeciwieństwie do przekazywania obiektu nie ma ukrywania danych. Twierdzi jednak, że ukrywanie danych może powodować problemy i jest przeceniane: 1. Wydajność 2. Łatwość implementacji 3. Jak tylko komunikujesz się przez sieć lub między procesami, i tak obie strony muszą uzgodnić reprezentację danych . To dodatkowa praca, którą możesz pominąć, jeśli pracujesz tylko na danych. 3. **Najbardziej istotne dla mojego pytania. To 29 minut w:** "Uczynienie swoich funkcji możliwymi do komponowania". Oto przykładowy kod, którego używa do wyjaśnienia koncepcji: ;; Zły (defn proces złożony [] (let [a (get-component @global-state) b (podproces-jeden a) c (podproces-dwa a b) d (podproces-trzy a b c)] (reset! stan globalny d ))) ;; Dobrze (defn proces złożony [stan] (-> stan podproces-jeden podproces-dwa podproces-trzy)) Rozumiem, że większość programistów nie zna Clojure, więc przepiszę to w trybie rozkazującym: ;; Dobry stan procesu złożonego (stanu) def = stan podprocesu-jeden(stan) = stan podprocesu-dwa(stan) = stan zwrotny-podprocesu-trzy(stan) Oto zalety: 1. Łatwy do testowania 2. Łatwy do obejrzenia w tych funkcjach w izolacji 3. Łatwo skomentować jeden wiersz tego i zobaczyć, jaki jest wynik, usuwając pojedynczy krok 4. Każdy podproces może dodać więcej informacji do stanu. Jeśli podproces trzeba przekazać coś do podprocesu trzeciego, wystarczy dodać klucz/wartość. 5. Brak schematu do wyodrębniania potrzebnych danych ze stanu tylko po to, aby można je było zapisać z powrotem. Po prostu przekaż cały stan i pozwól podprocesowi przypisać to, czego potrzebuje. Wracając do mojej sytuacji: wziąłem tę lekcję i zastosowałem ją w mojej grze. Oznacza to, że prawie wszystkie moje funkcje wysokiego poziomu przyjmują i zwracają obiekt `gameState`. Ten obiekt zawiera wszystkie dane gry. Np.: Lista złoczyńców, lista menu, łupy na ziemi itp. Oto przykład mojej funkcji aktualizacji: update(gameState) ... gameState = handleUnitCollision(gameState) ... gameState = handleLoot(gameState) ... Chciałem zapytać o to, **czy stworzyłem jakąś obrzydliwość, która wypaczyła pomysł, który jest praktyczny tylko w funkcjonalnym języku programowania?** JavaScript nie jest _idiomatycznie_ funkcjonalny (chociaż można to napisać w ten sposób ) i pisanie niezmiennych struktur danych jest naprawdę trudne. Martwi mnie tylko to, że on zakłada, że każdy z tych podprocesów jest czysty. Dlaczego należy przyjąć takie założenie? Rzadko zdarza się, aby którakolwiek z moich funkcji była czysta. Czy te pomysły rozpadają się, jeśli nie masz niezmiennych danych? Martwię się, że któregoś dnia obudzę się i zorientuję się, że ten cały projekt to fikcja i tak naprawdę dopiero wdrażam antywzorzec Big Ball Of Mud. * * * Szczerze, pracuję nad tym kodem od miesięcy i jest super. Czuję, że dostaję wszystkie korzyści, o których twierdził. Mój kod jest dla mnie bardzo łatwy do zrozumienia. Ale jestem jednoosobową drużyną, więc mam przekleństwo wiedzy. # Aktualizacja Koduję 6+ miesięcy tym wzorem. Zwykle do tego czasu zapominam, co zrobiłem i właśnie tam „napisałem to w czysty sposób?” wchodzi w grę. Gdybym tego nie zrobił, naprawdę bym walczył. Jak na razie wcale nie walczę. Rozumiem, jak potrzebna byłaby kolejna para oczu, aby sprawdzić, czy można ją pielęgnować. Wszystko, co mogę powiedzieć, to przede wszystkim dbałość o utrzymanie. Zawsze jestem najgłośniejszym głosicielem czystego kodu, bez względu na to, gdzie pracuję. Chcę odpowiedzieć bezpośrednio tym, którzy mają już złe osobiste doświadczenia z tym sposobem kodowania. Wtedy tego nie wiedziałem, ale myślę, że tak naprawdę mówimy o dwóch różnych sposobach pisania kodu. Sposób, w jaki to zrobiłem, wydaje się być bardziej uporządkowany niż to, czego doświadczyli inni. Kiedy ktoś ma złe osobiste doświadczenia z "Wszystko jest mapą", mówi o tym, jak trudno jest go utrzymać, ponieważ: 1. Nigdy nie znasz struktury mapy, której wymaga funkcja 2. Każda funkcja może mutować dane wejściowe w sposób, w jaki nigdy bym się nie spodziewał. Musisz przejrzeć całą bazę kodu, aby dowiedzieć się, jak dany klucz dostał się na mapę lub dlaczego zniknął. Dla tych, którzy mają takie doświadczenie, być może podstawą kodu było „Wszystko zajmuje 1 z N typów map”. Moje brzmi: „Wszystko zajmuje 1 z 1 typu mapy”. Jeśli znasz strukturę tego 1 typu, znasz strukturę wszystkiego. Oczywiście ta struktura zwykle rośnie z czasem. Dlatego... Jest jedno miejsce, w którym można szukać implementacji referencyjnej (tj. schematu). Ta implementacja referencyjna to kod, którego używa gra, więc nie może być nieaktualny. Jeśli chodzi o drugi punkt, nie dodaję/usuwam kluczy do mapy poza implementacją referencyjną, po prostu mutuję to, co już tam jest. Posiadam również duży zestaw testów automatycznych. Jeśli ta architektura w końcu upadnie pod własnym ciężarem, dodam drugą aktualizację. W przeciwnym razie załóż, że wszystko idzie dobrze :)


title: Opracowanie interfejsu do systemu dynamicznego

text: Pracuję dla małej firmy i projektuję GUI do interfejsu naszego wbudowanego systemu. Problem z tym wbudowanym systemem polega na tym, że nie jest to gotowy produkt (może nigdy nie być) i jest stale rozwijany, ulepszany i aktualizowany dla różnych klientów i aplikacji w małych ilościach. Aby sobie z tym poradzić, stworzyłem program, który może eksportować wszystkie dane z arkusza kalkulacyjnego, z którego pochodzi większość wbudowanych zmiennych systemowych, i wrzucać je do małej bazy danych, z której może korzystać aplikacja GUI. Ten program bazodanowy, który stworzyłem, udostępnia również plik odniesienia dla wbudowanego systemu, który pozwala GUI na wyszukanie wszystkich zmiennych. Ten system działa jak dotąd całkiem dobrze, a nawet jest zintegrowany z kontrolą wersji między GUI, bazą danych i systemem wbudowanym. Dużym problemem jest to, że w kilku projektach, które korzystają z tego systemu, cały czas trwa rozwój i strasznie nużące jest utrzymywanie systemu na bieżąco i wprowadzanie nowych zmian. Doszło do punktu, w którym musiałem zakodować GUI, aby dynamicznie (generalnie) generować wszystkie interfejsy, ponieważ nigdy nie mam gwarancji, że znajdę te same dane w ten sam sposób. Nie byłem w stanie wymyślić dobrego sposobu na jednoznaczną identyfikację danych, które importuję z programu Excel, ponieważ wszystkie pola można zmienić (ze względu na upór inżynierii, refaktoryzację kodu i/lub problemy z programem Excel) i nie mogę przypisać stałe odniesienie w samym arkuszu. Czy są więc jakieś dobre metody lub pomysły, jak radzić sobie z chaosem?


title: Jaki jest dobry system zarządzania tagami?

text: Pracuję dla firmy wydawniczej, w której musimy śledzić konwersje itp. Wystarczy powiedzieć, że mamy tagi dla różnych obszarów świata, a lista może być bardzo długa. Musimy znaleźć system, który może nadać tag „A” krajowi „B” i tak dalej, a ja muszę to zrobić tak, aby moje mniej uzdolnione technicznie mogły sobie z tym poradzić. Czy ktoś zna dobre rozwiązanie?


title: Wdrożenie swego rodzaju systemu nawigacyjnego

text: Więc podejmuję się projektu, który zajmuje się nawigacją. Oto jak wygląda opis problemu. Powiedzmy, że dana mapa piętra, z różnymi pomieszczeniami, teraz jakoś, ta informacja jest przekazywana do programu i co program robi, to zajmuje dwa dodatkowe dane wejściowe, Lokalizacja początkowa. Ostateczna lokalizacja. Teraz, mając te dwie lokalizacje, program wytycza najlepszą możliwą trasę od lokalizacji początkowej do końcowej. Do implementacji kodu będę używał języka C. A teraz problemy: 1. W jaki sposób wprowadzić do mojego programu informacje o podłodze, tj. czy jest tam ściana, czy drzwi, czy po prostu pusta przestrzeń. Oto moje zdanie na ten temat. Będę miał matrycę 2D, gdzie 1 w matrycy oznacza pustą przestrzeń, a 0 oznacza ścianę. Ale teraz nie jestem pewien, jak oznaczyć komórkę jako 0, czyli jak dobrać wymiary matrycy? Załóżmy na przykład, że moja podłoga ma wymiary 8 na 8 (jednostki długości). Teraz moja macierz powinna mieć 8 na 8 czy 16 na 16, czy co? A co jeśli po wybraniu wymiaru pojedynczej komórki, jeśli jedna część komórki to ściana, a druga to pusta przestrzeń, czy będzie to 0 czy 1? Ale domyślam się, że w końcu byłoby to ręczne wprowadzanie danych? Ale nie oczekuję, że ktoś stworzy dla mnie taką matrycę ręcznie? Czyli jakaś pomoc w tym kierunku zostanie doceniona? Czy ten sposób przedstawiania danych jest w porządku, czy powinienem iść w innym kierunku? 2. Powiedz, jeśli pójdę według powyższego sposobu reprezentacji danych, co mam zrobić dalej? Myślałem, że jakoś będę musiał tę macierz danych przekonwertować na wykres, a potem będzie to łatwy problem. Nie jestem do końca pewien, jak to zrobię, ale docenię niektóre źródła, w których mogę przeczytać o czymś podobnym. 3. Czy są jakieś inne wskazówki, którymi się kierować w przypadku tego projektu? PS: Przez Nawigację rozumiem, biorąc pod uwagę punkt początkowy i końcowy oraz biorąc pod uwagę, że punkt początkowy jest taki sam, jak aktualna lokalizacja urządzenia, samo przesunie się do ostatecznej lokalizacji. Dziękuję.


title: Jak uwierzytelnić archiwum

text: Tło: Mam w moim programie funkcję aktualizacji, która pobiera aktualizacje do katalogu określonego przez użytkownika. Następnie użytkownik może zainstalować te aktualizacje, kiedy tylko chce, po prostu je otwierając. Te aktualizacje to nic innego jak skompresowany plik archiwum, który ma zostać otwarty przez moją aplikację. Problem: Teraz chcę, gdy użytkownik instaluje aktualizacje, mój program powinien zapewniać, że są to oryginalne aktualizacje utworzone przeze mnie i nie są modyfikowane przez kogoś innego. Jak mogę to zapewnić? Słyszałem o weryfikacji autentyczności Winrar. ale nie jestem pewien, czy jest dobry, czy nie? Edycja: Użytkownik ma dwa sposoby na zainstalowanie aktualizacji. A) Użytkownik pobiera aktualizacje z serwera. Plik aktualizacji zostanie zapisany na komputerze użytkownika. Użytkownik otworzy plik aktualizacji, aby go zainstalować. B) To jest dla użytkownika, który nie ma połączenia z Internetem na swoim komputerze. Użytkownik pobiera aktualizację w kafejce internetowej, kopiuje ją na swój komputer, a następnie instaluje. Ponieważ w opcji B użytkownik nie ma połączenia z Internetem na swoim komputerze, więc mój program nie może sprawdzić wartości bazowej na serwerze aktualizacji.


title: Czy jest jakiś profesjonalny sposób na zilustrowanie różnicy między 2 diagramami?

text: Zrobiłem dokument, który ma opisać różnicę między tą samą strukturą logiczną z innej wersji (np. Strukturą A z wersji 8 i Strukturą A z wersji 9 ). Na szczęście mam diagram struktury logicznej z 2 specyfikacji funkcjonalnej. Udało mi się skopiować obraz każdej struktury logicznej i wkleić je w MS Word i porównać 2 wersje obok siebie. Nie wiem, czy istnieje standardowy sposób na zilustrowanie różnicy. Po prostu przekreślam usunięty element logiczny z poprzedniej wersji i rysuję prostokąt wokół nowego elementu logicznego następnej wersji. Wiem, że moja droga jest trochę dziecinna. Zastanawiam się, jak profesjonalnie je zaprezentować. ![tutaj podaj opis obrazu](http://i.stack.imgur.com/UpGFG.png) Ponadto nie uwierzysz, ale MS Word nie ma kształtu KRZYŻA, więc tak naprawdę używając znaku mnożenia, który wygląda jak gigantyczny potwór: ![tutaj wpisz opis obrazka](http://i.stack.imgur.com/h5Lim.png) Dlatego nienawidzę siebie. W przeciwieństwie do 2 oddzielnych linii, ten kształt jest łatwy w użyciu, rysowaniu i zmienianiu rozmiaru. Zastanawiam się, czy MS Word przejmowałby się normalnym krzyżem.


title: DSL umożliwia użytkownikom odwoływanie się do formularzy i rekordów do wyświetlenia?

text: W moim systemie istnieją trzy główne "unikalne" komponenty: 1. Wizualny konstruktor formularzy (wspierany przez AngularJS); * generuje `id` * CRUD automatycznie dostępny dla niego w `/form_type/id` 2. "Strona zbiorcza"; z formularzem zawiera tytuł i **obszar wejściowy DSL** * określa `id`; który przedstawi CRUD dla formularzy utworzonych w `1.` * może określić tylko do odczytu * CRUD "Strona zbiorcza" 3. Szukaj * * * Za pomocą DSL; Myślałem o użyciu Markdown z dodatkową składnią nawiasów klamrowych, na przykład: Nagłówek ======= Lorem ipsum {2_columns: [{form_type:id}, {form_type:id read-only}]} Alternatywnie mogę podać prosty interfejs przeciągnij i upuść; więc przeciągasz pola tekstowe i widżety wokół wstępnie zdefiniowanego szablonu (np. dwóch kolumn). * * * Sugestie dotyczące tego podejścia i/lub mojej składni DSL byłyby bardzo mile widziane. Zwróć uwagę, że prawdopodobnie będę to FOSS, gdy będzie gotowy.


title: Jak mogę znaleźć trendy związane z przyjmowaniem różnych technologii programowania?

text: > **Możliwy duplikat:** > Statystyki użycia języka w branży Szukam danych na temat wskaźników przyjęcia technologii programowania. Jestem ciekawy, aby znaleźć dane dotyczące zapotrzebowania na pracę i podaży programistów w wielu różnych technologiach. Do tej pory przyglądałem się Umiejętnościom LinkedIn i Trendom Google, ale śledzą one tylko zainteresowanie programistów. Jakieś sugestie dotyczące znalezienia danych, których szukam?


title: Mając znane dane wejściowe i wyjściowe, czy możemy wygenerować kandydujące funkcje, które mapują dane wejściowe do wyników?

text: Natknąłem się na problem, w którym mam zestaw wejść, a także kilka znanych par wejścia-wyjścia. Interesuje mnie wynik, ale aby to uzyskać, muszę dowiedzieć się, w jaki sposób dane wejściowe są wykorzystywane do generowania danych wyjściowych. Na przykład mogę mieć następujące ciągi wejściowe wraz z kilkoma znanymi ciągami wyjściowymi char001 --> dasjudash2 // znane wejście/wyjście char002 --> ef2y789e2y // znane char003 --> jnjxf9823d // znane char004 --> ? // nieznane wyjście char005 --> ? // nieznane wyjście Uważam, że może istnieć jakiś algorytm, który pobiera dane wejściowe i generuje dane wyjściowe, ale ten algorytm jest nieznany. Bardzo możliwe, że pary również są generowane losowo (np. patrz w niebo, losowo wybierz ciąg znaków). Mógłbym wpatrywać się w to długo i intensywnie i próbować myśleć o tym, jak są ze sobą powiązane, ale komputery prawdopodobnie mogą mi pomóc. Zasadniczo, biorąc pod uwagę znane dane wejściowe i wyjściowe, czy możliwe jest wymyślenie potencjalnych funkcji, które przyjmą znane dane wejściowe i wygenerują znane dane wyjściowe, a następnie wykorzystają je do wzięcia reszty danych wejściowych i wygenerowania odpowiednich wyników? Biorąc pod uwagę, że rozwiązanie może być jedną z nieskończonych możliwości (włączając w to możliwość, że rozwiązanie nie istnieje, w przypadku, gdy ktoś po prostu spojrzał w niebo i wybrał losowe postacie z kapelusza), szybko odrzuciłbym to jako obliczeniowo niewykonalne zadanie, ale może moja intuicja się myli i istnieją dowody naukowe na to, że ten problem jest do rozwiązania?


title: Czy Microsoft Solver jest w stanie rozwiązać tak złożone problemy z planowaniem?

text: Piszę aplikację, która określi plan grafikowy dla kilkudziesięciu osób według ich zawodu (roli) i dyspozycyjności (dzień tygodnia i godziny). Użyłem arkusza kalkulacyjnego Excela, aby rozwiązać ten problem, byłem wtedy w stanie opracować logiczne i oparte na decyzjach podejście do przypisywania tych osób do zmian i ról, zgodnie z kilkoma zestawami ograniczeń. Kiedy miałem napisać to w kodzie, zasugerowano mi wypróbowanie Microsoft Solver. Czytałem trochę o jego możliwościach, ale nie jestem zaznajomiony z napotkaną terminologią. Cóż, wystarczy powiedzieć, że nigdy nie korzystałem z Microsoft Solver i nawet nie wiem, czy można za jego pomocą rozwiązać następujący problem z harmonogramem. Do tej pory znalazłem bardzo niewiele przykładów problemów z planowaniem i nawet te są proste w porównaniu. Więc moje pytanie brzmi, czy Microsoft Solver może rozwiązać następujący problem z planowaniem? * * * **Problem z planowaniem** Przydziel ludzi do zmian na cały tydzień w zależności od ich dostępności i roli, do której mają kwalifikacje, zgodnie z kilkoma zestawami ograniczeń i celów. **Struktura** * Tygodnie składają się z siedmiu dni. * Dni składają się ze zmian (najczęstsze są przesiewy o świcie, poranku, popołudniu i nocy). Zmiany określa się w ten sposób: * Świt: 00:00 -> 08:00 * Rano: 08:00 -> 12:00 * Popołudnie: 13:00 -> 19:00 * Noc: 07 1:00 -> 00:00 * W niektóre dni tygodnia nie ma żadnej zmiany, podczas gdy inne mogą mieć jedną, dwie lub więcej. * Każda osoba ma tygodniową dyspozycyjność według tego samego dnia tygodnia / struktury zmiany. * Przykład: Peter jest dostępny tylko w poniedziałek wieczorem (poniedziałek 19:00 -> 00:00). * Czasami ludzie mają dwa lub więcej dni, w których są dostępni i chcieliby, aby ich harmonogram był przez nie zmieniany. * Przykład: Kyle jest dostępny tylko w środy wieczorem i czwartki rano, także chciałby je rotować. Jeden tydzień środa inny tydzień czwartek. * Każda osoba ma zestaw ról, które może wypełnić (jedną lub więcej). * Kierowca * Medyk * Lekarz **Cele** 1. Każda zmiana musi mieć co najmniej: dwóch kierowców, jednego lekarza i trzech medyków. 2. Każda osoba z dyspozycyjnością musi być przydzielona do zmiany, nie ma znaczenia, czy jedna zmiana ma trzech kierowców, a druga tylko dwóch. **Ograniczenia** * Osoba może pełnić tylko jedną rolę na zmianę. * Do zmiany można przydzielić tylko osobę, która jest w stanie ją wykonać. * Osoba może zostać przypisana do roli tylko wtedy, gdy ma kwalifikacje do jej wykonywania. * Osobę można przydzielić tylko na jedną zmianę tygodniowo, chyba że w organizacji brakuje personelu _(za mało pracowników oznacza, że potrzebujemy więcej osób do obsadzenia zmian, aby osiągnąć cel nr 1)_. W takim przypadku obowiązuje jeden dodatkowy warunek przy przydzielaniu osób do zmian po pierwszej. * Osoba przydzielona do drugiej zmiany w tym samym tygodniu musi być osobą, która nie pracowała na drugiej zmianie przez najdłuższy czas, jednocześnie spełniając jednocześnie możliwości i dyspozycyjność tej osoby. _Uwaga moderatora: nie udało się znaleźć odpowiednich tagów._


title: Jak ocenić IDE?

text: Nie chcę wiedzieć, które IDE jest najlepsze, bo to subiektywne. Chciałbym wiedzieć, jak ocenić IDE. Jestem przede wszystkim użytkownikiem `vima` i jestem tam realistycznie szczęśliwy, ale od czasu do czasu patrzę na języki, które mają potężne IDE i rozważam ich użycie. Problem, z którym się spotykam, polega na tym, że w większości wydają mi się takie same. Z pewnością każdy z nich zadziała, ale kiedy próbujesz zdecydować, w które IDE zainwestować czas, w jaki sposób mam zdecydować? Jakie funkcje powinienem przetestować, aby sprawdzić, czy podoba mi się sposób, w jaki A lub B działają lepiej? Oczywiście niektóre IDE są specjalnie dostosowane do języka, ale mając do wyboru, powiedzmy, Netbeans, Eclipse i Intellij IDEA, jak mam podjąć decyzję? jako nowicjusz wydają się takie same. Przy ocenie zazwyczaj próbuję edytora, kilku opcji konfiguracyjnych, przeglądarki plików. Myślę, że moi koledzy są w zasadzie tacy sami jak ja i nie używają IDE. Wątpię też, czy w końcu wykorzystałbym IDE do pracy, ponieważ sklep Perl i jestem za to zadowolony z vima, po prostu próbuję dowiedzieć się, jak ich używać w kontekście języków, które nie są na co dzień pracę i solidne wsparcie IDE.


title: Jak zarządzać wydaniami z wieloma funkcjami w różnych stanach?

text: Mamy strukturę rozgałęzień składającą się z: * wielu gałęzi dev dla każdej głównej nowej funkcji * gałęzi głównej, połączonej z gałęzią deweloperską, gdy funkcja jest gotowa do testowania * gałęzi wydawniczej, połączonej z gałęzią główną, gdy funkcja jest gotowa do produkcji Często mieć nowe funkcje ukończone mniej więcej w tym samym czasie, które trafiają do Main, a niektóre z tego samego kodu źródłowego zostały zmienione. Następnie funkcja A może zostać zadeklarowana jako gotowa do produkcji i musi zostać wdrożona, podczas gdy funkcja B wymaga więcej pracy. Po wprowadzeniu zmian do Main, szczególnie w przypadku wielu wersji funkcji A i B, **ich tożsamość jako oddzielnych funkcji zostaje utracona**. Wypromowanie tylko jednego z nich do produkcji staje się wtedy ryzykowne i trudne. Używamy TFS i nie wiem, czy jest to jedno z jego ograniczeń. Jaki jest najlepszy sposób na rozwiązanie tego problemu? Czy powinniśmy używać innej strategii rozgałęziania, czy DVCS to naprawi?


title: Refaktoryzacja: dwa duże kawałki w ramach funkcji

text: Projektuję API, które w większości polega na refaktoryzacji oryginalnego kodu. Więc teraz mam metodę, która składa się z dwóch dużych kawałków, które są oddzielone warunkiem If-else, co moim zdaniem nie jest najlepszym pomysłem. Kod wygląda tak: zrób_coś(): if (istnieje): #Duży blok instrukcji. else: #kolejny duży blok instrukcji. Powodem, dla którego mam je oba pod jedną funkcją, jest to, że obie porcje robią to samo, ale z pewnymi drobnymi zmianami, co wprowadza brzydki blok if-else. Chciałem wiedzieć, jaki byłby najlepszy pomysł na refaktoryzację tego kodu w lepszy sposób, jeśli można to zrobić za pomocą OOP, byłoby jeszcze lepiej. Nie idę z oczywistym zdefiniowaniem dwóch metod, ponieważ w tej chwili obie części robią to samo.


title: Czy ktoś używa maszyn wirtualnych do tworzenia stron internetowych i dlaczego?

text: Widzę kilku programistów, którzy lubią używać maszyn wirtualnych do tworzenia stron internetowych. Czy są inni, którzy to robią? Jeśli tak, dlaczego to robisz? Czy są jakieś plusy/minusy tworzenia na maszynie wirtualnej, a nie w środowisku niezwirtualizowanym? Myślę, że rzeczy są wolniejsze w maszynie wirtualnej.


title: Kierownicy projektów: Czy zachęcasz do podziału zadań na poranek i popołudnie?

text: Nigdzie o tym nie czytałem, ale oto moje przemyślenia: programowanie jest z natury trudne intelektualnie. Pamiętam, że przeczytałem w Code Complete coś, co utkwiło mi w pamięci: autor pchał i pracował nad czymś długimi godzinami tylko po to, by spędzić resztę tygodnia na naprawie tego. To jest coś, czego menedżerowie nie rozumieją. Na przykład w ostatniej firmie, w której pracowałem, oczekiwano od nas przełączania się między zadaniami i projektami, tak jakbyśmy przechodzili z dokręcania śrub na malowanie na linii montażowej. Wejście do projektu lub naprawianie błędu, zwłaszcza z okropnym kodem, który musieliśmy utrzymywać, ma duży rozmach i zajmuje trochę czasu, aby zebrać wszystkie potrzebne informacje w głowie i zacząć działać. Pomyślałem, że dobrze byłoby skoncentrować się na projektowaniu i kodowaniu we wczesnych godzinach, kiedy zwykle zachowujemy większą czujność i prowadzimy szkolenia, administrację lub spotkania po południu. Czy ktoś myślał o tym wcześniej? jakieś studia?


title: Metaprogramowanie

text: Właśnie rozpocząłem swoją podróż jako programista C++, a ostatnio badam temat zwany metaprogramowaniem. Do tej pory przejrzałem wiele informacji na ten temat i mam kilka pytań. 1. Użycie Reflection w c++: Czy to możliwe? W moim rozumieniu refleksja jest techniką metaprogramowania, która ma zdolność manipulowania stanem programu, a jej manipulacja może być introspekcją lub introcesją. 2. Jaka jest różnica między architekturą refleksyjną a architekturą metapoziomową? W jakiej kategorii mieści się architektura metaprogramowania? 3. Metaprogramowanie ma dwa poziomy: poziom meta i poziom podstawowy. W moim rozumieniu program obiektowy lub badany system jest poziomem podstawowym, a metaprogram, który będzie działał na badanym systemie, jest poziomem meta. Mam rację? Pomóż mi również, podając kilka wskazówek dotyczących pracy nad metaprogramowaniem szablonów w C++. Czy możesz zasugerować mi kilka praktycznych przykładów, których mogę szukać, aby zdobyć praktyczne doświadczenie w tej technice programowania?


title: Przycisk „Zapisz” w naszej aplikacji internetowej (20-30 pól tekstowych), klient obawia się, że użytkownicy zapomną go kliknąć i stracą swoje dane

text: Mam później spotkanie z klientem w sprawie aplikacji webowej ASP.NET, którą dla niego tworzymy. Aplikacja zawiera wiele ekranów w stylu „formularzy” z 20-30 polami tekstowymi i oczywiście przycisk „Zapisz”, który wysyła z powrotem na serwer i zapisuje dane. Klient naprawdę tego nie lubi, ponieważ obawia się, że użytkownicy zapomną kliknąć „Zapisz” i stracą swoje dane. Chociaż oczywiście rozumiem, że możemy użyć AJAX do zapisywania w miarę postępów użytkownika, uważam, że wykracza to poza zakres projektu i jest podatne na błędy. Czy ktoś miał do czynienia z takimi klientami?


title: Chcę napisać internetową grę planszową dla 2 graczy. Jakiego frameworka powinienem użyć?

text: Jestem programistą C#. Niedawno zwrócił się do mnie klient, aby opracować wieloosobową grę planszową (maksymalnie 4 graczy). Bawiłem się z WCF, WPF i EF 4.1, aby coś się działo, ale wciąż wpadam na małe potknięcia. Z pewnością wydaje się, że zintegrowanie wszystkich tych technologii w jedno rozwiązanie jest problematyczne. Nie mam dużego doświadczenia w WPF/WCF, ale uważam, że pojęcia są łatwe do zrozumienia. Tyle, że ciągle natrafiam na małe problemy, które są ogromnymi przeszkodami. Myślałem najpierw o stworzeniu usługi WCF do zarządzania tablicami i regułami. Następnie zwróciłbym się do interfejsu użytkownika (prawdopodobnie Silverlight/WPF). Właściwie jestem w punkcie, w którym myślę, że powinienem wypróbować framework, a nawet zapuścić się w PHP/Ruby/Python. Wymagania są proste: * Web * Turowa * Gra planszowa * Backend bazy danych Co byś zasugerował jako programista C# (prawdopodobnie słaby)?


title: Specjalizuję się w pakiecie oprogramowania dostawcy — czy narażam swoją karierę na ryzyko?

text: Mam więc okazję wyspecjalizować się w pakiecie oprogramowania dostawcy (takiego jak SAS, SAP, PeopleSoft, Pega, Lombardi BPM...). Znasz ofertę - potrzebują kodera, aby nauczyć się ich pakietu i _"jest całe zapotrzebowanie na tę umiejętność"_ ; _"Korzystają z niego duże, rozwijające się firmy"_ itd. I (przynajmniej teraz) pieniądze są lepsze. Martwię się, czy będę w stanie utrzymać moje „normalne” umiejętności programistyczne. Martwię się, jak to będzie wyglądać w CV, jeśli za kilka lat przejdę z powrotem do „normalnego” programowania. Martwię się, czy będzie fajnie. Co myślisz?


title: Czy testujesz swoje SQL/HQL/kryteria?

text: Czy testujesz swój SQL lub SQL wygenerowany przez Twoją platformę bazodanową? Istnieją frameworki, takie jak DbUnit, które umożliwiają tworzenie prawdziwej bazy danych w pamięci i wykonywanie prawdziwego SQL. Ale jest bardzo trudny w użyciu (nie jest przyjazny dla programistów, że tak powiem), ponieważ najpierw musisz przygotować dane testowe (i nie powinny być dzielone między testami). PS Nie chodzi mi o mocowanie baz danych czy metody bazodanowe frameworka, ale testy, które dają 99% pewności, że Twój SQL działa nawet po ostrej refaktoryzacji.


title: Czy programuję za wolno?

text: Jestem dopiero rok w branży i mam problemy z wykonaniem kalkulacji dla konkretnych zadań. Zanim to zamkniesz, tak, już to przeczytałem: http://programmers.stackexchange.com/questions/648/how-to-respond-gdy-you-are-asked-for-an-estimate i to jest około ten sam problem, który mam. Ale szukam bardziej konkretnego miernika doświadczeń, czegoś wymiernego lub prawdopodobnie średniej wydajności innego programisty, do której powinienem dążyć i oprzeć swoje szacunki. Odpowiedzi wahają się od tygodni, a ja szukałem odpowiedzi na poziomie zadania przydzielonego na dzień lub dwa. (Zauważ, że nie obejmuje to przesyłania do kontroli jakości ani dokumentacji, tylko rzeczywisty czas rozwoju od pisania testów, jeśli korzystałem z TDD, do stworzenia strony, przed przesłaniem jej do testów) Obecnie moja obecna stawka jest następująca (w ASP Webforms .NET): * W tej chwili jestem w stanie stworzyć prostą stronę wprowadzania danych z listą siatki (bez skomplikowanej logiki, tylko tworzenie i odczyt) na już zbudowanej architekturze, przy założeniu jednego pełnego dnia (8 godzin) czasu. * Dodanie złożonej funkcjonalności, a strony Aktualizuj i Usuń dodają kolejny pełny dzień do zadania. * Jeśli muszę zacząć stronę od zera (brak rozwiązania, brak istniejącej strony internetowej) zajmuje mi to kolejny pełny dzień. * (Nie zawsze), ale jeśli napotkam coś nowego lub jeszcze nie zrobiłem, zajmuje mi to kolejny pełny dzień. Ilekroć robię oszacowanie, które jest dłuższe niż oczekiwano, czuję, że inni myślą, że jestem daleko w tyle za wszystkimi innymi. Jestem po prostu zaniepokojony, ponieważ spodziewano się, że jeśli jest to tylko jedna strona, nie zajmie mi to więcej niż cały dzień. Tak, zdecydowanie jest więcej do zrobienia. Zawsze jest. Muszę się jeszcze wiele nauczyć. Ale chciałbym wiedzieć, czy moja obecna stawka jest zbyt niska, po prostu średnia, czy średnia dla kogoś nie dłuższego niż rok w branży.


title: Gdzie umieścić biblioteki zewnętrzne w projekcie Qt?

text: Tworzę wiele małych projektów Qt Creator (opartych na plikach .pro, a nie CMake) i czasami muszę w nich korzystać z zewnętrznych bibliotek. Do tej pory miałem strukturę projektu taką jak poniżej: folder projektu |- project.pro |- (pliki projektu .cpp i .h, ewentualnie w podfolderach) |- lib |- include | |-biblioteka1 | | |- (wszystkie pliki nagłówkowe biblioteki1) | |-biblioteka2 | |- ... |- win32 | |- biblioteka1.dll | |-biblioteka2.a | |- ... |- unix |- library1.so |- library2.a |- ... Cały folder `lib` (z plikami binarnymi) został dołączony do mojego repozytorium (git). Takie podejście było w porządku przy korzystaniu z małych bibliotek, ale odkąd zacząłem używać kilku dużych bibliotek, umieściłem je w osobnych repozytoriach (na bibliotekę) i użyłem podmodułów git. Jednak to rozwiązanie jest niedoskonałe, ponieważ zużyłbym dużo dodatkowej przestrzeni po aktualizacji moich bibliotek i generalnie umieszczeniu ich w repozytorium jest uważany za zły pomysł. Myślałem o rozwiązaniu, w którym można by mieć zmienną systemową dla ręcznie instalowanych bibliotek lub mieć ją zdefiniowaną w qmake, ale wymagałoby to dodatkowej pracy i czytania dokumentacji w celu skonfigurowania projektu. Innym podejściem byłoby po prostu pobranie/skompilowanie bibliotek i umieszczenie ich w ignorowanym (w git) folderze `lib`, ale wtedy skończylibyśmy wszędzie ze zduplikowanymi bibliotekami (i problem z aktualizacją ich do nowszych wersji w różnych projektach). Jak mogę zorganizować mój projekt Qt, aby zminimalizować ilość pracy i czytania dokumentacji potrzebnej do jego skonfigurowania i zmaksymalizować jego łatwość utrzymania?


title: Jak liczy się doświadczenie każdego testera?

text: Programista uczy się wielu rzeczy w pracy. Dla np. Pomyślmy o programiście Java lub C++, z biegiem lat wiele się uczy o technologii, wzorcach projektowych, nowych frameworkach itp. Myślę, że to dodaje jego doświadczeniu zawodowemu dobry wynik do jego profilu, ale co czyni testera ważne doświadczenie zawodowe ? Interesuje mnie testowanie aplikacji internetowych na stażyście w firmie opartej na produktach przez ostatnie cztery i pół miesiąca. W moim biurze pracownicy, którzy są dwa, trzy lata przede mną, nie wykonują pracy inaczej niż ja, nie wyglądają, jakby nauczyli się czegoś wspaniałego na swoim doświadczeniu zawodowym. _Czy to los testera, czy dzieje się to tylko w moim biurze?_. Chciałbym usłyszeć odpowiedzi od moich kolegów testerów, którzy przeszli ścieżkę testowania :)


title: Tłumaczenie widoków w MVC

text: Jaka jest najlepsza praktyka, jeśli chodzi o tłumaczenie widoków we wzorcu projektowym MVC, w witrynie wielojęzycznej: 1. Zawsze miej tylko jeden plik widoku i tłumacz jego poszczególne ciągi za pomocą funkcji tłumaczenia frameworka. 2. Zawsze miej tyle widoków, ile obsługuje strona internetowa, bezpośrednio przetłumaczone, po jednym dla każdego języka i pozwól, aby wewnętrzne elementy frameworka ładowały plik widoku specyficznego dla danego języka dla języka aktualnie wybranego przez użytkownika. Którą z tych dwóch opcji powinienem użyć (jeśli nie ma trzeciej) i dlaczego?


title: Właściwa praca z klasami JavaScript

text: Podobne pytania z pewnością były zadawane wcześniej, ale chciałbym usłyszeć kilka słów o moim konkretnym sposobie implementacji klas Javascript. Zacznę od przykładu JavaScript zaczerpniętego z rzeczywistej aplikacji, nad którą ostatnio pracowałem. **Przykład** PageControl= new function() { var self= this; // przykład dodatkowej kontrolki powiązanej z kontrolką strony var grid= new GridControl(); self.initialise= function() { // inicjalizacja pól formularzy, kontrolek itp. }; // przykładowa funkcja self.load= function(id) { // przeładowuje formularz nowymi danymi }; $(dokument).gotowy(funkcja() { self.initialise(); }); }; Każda strona ma własną instancję PageControl z określonymi zadaniami, które dotyczą wyłącznie danej strony. **Pytanie:** Nie szukam alternatywnych sposobów jego implementacji, chciałbym tylko wiedzieć, czy powyższy przykład to zły lub zły kod. Powyższa struktura działała jak dotąd świetnie, nawet jeśli pracuję z podkontrolkami, takimi jak `PageControl.grid.reload();`, ale nie chcę trzymać się kodu podatnego na błędy.


title: DTO - warstwa usług - najlepsze praktyki dotyczące bezstanowości wzajemnie się ze sobą kolidujące

text: Projektuję REST API w połączeniu z warstwą usług, która przyjmuje DTO jako dane wejściowe i produkuje je jako dane wyjściowe. Działa to dobrze w przypadku większości wywołań usług, w których DTO jest używane do uzyskania dostępu do podstawowej biblioteki (wbudowanego serwera OLAP), która wykonuje tę pracę. Jest jednak jedna usługa, w której coś wydaje się nie tak. Usługa jest odpowiedzialna za tworzenie, manipulowanie i opcjonalnie przechowywanie obiektów reprezentujących raporty (pomyśl o raportach programu Excel). Robi to za pośrednictwem podstawowej biblioteki, która nie udostępnia raportów jako zasobu. Ponieważ raporty nie reprezentują zasobu po stronie serwera, chyba że są utrwalone (trwałość jest moją własną implementacją, a nie koncepcją w bibliotece), usługa musi pobrać obiekt raportu, który zawiera wszystkie informacje niezbędne do skonstruowania raportu z zarysowania, aby być bezpaństwowcem. Zdecydowałem, że metody obsługi raportów powinny pobierać ReportDTO, manipulować nimi i zwracać zmodyfikowaną wersję. (Obejmuje to operacje, takie jak zamiana osi wierszy i kolumn, sortowanie osi i filtrowanie osi.) Myślałem, że skoro mam wszystkie informacje dostępne w ReportDTO niezbędne do wykonania wszystkich tych operacji, równie dobrze mogę wykonać je w DTO i zwracają zmodyfikowaną wersję, zamiast powielać DTO jako obiekt domeny. Nie oznacza to, że serwer nie współpracuje z żadnym modelem. Rzeczywiście, kod po stronie serwera obejmuje walidację raportu przy użyciu biblioteki innej firmy (tj. model walidacji nie jest mój - nie mam modelu domeny dla samego raportu, tylko DTO), zapisując raport, jeśli użytkownik tak wybierze i wykonanie raportu w bazie danych w celu uzyskania świeżych danych. Więc jest praca do wykonania poza manipulowaniem DTO, chodzi tylko o to, że nie jest to praca związana z modelem domeny, który musiałem zaprojektować sam, ale raczej taki, który został mi dostarczony. Po zrealizowaniu powyższych operacji coś sobie uświadomiłem. Operacje są operacjami logiki biznesowej, czyż nie? DTO nie powinien tego mieć. Potem miałem wiele innych myśli: „Dobra, w porządku, wykonam operacje w warstwie usług… Och, czekaj. Warstwa usług powinna koordynować tylko obiekty domeny zawierające logikę biznesową, a nie samą logikę biznesową. , zrobię ReportDTO obiekt domeny dobrej jakości.Crap, teraz wystawiam moje obiekty domeny z warstwy usług.To jest API, naprawdę powinienem trzymać się DTO jako danych wejściowych i wyjściowych dla warstwy usług, aby zmienić mój model domeny (lub zmiany w modelu domeny innej firmy, którego używam) nie wpływają na umowę z klientami usługi. W porządku, będę miał Report i ReportDTO.... które mają dokładnie tych samych członków, ponieważ ReportDTO ma już wszystkie informacje niezbędne do manipulowania raportem (po prostu nie do wykonania, sprawdzenia lub zapisania) ze względu na decyzję dotyczącą raportu przejściowego, którą podjąłem ze względu na interfejs API RESTful." Wyraźnie przeciwstawiłem się każdemu proponowanemu przeze mnie rozwiązaniu. Więc co do cholery mam zrobić? Nie chcę, aby raporty były stanowe, ponieważ tak naprawdę nie postrzegam ich jako zasobu, dopóki nie zostaną faktycznie zapisane. Jeśli ustawię je jako stanowe, będę musiał zarządzać ich mapą lub pamięcią podręczną w mojej usłudze i radzić sobie z wieloma klientami próbującymi nadać swoim raportom tę samą nazwę, zaimplementować zabezpieczenia, aby zapewnić, że użytkownik widzi tylko własne raporty itp. Wszystkie te problemy znikają przy bezpaństwowym podejściu. Skutkami ubocznymi są jednak wyżej wymienione kwestie. Czy gdzieś się pomyliłem? Pomóż mi rozwiązać ten problem projektowy, zanim stanie się on stałą częścią mojego interfejsu API. Dziękuję.


title: Czy Git ma „tryb awaryjny”, aby zapobiec przepisaniu historii?

text: Kiedy jesteś trochę świeży z Git (i ogólnie z DVCS) i zaczynasz odkrywać zmiany związane z przepisywaniem historii, jesteś bezpieczny, jeśli repozytorium jest tylko lokalne, ale możesz napotkać problemy, jeśli pracujesz ze zdalnymi i próbujesz popchnąć takie zmiany. Funkcja, której bym się spodziewał, to możliwość włączenia „trybu awaryjnego”, który zasadniczo powstrzymałby mnie przed robieniem tego, czego nie powinienem robić… I co przez to rozumiem? Mam na myśli zmiany polegające na przepisaniu historii dla rzeczy, które już zostały zepchnięte do źródła. Nie potrafię tego precyzyjnie zdefiniować, ale obejmuje to takie przypadki jak: * `commit --amend` gdy HEAD został już wypchnięty * `rebase` gałęzi nielokalnej * `reset` gałęzi, która została wypchnięta To są przykłady sytuacji, które prawdopodobnie spowodują, że następne `push` się nie powiedzie (ponieważ nie byłoby to szybkie przewijanie do przodu, IIRC). Część zrobiłem przez przypadek i musiałem odtworzyć gałąź na pilocie. I wciąż miałem szczęście, że zrobiłem to na tyle szybko, że nikt nie wyciągnął historii, którą przepisałem. Uważam, że można zidentyfikować tego typu zmiany i na żądanie uniemożliwić użytkownikowi ich wprowadzenie. Czy może jest na to opcja? Jeśli nie, czy uważasz, że warto spróbować go stworzyć? Czy spróbowałbyś precyzyjnie zdefiniować, jak zidentyfikować taką „niebezpieczną zmianę”?


title: Przez większość czasu nie mogę wymyślić powodu, aby mieć obiekt zamiast statycznej klasy. Czy przedmioty mają więcej zalet niż mi się wydaje?

text: Rozumiem pojęcie obiektu, a jako programista Java czuję, że paradygmat OO przychodzi mi w praktyce dość naturalnie. Jednak ostatnio zacząłem myśleć: Chwileczkę, jakie są właściwie praktyczne korzyści z używania obiektu nad używaniem klasy statycznej (z odpowiednią enkapsulacją i praktykami OO)? Mógłbym pomyśleć o dwóch korzyściach z używania obiektu (obie są znaczące i potężne): 1. Polimorfizm: pozwala na dynamiczną i elastyczną zamianę funkcjonalności w czasie wykonywania. Pozwala także na łatwe dodawanie nowych funkcjonalności i alternatyw do systemu. Na przykład, jeśli istnieje klasa `Car` zaprojektowana do pracy z obiektami `Engine` i chcesz dodać do systemu nowy silnik, z którego może korzystać samochód, możesz utworzyć nową podklasę `Engine` i po prostu przekazać obiekt tę klasę do obiektu `Car`, bez konieczności zmiany czegokolwiek w `Car`. Możesz to zrobić w czasie wykonywania. 2. Umiejętność „przekazywania funkcjonalności dookoła”: możesz dynamicznie przekazywać obiekt w systemie. **Ale czy są jeszcze jakieś zalety obiektów nad klasami statycznymi?** Często kiedy dodaję nowe 'części' do systemu, robię to poprzez utworzenie nowej klasy i utworzenie z niej obiektów. **Ale ostatnio, kiedy się zatrzymałem i pomyślałem o tym, zdałem sobie sprawę, że klasa statyczna działa dokładnie tak samo jak obiekt w wielu miejscach, w których normalnie używam obiektu.** Na przykład pracuję nad dodanie mechanizmu zapisywania/ładowania plików do mojej aplikacji. W przypadku obiektu linia wywołująca kodu będzie wyglądać tak: **`Rzecz rzecz = fileLoader.load(plik);`** Z klasą statyczną wyglądałaby tak: **`Rzecz rzecz = FileLoader.load (file);`** **Jaka jest różnica?** Dość często po prostu nie mogę wymyślić powodu, aby utworzyć instancję obiektu, gdy zwykła stara klasa-statyczna zachowywałaby się tak samo. Ale w systemach OO klasy statyczne są dość rzadkie. Więc coś mi brakuje. **Czy są jeszcze jakieś zalety innych obiektów niż wymienione przeze mnie?** Proszę o wyjaśnienie. **EDYTUJ:** Aby wyjaśnić. Uważam, że obiekty są bardzo przydatne podczas wymiany funkcji lub przekazywania danych. Na przykład napisałem aplikację, która tworzy melodie. `MelodyGenerator` posiadał kilka podklas, które w różny sposób tworzą melodie, a obiekty tych klas były wymienne (wzorzec Strategia). Melodie też były obiektami, ponieważ warto je przekazywać. Podobnie jak akordy i łuski. **Ale co ze „statycznymi” częściami systemu – które nie będą przekazywane dalej? Na przykład - mechanizm 'zapisz plik'. Dlaczego powinienem zaimplementować go w obiekcie, a nie w klasie statycznej?**


title: Jak wycenić recenzje kodu, aby zachęcić do dobrego zachowania?

text: Pracuję dla firmy, która ma hostowaną aplikację internetową .net z wieloma klientami. Ci klienci często chcą pisać dostosowania do naszej aplikacji. Mamy interfejsy API do podłączenia do aplikacji, ale same dostosowania są napisane w .net. Jest to wspólne, bezpieczne środowisko hostingowe i musimy przejrzeć te dostosowania, zanim wdrożymy je w naszym centrum danych, aby upewnić się, że nie obniżą wydajności, nie powodują awarii naszych serwerów ani nie otwierają żadnych luk w zabezpieczeniach. Za te przeglądy kodu pobieramy opłatę. Obecny model wyceny jest po prostu funkcją liczby linii kodu. Myślę, że jest to zły pomysł z różnych powodów, ale przede wszystkim dlatego, że jeśli jesteśmy zainteresowani weryfikacją, czy kod działa zgodnie z oczekiwaniami, powinniśmy zachęcać do dobrego, czytelnego kodu, a nie do kompaktowania. Chciałbym zaproponować model wyceny, który zawiera jako dane wejściowe niektóre lub wszystkie z poniższych elementów: * Wiersze kodu * Złożoność cykliczna * Średnia długość funkcji * Liczba funkcji Czy są jakieś inne metryki, które powinienem uwzględnić, lub inne pomysły na to, jak może rozsądnie stworzyć ceny za przeglądy kodu, które zachęcają do bezpiecznego i zrozumiałego kodu?


title: Wielokrotne wysyłanie a przeciążanie funkcji

text: Próbuję zrozumieć różnicę (jeśli istnieje) między tymi dwoma. Według strony Wikipedii dla Multiple Dispatch jest to równoznaczne z przeciążeniem funkcji, ale później mówimy: > W języku z tylko jedną wysyłką, takim jak Java […], co wydaje się sprzecznością, ponieważ Java obsługuje funkcję przeciążenie. Więc co to jest? Czy funkcja Multiple Dispatch różni się od funkcji przeciążania funkcji, czy też artykuł zawiera błędne twierdzenie, że Java nie obsługuje funkcji Multible Dispatch?


title: Podkreślenie znaczenia TDD dla klientów

text: Znaczenie TDD musi być propagowane, ale zawsze istnieje luka w harmonogramie projektu i czasie potrzebnym na opracowanie projektu TDD. Klienci zwykle nie rozumieją znaczenia utrzymania kodu lub TDD i chcą, aby projekt został ukończony tak szybko, jak to możliwe. Rezultatem byłby test po opracowaniu, który byłby bardzo prostymi minimalnymi testami, aby zadowolić narzędzia pokrycia i pozwolić analizatorom projektu mieć świetny wykres. Czy projekty opracowane z wykorzystaniem TDD trwają dłużej, czy to tylko nieuzasadniona obawa?


title: Jak wizualizować zatwierdzenia Git na wideo jako proces?

text: Jest tu fajny film, który pokazuje rozwój bardziej jak proces. Jak mogę wizualizować własne projekty podobne do tego? Czy istnieje oprogramowanie typu open source do tworzenia tego rodzaju wizualizacji? Myślę, że byliby całkiem przydatni, aby wyjaśnić rzeczy nowym programistom, zanim zaczną programować i być może zobaczę też szerszy obraz.


title: Pytanie o obiekty stanu i domeny

text: Załóżmy, że tworzę obiekt domeny o nazwie UserAdministration, jeśli mam metodę o nazwie CreateUser, jak przekazać stan do tej metody, czy utworzyłbym właściwości obiektu UserAdministration i miałbym metodę CreateUser, czy też przekazałbym wszystkie informacje dla metody CreateUser w poco? Również jak mogę zidentyfikować moje obiekty domeny?


title: Potrzebuję kilku zadań/wyzwań wskaźnikowych

text: Zmagam się z nauką. Muszę ćwiczyć i dalej ćwiczyć, żeby coś się przykleiło. Nie robię dużo C++ (może raz w miesiącu), więc ciągle przeglądam te same rzeczy. Potrzebuję kilku zadań, aby naprawdę zrozumieć wskaźniki i ich zastosowania w prawdziwym świecie, zamiast czytać scenariusze. Stworzyłem własną listę linków, ale potrzebuję bardziej zaawansowanych rzeczy, takich jak arytmetyka wskaźników oraz wskaźniki i funkcje. Jeśli ktoś mógłby podać kilka zadań z prawdziwego świata, aby pogłębić moją wiedzę i doświadczenie ze wskaźnikami, byłbym wdzięczny. Jestem w porządku z typami danych ze względu na moje doświadczenie w Javie. Czekamy na pewne wyzwania (niezbyt twardy umysł).


title: Stylizacja instrukcji AND/OR if

text: Jak stylizować złożone wyrażenia złożone ORAZ/LUB, aby zapewnić maksymalną czytelność? Jak robisz wcięcia i gdzie umieszczasz łamanie wierszy? Moja szczególna sytuacja wygląda mniej więcej tak. To zdecydowanie lepsze niż zbijanie wszystkiego w jedną linię, ale nadal wygląda na niechlujne. if ( ( x == y && a != b && p.isDobry() && ( i + u == b || q >= a ) ) || k.isCoś() || m > n ) { doCoś( ); }


title: Który kod jest lepszy do optymalizacji przewidywania gałęzi?

text: Biorąc pod uwagę przewidywanie gałęzi, a także efekt optymalizacji kompilatora, który kod oferuje lepszą wydajność? Zauważ, że bRareExceptionPresent reprezentuje rzadki stan. To nie jest normalna ścieżka logiki. /* NAJBARDZIEJ WSPÓLNA ścieżka musi rozgałęziać się wokół wyjątku if */ bool SomeFunction(bool bRareExceptionPresent) { // przerwij przed function if(bRareExceptionPresent) { return false; } .. function primary body .. return true; } /* NAJBARDZIEJ WSPÓLNA ścieżka NIE rozgałęzia się */ bool SomeFunction(bool bRareExceptionPresent) { if(!bRareExceptionPresent) { .. function primary body .. } else { return false; } zwróć prawdę; }


title: W jaki sposób powiązane są projektowanie po umowie i testowanie oparte na właściwościach (QuickCheck)?

text: Czy ich jedyne podobieństwo polega na tym, że **nie** są xUnit (a dokładniej, nie są oparte na wyliczeniu konkretnych przypadków testowych), czy jest to głębsze? Testy oparte na właściwościach (przy użyciu QuickCheck, ScalaCheck itp.) wydają się dobrze dopasowane do funkcjonalnego stylu programowania, w którym unika się skutków ubocznych. Z drugiej strony, Design by Contract (zaimplementowany w Eiffel) jest bardziej odpowiedni dla języków OOP: możesz wyrazić warunki końcowe dotyczące _efektów_ metod, a nie tylko ich wartości zwracane. Ale oba obejmują testowanie twierdzeń, które są ogólnie prawdziwe (zamiast twierdzeń, które powinny być prawdziwe dla konkretnego przypadku testowego). I oba mogą być testowane za pomocą losowo generowanych danych wejściowych (z QuickCheck jest to _tylko_ sposób, podczas gdy w przypadku Eiffla uważam, że jest to opcjonalna funkcja narzędzia AutoTest). Czy istnieje pojęcie zbiorcze obejmujące oba podejścia? A może wyobrażam sobie związek, który tak naprawdę nie istnieje.


title: Uprawnienia/prawidłowy model/wzór dla aplikacji .NET

text: Muszę wdrożyć elastyczne I proste (jeśli coś takiego istnieje), a jednocześnie korzystać z wbudowanych środków, jeśli to możliwe. Do tej pory mam zaimplementowane MembershipProvider i RoleProviders. Fajnie, ale gdzie mam się teraz udać? Czuję, że muszę dodać termin „Przywilej” i zakodować te wewnątrz aplikacji na sztywno. Użytkownicy skonfigurują role, aby dodać uprawnienia do ról i przypisać role użytkownikom. Czy to brzmi jak dobry model? Czy powinienem pomyśleć o dodaniu uprawnień na poziomie użytkownika oprócz dodawania ich do ról? Mogę, ale wyobrażam sobie problemy z konfiguracją (mylące) i podążaniem za wsparciem. Jeśli tego nie zrobię, a niektórzy konkretni użytkownicy będą potrzebować mniejszych uprawnień - admin będzie musiał stworzyć kolejną rolę itp. Jakiś srebrny punkt dla takiego systemu? I dlaczego Microsoft nie poszedł dalej niż tylko dostawcy członkostwa i ról? Inny pomysł: zostaw role jako posiadacza „przywileju” i zakoduj je na stałe. Następnie mogę kodować do tych ról wewnątrz aplikacji, używając wszystkich dostępnych znaczników/atrybutów itp. - wszystkich Microsoft. Dodaj nową encję "Grupa" i stwórz relację taką jak ta * Użytkownicy * Grupy użytkowników * Grupy * RoleGroups * Role W ten sposób mogę zbierać role w grupy i przypisywać je do użytkowników. Brzmi świetnie i pasuje do innych wzorców oprogramowania. Ale wtedy naprawdę nie mogę zaimplementować rzeczy wewnątrz RoleProvider, takich jak: * AddUsersToRoles * RemoveUsersFromRoles A niektóre rzeczy nie mają już sensu, ponieważ będą zakodowane na stałe * DeleteRole * CreateRole


title: Zbieranie architektury aplikacji

text: Załóżmy, że istnieje system do zbierania informacji o działaniach systemu. Istnieje część klienta z interfejsem i części agenta, które są zainstalowane na każdym komputerze. Szacuję, że obecnie może być maksymalnie 20 komputerów. Później może być więcej niż 50. Moje rozwiązania: 1. Agent przechowuje dane w lokalnej bazie danych, m.in. sqlite. Istnieje również usługa, która może być wykorzystana przez klienta do zapytania o dane. Jeśli więc klient chce wyświetlić dane dla 50 komputerów, wysyła zapytanie do 50 komputerów. Jestem teraz na tym rozwiązaniu, ale może to całkowicie błędne. 2. Agent przechowuje dane w lokalnej bazie danych (nie znam dobrej do tego). Istnieje również serwer (baza główna) oraz lokalne bazy danych są synchronizowane z serwerem. W takim przypadku klient łączy się z główną bazą danych w celu wyświetlenia danych. 3. Agent wysyła dane w czasie rzeczywistym do głównej bazy danych. Tak samo jak w punkcie 2, ale nie ma synchronizacji. 4. Podobnie jak w punkcie 3, ale agent buforuje dane w lokalnej bazie danych i przesyła je małymi porcjami do głównej bazy danych. Jakie jest najlepsze podejście?


title: Jak planujesz swój kod asynchroniczny?

text: Stworzyłem bibliotekę, która jest inwokatorem usługi internetowej w innym miejscu. Biblioteka udostępnia metody asynchroniczne, ponieważ wywołania usług sieci Web są dobrym kandydatem do tego celu. Na początku wszystko było w porządku, miałem metody z łatwymi do zrozumienia operacjami w stylu CRUD, ponieważ biblioteka jest rodzajem repozytorium. Ale potem logika biznesowa zaczęła się komplikować, a niektóre procedury obejmują łączenie wielu z tych asynchronicznych operacji, czasami różnymi ścieżkami w zależności od wartości wyniku, itd. itd. Nagle wszystko jest bardzo nieuporządkowane, aby zatrzymać wykonanie w punkcie przerwania nie jest zbyt pomocne, aby dowiedzieć się, co się dzieje lub gdzie na osi czasu procesu zatrzymałeś się, staje się uciążliwe... Rozwój staje się mniej szybki, mniej zwinny i wyłapuje te błędy, które zdarzają się raz w 1000 razy staje się piekłem. Z technicznego punktu widzenia repozytorium, które udostępnia metody asynchroniczne, wyglądało na dobry pomysł, ponieważ niektóre warstwy trwałości mogą mieć opóźnienia i można użyć podejścia asynchronicznego, aby maksymalnie wykorzystać sprzęt. Ale z funkcjonalnego punktu widzenia sprawy stały się bardzo złożone, a biorąc pod uwagę te procedury, w których potrzebnych było kilkanaście różnych połączeń... nie znam prawdziwej wartości ulepszenia. Po przeczytaniu przez chwilę o TPL wydawało się to dobrym pomysłem na zarządzanie zadaniami, ale w momencie, gdy trzeba je połączyć i zacząć ponownie wykorzystywać istniejącą funkcjonalność, robi się bardzo bałagan. Mam dobre doświadczenia z używaniem go w bardzo konkretnych scenariuszach, ale złe doświadczenia z ich szerokim użyciem. Jak pracujesz asynchronicznie? Używasz go zawsze? A może po prostu dla długotrwałych procesów?


title: Rozmowa kwalifikacyjna: jak długo jest rozsądne?

text: Tak więc zatrudniam starszego dewelopera/wiodącą rolę zespołu dla projektu ASP.NET MVC3. To ważna pozycja dla naszego zespołu, ponieważ ta osoba będzie prowadzić jeden z naszych dwóch głównych produktów — produkt, który od jakiegoś czasu nie cieszył się zbytnią sympatią programistów. Muszę więc upewnić się, że moi kandydaci robią mądre rzeczy z kontrolerami, widokami, widokami modeli, DAL-ami, testami jednostkowymi itp. Podczas rozmów kwalifikacyjnych używam kilku trywialnych wyzwań programistycznych, ale chcę dać szansę osobom, które mają problemy z kodowaniem tablic połysk. Najlepsze zadanie, jakie przychodzi mi do głowy: zaimplementowanie banalnej strony logowania to chyba ponad godzina pracy i nawet jeśli ograniczę to na 2 godziny, to raczej nie będzie w 100% skończone. Czy to jest sprawiedliwe? Staram się zachować równowagę między zachowaniem rozsądnego zadania a umożliwieniem kandydatowi popisania się szerokim zakresem umiejętności, których wymaga kierownik techniczny.


title: Zależności typów a struktura katalogów

text: Ostatnio zastanawiałem się, jak organizować typy w katalogach/przestrzeniach nazw w.r.t. ich zależności. Jedną z metod, którą widziałem, która moim zdaniem jest rekomendacją zarówno dla Haskella, jak i .NET (chociaż w tej chwili nie mogę znaleźć odniesień do tego), jest: Type Type/ATypeThatUsesType Type/AnotherTypeThatUsesType Jednak moja naturalna skłonność ma działać odwrotnie: Type/ATypeUponWhichTypeDepends Type/AnotherTypeUponWhichTypeDepends **Questions:** * Czy moja skłonność do basu jest przeciwna? * Czy istnieją jakieś większe korzyści/pułapki wynikające z jednego w stosunku do drugiego? * Czy to tylko coś, co zależy od aplikacji, np. czy budujesz bibliotekę, czy robisz normalne kodowanie?


title: Wzorzec testera/wykonawcy: Załóżmy, że dzwoniący stosuje się do wzorca, czy też zachowaj się defensywnie i powtórz kontrolę?

text: Załóżmy prostą klasę, która implementuje wzorzec Tester/Doer: public class FooCommandHandler : ICommandHandler { public bool CanHandle(object command) { return polecenie is FooCommand; } public void Handle(object command) { var fooCommand = (FooCommand)polecenie; // Zrób coś z fooCommand } } Teraz, jeśli ktoś nie dostosuje się do wzorca i wywoła `Handle` bez weryfikacji polecenia za pomocą `CanHandle`, kod w `Handle` zgłasza wyjątek. Jednak w zależności od rzeczywistej implementacji `Handle` może to być cała gama różnych wyjątków. Poniższa implementacja sprawdzi ponownie `CanHandle` w `Handle` i wyrzuci _opisowy_ wyjątek: public void Handle(object command) { if(!CanHandle(command)) throw new TesterDoerPatternUsageViolationException("Najpierw wywołaj CanHandle"); // rzeczywista implementacja obsługi komendy. } Ma to tę zaletę, że wyjątek jest bardzo opisowy. Ma tę wadę, że `CanHandle` jest wywoływana dwukrotnie dla „dobrych” klientów. Czy istnieje konsensus co do tego, którą odmianę należy zastosować?


title: Czy czytałeś „Wolne oprogramowanie zaprogramowane w Haskell”? Co miałeś na myśli?

text: Czy ktoś wie coś o tej książce? Nie ma recenzji i nie wygląda na to, że jest jeszcze w druku, czy coś?


title: Skryptować własny rysunek w aplikacji Delphi za pomocą instrukcji IF/THEN/ELSE?

text: Buduję aplikację Delphi, która wyświetla projekt budynku, w tym drzwi, okna, okablowanie, oświetlenie, gniazdka, przełączniki itp. Zaimplementowałem bardzo lekki własny skrypt do wywoływania poleceń rysowania na płótnie, który jest załadowany z bazy danych. Na przykład jedno polecenie to „ELP 1110,1110,1290,1290,3,8388608”, które rysuje elipsę, parametry to od 1110x1110 do 1290x1290 z szerokością pióra 3 i kolorem „8388608” przekonwertowanym z liczby całkowitej na „TColor”. . To, co teraz robię, to implementowanie obiektów z typowymi procedurami rysowania i chciałbym użyć mojego silnika skryptów, ale to wymaga instrukcji `IF/THEN/ELSE` i tym podobnych. Na przykład, gdy rysuję światło, jeśli jest włączone, chciałbym narysować je na żółto, ale jeśli jest wyłączone, chciałbym narysować je na szaro. Mój obecny silnik skryptowy nie rozpoznaje takich instrukcji. Po prostu akceptuje proste polecenia rysowania, które odpowiadają metodom `TCanvas`. Oto opracowana przeze mnie (niekompletna) procedura wykonywania polecenia rysowania na kanwie: function DrawCommand(const Cmd: String; var Canvas: TCanvas): Boolean; wpisz TSingleArray = tablica Single; var Br: TBrush; Pn: TPen; X: liczba całkowita; P: liczba całkowita; L: ciąg; Inst: ciąg; T: ciąg; Nums: TSingleArray; początek Wynik:= Fałsz; Br:= Płótno.Pędzel; Pn:= Płótno.Pióro; if Assigned(Canvas) to zacznij, jeżeli Length(Cmd) > 5 to zacznij L:= UpperCase(Cmd); if Pos(' ', L)> 0 to zacznij Inst:= Copy(L, 1, Pos(' ', L) - 1); Usuń(L, 1, Poz(' ', L)); L:= L + ','; Ustaw długość (liczby, 0); X:= 0; podczas gdy Poz(',', L) > 0 zaczynają się P:= Poz(',', L); T:= Kopiuj(L, 1, P - 1); Usuń(L, 1, P); Ustaw długość (liczby, X + 1); Liczba[X]:= StrToFloatDef(T, 0); Inc(X); koniec; Br.Style:= bsClear; Pn.Style:= psSolid; Pn.Kolor:= clCzarny; if Inst = 'LIN' to zacznij Pn.Width:= Trunc(Nums[4]); jeśli Length(Nums) > 5 to zacznij Br.Style:= bsSolid; Br.Kolor:= Obci.(Liczby[5]); koniec; Canvas.MoveTo(Trunc(Nums[0]), Trunc(Nums[1])); Canvas.LineTo(Trunc(Nums[2]), Trunc(Nums[3])); Wynik:= Prawda; end else if Inst = 'ELP' następnie zacznij Pn.Width:= Trunc(Nums[4]); jeśli Length(Nums) > 5 to zacznij Br.Style:= bsSolid; Br.Kolor:= Obci.(Liczby[5]); koniec; Canvas.Ellipse(Trunc(Nums[0]),Trunc(Nums[1]),Trunc(Nums[2]),Trunc(Nums[3])); Wynik:= Prawda; end else if Inst = 'ARC' następnie zacznij Pn.Width:= Trunc(Nums[8]); Canvas.Arc(Trunc(Nums[0]),Trunc(Nums[1]),Trunc(Nums[2]),Trunc(Nums[3]),Trunc(Nums[4]),Trunc(Nums[5] ),Obcinak(Liczby[6]),Obcinanie(Liczby[7])); Wynik:= Prawda; end else if Inst = 'TXT', a następnie rozpocznij Canvas.Font.Size:= Trunc(Nums[2]); Br.Style:= bsClear; Pn.Style:= psSolid; T:= Polecenie; Usuń(T, 1, Poz(' ', T)); Usuń(T, 1, Poz(',', T)); Usuń(T, 1, Poz(',', T)); Usuń(T, 1, Poz(',', T)); Canvas.TextOut(Trunc(Nums[0]), Trunc(Nums[1]), T); Wynik:= Prawda; koniec; end else begin //Nie znaleziono spacji, nieprawidłowa komenda end; koniec; koniec; koniec; Chciałbym wiedzieć, jaki jest dobry, lekki aparat skryptowy innej firmy, którego mógłbym użyć, aby to osiągnąć? Nie chciałbym implementować parsowania `IF`, `THEN`, `ELSE`, `END`, `IFELSE`, `IFEND` i wszystkich tych niezbędnych poleceń. Potrzebuję po prostu możliwości poinformowania silnika skryptów, czy pewne właściwości spełniają określone warunki, musi on narysować obiekt w określony sposób. Powyższy jasny przykład to tylko jeden scenariusz, ale to samo rozwiązanie musi mieć również zastosowanie do innych scenariuszy, takich jak otwieranie lub zamykanie drzwi, blokowanie lub otwieranie drzwi i odpowiednio narysować je w inny sposób. Należy to zaimplementować na poziomie rysowania skryptów obiektów. Nie mogę na stałe zakodować żadnej z tych reguł skryptów/rysowania, rysunek musi być kontrolowany na podstawie bieżącego stanu obiektu, a także mogę chcieć narysować światło o określonym odcieniu lub ciemności w zależności od tego, jak przyciemniono światło jest.


title: Jak podejść do tworzenia aplikacji internetowych?

text: Przechodziłem przez Flask i wydaje mi się, że teraz mam przyzwoite zrozumienie, aby iść dalej i budować aplikację internetową. Jednak chcę wiedzieć, jak podejdę do problemu. Na przykład: Postanawiam zbudować aplikację do blogowania. Pierwszą rzeczą, którą robię, jest zapisywanie wszystkich rzeczy, które przychodzą mi do głowy, od rejestracji użytkowników, przez umieszczanie danych na blogu, po publikację na stronie. Potem po prostu zabieram się do kodowania. Wiem, że to nie jest właściwe podejście. Słyszałem o diagramach UML, diagramach przepływu pracy i tak dalej. Byłoby wspaniale, gdyby ktoś mógł po prostu nakreślić kroki, które wykonałby, aby zbudować dużą aplikację, a następnie mógłbym przejść dalej i dowiedzieć się o nich więcej. Na przykład może to być coś takiego: 1. Zbierz wymagania 2. Rysuj Diagramy UML 3. Narysuj diagramy przepływu pracy 4. Rozpocznij kodowanie Proszę zasugerować wyczerpującą listę, aby moje podejście było bardziej systematyczne. Dziękuję


title: Opinia i pomoc w następujących pytaniach podczas rozmowy kwalifikacyjnej

text: Nie znam terminologii związanej z rozmowami kwalifikacyjnymi i tworzeniem oprogramowania. Więc moje pytania brzmią: jaka jest twoja opinia na temat następujących pytań na rozmowie o pracę i jak najlepiej odpowiedzieć, zwłaszcza na ostatnie pytanie, które zadał? Nowy pracodawca zaproponował mi pracę polegającą na budowaniu bardzo bogatych interaktywnych aplikacji internetowych w Paryżu. Pytania, na które lubię poznać Twoje opinie, to: 1) Jakiego wynagrodzenia oczekujesz? 2) Czy możesz pracować w startupie? (Co to znaczy?) 3) Czy wiesz o iteracyjnych procesach rozwoju? (Co to znaczy? może pracować z wieloma programistami.) 4) Metodologia Lean? (Co to znaczy?) 5) Budujemy silną kulturę internetową, jak możesz pomóc? Dzięki za pomoc.


title: Zaprojektuj pytanie dotyczące współbieżnego serwera forkingowego

text: Jestem na wczesnym etapie projektowania aplikacji klient/serwer. Klienci będą programami wsadowymi, które odczytują plik danych kontaktowych klienta (imię i nazwisko, adres, adres e-mail, nr telefonu) i przekazują te komponenty na serwer, który doda je (jeśli nie są jeszcze obecne) do odpowiednich tabel mySQL i zwróci identyfikatory dla każdego składnika. Aby zwiększyć wydajność, serwer będzie miał cztery serwery „zarządzające”, z których każdy będzie szukał i prawdopodobnie dodał nowy wiersz, a następnie przekaże te cztery komponenty za pośrednictwem IPC do tych menedżerów, aby mogli pracować jednocześnie. Innymi słowy * Jeden „serwer główny”, który nie robi nic poza nasłuchiwaniem połączenia z zadania wsadowego i rozwidla/wykonaj proces „podrzędny”, * Czterech „menedżerów”, którzy czytają z gniazda, wykonują wyszukiwanie w tabeli i ewentualnie dodają wiersz i zapisz identyfikator, * Jeden proces „podrzędny” dla każdego podłączonego klienta, generowany przez mastera, gdy nowe połączenie przychodzi od klienta, co komunikuje się z zadaniem wsadowym: odbieranie rekordu kontaktu z klientem, wysyłanie komponentów do każdego menedżerów, czekając, aż wszyscy menedżerowie odpowiedzą z identyfikatorami, które obliczyli, i wysyłając rekord podsumowujący z powrotem do klienta, zanim zapętlą się, aby otrzymać następny rekord. (Przetwarzanie jest nieco bardziej skomplikowane niż opisałem - w rzeczywistości jest _ośmiu_ menedżerów, a wyniki z pierwszych czterech muszą zostać całkowicie zebrane przed wywołaniem kolejnych trzech menedżerów, które z kolei muszą zakończyć się przed wywołaniem ostatniego menedżera Ale to tylko prosty proces z kilkoma sekwencyjnymi etapami, z których każdy polega na wydobyciu równoczesnej pracy i czekaniu, aż wszystko się zakończy). serwery podrzędne? dlaczego nie kazać klientowi nawiązać osobnych połączeń bezpośrednio z tymi procesami menedżera? Nie mam naprawdę dobrego sprzeciwu: każdy klient _mógłby_ zasadniczo zaimplementować logikę slave bezpośrednio i utworzyć osiem jednoczesnych połączeń z serwerami zarządzającymi. Mam wrażenie, że to nie jest najlepsze podejście - że jakoś ważne może być posiadanie scentralizowanej kontroli, aby solidnie radzić sobie z awariami i błędami lub gromadzeniem statystyk dotyczących serwera jako całości. Ale nie mam wcześniejszego doświadczenia w budowaniu pełnowymiarowej, godnej produkcyjnej aplikacji klient/serwer. Bardzo chciałbym poznać opinie osób, które mają wcześniejsze doświadczenie w tworzeniu aplikacji tego rodzaju. **AKTUALIZACJA 1:** Jedna zaleta: jeśli proces klienta nagle ulegnie awarii lub zostanie anulowany, proces podrzędny pozostanie aktywny, będzie mógł wykryć, że klient odszedł, będzie miał pełną wiedzę o stanie zadania i może zapewnić integralność danych poprzez uzupełnienie (lub wycofanie) bieżącej jednostki pracy. Może to doprowadzić do uporządkowanego zakończenia niepowodzenia.


title: Czy dziedziczenie wielokrotne narusza zasadę pojedynczej odpowiedzialności?

text: Jeśli masz klasę, która dziedziczy z dwóch różnych klas, czy nie oznacza to, że twoja podklasa automatycznie robi (przynajmniej) 2 rzeczy, po jednej z każdej nadklasy? Uważam, że nie ma różnicy, jeśli masz dziedziczenie wielu interfejsów. Edycja: Aby było jasne, uważam, że jeśli podklasowanie wielu klas narusza SRP, to implementacja wielu (niemarkerowych lub podstawowych interfejsów (np. Porównywalnych)) również narusza SRP.


title: Tworzenie oprogramowania dla firmy poza firmą

text: Pracuję w firmie informatycznej jako programista. Obecnie pracujemy nad dużym projektem oprogramowania, rozwiązaniem do automatycznego klastrowania baz danych od wielu dostawców. Utrzymywaliśmy dobre standardy kodowania, dzięki czemu nasz kod jest wysoce modułowy i nadaje się do wielokrotnego użytku. Wiele z opracowanych przez nas modułów może przynieść ogromne korzyści społeczności open-source. W naszym zespole jest sporo programistów, którzy przyczyniają się do różnych projektów open-source, ale jak dotąd nie udało nam się przekonać pracodawcy do rozważenia open-sourcingu niektórych modułów. Kilkoro z nas zdecydowało, że chcielibyśmy wnieść kod do społeczności open-source, jednocześnie tworząc kod dla firmy. Ponieważ nasz pracodawca nie jest przychylny tej sprawie, przesyłanie kodu, który piszemy w godzinach pracy, prawdopodobnie nie wchodzi w grę. Zdecydowaliśmy się na alternatywne podejście, pisząc kod w wolnym czasie, który możemy wykorzystać zarówno dla firmy, jak i społeczności open-source. Chcielibyśmy wiedzieć, jakie są zastrzeżenia tego podejścia, potencjalne kwestie prawne i czy ktoś ma podobne doświadczenie, abyśmy mogli dalej dopracować nasz plan, zanim odłożymy go na stół w pracy.


title: Jak powinienem śledzić wersję/zmiany skryptu php?

text: Jak powinienem śledzić wersje/zmiany skryptu php, gdy dotyczy on pojedynczego skryptu w jednym pliku? Czy powinienem mieć osobny dziennik zmian, a jeśli tak (1) jak powinien być nazwany, (2) w jaki sposób powinna być sformatowana zawartość dziennika i (3) jak powinien być powiązany ze skryptem/plikiem php? A może powinienem uwzględnić zmiany w komentarzu na górze pliku php? Obecnie na górze pliku mam następujące komentarze: ` /** * @author Jan Kowalski <kontakt@John Kowalski.com> * @version 1.0 * @copyright Copyright (c) 2010, Jan Kowalski */ ` Dzięki z góry za odpowiedź!


title: Mieszanie transakcji DB i rejestrowanie z perspektywy projektowania

text: Załóżmy, że mamy stronę widoku, na której użytkownicy wykonują działania w wielu krokach, niektóre z tych działań obejmowałyby operacje bazy danych z transakcjami (fragmenty są w pseudokodzie, jak np.): Widok 1: Krok 1: ... Krok 2: .. Wywołaj ActionX Krok 3: ... ActionX: # można wywołać z różnych punktów w widoku ... Rozpocznij operacje bazy danych transakcji Zakończ transakcję Powiedzmy, że chcemy rejestrować postęp użytkownika w widoku (lub zapisać niektóre stany) w trwałym sposób w DB, dzięki czemu w przypadku przerwania programu/aplikacji możemy przywrócić stan do ostatniej akcji użytkownika wewnątrz widoku: View1: Step 1: ... Logger.log('view1-step1-done') Krok 2: ... Wywołaj ActionX Logger.log('view1-step2-done') Krok 3: ... Logger.log('view1-step3-done') Teraz ide sojusznikami, chcielibyśmy, aby trwałe logowanie i akcje transakcyjne oparte na bazie danych były wykonywane w tej samej transakcji DB, ponieważ nie chcemy tworzyć niespójnego stanu, w którym akcja jest wykonywana, ale nie jest odzwierciedlona w stanie dziennika , lub odwrotnie. Pytanie brzmi: jak osiągnąć ten cel przy minimalnej współzależności i SOC. Oto kilka sugestii: Widok 1: Krok 1: ... Krok 2: ... Rozpocznij transakcję Wywołanie ActionX # Rozpocznij/zakończ wyciągi transakcji zostaną usunięte z ActionX Logger.log('view1-step3-done') Zakończ krok transakcji 3: ... Nie podoba mi się to, ponieważ obsługa transakcji należy naturalnie do samego działania. Lub inny: Widok 1: Krok 1: ... Krok 2: ... Wywołaj ActionX (logMsg='view1-step3-done') Krok 3: ... ActionX (logMsg): ... Rozpocznij bazę danych transakcji ops Logger.log(logMsg) Zakończ transakcję Temu też się nie podoba. Obsługa komunikatów dziennika nie należy do akcji.


title: Dlaczego mniej IRQL-ów w 64-bitach, mimo że APIC ma więcej linii przerwań?

text: Gdy komputery x86 przeszły z 32-bitowych na 64-bitowe, odeszły również od używania programowalnych kontrolerów przerwań w stylu 8259 z 8 liniami przerwań. (Lub dwa multipleksowane PIC dla łącznie 15 linii przerwań.) Następnie, jeśli miałbyś zainstalować 32-bitowy system Windows dla systemu operacyjnego, Windows zaimplementowałby 32 programowe IRQLs (poziomy żądań przerwań) z IRQLs od 3 do 26 (lub tak) zarezerwowane dla urządzeń. Potem pojawiła się platforma x64. Potrzebujesz maszyny z APIC, która ma 256 linii przerwań, aby zainstalować na niej 64-bitowy Windows. Jednak 64-bitowy system Windows implementuje tylko 16 IRQL. Więc moje pytanie brzmi, czy ktoś wie, dlaczego 64-bitowy Windows zaimplementowałby mniej IRQL niż jego 32-bitowy odpowiednik, mimo że ma do dyspozycji o wiele więcej linii przerwań sprzętowych?


title: Dokumentacja wsparcia / utrzymania dla zespołu programistów

text: Pracuję w dziale rozwoju (około 40 programistów) dla dużej firmy E-Commerce. Szybko się rozwinęliśmy, ale nie rozwinęliśmy się zbyt dobrze w dziedzinie dokumentowania naszej pracy. Pracujemy z metodologią Agile / Scrum-podobną do naszego rozwoju i testowania, ale dokumentacja wydaje się być zaniedbana. Musimy być w stanie stworzyć dokumentację, która pomogłaby programiście, który wcześniej nie pracował nad naszym projektem lub był nowy w firmie. Musimy również utworzyć więcej informacji na wysokim poziomie dla naszego działu pomocy technicznej, aby wyjaśnić wszelkie dodatkowe ustawienia konfiguracji i rozwiązania znanych problemów, które mogą się pojawić. Obecnie umieszczamy to w źle skonstruowanej wiki, opartej na starej witrynie Sharepoint/TFS. Czy ktoś może zaproponować jakieś idealne linki lub porady dotyczące poprawy standardu dokumentacji? Co działa w innych firmach? Czy ktoś ma radę na temat tworzenia dokumentacji w ramach zwinnego procesu? Wielkie dzięki, ben


title: Czy kod debugowania powinien być pozostawiony na miejscu, zawsze, czy dodawany tylko podczas debugowania i usuwany po znalezieniu błędu?

text: Ja, na przykład, dodaję kod debugowania (taki jak instrukcje print) tylko wtedy, gdy próbuję zlokalizować błąd. A kiedy już go znajdę, usuwam kod debugowania (i dodaję przypadek testowy, który specjalnie testuje ten błąd). Czuję, że zaśmieca prawdziwy kod i dlatego nie ma tam miejsca, chyba że debuguję. Jak ty to robisz? Czy pozostawiasz kod debugowania na miejscu, czy usuwasz go, gdy jest przestarzały (co może być trudne do oceny, kiedy to jest)?