title: Wydaj projekt open-source na wielu licencjach

text: Rozważ tę licencję, którą napisałem dla mojego oprogramowania: Copyright 2014, [moje imię] Autor(zy) tego oprogramowania zamierza zapewnić użytkownikom maksymalną swobodę. Jako takie, niniejsze oprogramowanie może być używane w ramach jednej z poniższych licencji: 1. MIT: [link do licencji] 2. Apache 2.0: [link do licencji] 3. BSD 2-klauzula: [link do licencji] 4. Klauzula 3 BSD: [link do licencji] Lub można ją uznać za udostępnioną do domeny publicznej w jurysdykcjach, w których jest to możliwe. W każdym razie oprogramowanie nie jest objęte gwarancją. Czy widzicie jakieś potencjalne problemy z tą licencją, zwłaszcza z prawnego punktu widzenia? Czy udaje mu się zapewnić użytkownikom maksymalną swobodę?


title: Dlaczego nie należy odwoływać się do obiektu DbContext w warstwie usług?

text: Szukałem implementacji interakcji `Service Layer` i `Controller` w blogach i niektórych projektach open source. Wydaje się, że wszystkie z nich odwołują się do obiektu `DbContext` w klasach repozytorium, ale unika się ich używania w klasach usług. Klasy usług zasadniczo wykorzystują odwołania `IQueryable<T>` do `DbSet<T>`. Chcę wiedzieć, dlaczego ta praktyka jest dobra i dlaczego `DbContext` nie powinien mieć odniesienia w warstwie usług.


title: Jakie jest pochodzenie negatywnego terminu „starszy kod”

text: Wszyscy mówią o przestarzałym kodzie w tworzeniu oprogramowania, a ja słyszałem, że w ciągu ostatnich dziesięciu lat termin ten był używany do malowania jakiejkolwiek bazy kodu jako złej. Skąd wziął się ten termin, który ma tak silne skojarzenia dla programistów? Jestem pewien, że musi istnieć jakaś książka na temat rozwoju oprogramowania, która była pionierem tego terminu. Bardzo chciałbym zlokalizować pochodzenie terminu „przestarzały kod”.


title: Kontrola wersji i zarządzanie projektami dla freelancerów

text: Czy istnieją narzędzia do kontroli wersji i zarządzania projektami, które „dobrze współpracują” z freelancerami, jeśli chcę, aby mój klient był cały czas zaangażowany w projekt? Martwi mnie to, że dostawcy hostingu repozytoriów mają swoje opłaty oparte na „liczbie użytkowników”, która według mnie jest liczbą, która będzie stale rosła, gdy kończę jeden projekt po drugim. Dla każdego projektu, na przykład, musiałbym dodać uprawnienia mojemu wykonawcy, aby mógł on pobrać kod źródłowy i współpracować. Jak to działa w praktyce? Czy „usuwam” wykonawcę z projektu po jego zakończeniu? Oznacza to, że zasadniczo stwierdzam, że nie oferuję już wsparcia i poprawek błędów. A może freelancerzy płacą coraz więcej za te usługi? Korzystasz z takich usług online, czy sam je hostujesz? A może po prostu wysyłasz kod do klienta e-mailem w cotygodniowych iteracjach?


title: Czy nagłówek jakiejkolwiek połączonej listy musi zawierać jakieś dane?

text: Czy istnieje jakaś zasada, która mówi, że nagłówek dowolnej połączonej listy powinien zawierać dane. Czy to dlatego, że robiąc tak oszczędzamy miejsce na jeden węzeł. Dlaczego dla niektórych implementacja head zawiera dane, a dla innych nie.


title: Dlaczego algorytm wnioskowania o typach OCamla (i F#) wymaga funkcji tagowania jako rekurencyjnych?

text: Z _Real World OCaml_ (beta): > OCaml rozróżnia definicje nierekurencyjne (używające `let`) i > definicje rekurencyjne (używające `let rec`) głównie z powodów technicznych: algorytm wnioskowania o typie musi wiedzieć, kiedy zbiór definicji funkcji > są wzajemnie rekurencyjne iz powodów, które nie dotyczą czystego języka > takiego jak Haskell, muszą one być wyraźnie zaznaczone przez programistę. Dlaczego tak jest (jaki dokładnie jest powód techniczny) i dlaczego czysty język, taki jak Haskell, „ucieka” bez konieczności oznaczania funkcji jako rekurencyjnych?


title: Jak zwiększyć zaangażowanie właściciela produktu w zwinne projekty?

text: Podczas retrospektyw iteracyjnych projektów zwinnych jednym z najczęściej pojawiających się dla nas tematów jest to, że właściciel produktu (lub właściciele produktu nie są) nie są dostępni lub zaangażowani w projekt na co dzień. Wydaje się, że częstym motywem jest to, że klienci nie chcą „poświęcać” niezbędnej ilości czasu właściciela produktu na projekt, ale zamiast tego odpowiadają na pytania za pośrednictwem poczty elektronicznej lub tylko podczas demonstracji produktu. Skutkuje to wydłużeniem cyklu sprzężenia zwrotnego i zmniejszeniem efektywności projektu. Czy musiałeś pokonać tę przeszkodę? Jak to zrobiłeś?


title: Czy serwer powinien „być pobłażliwy” w tym, co akceptuje i „po cichu odrzucać błędne dane wejściowe”?

text: Miałem wrażenie, że do tej pory wszyscy zgadzają się, że ta maksyma była błędem. Ale ostatnio widziałem tę odpowiedź, która ma komentarz „bądź łagodny”, przegłosowany 137 razy (na dzień dzisiejszy). Moim zdaniem pobłażliwość, jaką akceptują przeglądarki, była bezpośrednią przyczyną całkowitego bałaganu, że HTML i niektóre inne standardy sieciowe były kilka lat temu i dopiero niedawno zaczęły prawidłowo wychodzić z tego bałaganu. Sposób, w jaki to widzę, bycie pobłażliwym w tym, co akceptujesz, doprowadzi do tego. Drugą częścią tej maksymy jest _"po cichu odrzuć błędne dane wejściowe, bez zwracania komunikatu o błędzie, chyba że jest to wymagane przez specyfikację"_ , co wydaje się obraźliwe. Każdy programista, który wali głową w ścianę, gdy coś po cichu zawodzi, będzie wiedział, co mam na myśli. Czy więc całkowicie się mylę? Czy mój program powinien być pobłażliwy w tym, co akceptuje i po cichu połykać błędy? A może źle interpretuję, co to ma znaczyć? * * * Pierwotne pytanie brzmiało "program" i zgadzam się z opinią wszystkich. Pobłażliwość programów może mieć sens. Tak naprawdę chodziło mi jednak o API: interfejsy wystawione na działanie _innych programów_ , a nie ludzi. Przykładem jest HTTP. Protokół jest interfejsem, z którego korzystają tylko inne programy. Ludzie nigdy nie podają bezpośrednio dat, które trafiają do nagłówków, takich jak „Jeśli-zmodyfikowano-od”. Pytanie więc brzmi: czy serwer implementujący standard powinien być pobłażliwy i dopuszczać daty w kilku innych formatach, oprócz tego, który jest faktycznie wymagany przez standard? Uważam, że „bądź łagodny” ma odnosić się do tej sytuacji, a nie do ludzkich interfejsów. Jeśli serwer jest pobłażliwy, może wydawać się to ogólną poprawą, ale myślę, że w praktyce prowadzi to tylko do implementacji klienta, które kończą się _poleganiem_ na pobłażliwości, a tym samym nie działają z innym serwerem, który jest pobłażliwy w nieco inny sposób. Czy więc serwer z pewnym API powinien być pobłażliwy, czy to bardzo zły pomysł? * * * Teraz przejdźmy do łagodnej obsługi danych wejściowych użytkownika. Rozważ YouTrack (oprogramowanie do śledzenia błędów). Używa języka do wprowadzania tekstu, który przypomina Markdown. Z wyjątkiem tego, że jest „pobłażliwy”. Na przykład pisanie - foo - bar - baz jest _nie_ udokumentowanym sposobem tworzenia listy punktowanej, a jednak działało. W związku z tym był często używany w naszym wewnętrznym narzędziu do śledzenia błędów. Pojawia się następna wersja, a ta pobłażliwa funkcja zaczyna działać nieco inaczej, łamiąc kilka list, które (nie)właściwie używały tej (nie)funkcji. Oczywiście udokumentowany sposób tworzenia list punktowanych nadal działa. Czy zatem moje oprogramowanie powinno być łagodne w zakresie akceptowanych przez użytkownika _danych wejściowych_ użytkownika?


title: Kod uwzględniający środowisko

text: Istnieją sytuacje, w których wdrożone środowisko (na przykład **development** , **test** lub **production** ) może dyktować wynik niektórych działań. Na przykład, być może pomyślny proces „rejestracji użytkownika” spowoduje wysłanie wiadomości e-mail z powiadomieniem do nowego użytkownika. Działania specyficzne dla środowiska: * **Rozwój:** Nie wysyłaj e-maila. Dzienniki e-mail zapewnią wystarczająco dużo programistom. * **Test:** Wysyłaj wszystkie e-maile na jakąś skrzynkę testEnvironment@domain.com, a nie na adres użytkownika. * **Produkcja:** Wyślij e-mail do użytkownika. Poniżej wymieniłem trzy możliwe rozwiązania. ## **Wartość konfiguracyjna CurrentEnvironment** Jednym ze sposobów rozwiązania tego problemu, który często widziałem, jest posiadanie jakiejś wartości konfiguracyjnej (czy to w jakimś pliku konfiguracyjnym xml, czy w bazie danych), takiej jak `CurrentEnvironment`, która określa aktualne środowisko, w którym system jest wdrażany. Wymagałoby to sprawdzenia case/if w kodzie w celu określenia żądanej akcji: if(CurrentEnvironment == Environment.Test) { // Wyślij wszystkie e-maile do skrzynki odbiorczej testEnvironment@domain.com. } else if(CurrentEnvironment == Environment.Production) { // Wyślij wiadomość e-mail do użytkownika. } Moim zdaniem nie jest to rozwiązanie, które można utrzymać. ## **Wyczyść wszystkie adresy e-mail** Inną metodą jest uruchomienie skryptu zmiany po przywróceniu bazy danych, aby wykonać następujące czynności: * Usunąć wszystkie adresy e-mail użytkowników (w fazie rozwoju), * Zamienić wszystkie adresy e-mail użytkowników na testEnvironment@domain .com (w teście) Jest to dodatkowy krok w procesie wydania, którego pominięcie może mieć niebezpieczne skutki. Ponadto to rozwiązanie rozwiązuje tylko problem z pocztą e-mail. Być może istnieje wiele innych sytuacji, w których liczy się środowisko. ## **Transformacja konfiguracji** Innym pomysłem jest użycie transformacji web.config. W ten sposób konfiguracja może być różna dla różnych środowisk. Na przykład, będziemy mieć następujące konfiguracje: web.config web.Development.config web.Test.config web.Production.config Transformacja może następnie użyć różnych "dostawców" lub ustawić pewne atrybuty zgodnie ze środowiskiem. Na przykład `overrideDeliveryAddress` można ustawić w `web.Test.config`: <EmailService> <providers> <add name="EmailServiceProvider" type="CustomProviders.EmailServiceProvider, CustomProviders" smtp="smtp.domain.com " password="xyz" overrideDeliveryAddress="testEnvironment@domain.com" enabled="true" /> </providers> </EmailService> To rozwiązanie wymaga znacznie więcej pracy, ale jest bardziej łatwe w utrzymaniu i mniej inwazyjne. Kod jest teraz nieświadomy dla środowiska. Jakie inne sposoby można osiągnąć powyżej? Czy kod KIEDYKOLWIEK powinien być świadomy środowiska?


title: Czy istnieje podzbiór programów, które unikają problemu z zatrzymaniem?

text: Właśnie czytałem inne wyjaśnienie problemu zatrzymania i skłoniło mnie do myślenia, że wszystkie problemy, które widziałem, a które są podane jako przykłady, obejmują nieskończone sekwencje. Ale nigdy nie używam nieskończonych sekwencji w moich programach - trwają one zbyt długo. Wszystkie aplikacje w świecie rzeczywistym mają dolne i górne granice. Nawet liczby rzeczywiste nie są naprawdę rzeczywiste - są to przybliżenia przechowywane jako 32/64 bity itp. Pytanie brzmi, czy istnieje podzbiór programów, które można określić, jeśli się zatrzymają? Czy to wystarczy dla większości programów. Czy potrafię zbudować zestaw konstrukcji językowych, które potrafię określić „zatrzymuje się” programu. Jestem pewien, że było to już badane gdzieś wcześniej, więc wszelkie wskazówki byłyby mile widziane. Język nie byłby kompletny, ale czy jest coś takiego jak prawie kompletny, co jest wystarczająco dobre? Oczywiście taka konstrukcja musiałaby wykluczyć rekurencję i nieograniczone pętle while, ale dość łatwo mogę napisać program bez tych pętli. Czytanie ze standardowego wejścia jako przykładu musiałoby być ograniczone, ale to dość proste - ograniczę moje wprowadzanie do 10 000 000 znaków itp., w zależności od dziedziny problemu. tia [Aktualizacja] Po przeczytaniu komentarzy i odpowiedzi może powinienem powtórzyć moje pytanie. Dla danego programu, w którym wszystkie dane wejściowe są ograniczone, można określić, czy program się zatrzyma. Jeśli tak, jakie są ograniczenia języka i jakie są ograniczenia zestawu wejściowego. Maksymalny zestaw tych konstrukcji określi język, który można wydedukować, aby zatrzymać lub nie. Czy przeprowadzono jakieś badania na ten temat? [Aktualizacja 2] oto odpowiedź, tak, już w 1967 roku z http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf Że problem zatrzymania można przynajmniej teoretycznie rozwiązać dla Systemy skończonych stanów zostały już omówione przez Minsky'ego w 1967 [4]: „...każda maszyna skończoności, jeśli pozostawiona całkowicie samej sobie, w końcu wpadnie w idealnie okresowy, powtarzalny wzór. Czas trwania tego powtarzającego się wzoru nie może przekroczyć liczby stanów wewnętrznych maszyny…” (a więc jeśli będziesz trzymać się skończonych maszyn Turinga, możesz zbudować wyrocznię)


title: Wzór dostępu do połączenia MySQL

text: Mamy aplikację w C++, która próbuje uzyskać dostęp do bazy danych MySQL. W aplikacji jest kilka (około 5) wątków (z biblioteką Boost do obsługi wątków) i każdy wątek ma kilka obiektów, z których każdy próbuje uzyskać dostęp do Bazy danych dla swoich własnych celów. Ma prosty model typu ORM, ale to naprawdę nie jest tutaj ważny czynnik. Istnieją trzy potencjalne wzorce dostępu, o których mogę pomyśleć: 1. Może istnieć pojedynczy `obiekt połączenia` na aplikację lub wątek i jest on współdzielony przez wszystkich (lub grupę). Obiekt musi być bezpieczny dla wątków i będą występować rywalizacje, ale MySQL nie zostanie uruchomiony ze zbyt dużą liczbą połączeń. 2. Każdy obiekt może sam zainicjować połączenie. Baza danych musi dbać o współbieżność (co myślę, że MySQL może), a projekt może być znacznie prostszy. Tutaj mogą być dwie możliwości. a. albo obiekt utrzymuje stałe połączenie przez całe życie LUB b. obiekt inicjuje połączenie w razie potrzeby. 3. Aby uprościć rywalizację jak w przypadku 1 i nie tworzyć zbyt wielu gniazd jak w przypadku 2, możemy mieć połączenia oparte na grupach/zestawach. Więc może istnieć więcej niż jedno połączenie (powiedzmy N), każde z tych połączeń może być połączeniem współdzielonym przez M obiektów. Oczywiście każdy z tych wzorców ma inny koszt zasobów i będzie działał z różnymi ograniczeniami i celami. Jakimi kryteriami powinienem się kierować, aby wybrać wzór tego do własnej aplikacji? Jakie są zalety i wady każdego z tych wzorców w stosunku do drugiego? Czy jest jakiś inny wzór, który jest lepszy? * * * PS: Przeszedłem przez te pytania: mysql, jedno połączenie vs.


title: Refaktoryzacja poszukiwana w celu zastąpienia współdzielonych typów danych w komponencie .NET

text: Zajmuję się aktualizacją oprogramowania, które składa się z dwóch elementów: procesu Kontrolera i procesu interfejsu użytkownika. Kontroler i UI komunikują się za pomocą komunikatów XML. Ponadto kontroler jest zbudowany na bazie udostępnionej biblioteki, która implementuje szereg przepływów biznesowych. Do budowania wiadomości do komunikacji kontroler-UI ktoś zdecydował się użyć wbudowanej serializacji i deserializacji .NET i dlatego utworzył typy klas z adnotacjami z atrybutami kontrolującymi serializację (XmlElement, XmlAttribute itp.) dla każdej wiadomości, serializując ją i deserializując przez przy użyciu domyślnego serializatora XML. W przypadku pierwszych kilku kontrolerów było to w porządku. Ale teraz, podczas gdy niektóre wiadomości można ponownie wykorzystać, inne nie. Pełnią podobne funkcje, ale są strukturalnie niezgodne z informacjami, których potrzebujemy. Ponieważ ta decyzja została podjęta, utknęliśmy z typami danych, które nie mogą modelować potrzebnych nam danych i nie można ich zmienić, ponieważ złamałyby inne kontrolery. Jednocześnie potrzebujemy funkcjonalności i sekwencji komunikatów zaimplementowanych w bibliotece współdzielonej. Potrzebuję wyjścia z tej zagadki, takiego, które ma najmniejszy koszt techniczny w stosunku do zmiany innych kontrolerów, potrzebuję pewnego rodzaju „polimorfizmu strukturalnego” dla tych typów, gdzie typ jest ten sam, ale jego wewnętrzna struktura jest inna. Być może te komunikaty można zmienić na typy danych "obiektowych", ale w takim przypadku... Potrzebuję sposobu na kontrolowanie z zewnątrz biblioteki współdzielonej odlewania, które jest wykonywane wewnątrz biblioteki współdzielonej. Jak mam do tego podejść, nie mam wystarczającego doświadczenia, aby znaleźć do tego czystą refaktoryzację? Czuję, że utknąłem. Używamy .NET 4.5


title: Jak naprawić starszy kod, który niebezpiecznie używa <string.h>?

text: Mamy sporo starszego kodu, napisanego w prostym C (niektóre z nich to K&R!), który przez wiele, wiele lat był kompilowany przy użyciu Visual C 6.0 (około 1998) na maszynie XP. Zdajemy sobie sprawę, że jest to nie do utrzymania i staramy się przenieść to do nowoczesnego kompilatora. Kwestie polityczne mówią, że najnowszym dozwolonym kompilatorem jest VC++ 2005. Podczas kompilowania projektu pojawia się wiele ostrzeżeń dotyczących niebezpiecznych funkcji manipulacji ciągami znaków (`sprintf()`, `strcpy()`, itp.). Przegląd niektórych z tych miejsc pokazuje, że kod jest rzeczywiście niebezpieczny; nie sprawdza przepełnienia bufora. Ostrzeżenie kompilatora zaleca przejście do używania `sprintf_s()`, `strcpy_s()` itp. Są to jednak funkcje stworzone przez Microsoft (i zastrzeżone) i nie są dostępne w (powiedzmy) gcc (chociaż przede wszystkim sklep Windows mamy kilku klientów na różnych smakach *NIX) Jak powinniśmy postępować? Nie chcę tworzyć własnych bibliotek ciągów. Chcę tylko raz przejrzeć kod. Wolałbym nie przechodzić na C++, jeśli możemy w tym pomóc.


title: Luźno porównaj dane wprowadzone przez użytkownika z rekordem bazy danych

text: Mam tabelę bazy danych z 3 kolumnami; identyfikator, pytanie i odpowiedź. Na froncie mam aplikację PHP, która wyświetla pytania użytkownikowi. Aplikacja porównałaby następnie dane wprowadzone przez użytkownika z odpowiedzią w bazie danych. Używając tylko PHP, jak mogę luźno porównać dane wejściowe użytkownika z rekordem w bazie danych i przekazać je jako poprawne, nawet jeśli nie jest to ścisłe dopasowanie? Na przykład:- **Pytanie:** Jaka jest struktura cząsteczki wody? **Odpowiedź w bazie danych:** Wodór i tlen **Akceptowane odpowiedzi:** Tlen i wodór, wodór n tlen, wodór i tlen


title: Rozmiar bazy danych czynnikiem Hibernate vs JDBC?

text: Czy wiesz, czy rozmiar bazy danych (liczba użytych tabel) jest czynnikiem decydującym o wyborze między Hibernate a JDBC? Dlaczego lub dlaczego nie? W moim konkretnym przypadku oceniam Hibernate i JDBC pod kątem interakcji z bazą danych Oracle dla małej aplikacji internetowej.


title: Przepływ pracy git do oddzielania zatwierdzeń

text: Najlepsze praktyki z git (lub dowolnym VCS) powinny polegać na tym, aby każde zatwierdzenie robiło najmniejszą możliwą zmianę. Ale to w ogóle nie pasuje do tego, jak pracuję. Na przykład ostatnio musiałem dodać trochę kodu, który sprawdzał, czy wersja wtyczki do mojego systemu jest zgodna z wersjami, które system obsługuje. Jeśli nie, wypisz ostrzeżenie, że wtyczka prawdopodobnie wymaga nowszej wersji systemu. Pisząc ten kod zdecydowałem, że chcę pokolorować ostrzeżenia. Miałem już kod z kolorowym komunikatem o błędzie, więc edytowałem ten kod. Ten kod znajdował się w module startowym jednego wejścia do systemu. Kod sprawdzający wtyczkę znajdował się w innej ścieżce, która nie używała tego punktu wejścia, więc przeniosłem kod kolorowania do oddzielnego modułu, aby oba punkty wejścia mogły z niego korzystać. Ponadto, aby przetestować działanie mojego kodu sprawdzającego wtyczki, muszę przejść do edycji kodu UI/UX, aby upewnić się, że mówi użytkownikowi „Musisz zaktualizować”. Kiedy już wszystko zostało powiedziane i zrobione, wyedytowałem 10 plików, zmieniłem zależności, 2 punkty wejścia są teraz zależne od kodu kolorowania itd. Będąc leniwym, prawdopodobnie po prostu po prostu `git add . && git commit -a` całość. Spędzenie 10-15 minut na próbie manipulowania wszystkimi tymi zmianami w 3 do 6 mniejszych zmian wydaje się frustrujące, co rodzi pytanie **Czy istnieją przepływy pracy, które działają dla Ciebie lub ułatwiają ten proces?** Nie sądzę, że mogę to zrobić jak magicznie zawsze modyfikuję rzeczy w idealnej kolejności, ponieważ nie znam tej kolejności, dopóki nie zacznę modyfikować i zobaczyć, co się pojawi. Wiem, że mogę `git add --interactive` itp., ale wydaje się, przynajmniej dla mnie, trochę trudno wiedzieć, jakie dokładnie zmiany pobieram, aby każde zatwierdzenie faktycznie zadziałało. Ponadto, ponieważ zmiany znajdują się w bieżącym katalogu, nie wydaje się, aby łatwo było przeprowadzać testy na każdym zatwierdzeniu, aby upewnić się, że zadziała bez przechowywania wszystkich zmian. A potem, gdybym miał schować, a potem uruchomić testy, gdybym pominął kilka linijek lub przypadkowo dodał kilka linijek za dużo, nie mam pojęcia, jak łatwo bym z tego odzyskał. (jak w przypadku, gdy weź brakujące linie ze skrytki, a następnie odłóż resztę, lub weź kilka dodatkowych linii, których nie powinienem był chwycić i wepchnąć ich do skrytki na następny commit. Myśli? Sugestie? PS: Mam nadzieję, że tak jest odpowiednie pytanie.Pomoc mówi _metodologie i procesy rozwoju_


title: Czy Agile można osiągnąć bez zaangażowania klienta?

text: Nie mogłem napisać książki o Agile. Pracowałem w kilku sklepach, które nazywają swój proces Agile. Jednym z głównych punktów rozwoju Agile jest regularne zaangażowanie klienta. Po sprincie praca może zostać zaprezentowana klientowi w celu uzyskania jego opinii. Wypłukać i powtórzyć. Problem, z którym się spotykam, polega na tym, że wielu klientów nie chce się tak angażować. Zdecydowanie woleliby podejście kaskadowe. Zbierz wymagania z góry, a następnie wróć, gdy skończysz. Z mojego doświadczenia wynika, że wodospad nie działa. Klienci nie wiedzą, czego chcą, dopóki tego nie zobaczą. Dylemat kaskadowy jest dalej propagowany przez dużą społeczność programistów, którzy chcą mieć wszystkie wymagania z góry. W ten sposób wiedzą, co budują, mogą odpowiednio zaprojektować, a klient jest winny, ponieważ „zaakceptował” te wymagania. Czy się mylę? Czy Agile może działać bez zaangażowania klienta? Jeśli tak, to jak i jak radzisz sobie z omawianymi przeze mnie problemami?


title: Co skłoniłoby Cię do przyjęcia języka z bardzo małą ilością zasobów i narzędzi, prawie bez bibliotek i mniej więcej żadnych innych użytkowników w projekcie?

text: Często wiele przyzwoitych języków po prostu nie stanie się popularnymi z powodu problemu z kurczakiem i jajkiem, w którym brakuje zasobów (książek, samouczków... innych niż do podstawowej dokumentacji językowej), narzędzi (obsługa IDE, debuggery), bibliotek (poza jakąś małą standardową biblioteką) i bardzo niewiele osób ją przyjęło. Język też mógł nie być ustandaryzowany. Takie języki wciąż są czasami używane, ponieważ w przeciwnym razie nie mielibyśmy dziś żadnych popularnych języków. Niektóre stały się popularne, ponieważ zostały stworzone dla konkretnego głównego produktu i do tego celu używane (np. C dla UNIX), ale niektóre języki nie były, ale nadal stały się dość popularne (np. Java i Python). Co musiałby zaoferować tak słabo obsługiwany język, abyś mógł go zaadaptować do projektu oprogramowania, który zamierzasz stworzyć? Z pewnością w języku musiałoby być coś całkiem rewolucyjnego lub wyjątkowego.


title: Jak instrumentować istniejącą aplikację ASP.NET?

text: Mamy kilka bardzo złożonych aplikacji internetowych ASP.NET, które są używane wewnętrznie przez setki użytkowników. Próbujemy dowiedzieć się, w które obszary aplikacji zainwestować, aby poprawić funkcjonalność, ale nie jesteśmy pewni, które ekrany/funkcje są intensywniej wykorzystywane. Idealnie więc, chciałbym znaleźć sposób na dodanie do aplikacji warstwy oprzyrządowania, która zbiera metryki na temat tego, które przyciski są klikane, które pola tekstowe są używane itp. Czy są tam jakieś produkty / aplikacje open source które zrobią tego rodzaju oprzyrządowanie dla ASP.NET? Oczywiście mógłbym zrobić to sam ręcznie, wchodząc do kodu i wstrzykując wszędzie instrukcje rejestrowania, ale byłaby to znaczna ilość pracy, która będzie trudna do wykonania.


title: Pomysł algorytmu do wykrywania struktury nawigacji strony?

text: Obecnie jestem w trakcie rozwijania importera dowolnej istniejącej, dowolnej (statycznej) strony HTML do nadchodzącej wersji naszego CMS. Mimo, że pobieranie plików jest pomyślnie rozwiązane, spuszczam z siebie włosy, jeśli chodzi o wykrycie struktury serwisu (stron i podstron) wyłącznie z plików HTML, bez podawania przez użytkownika dodatkowych wskazówek. Zasadniczo chcę uzyskać takie drzewo: + Strona główna 1 + Strona podrzędna 1 + Strona podrzędna 2 + Strona podrzędna 1 + Strona podrzędna 3 + Strona główna 2 + Strona podrzędna 4 + Strona podrzędna 3 + ... Tzn. Chcę być w stanie wykryć strukturę menu z linków wewnątrz stron. Nie musi to być w 100% dokładne, ale przynajmniej chcę osiągnąć coś więcej niż tylko płaską listę. Myślałem o przejrzeniu wielu stron, aby zobaczyć podobne obszary i zidentyfikować je jako obszary menu i przeanalizować znajdujące się tam linki, ale mimo wszystko nie jestem _tak_ zadowolony z tego pomysłu. **Moje pytanie:** Czy potrafisz sobie wyobrazić jakiś algorytm, jeśli chodzi o wykrywanie takiej struktury? **Aktualizacja 1:** To, czego szukam, to _nie_ pająk sieciowy, ale algorytm tworzy logiczne drzewo relacji stron, aby móc tworzyć strony i podstrony w moim CMS podczas ich importowania. **Aktualizacja 2:** Zgodnie z sugestią Roberta rozwiążę ten problem, zaczynając od strony głównej, a następnie po prostu analizując linki i traktując każdy link na stronie po prostu jako stronę podrzędną. Prawdopodobnie będę rekursywał nie w sposób głęboki, ale raczej wszerz, aby uzyskać bardziej zrównoważoną strukturę nawigacji.


title: Czy istnieje skuteczny sposób na przekonwertowanie projektu Java z TUI na projekt z GUI?

text: Potrzebuję więc, aby interfejs aplikacji bazodanowej Java był graficznym interfejsem użytkownika. Zakodowaliśmy projekt w Eclipse i zamierzam go zaimportować do Netbeans. W Netbeans jest świetny konstruktor GUI, ale nie jestem pewien, jak się do tego zabrać.


title: Jak to się dzieje, że proces projektowania jest tak inny w przypadku projektowania stron internetowych i projektowania GUI?

text: Miałem okazję rozwijać aplikacje w kilku niszach: back-end serwerowy, klienty desktopowe, a od niedawna strona internetowa na małą skalę. Kiedy już oddałem się projektowaniu strony internetowej, zadaję sobie pytanie, dlaczego proces projektowania interfejsu użytkownika jest tak inny? Czy możesz wskazać różnice i dlaczego powstały? Kiedyś HTML służył do oznaczania tekstu, a graficzny interfejs użytkownika był interfejsem do wykonywania prawdziwej pracy, ale dzisiaj, dlaczego proces tworzenia GUI jest nadal tak inny? Oto kilka na początek: Pulpit: **Użyj wyraźnego układu**. (np. StackPanel w WPF, BorderLayout w Swing) Sieć: **Układ to zestaw właściwości CSS** (np.: wysokość/szerokość, margines/wypełnienie, pływak, wyświetlanie...), które są przypisywane do każdego kontenera jak element. Desktop: **Izolacja komponentów GUI** do klas OO, łatwe ponowne użycie. Sieć: **Komponenty nie są ponownie wykorzystywane na poziomie HTML** , mogą być ponownie wykorzystywane w dynamicznym generowaniu kodu HTML po stronie serwera. Tylko style CSS mogą być ponownie użyte. Czy możesz wymienić jeszcze kilka? i dlaczego? Dlaczego nie mogą być podobne? Uwaga dodatkowa: mam pewne doświadczenie z GWT, tworzy aplikację kliencką działającą w przeglądarce, ale dlaczego nie mogę stworzyć strony internetowej (takiej jak strona bloga) z metodami i narzędziami do projektowania interfejsu użytkownika na pulpicie?


title: Dlaczego Knuth zabrania czytania cytatów z przedrozdziałów w The Art of Computer Programming?

text: Po przedmowie do The Art of Computer Programming znajduje się procedura czytania tego zestawu książek. Krok 4 to rozpoczęcie czytania Rozdziału N ze szczególną instrukcją, aby „nie czytać cytatów, które pojawiają się na początku rozdziału”. (podkreśl jego). Ta sekcja jest obecna w trzecim wydaniu tomu 1 z 1997 r., ale nie w trzecim wydaniu tomu 2 ani w drugim wydaniu tomu 3, oba datowane na rok 1998. Domyślam się, dlaczego ta ciekawa instrukcja istnieje, ale nie udało mi się znaleźć wszelkie odniesienia do niego. Czy ktoś wie o tym z pierwszej ręki lub link do informacji?


title: Co wybrać: freeware, shareware czy payware?

text: Kilka lat temu stworzyłem program, który ma stałą grupę użytkowników. Stał się dość popularny i teraz mamy blisko dwa miliony pobrań na Download.com. Na początku udostępniłem aplikację jako freeware, aby dotrzeć do jak największej liczby użytkowników, ale wiąże się to z kosztami serwera i oczywiście fajnie byłoby otrzymać trochę pieniędzy w zamian za swój wysiłek. Szukam sposobu na uzyskanie rozsądnych dochodów z mojej bezpłatnej aplikacji, ale wciąż zarobię trochę pieniędzy. Oto moje dotychczasowe doświadczenia (obecne pogrubione): Xacti.com : Niskie przychody i zajęło mi dużo e-maili, aby w końcu otrzymać pieniądze. OpenCandy.com : Przyjazny, przychody są w porządku, dobry przegląd pobrań online. **InstallMonitizer.com** : Testujemy z nimi właśnie teraz, przychody wydają się wyższe i mamy program poleceń. Inną opcją byłoby przejście na shareware (powiedzmy, 30-dniowy okres próbny), ale myślę, że kosztowałoby mnie to wielu użytkowników. Moim zdaniem ekrany z oferty są nieszkodliwe. Czego używasz do swojego oprogramowania (opensource, freeware, shareware)? Jakie masz dotychczasowe doświadczenia? Co zaakceptowałbyś jako użytkownik? **Aktualizacja 28.12.2011:** Liczba instalacji wciąż rośnie dzięki InstallMonetizer: http://www.installmonetizer.com. Pakiet automatycznie sprawdza najlepsze dopasowanie pod względem lokalizacji geograficznej i przychodów. W przypadku niektórych aplikacji widzimy 1,00 USD za pobranie z USA! Obsługiwanych jest również wiele innych krajów. Aktualizacja wszystkich serwerów lustrzanych zajmie trochę więcej czasu. Będę was informować.


title: Jak wytłumaczyć laikowi rozbieżność w stawkach programistów?

text: Niedawno rozmawiałem z gościem, który szuka programistów do zbudowania pomysłu na produkt. Wspomniał, że otrzymał zainteresowanie od ludzi, ale stawki wahały się od 20 do 120 USD za godzinę. Szacuje, że ten projekt powinien zająć 3-6 miesięcy, a ponieważ nie jest techniczny, jest zdezorientowany, dlaczego może być tak duża wariancja. Rozumiem, jak wybrałbym kogoś, ale jestem programistą i potrafię ocenić pracę innych osób. Jak mam mu wytłumaczyć (w sposób bezstronny, jeśli to możliwe, bo ja też się zastosuję) o wariancji stawek? Czy jest jakaś dobra analogia, która by pomogła?


title: Jak mogę programować w większej liczbie języków przy mniejszej liczbie IDE?

text: Chciałbym skonfigurować komputer tak, aby móc programować w .net, C#, Java, ActionScript, JS/CSS oraz w językach funkcjonalnych, takich jak Scala czy Haskell. Jednak chcę to zrobić z jak najmniejszą liczbą w pełni funkcjonalnych środowisk IDE do nauki / programów zajmujących miejsce na dysku twardym na moim komputerze / uruchamiania wielu środowisk IDE jednocześnie. Jakich programów mogę użyć, aby zminimalizować liczbę w pełni funkcjonalnych środowisk IDE, których muszę się nauczyć/używać. (Na przykład, jeśli Eclipse może obsłużyć wszystkie te frameworki, byłaby to prawidłowa odpowiedź)


title: Co jest ważniejsze: rozwiązywanie czy wdrażanie?

text: Myślę, że jestem w stanie łatwo rozwiązać problemy z ołówkiem i papierem, ale wydaje mi się, że zaimplementowanie rozwiązania w kodzie zajmuje więcej czasu. Pomiędzy „rozwiązywaniem” a „wdrożeniem”, co jest ważniejsze w dziedzinie IT?


title: Jako nowicjusz, jak najlepiej przezwyciężyć złożoność większych projektów?

text: Obecnie jestem studentem i radzę sobie ze wszystkimi zadaniami, których realizacja wymaga maksymalnie 3-5 zajęć. Teraz chcę tworzyć programy na większą skalę, ale naprawdę trudno mi wymyślić, jak zaprojektować program z wyższego poziomu. Przykładem ze świata rzeczywistego, nad którym pracuję, jest projekt grupowy polegający na zbudowaniu czytnika RSS. Jak dotąd tak dobrze i mam bardzo prosty prototyp, który używa frameworka RSS plus kilka klas, które sam stworzyłem. Korzystając z prototypu jako przykładu i dokumentu wymagań (znacznie ponad 50 wymagań, jak na razie) muszę zbudować rzeczywisty program. Czuję, że znam wiele zasad, ale nie jestem pewien, jak je zastosować w różnych kontekstach, takich jak ten. Zastanawiam się, jak podzielić ten prosty czytnik RSS na wiele komponentów, klas itp. i jakie one powinny być. Naprawdę chciałbym wiedzieć, jak mogę/powinienem zająć się tym projektem. Chcę móc się cofnąć i zwizualizować różne części programu, więc mam pewną strukturę przed napisaniem jakiegokolwiek kodu. Dodatkowe uznanie, jeśli masz link do artykułu lub bloga, który faktycznie pokazuje, na przykład, jak możesz wziąć koncepcję i rozłożyć ją na wysokim poziomie. Rodzaj artykułu typu „od koncepcji do produkcji” zamiast po prostu abstrakcyjnych informacji dostępnych na stronach takich jak SourceMaking.


title: Jak zatwierdzić konwersję plików?

text: Powiedzmy, że zatwierdziłeś plik typu _foo_ w swoim ulubionym `vcs`: $ vcs add data.foo $ vcs commit -m "Moje dane" Po opublikowaniu zdajesz sobie sprawę, że istnieje lepszy format danych _bar_. Do konwersji możesz użyć jednego z poniższych rozwiązań: $ vcs mv data.foo data.bar $ vcs commit -m "Przygotowanie do użycia paska formatu" $ foo2bar --output data.bar data.bar $ vcs commit -m "Rzeczywiste foo konwersja do słupka” lub $ foo2bar --output data.foo data.foo $ vcs commit -m "Przekonwertowane dane na pasek formatu" $ vcs mv data.foo data.bar $ vcs commit -m "Zmieniono nazwę, aby dopasować do typu danych" lub $ foo2bar --output data.bar data.foo $ vcs rm data.foo $ vcs add data.bar $ vcs commit -m "Przekonwertowane dane do paska formatu" W pierwszych dwóch przypadkach konwersja nie jest operacją niepodzielną i _plik rozszerzenie "kłamie"_ w pierwszym zatwierdzeniu. W ostatnim przypadku konwersja nie zostanie wykryta jako operacja przeniesienia, więc o ile wiem, _trudno będzie prześledzić historię pliku_ w zatwierdzeniu. Chociaż instynktownie wolałbym to ostatnie rozwiązanie, nie mogę przestać myśleć, że śledzenie historii powinno mieć bardzo wysoki priorytet w kontroli wersji. Jaka jest najlepsza rzecz do zrobienia?


title: Cytat Torvaldsa o dobrym programiście

text: Przypadkowo natknąłem się na następujący cytat Linusa Torvaldsa: > „Źli programiści martwią się o kod. Dobrzy programiści martwią się o dane > struktury i ich relacje”. Myślałem o tym przez ostatnie kilka dni i nadal jestem zdezorientowany (co chyba nie jest dobrym znakiem), dlatego chciałem omówić następujące kwestie: * Jaka interpretacja jest możliwa/ma sens? * Co można z tego zastosować/nauczyć się?


title: Projekt kompilatora w Lisp

text: Przy odrobinie googlowania mogłem łatwo znaleźć dokumenty w projekcie kompilatora w C, Javie i C#, a nawet w Haskell, ale nie w Lispie, z wyjątkiem implementacji Scheme/Lisp w Lispie. Czy Lisp nie jest tak popularny we wdrażaniu innych (niefunkcjonalnych) języków programowania? Czy znasz jakąś dobrą dokumentację dotyczącą implementacji kompilatora w LISP-ie?


title: MVC: Jak zaimplementować widoki połączone?

text: Zajmuję się tworzeniem aplikacji Java do wizualizacji szeregów czasowych. Potrzebuję (co najmniej) trzech połączonych widoków, co oznacza, że interakcja z jednym z nich aktualizuje pozostałe. Widoki to: 1. Lista przedstawia dostępne i aktualnie wybrane szeregi czasowe. Wybrane szeregi czasowe są wykorzystywane jako dane wejściowe do kolejnych obliczeń. Zmiana wyboru powinna zaktualizować inne widoki. 2. Wykres liniowy wyświetla dostępne i wybrane szeregi czasowe. Serie czasowe powinny być dostępne do wyboru z tego miejsca, klikając je. 3. Wykres słupkowy przedstawia zagregowane dane w szeregach czasowych. Podczas powiększania okresu wykres liniowy powinien powiększać się do tego samego okresu (i na odwrót). Jak ładnie to zaimplementować z punktu widzenia inżynierii oprogramowania? Tj. Chciałbym napisać czytelny i łatwy w utrzymaniu kod wielokrotnego użytku. Więc pomyślałem o wzorcu MVC. Na początku spodobał mi się pomysł, aby trzy komponenty widoku obserwowały moją klasę modelu i odświeżały widoki po otrzymaniu powiadomienia. Ale potem wydawało się, że nie wypada przechowywać w modelu danych związanych z widokiem. Przechowywanie m.in. wybór szeregów czasowych lub poziom powiększenia wykresu w modelu ma wpływ na widok, którego nie chciałbym w modelu wielokrotnego użytku. Z drugiej strony, obserwowanie siebie przez kontrolerów skutkuje wieloma zależnościami. Dodając kolejny widok, musiałbym zarejestrować wszystkie inne widoki jako obserwatora nowego widoku i odwrotnie, przekazując wiele referencji i wprowadzając zależności. Może rozwiązaniem byłby inny „model” przechowujący tylko dane związane z widokami?


title: Czy powinienem zapytać/powiedzieć szefowi przed podjęciem pracy jako freelancer?

text: Obecnie pracuję jako praktykant w firmie konsultingowej. Niedługo po ukończeniu kolejnego semestru przejdę do pełnoetatowego pracownika i uwielbiam tam pracować. Jednak jako student brakuje mi pieniędzy i spotkałem właściciela firmy poza pracą, który zaproponował, że zatrudni mnie do samodzielnego tworzenia stron internetowych. Ponieważ spotkałem tę osobę poza pracą, uważam, że dla niego nie byłoby konfliktu interesów. Jednak praca, której oczekuje ode mnie, jest bardzo podobna do tej, którą już wykonuję dla mojego obecnego szefa. Czy powinienem porozmawiać z szefem przed rozważeniem oferty? **Edytuj** : Rozumiem, że nie mogę odebrać IP z pracy i nie mam umowy, jestem zatrudniony do woli.


title: Substytucja Liskov i naruszenie zasady SRP – jak najlepiej ustrukturyzować ten scenariusz?

text: Ucząc się SRP i LSP, staram się ulepszyć projekt mojego kodu, aby jak najlepiej spełniał obie te zasady. Mam klasę pracownika, która ma na sobie metodę obliczania płatności. Po pierwsze, uważam, że zgodnie z zasadami OOP SOLID, metoda generatePay() nie powinna być odpowiedzialnością pracowników. Powszechnymi obowiązkami pracowników byłyby wykonywanieDuties(), takeLunchBreak(), clockIn() i clockOut() itd. Czy mam rację myśląc w ten sposób? Dlatego uważam, że metoda obliczPay() powinna należeć do innej klasy. Ok, więc to moja niepewność SRP. Jadąc do LSP: mam podklasy, takie jak księgowi, sprzedawcy i dyrektorzy. To są wszyscy pracownicy, którzy otrzymują wynagrodzenie. Jak zmienić ten projekt, aby lepiej wspierać wolontariuszy? Wolontariusze nie otrzymują wynagrodzenia. public class Pracownik { private String name; wynagrodzenie prywatne; prywatny boolean topPerformer; prywatny int bonusAmount; public Employee(String name, int salary, boolean topPerformer, int bonusAmount) { // ustaw pola itd.. } // Ta metoda nie pasuje tutaj. public int kalkulacjaPay(){ if(topPerformer) zwraca wynagrodzenie+kwota bonusu; else{ zwrot wynagrodzenia; } } }


title: jak zainstalować biblioteki cross-kompilacji opencv na Raspberry

text: mój problem może być skomplikowany, postaram się szczegółowo opisać, że skompilowałem opencv dla ARM (raspberry pi) z mojego hosta i wszystko działa dobrze. Próbowałem też skompilować krzyżowo przykład i również zadziałało, dostałem plik wykonywalny. ale po przeniesieniu pliku wykonywalnego do maliny nie mogę go uruchomić i pojawia się następujący błąd: błąd podczas ładowania bibliotek współdzielonych: libopencv_core.so.3.0: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu. na moim hoście, w moim folderze budowania opencv, mam folder "install", w którym znajdują się cztery podfoldery: "bin", "share", "include", "lib". co mam zrobić z tym folderem? myślę, że muszę wykorzystać ich zawartość, ale nie wiem jak. gdzie i jak zainstalować krzyżowo skompilowane biblioteki w raspberry ?? jak mogę naprawić ten błąd? Z góry dziękuję


title: Przenoszenie mojej aplikacji ASP.NET MVC do Amazon AWS

text: Zbudowałem aplikację ASP.NET MVC, a teraz chcę ją przenieść do Amazon AWS z mojego serwera deweloperskiego. Moje pytanie brzmi: jak migrować aplikację ASP.NET do Amazon AWS? Oto, co do tej pory zbadałem/znalazłem: * Sesje nie działają między instancjami, więc muszę użyć DynamoDB lub memcached do przechowywania stanu. Przyjrzałem się różnym klientom, takim jak Enyim, jako możliwemu rozwiązaniu problemu ze stanem sesji przy użyciu Amazon ElastiCloud. * Amazon ma serwis internetowy dla e-maili SMTP. Muszę więc przerobić kod, który wysyła wiadomości SMTP do wysyłania przez Amazon SES, i przekierować przychodzące wiadomości e-mail na oddzielny serwer pocztowy, zmieniając rekordy DNS. * Dostępny jest pakiet SDK do zarządzania tożsamością użytkownika (Amazon IAM). Aby korzystać z tej usługi sieciowej, muszę zmienić kod uwierzytelniający. Być może jest więcej punktów, o których nie wiem. Jak więc przeprowadzić migrację aplikacji MVC do AWS?


title: Jak ustalić, co powinien otrzymać własny odpowiedni kontroler?

text: Używam wzorca MVC w mojej aplikacji sieci web zbudowanej z PHP. Zawsze staram się ustalić, czy potrzebuję nowego dedykowanego kontrolera dla zestawu akcji, czy też powinienem umieścić je wewnątrz już istniejącego kontrolera. Czy istnieją jakieś dobre zasady, których należy przestrzegać podczas tworzenia kontrolerów? Na przykład mogę mieć: `AuthenticationController` z akcjami: * `index()` do wyświetlenia formularza logowania. * `submit()` do obsługi przesyłania formularzy. * `logout()`, nie wymaga wyjaśnień. **LUB** `LoginController` z akcjami: * `index()` do wyświetlenia formularza logowania. * `submit()` do obsługi przesyłania formularzy. `LogoutController` z akcją: * `index()` do obsługi wylogowania. **LUB** `AccountController` z akcjami: * `loginGet()` aby wyświetlić formularz logowania. * `loginPost()` do obsługi przesyłania formularza logowania. * `logoutGet()` do obsługi wylogowania. * `registerGet()` aby wyświetlić formularz rejestracyjny. * `registerPost()` do obsługi przesyłania formularzy. Oraz wszelkie inne działania związane z kontem...


title: W jaki sposób witryny blogowe lub witryny zawierające treści podobne do prozy przechowują dane?

text: W jaki sposób witryny z blogami, witryny z pytaniami i odpowiedziami (lub inne witryny udostępniające treści podobne do prozy) przechowują swoje dane? To znaczy, w jaki sposób przechowujesz blogi i treści Q&A w bazie danych? Mam nadzieję, że przechowywanie tych ogromnych danych tekstowych w kolumnach tabeli RDBMS nie jest dobre.


title: Optymalny projekt bazy danych pod kątem funkcjonalności umożliwiającej użytkownikowi udostępnianie postów przez innych użytkowników

text: Chcę zaimplementować funkcjonalność, która pozwoli użytkownikom udostępniać posty innych użytkowników, podobnie jak przycisk udostępniania na Facebooku i Google+ oraz retweet na Twitterze. Są dwie możliwości: 1) Tworzę duplikat postu i mam kolumnę, która śledzi oryginalny identyfikator posta i jasno pokazuje, że jest to udostępniony post. 2) Mam osobny post udostępniony w tabeli, w którym zapisuję identyfikator postu, który jest kluczem obcym, aby opublikować identyfikator w tabeli postów. Mówiąc o programowaniu, w zasadzie trzymam wskaźnik do oryginalnego posta w osobnej tabeli, a gdy trzeba uzyskać posty opublikowane przez użytkownika, a także udostępnione, robię left join na poście i udostępnionej tabeli postów Post(post_id(PK), post_content, posted_by) SharedPost(post_id(FK do Post.post_id), sharing_user, sharedfrom(w przypadku, gdy ktoś udostępnia z profilu niebędącego właścicielem)) Jestem zwolennikiem drugiego wyboru, ale chciałem poznać porady ekspertów? Jeszcze jedno posty w mojej aplikacji internetowej będą bardziej na temat rozmiaru facebooka, a nie rozmiaru tweeta.


title: Czy tak działa Simplex Noise?

text: Zrobiłem teraz mnóstwo czytania na temat Simplex Noise i po wielu zamieszaniu i bólach głowy myślę, że jestem w stanie wyobrazić sobie, jak teraz działa Simplex Noise. Czy mam rację, ten szum simpleks (2D) jest po prostu siatką zbudowaną z sympleksów, w tym przypadku trójkątów, gdzie w każdym rogu trójkąta znajduje się wartość od 0 do 1. Kiedy zapytasz algorytm o punkt, przekonwertować współrzędne 2D na współrzędne siatki simpleks, interpolować szum, a następnie zwrócić rzeczywistą wartość?


title: Jak powoli udostępniać aplikację internetową coraz większej liczbie użytkowników, aby zbyt wielu jednoczesnych użytkowników nie powodowało awarii witryny?

text: Mam aplikację internetową, która, jak się spodziewam, szybko stanie się wirusowa. Jak mogę kontrolować ruch do niego, aby nie ulegał awarii przy zbyt dużym obciążeniu? Ta aplikacja nie wymaga logowania użytkownika. Będzie poprawnie testowany pod obciążeniem, ale nie jestem pewien, jakiego rodzaju ruchu się spodziewać, dopóki nie uruchomię go.


title: WPF4 Unleashed — jak działa konwertowanie elementów podrzędnych?

text: W rozdziale 2 książki **WPF4 Unleashed** autor pokazuje przykład, jak XAML przetwarza konwersję typów. Twierdzi, że <SolidColorBrush>White</SolidColorBrush> jest równoważny <SolidColorBrush Color="White"/> , ponieważ ciąg znaków można przekształcić w obiekt `SolidColorBrush`. Ale jak to wystarczy? Dla mnie to nie ma sensu. Skąd XAML wie, do której właściwości należy przypisać wartość `White`?


title: IL i rozróżnianie wielkości liter

text: Cytat z krótkiego wprowadzenia do kodu IL, CLR, CTS, CLS i JIT W .NET > CLS to skrót od Common Language Specifications. Jest to podzbiór CTS. CLS to > zestaw reguł lub wytycznych, których przestrzeganie zapewnia, że kod napisany w > jednym języku .NET może być używany przez inny język .NET. Na przykład jedna reguła > mówi, że nie możemy mieć funkcji składowych o tej samej nazwie z różnicą wielkości liter > tylko tzn. nie powinniśmy mieć funkcji add() i Add(). Może to działać w C#, ponieważ > rozróżnia wielkość liter, ale jeśli spróbujesz użyć tego kodu C# w VB.NET, nie jest to > możliwe, ponieważ VB.NET nie rozróżnia wielkości liter. W oparciu o powyższy tekst chcę potwierdzić tutaj dwa punkty: 1. Czy rozróżnianie wielkości liter IL jest warunkiem tylko dla funkcji składowych, a nie dla właściwości składowych? 2. Czy to prawda, że C# nie byłby interoperacyjny z VB.NET, gdyby nie dbał o rozróżnianie wielkości liter?


title: Obiektowy odpowiednik funkcji progn LISP-a?

text: Obecnie piszę parser LISP, który iteruje przez jakiś kod AutoLISP i robi co w jego mocy, aby uczynić go trochę łatwiejszym do odczytania (zmiana notacji przedrostkowej na notację infiksową, zmiana przypisań setq na przypisania „=" itd.) dla tych, którzy nie są nie jest używany do kodu LISP/tylko nauczył się programowania obiektowego. Podczas pisania poleceń, których LISP używa do dodania do "biblioteki" poleceń LISP, natknąłem się na polecenie LISP "progn". Jedynym problemem jest to, że wygląda na to, że progn po prostu wykonuje kod w określonej kolejności i czasami (nie zwykle) przypisuje ostatnią wartość do zmiennej. Czy nie mylę się, zakładając, że w celu przetłumaczenia progn na zrozumienie obiektowe mogę po prostu zrezygnować z funkcji progn i wydrukować zawarte w niej stwierdzenia? Jeśli nie, jaki byłby dobry odpowiednik programu progn w języku obiektowym?


title: Funkcja zliczania na strukturze drzewa (niebinarna)

text: Zajmuję się wdrażaniem struktury danych drzewa w c# na podstawie (głównie na implementacji Generic Dana Vanderbooma). Rozważam teraz podejście do obsługi własności Count, którego Dan nie implementuje. Oczywistym i łatwym sposobem byłoby użycie wywołania rekurencyjnego, które przemierza drzewo z radością dodając węzły (lub iteracyjne przemierzanie drzewa z kolejką i liczenie węzłów, jeśli wolisz). To po prostu wydaje się drogie. (Mogę też chcieć leniwie załadować niektóre z moich węzłów w dół drogi). Mógłbym prowadzić liczenie w węźle głównym. Wszystkie elementy potomne przechodzą do i/lub przechowują referencje do katalogu głównego i aktualizują wewnętrznie ustawianą właściwość count w przypadku zmian. To zepchnie problem iteracji do momentu, w którym będę chciał oderwać gałąź lub wyczyścić wszystkie dzieci poniżej danego węzła. Generalnie tańszy i stawia na podnoszenie ciężarów to, co myślę, będzie rzadziej nazywane funkcjami. Wydaje się, że to trochę brutalna siła, a to zwykle oznacza przypadki wyjątków, o których jeszcze nie pomyślałem, lub błędy, jeśli wolisz. Czy ktoś ma przykład implementacji, która utrzymuje licznik dla struktury _Unbalanced i/lub niebinarnego drzewa_ zamiast liczenia w locie? Nie martw się leniwym obciążeniem ani językiem. Jestem pewien, że mogę dostosować przykład do moich konkretnych potrzeb. **EDYCJA: Ciekawi mnie przykład, a nie instrukcje czy dyskusja. Wiem, że to nie jest trudne technicznie...**


title: Odpowiadanie użytkownikom końcowym o znalezionych błędach

text: Mam system śledzenia problemów, ale czasami użytkownicy zgłaszają błędy bezpośrednio do mnie w wiadomości e-mail. Jeśli odpowiadam na zgłoszenie błędu w wiadomości e-mail, jaka jest dobra etykieta? Czy dziękuję im za zgłoszenie błędu? Czy mam za to przeprosić ? Czy jest gdzieś dobry szablon?


title: Wiele plików w powershell

text: Jak korzystać z wielu plików w Powershell, aby zapewnić modułowość? function.ps1 może mieć wszystkie funkcje użytkowe? command1.ps1 może mieć wywołania związane z poleceniem?


title: Pytanie o wyśmiewanie zewnętrznych

text: w firmie rozwijamy dość duży projekt i kłócimy się o strategię testowania. Pytanie brzmi: czy wszystkie testy powinny być wykonywane w izolacji od usług zewnętrznych, takich jak baza danych czy API (facebook itp.), czy tylko część z nich? Oczywiście mam na myśli wykorzystanie makiet. Omówiliśmy następujące strategie: 1. Pisz wszystkie testy w izolacji od usług zewnętrznych - symuluj zewnętrzne wszędzie 2. Napisz część testów w izolacji i stwórz jeden większy test funkcjonalny dla każdej funkcji, która testuje ją przy użyciu zewnętrznych (bez wyśmiewania czegokolwiek) - za pomocą osprzętu 3. Uruchom wszystkie testy komunikujące się z zewnętrznymi (oczywiście nigdy nie ma to zastosowania do testów jednostkowych, więc w tym przypadku są poza zakresem) Wiem, że może to wywołać sporą dyskusję, ale myślę, że o to właśnie chodzi, ja” Chciałbym znaleźć plusy i minusy, o których jeszcze nie pomyślałem.


title: Dobre praktyki w zakresie rozwoju/dostarczania oprogramowania na dużą skalę

text: Jakie praktyki stosujesz podczas pracy z dużymi zespołami nad wieloma wersjami oprogramowania lub wieloma konkurencyjnymi projektami? Jakie są najlepsze praktyki, które można wykorzystać, aby najpierw wykonać właściwe rzeczy? Czy są dostępne informacje o tym, jak duże firmy IT rozwijają i zarządzają niektórymi ze swoich dużych projektów, m.in. takie rzeczy jak Oracle Database, WebSphere Application Server, Microsoft Windows, ....?


title: Zmodernizowana aplikacja

text: Jestem programistą z 3-letnim doświadczeniem. Zawsze chcę bawić się najnowszymi technologiami. Ale to nie jest praktyczne. Bo powiedzmy, stworzyłem aplikację internetową w .Net 3.5, teraz jest zrobiona w 30%. Po wydaniu .Net 4.0 zawsze myślę o .Net 4.0. Myślę, że w ten sposób wiele funkcji jest w nowej wersji, więc dlaczego nie miałbym ich zaimplementować w swojej aplikacji. Kiedy pracowałem z firmami IT, większość z nich koduje w bardzo starych wersjach, niektórzy używają VB.NET, C, nawet Classic ASP. Jakie więc mogą być punkty, które powinienem wziąć pod uwagę, jeśli zmienię aplikację?


title: Co to jest diagram kontekstu w SRS?

text: Uczę się pisać specyfikacje wymagań systemowych, a większość szablonów, które widziałem, mówi o diagramie kontekstowym. Czym dokładnie jest diagram kontekstowy?


title: Czy kod ze znakami wodnymi z losowymi końcowymi białymi znakami to dobry sposób na wykrycie plagiatu?

text: Rozważ to: int f(int x) { return 2 * x * x; } i to int squareAndDouble(int y) { return 2*y*y; } Jeśli znalazłeś je w niezależnych częściach kodu, możesz dać dwóm programistom korzyść z wątpliwości i założyć, że wymyślili mniej więcej tę samą funkcję niezależnie. Ale spójrz na spację na końcu każdego wiersza kodu. Ten sam wzór w obu. Na pewno dowód kopiowania. Na większym kawałku kodu korelacja losowych białych znaków na końcach linii byłaby niepodważalnym dowodem wspólnego pochodzenia. Teraz pomijając oczywiste słabości: m.in. widoczne lub oczywiste w niektórych edytorach, łatwe do usunięcia, zastanawiałem się, czy warto wdrożyć coś takiego w moim projekcie open source. Moja branża ma historię firm łudzących się projektami open source.


title: Pytanie dotyczące architektury

text: Piszę moduł dotyczący zasad/kwalifikowalności. Mam 2 zestawy danych, jeden to dane klienta, a drugi to dane o produktach klienta. Dane klienta do danych produktów klienta to jeden do wielu. Teraz muszę przejść przez zestaw reguł kwalifikowalności dla każdego z tych danych produktu Klienta. W przypadku danych produktów każdego klienta mogę powiedzieć, że klient kwalifikuje się do tego produktu lub odrzucić kwalifikację i powinien przejść do następnego rekordu produktu. Tak więc we wszystkich regułach muszę mieć dostęp do danych klienta i produktu klienta (konkretnego rekordu, względem którego reguły są wykonywane). Ponieważ wszystkie reguły mogą albo zatwierdzać produkt, albo odrzucać produkt, stworzyłem interfejs z tymi 2 metodami i implementuję ten interfejs dla wszystkich reguł. Dla wszystkich reguł przekazuję dane Klienta oraz dane jednego produktu (ponieważ reguły powinny być wykonywane na każdym wierszu danych produktu Klienta). Idealną sytuacją byłoby udostępnienie danych klienta i produktu klienta dla reguły zamiast przekazywania ich do każdej reguły. Jaki jest najlepszy sposób na zrobienie tego pod względem architektonicznym? Edycja: Oto co robię public class CustomerContract { public DateTime StartDate { get; ustawić; } public DateTime endDate { get; ustawić; } //Inne szczegóły dotyczące kontraktu } public class Klient { public int ID { get; ustawić; } ciąg publiczny Nazwa { get; ustawić; } stan ciągu publicznego { get; ustawić; } } public class CustomerInfo { public CustomerInfo(int CustomerID) { Customer = new Customer();// Pobierz klienta z bazy danych AppliedProducts = new List<CustomerProduct>();// Pobierz produkty klienta według customerID CurrentContract = new CustomerContract() ;//Pobierz kontrakt według IDKlienta, Stan odrzuceniaReasons = new List<int>();// tylko intailyzacja. kody odrzucenia są dodawane przez reguły. } public CustomerContract Aktualna Umowa { get; ustawić; } public IList<ProduktKlienta> AppliedProducts { get; ustawić; } public IList<int> odrzućPowody { get; ustawić; } public Klient Klient { get; ustawić; } } public class KlientProdukt { public dziesiętna KwotaOpłata { get; ustawić; } public int OdrzućReasonID { get; ustawić; } public int Produkt { get; ustawić; } publiczny dziesiętny RabatZastosowany { get; ustawić; } public dziesiętna Kwota Wycena { get; ustawić; } publiczny podatek dziesiętny { get; ustawić; } } public interface IRule { // Ponieważ musimy mieć dostęp do umów przy podejmowaniu decyzji o kwalifikowalności CustomerProduct ExecuteRule(CustomerProduct currentproduct, CustomerInfo customerInfo); //w przypadku odmowy, CustomerProduct DenyProduct(KlientProdukt bieżącyProdukt); } public class EligibityEngine { List<IRule> rules = new List<IRule>(); prywatna informacja o kliencie c; public EligibityEngine(int CustomerID) { c = new CustomerInfo(CustomerID); Zasady ładowania(); foreach (var customerProduct w c.AppliedProducts) { ExecuteRules(customerProduct); } } private void ExecuteRules(CustomerProduct bieżącyProdukt) { foreach (var reguła w regułach) { currentProductItem = rule.ExecuteRule(bieżącyProductItem, c); } } private void LoadRules() { // dodaj tutaj wszystkie typy IRule //rules.Add(); } } Realizując regułę, przekazuję dane produktu klienta oraz dane klienta. Muszę przekazać wynik wykonania jednej reguły drugiej. W powyższym wzorze, jeśli reguła zmieni dane w klasie customerInfo, nie jest ona zapisywana, chyba że zostanie przekazana jako ref. Moje pytanie brzmi: chcę, aby wszystkie reguły miały dostęp do tych danych bez ich przekazywania. Więc nie muszę się martwić o przechwycenie wyjścia reguły. Chcę, aby metoda executeRule została unieważniona.


title: Zobacz liczbę sprawdzań SVN w folderze

text: Mam bardzo duże repozytorium SVN (kopia robocza kilku GB), które właśnie osiągnęło swoje 20 000 checkin. Jako trochę ciekawą statystykę dla naszego zespołu (i częściowo uczcić nasze 20-tysięczne zameldowanie) chciałbym zrobić wykres pokazujący, które foldery w repozytorium miały najwięcej zameldowań. Czy jest na to sposób? Najczęściej używamy zintegrowanych klientów SVN w naszym IDE i Tortoise SVN, ale jestem skłonny zdobyć inne narzędzia do tej jednorazowej rzeczy.


title: Niezbędna infrastruktura dla dużych projektów z wieloma komponentami komunikującymi się przez IPC

text: Mam dość szczegółowe pytanie, na które prawdopodobnie nie ma dokładnej odpowiedzi. Jako inżynier oprogramowania zwykle mam za zadanie pracować nad programem lub projektem przy minimalnym zrozumieniu, w jaki sposób inne komponenty lub programy w projekcie współdziałają ze sobą. Kiedy jeden program ulegnie awarii w morzu wielu komponentów i procesów, jakie elementy infrastruktury są niezbędne, aby zapewnić dokładne śledzenie problemu w aplikacji, która narusza zasady? Dokładniej, jakie elementy infrastruktury powinny być niezbędne dla tego dużego projektu, a które są opcjonalne, ale bardzo pomocne. Jednym z takich przykładów, jaki mogę sobie wyobrazić, jest jakaś forma wspólnej infrastruktury rejestrowania, która pozwala programiście lub testerowi na łatwe przeglądanie dziennika zawierającego wiele komponentów dla wiadomości, które mogą nawiązywać do programu będącego winowajcą wraz ze „śladem” tego, co się stało przed wystąpieniem problemu. Myślę o czymś podobnym do narzędzia Androids alogcat. Te niezbędne elementy infrastruktury powinny być niezależne od języka. Chociaż te elementy powinny być zrozumiane przez wszystkich inżynierów w danym zespole, które elementy powinny być zrozumiane bardzo szczegółowo przez inżynierów systemów technicznych i za co poszczególni inżynierowie oprogramowania powinni być odpowiedzialni za dodanie ich do swoich narzędzi, aby umożliwić wykorzystanie takiej infrastruktury ? Jeśli coś nie ma sensu, możesz poprosić o wyjaśnienie, ponieważ rozumiem, że to pytanie jest bardzo szerokie i wymaga dopracowania. W razie potrzeby doprecyzuję otrzymane odpowiedzi i komentarze. Dzięki za wszelką pomoc! Aktualizacja: Wchodzę do zespołu, który ma może 5% kodu z testami jednostkowymi i dopiero zaczyna Instrument i Monitor. Każdy programista (mówię programista, a nie inżynier, ponieważ nie każdy w zespole jest inżynierem) nie rozumie podstaw natychmiastowego niepowodzenia i sprawdzania stanu zdrowia. Znaczna część naszego podstawowego oprogramowania to starszy kod, który jest w trakcie przenoszenia. Niestety nie mamy wystarczającej siły roboczej, aby dokonać refaktoryzacji wielu starszych komponentów. To właśnie skłoniło mnie do spróbowania zrozumienia, czy istnieją niezbędne narzędzia infrastrukturalne, które można wykorzystać do wykrywania i znajdowania błędów u źródła w znacznie szybszy sposób. Chociaż nie spodziewałem się, że narzędzie zrobi to w magiczny sposób, pomyślałem, że mogą istnieć narzędzia lub konfiguracje, które pozwolą łatwiej znaleźć błędy w morzu komponentów.


title: Główny/menedżer czy indywidualny współpracownik: co jest lepsze?

text: Obecnie pracuję w firmie jako manager (programista). Ale mam tylko 6,8 lat doświadczenia. Dołączyłem do tej firmy jako inżynier oprogramowania i awansowałem na stanowisko SSE, Lead i Manager. Niektórzy członkowie mojego zespołu mają lepsze doświadczenie niż ja i czuję, że potrzebuję więcej ekspozycji/doświadczenia, aby pełnić te role. Uważam, że lepiej być indywidualnym współpracownikiem i uczyć się wielu rzeczy przez kolejne kilka lat i zostać głównym inżynierem oprogramowania, niż angażować się w zarządzanie. Mam opcje: 1. Poproś mojego obecnego pracodawcę o przyznanie mi indywidualnego wkładu? 2. Znajdź nową firmę i dołącz jako SSE, aby zacząć od nowa? 3. Znaleźć nową firmę na stanowisko lidera? Proszę doradź.


title: Wydajny algorytm grupowania grafów

text: Szukam wydajnego algorytmu do znajdowania klastrów na dużym wykresie (ma około 5000 wierzchołków i 10000 krawędzi). Do tej pory używam algorytmu Girvan-Newmana zaimplementowanego w bibliotece Java JUNG, ale jest on dość wolny, gdy próbuję usunąć wiele krawędzi. Czy możesz mi zaproponować lepszą alternatywę dla dużych wykresów?


title: Czysta przeglądarka internetowa Java, czy to praktyczne?

text: Wiem, że przeglądarka internetowa Java jest możliwa, ale czy jest to praktyczne? Widziałem projekt Lobo i muszę przyznać, że jestem pod wrażeniem, ale z tego, co zebrałem, wydaje się, że rozwój zatrzymał się w 2009 roku. tych w szeregach Chrome lub Firefox, czy też byłby z natury wolniejszy, utrudniając użytkownikowi?


Jakie czynniki sprawiły, że Java odniosła sukces jako język programowania w komputerach korporacyjnych?


title: Jak możemy sprawić, że najlepsze praktyki tworzenia oprogramowania będą bardziej interesujące dla osób bez doświadczenia w zakresie oprogramowania?

text: Tam, gdzie pracuję, jest kilku doświadczonych programistów z doświadczeniem programistycznym, ale większość programistów to fizycy lub chemicy z doskonałą znajomością domeny, ale ograniczonym doświadczeniem, jeśli chodzi o tworzenie wysokiej jakości, łatwego w utrzymaniu oprogramowania. Aby temu zaradzić, rozpoczęliśmy regularne rozmowy i warsztaty. **Jak myślisz, jakie tematy powinniśmy omawiać, aby pomóc tym ludziom w zwiększeniu wydajności programistów?** W szczególności staramy się zdobyć entuzjazm dla tych prelekcji, ponieważ wielu programistów nie postrzega oprogramowania jako interesującego tematu. **Jak moglibyśmy uczynić je bardziej interesującymi dla osób bez oprogramowania?** Dzięki


title: Czy dobrym pomysłem jest scalanie wielu żądań HTTP w celu zaoszczędzenia przepustowości?

text: Przygotowuję aplikację jednostronicową, która czasami byłaby używana przez wolne połączenie mobilne. Niektóre z jego części są dość ciężkie pod względem żądań API (pobieranie dziesięciu różnych zasobów dla nowego wyświetlania ekranu). Teraz, czy to dobry pomysł, aby połączyć te usługi z jedną, która dostarcza wszystkie wymagane dane, ale nie jest tak „czysta” pod względem zasad REST? Czy można się spodziewać znaczącego wzrostu wydajności?


title: Implementacja prostego kontrolera we wbudowanym C

text: Czy istnieje znana metoda lub wzorzec do zaimplementowania prostego kontrolera dla projektu MVC w czystym C lub podejście do przypadku przełącznika jest standardem? **Tło :** Mam wbudowaną aplikację i jestem zadowolony z tego, jak wyszła logika biznesowa. Skończyłem również interfejs użytkownika, który sprowadza się do 2 funkcji: uint8_t getInput(void); void display(logger to Destination, char* message, ...) Wejścia mogą pochodzić z wielu źródeł, a wyjścia mogą być wysyłane do kilku miejsc docelowych. Wszystko to jest załatwione, więc aplikacja nie ma pojęcia, czy jest uruchamiana przez komputer na urządzeniu. Nie ma też pojęcia, czy zdarzenia pochodzą od ludzi, czy są sfałszowane przez testy jednostkowe. Zmagam się z logiką aplikacji. Moje poglądy decydują o tym, gdzie i jak wyświetlać wyniki. Moi kierowcy, przegrupowani w modele behawioralne o jasnych cechach, wiedzą _jak_ wykonywać swoją pracę bardzo dobrze, ale nie _kiedy_. Oto mój funkcjonalny wstępny projekt, który moim zdaniem narusza zasady takie jak DRY, spójność, elastyczność i może stwarzać problemy ze skalowalnością: **Rough draft :** (Sfałszowałem nazwy i zmniejszyłem rozmiar, ale masz pomysł) _menu.h_ void idźDoMenuGłównego(nieważne); // To jest punkt wejścia aplikacji po poprawnym skonfigurowaniu wszystkiego void goToFirstSubMenu(void); void firstFunkcjonalność(void); //Ostatnie poziomy to te, które wykonują wywołania logiki biznesowej void secondFunctionality(void); //Inna funkcjonalność lub zagnieżdżone podmenu void goToSecondSubMenu(void); nieważna trzecia funkcjonalność (nieważna); int zróbCośZLogikąBiznesu(int arg1, char arg2, void* arg3); //Inne podmenu i opcje /* I tak dalej, prototyp funkcji jest wcięty, aby odzwierciedlić logiczny poziom menu.*/ Wtedy większość funkcji będzie wyglądać mniej więcej tak: _menu.c_ void goToMainMenu(void) { wybór uint8_t = 0; resetDefaultState(); do { display(do Terminala, "Naciśnij 1, aby przejść do podmenu 1" ENDL); wyświetlacz (do Terminala, "Naciśnij 2, aby przejść do podmenu 2" ENDL); display(toTerminal, "Naciśnij 3, aby coś zrobić ze sterownikami" ENDL); display(toTerminal, "Naciśnij z, aby wrócić." ENDL); wybór = getChar(); /* Blokowanie wątku oczekującego na pojawienie się zdarzeń z innych wątków */ if (choice == '1'){ goToFirstSubMenu(); } else if(choice == '2'){ goToSecondSubMenu(); } else if(choice == '3'){ doCośZLogikąBiznesu(); } } while(wybór != 'z'); resetDefaultState(); /* Po powrocie podmenu jesteśmy przenoszeni do pętli do-while w menu nadrzędnym */ } * Czy jest to dobry sposób na robienie rzeczy dla małych i średnich systemów? * Jak można to ulepszyć, biorąc pod uwagę ograniczenia C i środowisk wbudowanych? **Co próbowano :** Wypróbowałem podejście n-argumentowe, w którym węzły to menu, a liście to funkcjonalność, ale bez polimorfizmu trudno jest elegancko zdefiniować, jak oba powinny zachowywać się względem danych wejściowych. System silnie typizowany również utrudnia wykonanie prostego systemu wywołań zwrotnych, ponieważ w końcu potrzebuję ton opakowań wokół sterowników, aby ujednolicić pojedynczy podpis wywołania zwrotnego (`void myCallback(void*)`). Wydaje się również, że jest to przesada w przypadku tego prostego przepływu stanów; Czuję, że pracuję przeciwko KISS i produktywności tylko dlatego, że zostałem wbity w „łańcuchy jeśli-jeszcze to diabeł”. **Co chciałbym :** W przypadku języków wyższego poziomu zazwyczaj można powiązać zdarzenia i wywołania zwrotne. Coś w stylu `bind(myMenu, thisInput, theCallback)` więc zawsze gdy `myMenu` jest skupione i zdarzenie `thisInput` które wywołało `theCallback` jest wywoływane. Nie jestem pewien, jak to zrobić w C bez przesadzania.


title: Jak wybrać framework

text: Ten cytat Joela Spolsky'ego przemówił do mnie: > Co jest lepsze, XUL, SWT Eclipse czy wxWindows? Nie wiem. To są wszystkie tak wielkie światy, że nie mogłem ich naprawdę ocenić i opowiedzieć. Nie wystarczy > przeczytać tutoriale. Musisz się z tym pocić i krwawić przez > rok lub dwa, zanim naprawdę się zorientujesz, że jest wystarczająco dobre... Niestety, > w większości projektów, musisz zdecydować, którego świata użyć, zanim będziesz mógł napisać > pierwszą linijkę tekstu. kod, który jest właśnie momentem, w którym masz > najmniej informacji. Jestem na tyle perfekcjonistą, że _nienawidzę_ myśli o wyborze frameworka do nowego projektu bez pełnej wiedzy o tym, jaki jest najlepszy wybór, ale faktem jest, że jak mówi Joel, nie ma (praktycznego) sposobu na posiadanie pełnej wiedzy jaki jest najlepszy wybór. W tej chwili próbuję wybrać ramy sieci web. W tej chwili, w oparciu o nasze platformy docelowe i moją ocenę różnych języków, wybrałbym Pythona zamiast Ruby, C# / ASP.NET lub Java / J2EE. Z dostępnych frameworków Pythona, w oparciu o to pytanie SO, wybrałbym Pylons zamiast Django. (Nasze zamierzone projekty są nieco wyspecjalizowane, nie związane z treścią, więc elastyczność Pylons brzmi lepiej niż obsługa CMS Django i wbudowany administrator. Nasz zespół ma stosunkowo niewielkie doświadczenie w żadnej z alternatyw, więc nie jest to istotny czynnik.) Ale Django jest znacznie bardziej popularne niż Pylons, a Ruby on Rails czy ASP.NET są znacznie bardziej popularne niż Django. Więc co mam wywnioskować? 1. Bardzo popularne wybory są bardziej popularne, ponieważ są znacznie lepsze, więc powinienem wybrać jeden z bardziej popularnych wyborów zamiast tego, co aktualnie planuję. 2. Bardzo popularne wybory niekoniecznie są dużo lepsze, ale większa popularność oznacza lepszą dokumentację, lepsze wsparcie społeczności, lepsze dodatki i łatwiejszy czas na znalezienie programistów z wcześniejszym doświadczeniem, więc powinienem wybrać jeden z bardziej popularnych wyborów zamiast co aktualnie planuję. 3. Każda z opcji byłaby dobra, więc powinienem wybrać to, co najlepiej pasuje do mojego docelowego projektu, nie podkreślając popularności.


title: Jak nazywasz funkcje/zmienne/itd., gdy nie możesz wymyślić dobrej nazwy?

text: Kiedy definiujesz funkcję/zmienną/itd. i nie jesteś pewien, jak ją nazwać, jak ją nazwać? Jak wymyślasz imię? Jeśli używasz imienia **_tymczasowego_** jako wizytówki, dopóki nie podasz jej prawdziwego imienia, jakiej tymczasowej nazwy używasz? * * * ### aktualizacja Używam takich rzeczy jak `WILL_NAME_LATER`, `NEEDS_NAME` lub `TO_BE_NAMED`. Miałem nadzieję, że istnieje przyjęta konwencja, w rzeczywistości miałem nadzieję, że jeśli użyję tej przyjętej konwencji, moje IDE podświetli nazwę, dopóki jej nie zmienię.


title: Czy mogę używać publicznie wspomnianych algorytmów do pisania programów?

text: Chcę napisać program, który rozwiąże sudoku. Znalazłem więc kilka algorytmów sudoku na Wikipedii. Czy mogę z nich korzystać, czy muszę opracować własny algorytm? Czy muszę prosić o zgodę konkretnego posiadacza licencji?.. Jeśli tak, jak mam się zająć uzyskaniem tego zezwolenia?


title: czynnik zaufania w przeglądzie kodu

text: Jak bardzo recenzent powinien ufać koderowi, który przesyła kod do recenzji? Zawsze mam dylemat, czy powinienem przetestować proponowane zmiany, czy też powinienem ufać zgłaszającemu, że będzie _wiedział_, co robi? Głównie dlatego, że w ostatecznym rozrachunku odpowiedzialność za nią również odpowiadają recenzenci. Recenzje kodu nie zawsze są zabawne.


title: Jaki jest odpowiednik „Efektywnej Java” Josha Blocha dla Objective-C/Cocoa?

text: Jestem nowicjuszem w Objective-C i Cocoa, ale dość doświadczonym programistą Java. Kiedy zaczynałem, czytanie Efektywnej Javy Josha Blocha sprawiło, że z dnia na dzień byłem o 20% lepszym programistą Java. Jak mówi przedmowa, większość książek językowych uczy składni i słownictwa, ale niewiele o użyciu idiomatycznym. **Nienawidzę** wiedzieć, że piszę coś w rodzaju "Wazon mojego wujka na kredensie mojej ciotki" w nowym języku. Jaki jest odpowiednik _Efektywnej Java_ dla Objective-C i Cocoa?


title: Wskazówki dotyczące algorytmu planowania zasobów Excel VBA?

text: Zostało to pierwotnie opublikowane na StackOverflow, ale sugerowano, aby zamiast tego opublikować je tutaj. Zamierzam stworzyć rozwiązanie Excel VBA, które będzie tworzyło rota/harmonogram przydzielania personelu do użytkowników usług za pomocą algorytmu. Uważam, że istnieją już nazwy dla tego rodzaju problemów/algorytmów, ale nie jestem do końca pewien, do czego się odwoływać. Oto mój scenariusz: Kolega zwrócił się do mnie z problemem umówienia personelu na wymagane wizyty. Obecnie jest to ręczny proces wykonywany co tydzień i jest pracochłonny. Zbiory danych są małe, średnio 20 użytkowników usług wymagałoby 2 wizyt dziennie z 5 pracownikami dostępnymi każdego dnia. Mam arkusz roboczy, który zawiera listę pracowników, którzy są dostępni na następny tydzień. Każdy wiersz danych zawiera imię i nazwisko, płeć, poziom umiejętności, kod pocztowy domu, dzień pracy, czas rozpoczęcia i czas zakończenia. Członek personelu może być wymieniony więcej niż raz w tym samym dniu, ponieważ może być dostępny przez wiele godzin rano, a także wieczorem. Kolejny arkusz zawiera listę usługobiorców i wizyt wymaganych na następny tydzień. Każdy wiersz danych zawiera ich imię i nazwisko, kod pocztowy, dzień wizyty, godzinę wizyty, czas trwania wizyty, wymaganą płeć (tj. musi być widywany przez mężczyznę/kobietę), wymagany poziom umiejętności (tj. dowolny, certyfikowany) oraz wymaganą liczbę pracowników na tę wizytę (tj. 1 lub 2). Ponownie użytkownik usługi może pojawić się więcej niż raz w tym samym dniu, ponieważ może wymagać wielu wizyt o różnych porach dnia (tj. rano i wieczorem) Stworzyłem już kilka funkcji VBA, aby poradzić sobie z obsługą kodów pocztowych i uzyskaniem szerokości/długości geograficznej -współrzędne wraz z funkcją obliczania odległości między dwoma punktami w linii prostej. Obecnie różne wartości kodów pocztowych ze współrzędnymi są przechowywane na arkuszu pomocniczym, aby VBA mógł się do niego odnieść. To, czego naprawdę szukam, to wskazówki, jak stworzyć procedurę/algorytm, który stworzy sugerowaną rotację/harmonogram, może to być prosta tabela z parami między personelem a wizytami. Proces musi zawsze tworzyć odpowiednie pary w oparciu o: * Wymagany poziom umiejętności * Wymaganą płeć * Dostępność personelu Najmniej ważne jest, aby w meczach brano pod uwagę odległość wymaganą do przebycia między wizytami. Uważam, że jest to określane jako algorytm genetyczny? Mogą zaistnieć przypadki, w których liczba odbiorców usług jest zbyt duża dla dostępnego personelu i odwrotnie. Korzystanie ze wszystkich pracowników nie jest konieczne, pod warunkiem, że wszystkie wizyty zostaną załatwione, jeśli wszystkie wizyty nie mogą zostać sparowane z powodu braku dostępności personelu, należy to odnotować jako niespełnione. W razie potrzeby mogę wykorzystać SQL Server, ale ostatecznie rozwiązanie musi zostać zaprezentowane użytkownikowi końcowemu w programie Excel, ponieważ jest to to, co jest mu najbardziej znane. Myślę, że procedura/proces musiałaby wyglądać mniej więcej tak: 1. Dla każdego dnia posortuj wizyty według czasu rozpoczęcia 2. Dla każdej wizyty określ, którzy członkowie personelu spełniają wymagania dotyczące płci i poziomu umiejętności i są dostępne w tym zakresie dzień 3. Czy dla każdego z pracowników określonych powyżej są oni dostępni we wskazanym czasie? 4. Dla każdego dostępnego członka personelu oblicz odległość od jego aktualnej lokalizacji do miejsca, w którym powinien być 5. Uporządkuj ich według preferencji według odległości wymaganej do przebycia 6. Po wykonaniu tej czynności dla każdego dnia wymyśl sugerowany przydział personelu do wizyt przy użyciu jakiejś metody punktacji Nie jestem ekspertem VBA i zajmuję się SQL Server jako moją codzienną pracą, ale jestem gotów spróbować znaleźć odpowiednie rozwiązanie, potrzebuję tylko wskazówek, jak najlepiej początek.


title: Doradztwo/podejście do destylowania jednolitego kodu i budowania wspólnego kodu dla zespołu

text: Pracuję dla stanu Kalifornia. Moim zdaniem nasz zespół programistyczny nie jest tak naprawdę „zespołem”, ponieważ zwykle pracujemy solo nad projektami przez cały cykl życia aplikacji/systemu. Efektem końcowym jest to, że wielu programistów „wymyśla koło na nowo”… pisze własne warstwy danych, mimo że zdecydowana większość z nas pracuje nad tą samą bazą danych Oracle… pisze własne zabezpieczenia… lista jest długa na. Nie mogę zmienić mentalności moich pracowników i nie mam realistycznych ambicji w zakresie zmiany procesu zespołowego... ale moim celem jest sprawienie, by nasz zespół pracował trochę więcej, przynajmniej w celu budowania wspólnego budynku elementy blokowe, które wszyscy możemy wykorzystać do funkcjonalności standardowej. Oczywiste korzyści są takie, że testowanie i wsparcie są znacznie łatwiejsze w utrzymaniu, gdy wszyscy nasi użytkownicy znają wspólny element, czas do produkcji jest krótszy, gdy nie piszesz tego samego repozytorium, które już zrobił ktoś inny, a my możemy skupić się na dostarczaniu lepszych rozwiązań do unikalnych problemów, które nasze aplikacje muszą rozwiązać... itd. Jestem pewien, że przemawiam do chóru. Sztuka polega na tym, że państwo nie lubi zmian, podobnie jak jego pracownicy. Menedżerowie często lekceważą nowe pomysły po prostu dlatego, że lubią unikać tarć i wolą kontynuować pracę bez zmian. Istnieją podobne pytania, ale ja szukam porady, w jaki sposób każdy z was mógł stanąć w obliczu podobnej sytuacji, i wszelkich wskazówek, aby uzyskać rodzaj wysiłku „oddolnego”, który ułatwi podejście do zarządzania. EDIT: Żeby wyjaśnić kilka rzeczy: * zakres, którego szukam, znajduje się w sklepie IT mojej agencji państwowej. Nie staram się koordynować w kilku działach. Zerwałem ludzi z kół treningowych, zanim poprosiłem ich o jazdę na motocyklach. * Bezpieczeństwo nie ma większego znaczenia, większość naszych aplikacji jest wewnętrznych i napisana w Windows Forms dystrybuowanych na Citrix (ugh.) i prawie wszystkie używają tych samych tabel korporacyjnych w Oracle... bardzo niewiele, jeśli jakieś aplikacje są "sklasyfikowane", więc mówić. nie powinno to utrudniać współpracy. * Posunąłem się nawet do skonfigurowania kanału NuGet, z kilkoma spakowanymi szablonowymi fragmentami kodu i napisałem kilka repozytoriów dla Oracle, wysłałem kilka e-maili, ale otrzymałem niewiele informacji zwrotnych. Około 1/3 naszego zespołu korzysta z ReSharper i od czasu do czasu wysyłam e-maile z poradami… znowu, nie za dużo opinii.


title: Zdezorientowany tworzeniem aplikacji warstwowych

text: Tak więc w przypadku pierwszego dużego projektu, za który dostaję zapłatę, zdecydowałem, że zrobię wszystko dobrze. W tym celu stworzyłem kilka projektów w moim Solution. Niektóre z tych projektów są ogólne i obsługują wspólne elementy, które można wykorzystać w dowolnym projekcie (takie jak rejestrowanie itp.), ale nie na tym skupiam się na moim pytaniu. Projekty, którymi się zajmuję w tym przypadku dotyczą głównie bazy danych i samej aplikacji internetowej, która będzie z niej korzystać. Mam więc projekt biblioteki klas Ortund.Objects i projekt biblioteki klas Ortund.DBContext. **Ortund.Objects** Ten projekt definiuje klasy, ustawienia właściwości i wartości domyślne, które tworzą bazę danych. Na przykład klasa Users definiuje właściwości, takie jak nazwa użytkownika, adres e-mail, hasło **Ortund.DBContext** Ten projekt używa Entity Framework i projektu Objects do budowania bazy danych. DbSets klas w projekcie Objects i różne inne składniki jawnie definiują strukturę bazy danych. Oczywiście, biorąc pod uwagę tę strukturę, miałbym projekt DBContext odwołujący się do projektu Objects. Oznacza to, że chociaż gdzieś w mojej głowie sensowne jest umieszczenie wszystkich moich metod i funkcji, których aplikacja internetowa będzie używać w projekcie Objects, w rzeczywistości nie byłbym w stanie nic zrobić, ponieważ nie będę miał DbContext. Odwołanie się do projektu DBContext spowodowałoby utworzenie odwołania cyklicznego. Tak więc, aby moja aplikacja mogła teraz współdziałać z bazą danych, jedyną opcją, jaką widzę, jest utworzenie czwartego projektu, który będzie działał jako warstwa danych, skutecznie stając się „pośrednikiem” między aplikacją internetową a pozostałymi 2 projektami . Kiedy zasugerowałem to na IRC, ktoś odpowiedział w następujący sposób: > Nie, warstwa aplikacji używa warstwy bazy danych, aby zapewnić trwałość warstwie > domeny. Nie rozumiem, co to znaczy. Czy ktoś może mi pomóc zrozumieć, jak najlepiej ustrukturyzować tę aplikację?


title: Co zaplanować przed rozpoczęciem prac nad projektem?

text: Powiedzmy, że otrzymałem specyfikację projektu od klienta i teraz czas zacząć go rozwijać. Zwykle po prostu zaczynam od pierwszego modułu (zwykle rejestracja użytkownika), a następnie przechodzę z jednego modułu do następnego. Planuję w głowie tylko tuż przed rozpoczęciem modułu, jak to będzie działać, ale wcześniej nie ma planowania. Myślę jednak, że byłoby lepiej, gdybym przejrzał specyfikacje i zaplanował, jak system będzie działał, zanim go zakoduję, np. jakie są główne komponenty, jak będą współdziałać itp. Po prostu nie wiem dokładnie, co mam zaplanować. Aby lepiej zorientować się, o co proszę, jak a) podzielić projekt na komponenty, b) zaplanować ich interakcje, np. zrobić diagramy klas, napisać testy jednostkowe itp.? Jakieś pomysły?


title: Czy projektowanie powinno trwać dłużej niż tworzenie kodu?

text: Kiedyś słyszałem, że jeśli spędzasz 90% swojego czasu na opracowywaniu projektu swojego programu, część kodowania zajmie tylko banalne 10% czasu. Odniosłem o wiele większy sukces w spędzaniu około 30% mojego czasu na projektowaniu architektury niż wtedy, gdy spędzałem 0% na projektowaniu. W rezultacie wydaje się, że moje programy unikają niepotrzebnego łączenia i są teraz bardziej elastyczne do zmiany przed jakąkolwiek refaktoryzacją. Zazwyczaj kończę fazę projektowania, gdy mam jasne wyobrażenie o tym, jak wszystkie obiekty powinny zostać nazwane (jestem naprawdę wybredny jeśli chodzi o nazywanie obiektów) i jaką odpowiedzialność będzie ponosił każdy z nich. Kiedy poczuję się pewnie w swoim projekcie i jestem gotowy do rozpoczęcia konstruowania oprogramowania, czy byłoby jakieś korzyści z poświęcenia więcej czasu na ponowne przemyślenie projektu? Mnie może się wydawać, że to przesada. Jaki jest efektywny stosunek czasu projektowania do czasu tworzenia kodu i czy czas projektowania powinien być dłuższy niż czas tworzenia kodu?


title: Ile czasu poświęcasz na projektowanie przed kodowaniem?

text: Z mojego doświadczenia wynika, że warto poświęcić trochę czasu na szkicowanie planów projektu przed zagłębieniem się w kod. Takie planowanie zwykle obejmuje wybór frameworków/narzędzi, pisanie wymagań i oczekiwań oraz robienie makiet. Zwykle robię to tylko w przypadku poważnych projektów, a nie jednorazowych lub krótkotrwałych prób. Chciałbym usłyszeć, ile czasu poświęcasz na planowanie/projektowanie projektów przed rozpoczęciem kodowania. Czy robisz to dla każdego projektu, czy tylko tych „poważnych”?


title: Proces tworzenia oprogramowania?

text: > **Możliwy duplikat:** > Co zaplanować przed rozpoczęciem tworzenia projektu? Zastanawiałem się, kiedy zaczynasz tworzyć oprogramowanie, jaki proces powinieneś ogólnie przejść, aby to zrobić? Mam na myśli to, że po tym, jak wpadniesz na pomysł, po prostu siadasz i zaczynasz bezpośrednio wysyłać kod, czy też jest jakiś proces planowania, który powinieneś najpierw przejść? (tj. schematy blokowe, diagramy itp.) Zastanawiam się, ponieważ właśnie wpadłem na pomysł i mam zamiar rozpocząć moją pierwszą „prawdziwą” aplikację, ale nie mam pojęcia, od czego zacząć. Co sugerujesz, jakie kroki należy podjąć, aby cykl rozwojowy przebiegał pomyślnie?


title: Ile projektu zrobić najpierw?

text: Nigdy nie pracowałem z profesjonalnym zespołem programistycznym. W związku z tym analizowanie i myślenie o każdym aspekcie mojego oprogramowania nie przychodzi mi naturalnie. Ilekroć wpadam na pomysł, który mnie ekscytuje, po prostu rozpoczynam nowy projekt w moim IDE (po ukończeniu poprzedniego) i zaczynam projektować interfejs — co oznacza dla mnie umieszczanie pasków menu, przycisków i innych komponentów w odpowiednich miejscach — i zaczynam kodowanie dla nich. Ostatnio zacząłem grać w szachy w Javie i podążałem za tym schematem: najpierw zaprogramowałem czarno-białą siatkę, potem zarejestrowałem słuchacza myszy itd., nie myśląc o wojownikach/obiektach gry w szachy. Jedną rzeczą, która mnie denerwuje, jest to, że nigdy nie byłem w stanie w pełni wykorzystać funkcji obiektowych programowania obiektowego, chociaż rozumiem to. Mam zwyczaj brać na siebie różne rzeczy, kiedy nadejdzie. To może być powód złego projektu, z którym kończę. Realizuję wszystkie projekty, które zaczynam, ale ponieważ są to projekty osobiste, nigdy nie czułem potrzeby refaktoryzacji kodu. Ale wiem, że gdybym poprosił o zmodyfikowanie dowolnej funkcji mojego programu, mógłbym być w bałaganie, ponieważ nie są one odpowiednio zaprojektowane (chociaż działają zgodnie z prośbą). Jaki jest poprawny/lepszy sposób na rozpoczęcie projektowania oprogramowania, które jest nieco skomplikowane jak gra w szachy?


title: Co powinno być pierwsze - funkcjonalność czy design?

text: Zacząłem czytać książkę z serii Head First o OOP i Designie. W pierwszym rozdziale jest napisane, że muszę się martwić o projekt mojej aplikacji zaraz po przygotowaniu podstawowej funkcjonalności. Gotowa podstawowa funkcjonalność oznacza, że masz coś do pokazania klientowi lub szefowi. Czy uważasz, że to właściwe podejście? Czy nie powinienem myśleć o projektowaniu od początku? Czy nie może się zdarzyć, że po przygotowaniu funkcjonalności nie będę miał czasu na wykonanie dobrego projektu, ponieważ będę miał do wdrożenia nowe wymagania o wysokim priorytecie? Przez „projekt” rozumiem projektowanie zorientowane obiektowo, a nie GUI czy coś takiego.


title: Rozpoczęcie projektu hobby

text: > **Możliwy duplikat:** > Co zaplanować przed rozpoczęciem tworzenia projektu? Przechodzę przez SE od dłuższego czasu, ale nie mogłem znaleźć odpowiedniej odpowiedzi na moje pytanie. Pytanie brzmi, że planuję w wolnym czasie stworzyć projekt hobby przy użyciu .NET i MVC3. Mam wszystko skonfigurowane na moim skrzynka. Ale największym problemem jest to, że nie wiem od czego zacząć Czy najpierw mam stworzyć dokumentację? Rozpocząć tworzenie szablonu internetowego? Jestem bardzo chętny, aby to rozpocząć, ale potrzebuję wskazówek. Daj mi znać, jeśli są jakieś pomysły.


title: Pięć lub mniej wskazówek, jak pisać dobry JavaScript?

text: JavaScript stał się oczywiście niezbędny; jednak wciąż jestem w tym nowy i stwierdziłem, że trudno jest zwalczyć wrażenie, że wydaje się taki bałagan i nie chcę się tym teraz zajmować. Jestem znacznie dalej w zrozumieniu innych języków niż w przypadku JavaScriptu, ponieważ wydaje mi się, że nie mogę pogodzić się z tym strachem. Mam wrażenie, że pisząc JavaScript próbuję namalować portret szczeniąt wyżeł weimarski. Zwykle pomaga mi pamiętać o kilku najważniejszych wskazówkach, które mogę zadać sobie przy każdym wykonywanym ruchu. (Moim zdaniem garstka to pięć lub mniej.) Czy możesz wymienić pięć (lub mniej) pytań dotyczących JavaScriptu, które powinienem zadać sobie przy każdym wykonywanym ruchu, gdy koduję JavaScript? Czym by one były? Aktualizacja: aby wyjaśnić, nie proszę o pięć rzeczy, o których należy pamiętać podczas nauki JavaScript; Proszę o pięć pytań, które zawsze zadaję sobie w przyszłości, które zawsze powinien zadać każdy. Pytania wysokiego poziomu, takie jak: „Czy prawdopodobnie powtórzę to gdzie indziej?” lub „czy ta nazwa zmiennej/funkcji jest wystarczająco konkretna (lub zbyt konkretna)” <== z wyjątkiem tych przykładowych pytań, które nie są specyficzne dla JavaScript. Szukam dyrektyw, które są specyficzne dla JavaScript.


title: Projekt przepływu pracy do wieloetapowej edycji w aplikacji internetowej

text: Mam aplikację internetową (ASP MVC2), w której można uzyskać dostęp do niektórych formularzy za pośrednictwem wielu tras, początkowo po ukończeniu formularza użytkownik został wyrzucony z powrotem do domyślnej strony tego formularza, a nie do strony, z której go weszli. Teraz przeprojektowuję sporych rozmiarów obszar, którym chcę się zająć, chcę rozwiązania, które jest łatwe do dodania. Mam kilka pomysłów, ale nie jestem pewien, z którym iść, wiem, że tego chcę być „niewidocznym” (tzn. nie dotykać moich adresów URL). Myślę więc albo: mógłbym mieć ukryte pola dla strony odsyłającej w formularzach. Alternatywnie mógłbym użyć TempData i mieć atrybut, który obsługuje sprawdzanie i dodawanie adresu URL strony odsyłającej (prawdopodobnie zawierałoby to ciąg znaków dla każdej z różnych ścieżek, aby użytkownik mógł mieć otwarte 2 różne formularze i nie przeszkadzać stronom odsyłającym). Problem z wartością formularza polega na tym, że wymagałoby to umieszczenia pól niezwiązanych z modelem w każdym z widoków i zepsułoby się, gdyby w przepływie pracy kiedykolwiek pojawiły się żądania GET. wymagałoby to również ręcznej obsługi tej właściwości w każdym widoku i akcji. Podejście TempData+atrybut byłoby znacznie lepszym sposobem na zastosowanie tego, ale użytkownicy zaawansowani, którzy robią wiele rzeczy naraz, mogą mieć sprzeczne odnośniki dla tych samych formularzy. Skłaniam się ku temu drugiemu podejściu, ponieważ jest bardziej eleganckie i łatwiejsze do śledzenia, ponieważ nie widzę wielu skrajnych przypadków, w których jest to pomijane, ale martwię się o wrażenia użytkownika, jeśli tak się stanie. Czy warto się wymieniać?


title: Dlaczego przeglądarki nie obsługują haml i sass?

text: Czas potrzebny na pobranie strony byłby znacznie skrócony, a parsowanie byłoby również łatwiejsze, jak sądzę. Dlaczego te języki nie są narzucane jako standard? Oczywiście są lepsze niż surowy html i CSS... Przeglądarki to jedyna rzecz, która trzyma nas z dala od wyeliminowania pośredniego kodu HTML/CSS.


title: Czy tworzenie iteratora, który jest świadomy własnego celu, to zła praktyka?

text: Dla pewnego tła, dlaczego zadaję to pytanie tutaj, jest przykład. W Pythonie metoda `chain` łączy ze sobą dowolną liczbę zakresów i łączy je w jeden bez tworzenia kopii. Oto link, jeśli go nie rozumiesz. Zdecydowałem, że zaimplementuję łańcuch w c++ używając szablonów variadic. O ile wiem, jedynym sposobem na utworzenie iteratora dla łańcucha, który pomyślnie przejdzie do następnego kontenera, jest poinformowanie każdego iteratora o końcu kontenera (pomyślałem o rodzaju hacka, gdzie, kiedy `!= ` woła się przed końcem, że będzie wiedział, aby przejść do następnego kontenera, ale pierwszy sposób wydawał się łatwiejszy i bezpieczniejszy i bardziej wszechstronny). Moje pytanie brzmi, czy jest coś z natury nie tak z iteratorem, który wie o swoim własnym końcu, mój kod jest w c++, ale może to być agnostyka językowa, ponieważ wiele języków ma iteratory. #ifndef CHAIN_HPP #define CHAIN_HPP #include przestrzeń nazw "iterator_range.hpp" iter { template <nazwatypu ... Kontenery> struct chain_iter; template <nazwa typu Kontener> struct chain_iter<Kontener> { private: using Iterator = decltype(((Container*)nullptr)->begin()); Początek iteratora; const Iterator end;//nigdy tak naprawdę nie był używany, ale utrzymywał go dla spójności publicznie: chain_iter(Kontener i kontener, bool is_end=false) : begin(container.begin()),end(container.end()) { if(is_end) początek = kontener.koniec(); } chain_iter & operator++() { ++początek; zwróć *to; } operator auto*()->decltype(*begin) { return *begin; } operator bool!=(const chain_iter & rhs) const{ return this->begin != rhs.begin; } }; template <typename Kontener, typename ... Kontenery> struct chain_iter<Container,Containers...> { private: using Iterator = decltype(((Container*)nullptr)->begin()); Początek iteratora; const Koniec iteratora; bool end_reached = false; chain_iter<Kontenery...> next_iter; public: chain_iter(Kontener i kontener, Kontenery& ... reszta, bool is_end=false) : begin(container.begin()), end(container.end()), next_iter(reszta...,is_end) { if( is_end) begin = container.end(); } chain_iter & operator++() { if (begin == end) { ++next_iter; } inny { ++rozpocznij; } return *to; } operator auto*()->decltype(*begin) { if (begin == end) { return *next_iter; } else { powrót *rozpocznij; } } operator bool !=(const chain_iter & rhs) const { if (begin == end) { return this->next_iter != rhs.next_iter; } else return this->begin != rhs.begin; } }; template <typename ... Kontenery> iterator_range<chain_iter<Kontenery...>> chain(Kontenery& ... kontenery) { auto begin = chain_iter<Kontenery...>(kontenery...); auto end = chain_iter<Kontenery...>(kontenery...,true); return iterator_range<chain_iter<Kontenery...>>(początek, koniec); } } #endif //CHAIN_HPP


title: Czy składnia ma znaczenie dla (Lispy) języka specyficznego dla domeny (MELT, wewnątrz GCC)?

text: Jestem głównym autorem i projektantem MELT, języka specyficznego dla domeny rozszerzającego GCC (Gnu Compiler Collection). Do implementacji dostępne jest bezpłatne oprogramowanie (na licencji GPLv3). Jeśli chcesz uzyskać szczegółowy opis, z punktu widzenia języka specyficznego dla domeny, przeczytaj mój artykuł DSL2011 na temat MELT. Wybrałem składnię Lispową dla _MELT_ , tak jak w Lispie lub w Scheme, każda operacja jest napisana z _"Wiele niesłychanych głupich nawiasów"_, więc zastosowanie funkcji `f` do argumentów `a` i `b` jest napisane `(f a b)` (tak jak w Scheme lub w Lisp). Oczywiście `(f)` -aplikacja funkcji bez argumentów- to nie to samo co `f` -prosta rzecz oznaczana przez zmienną-. _MELT_ współdzieli z wieloma innymi Lispami i Scheme zwykłe operatory "kontroli", takie jak `let if defun define cond lambda letrec list definstance` itd... _MELT_ nie używa wspólnych nazw dla podstawowych operacji (bez `car` lub ` +` w _MELT_ , który ma `pair_head` `list_first` `+i` `+iv` o różnych znaczeniach). A _MELT_ zajmuje się zarówno wartościami pierwszej klasy (jak w Scheme) i "rzeczami" (dla surowych danych GCC, takich jak _Gimple_ , szczegóły są w artykule DSL2011) Powody, dla których wybrałem składnię podobną do Lispa, obejmują: kiepski i chciał mieć szybką implementację. Parsowanie Lisp jest trywialne; * Umiałem (i potrafię) korzystać m.in. Emacs `lisp-mode` dla _MELT_ bez problemów. * Mała implementacja _MELT_ została oryginalnie stworzona w Common Lisp * Obecny translator _MELT_ jest załadowany, więc jest napisany w _MELT_ * Implementacja używa klasycznych trików Lisp: Wyrażenia S są rozszerzane przez mechanizm makr (w rodzaj wewnętrznego abstrakcyjnego drzewa składni), następnie znormalizowane i ostatecznie przetłumaczone na kod C. * GCC zawiera kilka formalizmów podobnych do Lisp (zwłaszcza dla zaplecza, dla plików "opisu maszyny"). * projekty GNU mają Emacs Lisp i Guile jako dialekty Lisp-podobne (nie byłem w stanie ich użyć z przyczyn technicznych opisanych w moim artykule DSL2011). Moje pytanie brzmi: _czy powinienem zaoferować alternatywną, podobną do wrostków składnię_ (trochę Pythona lub Lua-esque)? Z jednej strony obawiam się, że niektórzy ludzie (szczególnie młodzi, którzy nigdy nie spotkali się z żadnymi językami programowania podobnymi do Lispu; miałem kurs na Lisp w latach 80-tych) są całkowicie uczuleni na Lisp i nawet nie spróbują _MELT_, ponieważ jego wyglądu. Z drugiej strony, jedyne co mógłbym zrobić to jakiś prosty parser produkujący ten sam AST co _MELT_ ma dzisiaj, a składnia będzie ad-hoc (ale utrwalona) i prawdopodobnie nie będzie ładna. Ponadto praca nad alternatywną składnią, której nie będę używał, odciągnie mnie (lub zajmie trochę czasu) od innych wysiłków (pisanie dokumentacji i samouczka, robienie dobrych przykładów _MELT_ , debugowanie i ulepszanie implementacji). Niektóre młode osoby (w szczególności Jeremie Salvucci i Pierre Vittet) były w stanie uczyć się i kodować _MELT_ bez wcześniejszego kontaktu z _MELT_, dialektami Lispu (lub Schematu), a nawet kompilacją. Czy alternatywna składnia przyciągnęłaby ludzi uczulonych na Lisp? Miły facet powiedział mi, że składnia tak naprawdę nie ma znaczenia dla DSL. Można je zaadoptować, jeśli wniosą jakąś wartość, nawet przy niezbyt seksownej składni.


title: Gdy wywołanie modułu staje się brzydkie

text: Czy kiedykolwiek przytrafiło to się Tobie? Masz zestaw dobrze zaprojektowanych modułów z jedną odpowiedzialnością, objętych testami jednostkowymi. W każdej funkcji wyższego poziomu, którą kodujesz, (95% kodu) po prostu pobierasz dane wyjściowe z jednego modułu i przekazujesz je jako dane wejściowe do następnego. Następnie zauważasz, że ta funkcja wyższego poziomu zamieniła się w ponad 100-wierszowy skrypt z wieloma obowiązkami. Oto problem. Testowanie tego skryptu jest trudne (niemożliwe). Przynajmniej tak się wydaje. Czy sie zgadzasz? W moim obecnym projekcie wszystkie błędy pochodziły z tego skryptu. Dalsze szczegóły: każdy skrypt reprezentuje unikalne rozwiązanie lub algorytm utworzony przy użyciu różnych modułów na różne sposoby. Pytanie: jak możesz zaradzić tej sytuacji? Odruchowa odpowiedź: podziel skrypt na moduły z jedną odpowiedzialnością. Skomentuj odruchową odpowiedź: już jest! Najlepsza odpowiedź, jaką do tej pory wymyśliłem: tworzenie obiektów konektorów wyższego poziomu, które "połączą" ze sobą moduły w określony sposób (pobierają dane wyjściowe z jednego modułu i wprowadzają je jako dane wejściowe do innego modułu). Zatem jeśli nasz skrypt miał postać: Foo.Input fooIn = new Foo.Input(1, 2); Foo.Output fooOutput = fooModule.operate(fooIn); Double runtimevalue = getsomething(fooOutput.cokolwiek); Bar.Input barIn = new Bar.Input( runtimevalue, fooOutput.someOtherValue); Bar.Output barOut = barModule.operate(barIn); Stałoby się z łącznikiem: FooBarConnectionAlgo fooBarConnector = new fooBarConnector(fooModule, barModule); Foo.Input fooIn = nowe Foo.Input(1, 2); Bar.Output barOut = fooBarConnector.operate(fooIn); Zaletą jest to, że oprócz ukrywania kodu i wyjaśniania rzeczy, możemy przetestować FooBarConnectionAlgo. Jestem pewien, że ta sytuacja często się pojawia. Co robisz?


title: Czy używanie ELSE jest złe?

text: Często spotykam się z błędami spowodowanymi użyciem konstrukcji `ELSE`. Najlepszym przykładem jest coś w stylu: If (passwordCheck() == false){ displayMessage(); }else{ letThemIn(); } Dla mnie to krzyczy problem z bezpieczeństwem. Wiem, że passwordCheck jest prawdopodobnie wartością logiczną, ale nie umieszczałbym na nim zabezpieczeń moich aplikacji. Co by się stało, gdyby to był ciąg, int itp.? Zwykle staram się unikać używania `ELSE` i zamiast tego wybieram dwie całkowicie oddzielne instrukcje IF, aby przetestować to, czego oczekuję. Wszystko inne jest wtedy ignorowane LUB jest specjalnie obsługiwane. Z pewnością jest to lepszy sposób na zapobieganie błędom/problemom z bezpieczeństwem wchodzącym do Twojej aplikacji. Jak to robicie?


title: Jakie są wspólne kategorie tablic Kanban i Scrum JIRA?

text: Jeden minimalny system podobny do Kanbana ma trzy miejsca na karty: „Do zrobienia”, „W toku”, „Gotowe”. Jak widziałem w sieci Scrum i Kanban, może to być pięć lub sześć kategorii. Jakie są typowe opcje kategorii dla tablic Kanban i Scrum JIRA?


title: Standardy sieciowe czy unikanie ryzyka?

text: Moja firma tworzy aplikację App Engine. Aplikacja napotyka błąd (prawdopodobnie z powodu problemu z samym App Engine, zgodnie z naszymi badaniami) w IE9, ale nie można go wiarygodnie odtworzyć i doświadcza go niewielki odsetek użytkowników. Rozwiązaniem jest wymuszenie na IE9 korzystania z trybu IE8. Jako leniwy programista front-end (który nie lubi hacków CSS, podkładek i wypełniaczy) myślę, że można przynajmniej spróbować wrócić do trybu IE9 i zobaczyć, co się stanie, gdy wciąż jesteśmy w prywatnej wersji beta. Starszy inżynier (jest bardziej pragmatyczny) wolałby, abyśmy nadal zmuszali użytkowników IE9 do korzystania ze starszego trybu IE8. Kto ma rację?


title: HTML 4, XHTML i CSS 2 - Po jakim czasie są one przestarzałe?

text: Zająłem się programowaniem dokładnie rok temu. Teraz pozuję jako guru HTML, CSS i Javascript. html5 i css3 to nowe rzeczy, ale moim zdaniem nadal są eksperymentalne (niektóre nowe strony internetowe przypominają mi o tagu blink). Wiem, że HTML 4.x i xhtml były tam przez bardzo długi czas iw końcu stały się standardami. Ale nie było mnie w pobliżu, aby zobaczyć przejście od eksperymentalnych do surowych standardów. Więc moje pytanie brzmi, jak długo zajmie nam dotarcie tam z nowymi wersjami html, css i javascript. Większość kodu, który widzę, jest przystosowana do starszych przeglądarek i mogę śmiało powiedzieć, że łatwiej jest napisać kod javascript, który działa w ie5-8 niż pisać taki, który działa z i9 i ie5 (weźmy localStorage w tym przykładzie). Kiedy więc dojdziemy do tego poziomu, w którym jeśli chcesz mieć pewność, że kod działa prawie uniwersalnie, musisz upewnić się, że jest zgodny przynajmniej z HTML5 i CSS3.


title: Opcje refaktoryzacji - wiele metod w tej samej klasie lub w osobnych klasach

text: mamy pewne API, które zostanie wywołane przez klienta A, B, C lub D **Aktualny kod** doSomething(String client){ if (client.equals("A")){ ... } else if (klient .equals("B")){ ... } **Proponowana refaktoryzacja 1** rozdzielona na wiele metod i aby każdy klient wywoływał dedykowaną metodę, taką jak doSomethingForClientA() doSomethingForClientB() potrzebujemy tego, ponieważ wewnętrznie każda metoda wywoła inną prywatne metody zdefiniowane w tej samej klasie **Proponowana refaktoryzacja 2** Użyj wzorca strategii (lub szablonu) i podziel na wiele klas, aby klienci wywoływali wywołanie metody od klienta pozostaje doSomething() Które podejście jest lepsze na dłuższą metę? Czy istnieje jakiś wzorzec projektowy, który pomoże w przypadku opcji 1? czy trzecia opcja?