title: Zwinne tworzenie oprogramowania: Jak reagujesz *finansowo* na zmieniające się wymagania użytkowników?

text: Jest jedna rzecz, nad którą zawsze się zastanawiałem, kiedy czytałem o tym całym „zwinnym rozwoju” tutaj na SE i innych stronach: W „tradycyjnej” inżynierii oprogramowania, 1. zbierasz wymagania użytkownika, 2. piszesz specyfikację w oparciu o te wymagania, 3. przekazać klientowi i wystawić rachunek za wykonaną dotychczas pracę, 4. wykonać (zgrubny) projekt techniczny, aby można było oszacować koszty wdrożenia, 5. podać użytkownikowi wycenę za wdrożenie, 6 .poczekać na podpisanie specyfikacji przez klienta i zaakceptowanie oferty, 7.projektowanie, wdrażanie, testowanie, 8.rachunek. Jeśli w trakcie procesu zmienią się wymagania, wysyłasz ofertę (z ceną) na pożądane zmiany (lub robisz to za darmo, jeśli zmiana jest niewielka, podoba Ci się klient, a klient nie robi tego zbyt często) . Jak więc to działa (finansowo) w zwinnym projekcie, gdzie częste zmiany wymagań są częścią procesu? * Czy piszesz ofertę na każdą zmianę projektu? (Czy to nie byłby bałagan?) * A może negocjujesz stałą cenę i _masz nadzieję_, że klient nie zmienia zbyt często wymagań? (Może to być ryzykowne, znam klientów, którzy skorzystaliby z tej okazji, aby poprosić o nowe funkcje przez lata, zanim zaakceptują ukończenie projektu.) * A może po prostu wystawiasz klientowi rachunek za całkowity wymagany czas? (Może być ryzykowne dla klienta, który nie zna z góry kosztów.)


title: Projekt konstrukcji obiektu

text: Niedawno zacząłem używać c# do łączenia się z bazą danych i jedna część tego procesu wydawała mi się dziwna. Podczas tworzenia SqlCommand metoda, do której zostałem poprowadzony, miała postać: SqlCommand myCommand = new SqlCommand("Ciąg poleceń", myConnection); Pochodząc z tła Javy, spodziewałem się czegoś bardziej podobnego do SqlCommand myCommand = myConnection.createCommand("Ciąg poleceń"); Pytam, jeśli chodzi o design, jaka jest między nimi różnica? Wyrażenie „pojedyncza odpowiedzialność” zostało użyte, aby zasugerować, że połączenie nie powinno być odpowiedzialne za tworzenie SqlCommands, ale powiedziałbym również, że moim zdaniem różnica między nimi jest częściowo mentalna różnicy między wykonywanym połączeniem polecenie i polecenie działające na połączenie, z których to ostatnie wydaje się mniej podobne do tego, w co wierzyłem, że OOP powinno być. Część mnie zastanawia się również, czy te dwa elementy powinny być całkowicie oddzielone i powinny łączyć się ze sobą tylko za pomocą metody `connection.execute(command)`. Czy ktoś może pomóc wyjaśnić te różnice? Czy któraś z tych metod jest „bardziej poprawna” niż inne z punktu widzenia OO? (PS fakt, że używany jest c# jest całkowicie nieistotny. To tylko podkreśliło, że zastosowano różne podejścia)


title: OO Software Architecture - klasa bazowa, z której wszystko dziedziczy. Zły/dobry pomysł?

text: Przeglądam proponowaną architekturę oprogramowania OO, która wygląda tak: * `Base` * `Foo` * `Coś` * `Bar` * `CośElse` Gdzie `Base` jest klasą `statyczną`. Natychmiast pomyślałem, że każdy obiekt w dowolnej klasie odziedziczy wszystkie metody z `Base`, które utworzyłyby _duży_ obiekt. Czy może to spowodować problemy dla dużego systemu? Cała architektura jest hierarchiczna… „drzewo” jest znacznie większe niż to naprawdę. Czy tego rodzaju architektura ma nazwę (hierarchiczną?!). Jakie są znane plusy i minusy?


title: Jak odróżnić komentowany kod i komentarze dokumentacji

text: Po użyciu narzędzi do kontroli wersji nie ma już potrzeby komentowania starego kodu. Jednak niektórzy członkowie zespołu nadal komentują stary kod. Dlatego chcę je posprzątać. Chcę zaznaczyć skomentowane linie, które tak naprawdę są komentarzami/dokumentacją, aby za każdym razem nie musiałem ponownie czytać wszystkich skomentowanych regionów. Pozostawione nieoznaczone linie to nowy kod z komentarzem. Jak to osiągnąć? Jakieś istniejące narzędzia lub musisz pisać samodzielnie? Podobna koncepcja: w git mamy 'częściowe zatwierdzenie', aby wybrać kilka linii do zatwierdzenia. Jednak linie zaznaczone w 'częściowym zatwierdzeniu' są ważne tylko raz.


title: Ścieżka do nauki projektowania kompilatorów

text: Nie jestem pewien, czy jest to dopuszczalne pytanie, ale kompilator-os-design-od czego-zacząć był, więc pomyślałem, że spróbuję. Nie brałem udziału w formalnych zajęciach z informatyki. Programowałem w Pythonie i próbowałem C# bez powodzenia. Moje słownictwo techniczne jest obszerne, ale rozproszone w bardzo szerokim zakresie tematów informatycznych. Mam przed sobą bardzo długą drogę, zanim będę mógł dojść do poziomu, na którym mógłbym rozsądnie przeczytać książkę o projektowaniu/teorii kompilatora. **Pytam, jakie kroki muszę podjąć przed przystąpieniem do projektowania kompilatora.** Mam już kilka przykładów: * Architektura komputera * Binarny * Jak działa bootowanie/jądra/systemy operacyjne * Imperatyw vs. Comparative language design * „Gramatyki” przynajmniej to są przykłady tego, co widziałem. Edycja: nie mogę za życia zobaczyć, jak ten problem jest niejasny. Wyraźnie pogrubiłem to, o co prosiłem. Spodziewałem się, że zostanie to oznaczone jako stronnicze, niejasne/szerokie lub zbyt uogólnione, ale na pewno nie niejasne. Nie bój się powiedzieć, że jest to niekonstruktywne (po prostu upewnij się, że to, pod czym jest sklasyfikowane, jest dokładne).


title: Implementacja programowania funkcjonalnego w świecie rzeczywistym?

text: Staram się poznać różne rodzaje języków, aby zrozumieć obszary, w których każdy z nich jest wyjątkowo dobry. Do tej pory zajmowałem się C – językiem proceduralnym, C++ i java – statycznymi językami obiektowymi i groovy – dynamicznym językiem zorientowanym obiektowo. Każdy język programowania został prawdopodobnie uruchomiony w odpowiedzi na potrzebę. I zakładam, że każdy język jest wyjątkowo dobry przynajmniej w jednej rzeczy, dzięki której staje się standardem w określonej dziedzinie lub dziedzinie. Podobnie jak C, C++ stało się standardem w obszarach takich jak tworzenie przeglądarek lub gier. Python w świecie Linuksa ze względu na łatwość tworzenia skryptów, Java w świecie przedsiębiorstw itp. Teraz jestem zainteresowany nauką funkcjonalnego języka programowania, takiego jak Clojure lub Lisp. Więc gdzie są funkcjonalne języki programowania używane w rzeczywistych scenariuszach? Nie sądzę, aby można było używać Clojure lub Lisp do tworzenia aplikacji lub interfejsów użytkownika. Więc na jakie projekty powinienem się zaangażować po przejściu podstawowych samouczków i zasobów edukacyjnych, aby uzyskać krótkie zrozumienie implementacji programowania funkcjonalnego? A czy zdecydowanie polecasz w konkretnym języku, jak np. clojure?


title: Czy MVC jest teraz jedynym sposobem na pisanie PHP?

text: Hej... to wigilia Bożego Narodzenia i coś mnie niepokoi... tak, mam pracę na głowie, nawet gdy jestem na wakacjach. Ogromna ilość frameworków dostępnych dla PHP używa teraz MVC. Nawet ASP.net ma swój własny moduł MVC. Widzę atrakcyjność MVC, naprawdę potrafię i często z niego korzystam. Jedynym minusem, który widzę, jest to, że musisz uruchomić cały system, aby wykonać żądanie strony. W zależności od zadania może to być trochę marnotrawne. Więc pytanie. Czy w środowisku zawodowym jest to obecnie jedyny sposób na wykorzystanie PHP, czy też inne metody projektowania, które mają alternatywne korzyści?


title: Unikanie wartości null w kontrolerze

text: Próbuję przepracować, jak napisać ten kod. def get(params): """ Pobierz dane użytkownika lub 404 """ user = User.fetch_by_id(params['id']) jeśli nie user: abort(404) # Wyrenderuj jakiś szablon dla użytkownika... Jaki jest najlepszy sposób postępowania w przypadku niepowodzenia wyszukiwania? Jedna zasada mówi, że powinieneś unikać zwracania wartości null z funkcji. Prowadzi to do błędów i błędów AttributeErrors itp. w dalszej części pliku. Innym pomysłem jest wywołanie przez `fetch_by_id` błędu ValueError lub podobnego, jeśli nie istnieje użytkownik o takim identyfikatorze. Istnieje jednak ogólna zasada, że nie należy również używać wyjątków dla przepływu sterowania, co niewiele pomaga. Co można w tym przypadku zrobić lepiej?


DR-DOS, Plan, BSD, Sun Solaris, HP/UX, OpenServer... i tak dalej. Dlaczego zaawansowane technologicznie systemy operacyjne (takie jak rodzina UNIX) są w większości oparte na poleceniach (a nie na GUI)?


title: Dla programistów ASP.NET: Czy plik wykonywalny „dcpromo” ma jakieś znaczenie?

text: `Dcpromo.exe` jest znany wśród MCSE jako jedyny sposób na stworzenie kontrolera domeny Windows (innymi słowy domeny Active Directory)… który z kolei jest często używany przez system członkostwa ASP.NET. Próbuję ustalić, czy powinienem umieścić treść na „www.dcpromo.com” skierowaną do programistów lub bardziej do administratorów. Dla mnie logicznym rozszerzeniem tego "kontrolera domeny w Internecie" jest użycie WIF dla systemu członkostwa ASP.NET. Mielibyśmy wtedy witrynę internetową, która będzie służyć zainteresowaniom programistów w obszarach SSO, SAML, zarządzania użytkownikami i tożsamości, z którymi wszyscy się borykamy. Więc moje pytanie brzmi: **P:** Czy programiści widzą połączenie między narzędziem `dcpromo.exe` a członkostwem ASP.NET? Jeśli tak, to czy ma sens, aby http://www.dcpromo.com pomagać programistom w obszarach członkostwa i przetwarzania w chmurze?


title: Jak programiści pozostają zdrowi?

text: Bycie programistą to niezbyt zdrowy zawód - długie godziny siedzenia przed komputerem, a tuż nad boksem zbliżają się terminy. To odbija się na ciele i umyśle. Więc jakie masz wskazówki dla programistów, aby zachować zdrowie?


title: Jak budować konfigurowalne formularze?

text: Pracuję teraz nad dwoma osobnymi projektami, które są w zasadzie tylko systemami CMS - zbiorem formularzy do zapisywania różnych bitów informacji. Każdy projekt jest zbudowany, aby służyć wielu klientom, a każdy klient wydaje się chcieć rejestrować nieco inne informacje. W jednym projekcie poradziliśmy sobie z tym albo kopiując i wklejając całą logikę otaczającą ten formularz dla każdego klienta, abyśmy mogli wprowadzać zmiany bez wpływu na innych klientów, albo budujemy formularz główny zawierający wszystkie możliwe dane wejściowe, a następnie programowo usuwamy dane wejściowe, których klient nie chce (nasz framework pozwala nam usunąć dane wejściowe (zasadniczo z 'kontrolera') przed ostatecznym renderowaniem szablonu). Żadne z tych rozwiązań nie jest naprawdę czyste i powoduje, że formularze są wypełnione warunkami „jeśli” w zależności od tego, którego klienta obsługujemy. Drugi projekt, który dopiero zaczynam i nie chcę ponownie wpadać w te same pułapki, ale mam problem z wymyśleniem dobrego sposobu rozwiązania tego problemu. Mógłbym wyświetlić listę wszystkich identyfikatorów wejściowych dla każdego elementu formularza w bazie danych, a następnie utworzyć mapowanie między nimi a klientami, a następnie w moim szablonie formularza owinąć każdy renderowany widżet, sprawdzając, czy dane wejściowe są włączone dla bieżącego klienta . Na zapleczu – kiedy formularz jest przesyłany – mogłem zapisać tylko przesłane dane i w większości zrezygnować z warunków warunkowych. Tworzy to zależność od identyfikatorów użytych w szablonie, które muszą być zgodne z tymi zarejestrowanymi w bazie danych — nie chcę programowo tworzyć całego formularza, ponieważ nie dałoby mi to wystarczającej możliwości dostosowania. To najlepsze, co mogę wymyślić. Czy ktoś wcześniej miał do czynienia z tego rodzaju problemem? Jak do tego podszedłeś? Co zadziałało, a co nie? * * * Dla porównania możesz wziąć pod uwagę witryny takie jak Freshbooks, Trello, narzędzie do śledzenia błędów lub Facebook – jeśli którakolwiek z tych aplikacji pozwala każdemu użytkownikowi dostosować swoją stronę, dodając lub usuwając dane wejściowe, tak aby mogli rejestrować tylko rzeczy, na których im zależy – jak poradziłyby sobie z tą złożonością z architektonicznego punktu widzenia?


title: Railsy kontra Drupal

text: Pytałem Indeed.com/salary, aby zbadać ogólne trendy rynkowe. Porównując ruby na railach z drupalem, zauważysz znaczną różnicę między tymi dwoma. Nie jestem pewien, czy dane na Indeed.com są wiarygodne, czy nie, ale byłbym wdzięczny za Twoje komentarze, jeśli kiedykolwiek wypróbowałeś zarówno rails, jak i drupal. Właściwie jestem programistą .net rozważającym alternatywę dla moich umiejętności asp.net mvc i lubię uczyć się również umiejętności programowania stron internetowych innych niż Microsoft.


title: Jak mogę zarabiać na moim oprogramowaniu?

text: W ciągu ostatnich kilku miesięcy napisałem dobre oprogramowanie numeryczne w C# w .NET 4.0. Obecnie ma tylko wersje dla Windows XP/Vista/7/8/8.1, ale dzięki Mono/Xamarin nie byłoby trudno przenieść go na Linuxa, Mac OS, a nawet na urządzenia mobilne. Oprogramowanie ma kilka naprawdę fajnych funkcji programów takich jak Mathematica, Matlab, ale jest łatwiejsze i szybsze (i oczywiście nie tak duże). Ale nadal ma: prawdziwe i złożone wykresy dowolnej funkcji niestandardowej, obsługę większości funkcji specjalnych (bessel, gamma, mathieu itp.), język skryptowy z łatwymi obliczeniami macierzowymi, kalkulator naukowy, obliczenia numeryczne itp. Ma mniej błędów i więcej funkcji każdego dnia, ponieważ naprawdę uwielbiam nad tym pracować. Pracowałem nad tym oprogramowaniem głównie jako hobby, ale niewielu moich znajomych, którzy go testują, powiedziało mi, że jest naprawdę dobre, więc zacząłem się zastanawiać, jak mogę na nim zarobić (a może powinienem tego spróbować). Jeśli spróbuję opublikować to jako produkt komercyjny, co powinienem zrobić? Rozważam kilka opcji. 1. Zrób to za darmo i open source, wtedy nie zarobiłbym na tym żadnych pieniędzy, ale zyskałbym wielu użytkowników i popularność. To może być najlepsza opcja dla rozwoju mojego oprogramowania. Mimo to czuję, że kiedy będzie darmowy i open source, marnowałbym dużo czasu na pracę za darmo. 2. Zrób to freeware na komputerze, ale ładuj (lub umieszczaj w nim reklamy) na urządzeniach mobilnych. Brzmi rozsądnie, ale przeniesienie go na urządzenia mobilne zajęłoby dużo czasu, a ja potrzebowałbym dużo czasu na stworzenie wielu różnych wersji. 3. Stwórz oprogramowanie komercyjne. Byłoby fajnie, gdybym znalazł osoby, które będą chciały kupić moją aplikację, ale ma to wiele trudności. Nie mam tam żadnego doświadczenia, pojawiają się problemy: jak mam za to pobierać opłaty, zaciemnianie kodu, licencjonowanie kluczy itp. Wszelka pomoc byłaby tutaj mile widziana, jak to zrobić. 4. Coś jeszcze? Mam też inne pytania, m.in. co muszę zrobić na początku. Chyba muszę stworzyć stronę pomocy technicznej i zainstalować oprogramowanie do śledzenia błędów? Jakieś komponenty, które poleciłbyś do tego (obsługa strony internetowej + oprogramowanie do śledzenia błędów)?


title: Czy istnieje cel używania pull requestów we własnym repozytorium, jeśli jestem jedynym programistą?

text: Zacząłem więc od prawdziwego projektu na GitHubie i wszystko idzie całkiem dobrze, a pomysły płyną o wiele szybciej, niż początkowo sądziłem. Aby wszystko było zorganizowane, konfiguruję kilka oddziałów, abym mógł osobno rozwijać różne funkcje. Teraz, kiedy wypycham moją gałąź do GitHub, mam tę sekcję, w której mam dwa przyciski: `Pull Request` i `Compare` z nazwą gałęzi, do której ostatnio wypchnąłem. Rozumiem cel przycisku „Porównaj”, ale nie rozumiem, dlaczego miałbym chcieć utworzyć żądanie ściągnięcia w moim własnym repozytorium. Czy ktoś może mi wyjaśnić, dlaczego miałbym to zrobić? Czy warto tworzyć pull request we własnym repozytorium, jeśli jestem jedynym programistą?


title: Jaki jest standardowy termin dla mojej roli?

text: Zajmuję się pracą polegającą na pisaniu kodu i zarządzaniu programistami w dziale „projektów specjalnych” dużej firmy. Chciałbym lepiej zdefiniować swoją rolę i dowiedzieć się, czy istnieje standard branżowy określający to, co robię, aby łatwiej było mi badać najlepsze praktyki i pracować nad ścieżką kariery Co robię przez cały dzień: * Makro który łączy arkusz Excela z bazą danych Access działa zabawnie; Wzywają mnie, aby dowiedzieć się, co się dzieje i debugować. * Ktoś potrzebuje danych wyodrębnionych z wielu plików na Sharepoint. Wymyślam rozwiązanie po stronie klienta, ponieważ nie jestem upoważniony do robienia czegokolwiek po stronie serwera, a zmuszenie działu IT do zrobienia czegokolwiek zajęłoby kilka miesięcy i potrzebuję uzasadnienia biznesowego. * Menedżer chce nowego narzędzia do wprowadzania danych dla swojego zespołu. Rozmawiam z menedżerem i członkami zespołu w celu opracowania wymagań funkcjonalnych, a następnie projektuję/opracowuję/testuję aplikację. * Ktoś potrzebuje skryptu VBA, aby przetworzyć niektóre dane do prezentacji, która ma się ukazać za dwie godziny. Porzucam wszystko, co robię, aby zhakować szybki skrypt i przeprowadzić analizę, bez zbytniego testowania. * Zatrudniono programistę do zbudowania bazy danych dla jednego z zespołów, ponieważ pracuję nad zbyt wieloma różnymi rzeczami i nie mam czasu, aby zająć się tym projektem w wymaganym terminie. Kieruję jego pracą i popycham go do dotrzymania określonych terminów, przeprowadzam wywiady z interesariuszami, aby uzyskać więcej informacji, które pomogą mu wymyślić, jak zbudować niezbędne formularze i zmodyfikować wymagania funkcjonalne bazy danych, aby dopasować je do ram czasowych. * Ktoś chce załadować zestaw danych do systemu GIS i skonfigurować bieżące odświeżanie i raportowanie tego zestawu danych. Ułatwiam rozmowę między programistami GIS a właścicielami tego zbioru danych oraz projektuję aplikację demonstracyjną jako dowód koncepcji. To coś w rodzaju „wszechstronnego programowania i zarządzania IT”, ale oficjalnie nie jest to IT, ponieważ firma ma prawdziwy dział IT z rygorystycznie zdefiniowanym systemem składania wniosków, tworzenia kodu i zarządzania projektami. Wydaje mi się, że to, co robię, to bardziej praca majsterkowicza, w której wszystko spada na mnie, ponieważ jestem najbardziej geeki w pokoju. Czy w świecie oprogramowania istnieje standardowy termin na to, co robię?


title: Czy robię źle w mojej podróży do nauki programowania?

text: Cóż, zawsze lubiłem programować, ale nigdy nie byłem zaangażowany ani związany z żadnym prawdziwym projektem. Nauczyłem się trochę autoit, trochę c#, trochę html i css. Teraz zostałem zatrudniony **jako praktykant** jako programista przez firmę informatyczną i trudno mi zrozumieć całą sprawę. Używają mieszanki C#, T-SQL, html, php, javascript, ASP i wielu innych rzeczy. Brakuje mi całości. Mam do zrobienia programy w języku C#, które łączą bazy danych i synchronizują dane między nimi. Ale zawsze jest jakiś problem z tym _effin_ SQL. Używają studia zarządzania SQL do tworzenia swoich serwerów, a ten wadliwy „oprogramowanie” firmy Microsoft ma opcje 10212020, problemy, dynamikę i tak dalej. PRZYKŁAD: Zaznaczę pogrubieniem każdą technologię lub obiekt, który musiałem ze sobą połączyć lub Musiałem/Nie musiałem się ze sobą połączyć. Ale najbardziej frustrujące jest to, że nie wiem wystarczająco dużo. Każda technologia ma mnóstwo innych sposobów komunikowania się z innymi i konfiguracji, a oni oczekują, że będę o tym wiedział. Na przykład w zeszłym tygodniu oczekiwali, że będę wiedział, jak użyć **C#** do wykonania żądania internetowego **Http** do korzystania z usługi internetowej **wsdl** z **soap**, aby w odpowiedzi uzyskać długi **XML ** ciąg, który zawierał zamówienia złożone przez inną firmę. Następnie musiałem przeanalizować ten ciąg w **DataTables** i **Datasets** przy użyciu **LINQ**, ponieważ jest szybszy i „łatwiejszy” (NIE) niż **XmlReaders** z **Xpath**. Następnie musiałem wykonać **Procedury składowane** w **T-SQL**, aby opracować te rozkazy i uniknąć duplikatów po załadowaniu ich do **bazy danych** z różnymi **SqlCommand, SqlConnection, DataAdapters, Connection strings* * i tak dalej. I za każdym razem jest to coś takiego. Aby coś zrobić, musisz wiedzieć, jak korzystać z wielu technologii i zwariować, ponieważ muszą skonfigurować 1000 ustawień lub dostaniesz dziwny wyjątek (kodowanie, porównywanie ustawień, bla bla bla). Wydaje mi się, że jest za szeroki i za duży. Nie wiem, czy dam radę. Do dziś, dokumentując siebie, w jakiś sposób lub z pomocą współpracowników udało mi się wykonać tę pracę (i jestem im wdzięczna za nauczenie mnie). Ale po prostu za dużo trzeba wiedzieć. Projekt może stać się duży w ciągu kilku minut. W półtora miesiąca musiałem wymieszać to, co już wiedziałem, i uzyskać dokumentację dotyczącą: -specyfiki sprzętu -ustawień sprzętu -elementów sprzętowych wszelkiego rodzaju -wszelkiego rodzaju dziwne zachowania sql, najlepsze praktyki, dziwne ustawienia -C# dziwne zasady rzucania -C# **tysiące** obiektów, których musisz użyć, aby wykonać nawet najprostsze zadanie -html -Dziwne i mniej używane języki, takie jak język Zebra lub Arduino (który jest podobny do C) -Stare i nowe technologie, takie jak porty szeregowe, systemy MAC/linux (zawsze był na Windows), iOS 7 -Dobry sposób na interfejs różnych technologii (patrz przykład, który zrobiłem wcześniej, gdybym to był dla mnie, zrobiłbym to w zupełnie inny sposób...) i lista mogłaby się ciągnąć przez długi czas, bo po prostu za dużo musiałem się nauczyć. Czy programista musi to wszystko wiedzieć? Myślę, że to dla mnie po prostu za dużo lub jestem na to po prostu za głupi... Myślę o innej pracy, to staje się zbyt dużym stresem i wydaje mi się, że nigdy nie dostanę " cały projekt, co oznacza jasne wyobrażenie o tym, czego używam lub co robię. Co myślisz? Czy czułeś się tak samo? Czy powinienem iść dalej? Jest mi przykro i wstyd, że wielokrotnie musiałem polegać na kolegach z pracy lub szukać wszystkiego w Google...


title: Najlepsze praktyki dotyczące nieużywanych dziedziczonych funkcji wirtualnych (implementacja metod nadklasowych)

text: Załóżmy, że mam hierarchię kilku klas, z których każda wywodzi się od siebie za pomocą funkcji wirtualnych. Klasa bazowa działa jako interfejs i definiuje funkcje, które mogą nie być wymagane przez wszystkie klasy pochodne. Teraz zastanawiam się, jaka jest najlepsza praktyka dla takich funkcji pośrednich. Czy powinny one nadal być zaimplementowane i proste w łańcuchu do klasy bazowej, czy też powinny zostać pominięte? Problem, jaki mam, polega na tym, że implementacja takiej funkcji, gdy nie jest potrzebna, po prostu dodaje szum do kodu. Z drugiej strony, używając wyższej klasy, w C++ nie można po prostu wywołać metody nadklasowej (jak w Javie), więc trzeba wiedzieć, w której klasie bazowej ta metoda jest naprawdę zaimplementowana. Moim zdaniem naruszałoby to enkapsulację, ponieważ musiałbym znać pewne szczegóły implementacji klasy bazowej. Aby zilustrować to, co mam na myśli, jest sztuczny przykład: class MyInterface { virtual void foo(bool) = 0; wirtualny void foo1(int) = 0; }; class Base : public MyInterface { void foo(bool param) override { // zrób tutaj kilka rzeczy. } void foo1(int param) override { // zrób tutaj kilka rzeczy. } }; class A : Base { void foo(bool param) override { // zrób tutaj kilka rzeczy. Podstawa::foo(param); } // klasa nie potrzebuje tutaj foo1(), więc nie jest zaimplementowana. }; class B : A { void foo(bool param) override { // zrób tutaj kilka rzeczy. A::foo(param); } void foo1(int param) override { // Ta klasa wymaga foo1(), ale ponieważ A nie ma jej zaimplementowanej // Muszę o tym wiedzieć i pominąć A przechodząc bezpośrednio do Base Base::foo1(1); } }; Tutaj klasa `B` musi wiedzieć, że A nie implementuje `foo1` i musi ją pominąć. Oczywiście widać to w nagłówku, ale jeśli chcę później zmienić klasę `A`, nie powinno być konieczne dotykanie wszystkich innych klas, które się z niej wywodzą (zasada enkapsulacji i izolacji) Więc jeszcze gorzej, jeśli ja zaimplementuj teraz `foo1()` w `A` później, `B` nadal go pominie i nigdy nie zorientuje się, że funkcjonalność się zmieniła. Czyli z punktu widzenia modelu obiektowego założyłbym, że takie puste funkcje nadal powinny być projektowane w klasę?


title: Zdefiniuj programistę „Pośredni” (PHP)

text: Patrzę na rynek pracy (wyobrażam sobie, że wielu jest w tej chwili...) i chciałem zapytać, jaki jest ogólny konsensus co do poziomów umiejętności wymaganych dla "średniozaawansowanych" lub "młodszych" programistów (PHP). Na przykład, z jakimi zadaniami powinien sobie poradzić "średniozaawansowany" programista - i czego oczekiwałbyś od juniora?


title: Zmiana kariery z testowania na rozwój

text: Jestem Inżynierem Automatyki Testów, kiedy wszedłem do IT. aspirowałem do bycia programistą Java, ale jako nowicjusz nie miałem wyboru i zostałem wprowadzony do Test Automation. Jestem w Test Automation od 2 lat i chcę wiedzieć, czy mogę przejść na programowanie?


title: Strategia uwierzytelniania dla aplikacji mobilnej z aplikacją backend przy użyciu bcrypt

text: Mam aplikację zaplecza w node.js, która implementuje zarządzanie użytkownikami i używa bcrypt do obsługi hasła. Tak więc hasło jest przechowywane w jednym polu w formacie takim jak `<nagłówek><salt><hasowane hasło + sól>`. Ta część backendu nie może zostać zmieniona. Piszę kilka interfejsów API REST dla aplikacji mobilnych, aby (między innymi) uwierzytelnić użytkownika, ale uniemożliwiłbym przesłanie hasła w sposób jasny (chociaż przez połączenie SSL) z aplikacji mobilnej na serwer. Na początku zaprojektowałem proces, w którym klient żąda do serwera tokena uwierzytelniającego, który jest losowo generowany i przechowywany w bazie danych. Klient łączy token z hasłem (wprowadzonym przez użytkownika, a nie przechowywanym lokalnie) plus tajny klucz, haszuje to wszystko i wysyła do serwera wraz z tokenem uwierzytelniającym. Serwer generuje ten sam hash, porównuje go z tym uzyskanym od klienta itp. Problem w tym, że na serwerze hasło jest hashowane, więc to nie działa. Innym sposobem, o którym myślałem, jest zwrócenie przez serwer soli wraz z tokenem uwierzytelniającym, aby klient mógł ponownie wygenerować ten sam skrót, który jest przechowywany w bazie danych, połączyć go z tokenem uwierzytelniającym, ponownie zahaszować i odesłać do serwer. Czuję, że wysyłanie soli do klienta nie jest bezpieczne. Chciałbym wiedzieć, czy to dobra strategia, a jeśli nie, która z nich byłaby bardziej odpowiednia i bezpieczniejsza w tym przypadku? Przypominam, że nie mogę zmienić sposobu przechowywania i zarządzania hasłem po stronie serwera.


title: Niezmienny projekt z ORM: Jak zarządzane są sesje?

text: Gdybym miał stworzyć witrynę z mutowalnym językiem, takim jak C# i używać NHibernate, zwykle podchodzę do sesji z myślą o tym, aby tworzyć je tylko wtedy, gdy są potrzebne i usuwać na koniec żądania. Pomogło to w utrzymywaniu sesji dla wielu transakcji przez użytkownika, ale zapobiegało jej zbyt długiemu pozostawaniu otwartej, gdy stan może zostać uszkodzony. W niezmiennym systemie, takim jak F#, pomyślałbym, że nie powinienem tego robić, ponieważ zakłada, że pojedyncza sesja może być stale aktualizowana przez dowolną liczbę wstawek/aktualizacji/usuwań/ect... Nie jestem przeciwny „używaniu " rozwiązanie, ponieważ myślę, że łączenie połączeń pomoże obniżyć koszty łączenia za każdym razem, ale nie wiem, czy wszystkie systemy bazodanowe stosują łączenie połączeń. Wygląda na to, że powinien istnieć lepszy sposób, który nie narusza celu niezmienności. Czy powinienem po prostu wykonać prosty blok „używający” na transakcję, czy jest na to lepszy wzór?


title: Programowanie reaktywne a wzorzec MVVM do zarządzania aktualizacjami GUI

text: Programowanie reaktywne i MVVM to dwa podejścia, które mogą rozwiązać problem oddzielenia warstwy domeny od interfejsu użytkownika. * MVVM robi to, definiując model widoku, który jest strukturą danych mapowaną na komponenty interfejsu użytkownika. Interfejs użytkownika wyświetla dane i może je aktualizować, gdy wystąpi użytkownik. * framework reaktywny definiuje graf obserwabli, które informują interfejs użytkownika, że część danych uległa zmianie. w haskelu). Używałem głównie MVVM z kątowym i uważam, że stosunek prostoty do wyrazistości jest całkiem satysfakcjonujący, chociaż pracowałem z nim tylko przy małych/średnich projektach. **Co za reaktywny framework kupuje programistę, a czego nie mvvm?** **Czy naprawdę jest różnica?** Na przykład knockout.js jest reklamowany jako framework mvvm, ale ma reaktywny interfejs w swoim interfejsie: this.firstName = ko.observable("Jan"); this.lastName = ko.observable("Kowalski"); this.fullName = ko.computed(function() { return this.firstName() + " " + this.lastName(); }, this);


title: Nieistniejące klucze zwracające wartość null zamiast wyjątku

text: Odziedziczyłem projekt od innego dewelopera i jest on przepełniony następującym rodzajem błędu: echo $data['przykład']; Uwaga: Niezdefiniowany indeks: przykład Oczywiście zamierzam dokonać refaktoryzacji, aby sprawdzić istnienie klucza przed instrukcją print. Jednak moje pytanie nie dotyczy samego kodu. Czy istnieje wersja PHP, a może ustawienie w PHP, zgodnie z którym `echo $data['przykład'];` zwraca po prostu null lub 0 w przypadku nieistniejącego klucza? Pytam, ponieważ próbuję ustalić, czy poprzedni programista napisał zły kod, czy też jego środowisko programistyczne jest źle skonfigurowane. Jeśli to drugie, możemy oczywiście rozwiązać te problemy dla przyszłych projektów tego dewelopera.


title: Wyjątki lub kody błędów

text: Budujemy usługę sieciową (SOAP, .Net), która będzie komunikować się (głównie) z klientami natywnymi (windows, C++) i zastanawiamy się, jaki jest najlepszy sposób komunikowania błędów do klienta (np. SomethingBadHappened jak usługa logowania niedostępna lub coś takiego jak nie znaleziono użytkownika) i nie byliśmy w stanie zdecydować, czy zgłosić wyjątek do klienta, czy użyć jakiegoś modelu kodu błędu do wykonania powyższego. Co wolisz po stronie klienta: otrzymanie kodu błędu czy obsługa wyjątku ServerFault, który zawiera przyczynę błędu? 1) Dlaczego myślimy o wyjątkach: ponieważ spowodowałoby to ujednolicenie kodu po stronie serwera 2) Dlaczego myślimy o kodach błędów: Ponieważ _uważamy_, że ma to więcej sensu z perspektywy klienta. Jeśli 2) jest naprawdę prawdziwe, prawdopodobnie chcielibyśmy wybrać kody błędów niż wyjątki? Czy tak jest w tym przypadku? Czy odpowiedź uległaby zmianie, gdybyśmy rozmawiali z klientami zarządzanymi zamiast z klientami natywnymi?


title: Jak trudno jest zainstalować i konserwować produkt IBM Rational DOORS?

text: Chcę używać IBM Rational DOORS do tworzenia oprogramowania, ale prawdopodobnie musiałbym sam go zainstalować i konserwować. Ile wysiłku potrzeba? Czy jest to coś, co mogę łatwo wdrożyć na serwerze i od razu zacząć używać, czy też muszę zostać specjalistą IBM Rational, aby go prawidłowo wdrożyć? Innymi słowy, czy uruchamiam kilka programów instalacyjnych i "Voila, gotowe!" czy też muszę zainstalować i wykonać głęboką konfigurację na kilkunastu innych wymaganiach wstępnych dla przedsiębiorstw, zanim będę mógł uruchomić instalator DOORS?


title: Scons, make, jam, mrówki, autotools itp. i pliki projektów?

text: Chciałem poznać twoje myśli. Widzę systemy budowania, takie jak scons, make, jam, ant, autotools. Dlaczego istnieją? czy są one czymś w rodzaju międzyplatformowych „plików projektu”? Czy odpowiadają na inną potrzebę? dla mnie .NET ma prawie standardowy plik projektu (xbuild na mono może budować niektóre z moich projektów stworzonych przez msvc) Widziałem makefile w każdym katalogu i podkatalogu. Czy Twoim zdaniem jest to „niesłuszne”? Moje przeczucie mówi, że jeśli są to pliki „projektowe”, które pozwalają na przekazanie kilku parametrów dla kompletnej kompilacji, wszystko powinno znajdować się w jednym miejscu (nawet jeśli zawiera wiele plików). Co ważniejsze, dlaczego wszystkie te narzędzia istnieją?


title: Java czy Python do aplikacji internetowych?

text: Wybierając technologię dla aplikacji internetowych, w których liczba użytkowników może się skalować w czasie, należy wziąć pod uwagę: Java czy Python? Jakie są względy przy wyborze jednego, a nie drugiego? Jeśli szybkość i skalowalność są naszymi głównymi kryteriami, to którego powinniśmy użyć? Rozejrzeliśmy się i wydaje się, że istnieje więcej stron internetowych, które używają Pythona [tj. Quora, digg, reddit, bitbucket i disqus] niż Java. Czy na tej podstawie możemy powiedzieć, że Python jest bardziej odpowiedni dla aplikacji internetowych, w których głównym kryterium jest szybkość i skalowalność? Jednak przeszukaliśmy i znaleźliśmy kilka komentarzy mówiących, że Java jest w rzeczywistości szybsza niż Python. Dziękuję za twoje spostrzeżenia.


title: Najlepsze praktyki w zakresie przekazywania starszego kodu

text: Za kilka miesięcy kolega przejdzie do nowego projektu, a ja odziedziczę jeden z jego projektów. Aby się przygotować, zamówiłem już książkę Michaela Feathersa _Working Effectively with Legacy Code_. Ale te książki, a także większość pytań dotyczących starszego kodu, które znalazłem do tej pory, dotyczą przypadku dziedziczenia kodu w stanie, w jakim jest. Ale w tym przypadku faktycznie mam dostęp do oryginalnego programisty i mamy trochę czasu na uporządkowane przekazanie. Trochę tła na temat fragmentu kodu, który będę dziedziczył: * **Działa:** Nie ma żadnych znanych błędów, ale ponieważ wymagania wydajnościowe wciąż rosną, niektóre optymalizacje będą konieczne w niedalekiej przyszłości. * **Nieudokumentowane:** Nie ma prawie żadnej dokumentacji na poziomie metody i klasy. Jednak to, co kod ma robić na wyższym poziomie, jest dobrze rozumiane, ponieważ od lat piszę przeciwko jego API (jako czarna skrzynka). * **Tylko testy integracyjne wyższego poziomu:** Istnieją tylko testy integracyjne testujące poprawną interakcję z innymi komponentami za pośrednictwem API (znowu black-box). * **Bardzo niskopoziomowy, zoptymalizowany pod kątem szybkości:** Ponieważ ten kod jest kluczowy dla całego systemu aplikacji, wiele z nich zostało zoptymalizowanych kilka razy na przestrzeni lat i jest bardzo niskopoziomowych (jedna część ma swoją własną menedżera pamięci dla niektórych struktur/rekordów). * **Współczesne i wolne od blokad:** Chociaż dobrze znam programowanie współbieżne i wolne od blokad i faktycznie wniosłem kilka elementów do tego kodu, dodaje to kolejną warstwę złożoności. * **Duża baza kodu:** Ten konkretny projekt ma ponad dziesięć tysięcy linijek kodu, więc nie ma mowy, żebym mógł mi wszystko wyjaśnić. * **Napisane w Delphi:** Zamierzam to opublikować, chociaż nie wierzę, że język ma związek z pytaniem, ponieważ uważam, że ten rodzaj problemu jest agnostyczny językowo. Zastanawiałem się, jak najlepiej spędzić czas do jego odejścia. Oto kilka pomysłów: * **Zdobądź wszystko do zbudowania na moim komputerze:** Mimo że wszystko powinno być sprawdzone pod kontrolą kodu źródłowego, kto nie zapomniał od czasu do czasu zaewidencjonować pliku, więc prawdopodobnie powinno to być pierwszym porządkiem biznesu. * **Więcej testów:** Chociaż chciałbym więcej testów jednostkowych na poziomie klasy, aby kiedy będę wprowadzał zmiany, wszelkie wprowadzane przeze mnie błędy mogły zostać wyłapane wcześnie, kod w obecnej postaci nie jest testowalny (ogromne klasy, długie metody, zbyt wiele wzajemnych zależności). * **Co dokumentować:** Myślę, że na początek najlepiej byłoby skoncentrować dokumentację na tych obszarach kodu, które w innym przypadku byłyby trudne do zrozumienia, np. ze względu na ich niskopoziomowy/wysoce zoptymalizowany charakter. Obawiam się, że jest tam kilka rzeczy, które mogą wyglądać brzydko i wymagają refaktoryzacji/przepisania, ale w rzeczywistości są to optymalizacje, które pojawiły się tam z dobrego powodu, za którym mógłbym przegapić (por. Joel Spolsky, _Things You Should Nigdy nie rób, część I_ ) * **Jak dokumentować:** Myślę, że najlepsze byłyby diagramy klas architektury i diagramy sekwencji funkcji krytycznych z domieszką prozy. * **Kogo dokumentować:** Zastanawiałem się, co byłoby lepsze, żeby on napisał dokumentację lub żeby mi to wyjaśnił, żebym mógł napisać dokumentację. Obawiam się, że rzeczy, które są dla niego oczywiste, ale nie dla mnie, nie zostałyby odpowiednio ujęte. * **Refaktoryzacja za pomocą programowania w parach:** Może to nie być możliwe ze względu na ograniczenia czasowe, ale może mógłbym zrefaktoryzować część jego kodu, aby był łatwiejszy w utrzymaniu, gdy był jeszcze w pobliżu, aby dostarczyć dane wejściowe dotyczące tego, dlaczego rzeczy są sposób, w jaki są. Proszę skomentować i dodać do tego. Ponieważ nie ma wystarczająco dużo czasu, aby to wszystko zrobić, szczególnie interesuje mnie, jak określisz priorytety. _Aktualizacja:_ Po zakończeniu projektu przekazania rozszerzyłem tę listę o moje własne doświadczenia w poniższej odpowiedzi.


title: Projektowanie obszaru administracyjnego w moim CMS

text: Próbuję stworzyć mały CMS z ASP.NET MVC3, ale pomyliłem się w projektowaniu sekcji administratora. Postanowiłem stworzyć dwa obszary, jeden dla użytkowników, a drugi dla administratora. W moim CMS mam obiekt `Post` i `News` i chcę umieścić funkcje tworzenia/edycji/usuwania w obszarze administracyjnym oraz inne funkcje związane z użytkownikami w obszarze użytkownika, aby osiągnąć funkcjonalność w moim CMS. Na przykład mam dwa kontrolery `NewsController`, jeden w obszarze administracyjnym (włącznie z funkcjami tworzenia/edycji/usuwania) i drugi w obszarze użytkownika (w tym funkcja `preview(id)`). Czy ten projekt jest dobry? Jak mogę to poprawić?


title: Chciałbym poprawić się w pisaniu zorientowanych na cel historyjek/funkcji użytkownika

text: Chciałbym poprawić moje umiejętności pisania historyjek użytkownika, więc potrzebuję twojego doświadczenia i wskazówek. Myślę, że każdą _zmienną_ część historyjki użytkownika można poprawić, stosując się do pewnych wskazówek. ## 1\. Najłatwiejszą częścią może być zdefiniowanie możliwych ról. Jedynym problemem jest to, że historyjki użytkownika zazwyczaj opisują tylko funkcje funkcjonalne, które wymagają rozwoju. * **Czy piszesz niefunkcjonalne historie?** I nie myślę o opowiadaniach technicznych, które są związane z innymi aspektami planowania produktu, takimi jak sprawy administracyjne. Bardziej myślę o dodatkowych historiach wspierających, które wspierają ten sam cel wysokiego poziomu. Lubisz artykuły reklamowe, które są powiązane z funkcjami? ## 2\. Funkcje definiowania funkcji wydają się łatwe, ale okazuje się, że tak nie jest. Ponieważ widzę historie, które są mocno powiązane, więc niektóre role nie mogą zostać rozwinięte, dopóki inne nie zostaną skończone. Przykład: Rejestracja użytkownika to filarowa historyjka użytkownika, którą należy wykonać najpierw w celu opracowania innych historyjek użytkownika związanych z rolami zarejestrowanych użytkowników (zalogowani użytkownicy i/lub administratorzy itp.). To jest bardzo oczywiste, ale czasami relacje są znacznie bardziej subtelne. * **Jak uniknąć powiązań między historyjkami użytkowników?** Czy istnieje technika rozdzielania powiązanych historii w celu uzyskania lepszego paralelizmu w rozwoju? Zerwanie relacji pomaga również w lepszych cyklach sprintów, ponieważ jedna historia nie może zatrzymać całego sprintu. ## 3\. Korzyści To jest najtrudniejsza część, o której myślę, że mam najmniej wiedzy, jak pisać dobre historyjki użytkowników z wyraźnymi korzyściami. * **Czy rzeczywiście piszesz korzyści dla każdej historii, czy raczej zamiast tego podajesz cele na wysokim poziomie?** Podanie ich zamiast korzyści ułatwia zrozumienie, dlaczego jedna historyjka użytkownika jest ważniejsza od drugiej? Pomaga więc w ustalaniu priorytetów. * **Czy mądrze jest mieć wspólne korzyści/cele między zestawami historyjek użytkowników?** * **Czy piszesz historyjki użytkowników bez części korzyści?** Czy to mądre i co robisz w zamian? * **Czy piszesz korzyści w taki sposób, aby były mierzalne?** Czy możemy to zrobić i czy jest to korzystne? ## 4\. Historie użytkowników jako całość * **Czy kiedykolwiek zdefiniowałeś wszystkie historyjki użytkowników jako epickie?** Pomoże to odfiltrować/ustawić priorytety tych, które dają więcej wspólnego celu. Następnie podziel je na łatwe do strawienia porcje lub historie użytkowników według poszczególnych funkcji. * **Jakie dodatkowe metadane dodajesz do historyjek użytkownika?** Mówimy też o grupowaniu historyjek użytkownika według wyższej funkcji lub celu...


title: Niestandardowa tabela referencyjna domeny lub atrybutu, czy oba?

text: Projektuję swoją pierwszą prawdziwą bazę danych i rozważam zalety i wady tego, jak wymusić jednolitość moich danych. Moją pierwszą opcją jest utworzenie niestandardowej domeny i zaprogramowanie mojego interfejsu użytkownika tak, aby zezwalał tylko na określone opcje. Moją drugą opcją jest utworzenie „tabeli odniesienia atrybutów”, która będzie przechowywać dozwolone wartości. Mój interfejs użytkownika może przeszukiwać tę tabelę pod kątem dozwolonych wartości i wyświetlać je w rozwijanym polu. Lub mógłbym zrobić oba. Moje przemyślenia na temat pierwszego są takie, że trudniej byłoby utrzymać interfejs użytkownika. Jeśli domena miałaby się zmienić, musiałbym zmienić interfejs użytkownika (chyba że istnieje sposób na zapytanie domeny o wartości?). Nie wiem, czy istnieje, ale myślę, że to przetworzy i zwróci wyniki szybciej niż konieczność zapytania o drugą tabelę. Tabela atrybutów wydaje się korzystna, ponieważ mogę zaprojektować interfejs użytkownika, aby dostosowywał się w locie, ale mniej optymalna w tym sensie, że wartości danych nie są kontrolowane przez DBMS i wymaga dodatkowego zapytania. Wykonanie obu tych czynności zwiększyłoby złożoność, wydłużyłoby czas przetwarzania i zwiększyło konserwację interfejsu użytkownika.


title: prawo Moore'a i algorytm kwadratowy

text: Przechodziłem przez wideo (z `coursera - by sedgewick`), w którym twierdzi, że `nie można utrzymać prawa Moore'a za pomocą algorytmu kwadratowego`. aby policzyć N obiektów. Zajmuje to M dni Zgodnie z „prawem Moore'a”, masz komputer o mocy 2X po 1,5 roku.Ale teraz masz 2N obiektów do policzenia. Jeśli użyjesz algorytmu kwadratowego, w roku 197*+1.5 zajmie to (4M)/2 = 2M dni 4M, ponieważ algorytm jest kwadratowy, a dzielenie przez 2 z powodu podwojenia mocy komputera. Trudno mi to zrozumieć. Próbowałem to przepracować, jak poniżej. Aby policzyć N obiektów przy użyciu comp = X , zajmuje to M dni. -> N/X = M Po 1,5 roku musisz policzyć 2N obiektów używając comp=2X -> 2N/(2X) -> N/X -> M dni gdzie popełniłem błąd? czy ktoś może mi pomóc zrozumieć?


title: Dlaczego „ścisłe połączenie funkcji i danych” jest złe?

text: Znalazłem ten cytat w „Radości Clojure” na s. 32, ale ktoś powiedział mi to samo podczas obiadu w zeszłym tygodniu i słyszałem to również w innych miejscach: > [A] minusem programowania obiektowego jest ścisłe połączenie między > funkcją a danymi. Rozumiem, dlaczego niepotrzebne sprzęganie jest złe w aplikacji. Również czuję się komfortowo mówiąc, że należy unikać mutowalnego stanu i dziedziczenia, nawet w programowaniu zorientowanym obiektowo. Ale nie rozumiem, dlaczego przyklejanie funkcji do klas jest z natury złe. Mam na myśli, że dodanie funkcji do klasy przypomina tagowanie wiadomości w Gmailu lub umieszczanie pliku w folderze. To technika organizacyjna, która pomoże ci ją odnaleźć. Wybierasz pewne kryteria, a następnie łączysz podobne rzeczy. Przed OOP nasze programy były dość dużymi zbiorami metod w plikach. Chodzi mi o to, że musisz gdzieś umieścić funkcje. Dlaczego ich nie zorganizować? Jeśli jest to zawoalowany atak na typy, dlaczego po prostu nie powiedzą, że ograniczenie typu wejścia i wyjścia do funkcji jest złe? Nie jestem pewien, czy mógłbym się z tym zgodzić, ale przynajmniej znam argumenty typu pro i con. Brzmi to dla mnie jak osobna sprawa. Jasne, czasami ludzie się mylą i umieszczają funkcjonalność w niewłaściwej klasie. Ale w porównaniu z innymi błędami wydaje się to bardzo drobną niedogodnością. Tak więc Clojure ma przestrzenie nazw. Czym różni się wklejanie funkcji do klasy w OOP od wklejania funkcji w przestrzeni nazw w Clojure i dlaczego jest to takie złe? Pamiętaj, funkcje w klasie niekoniecznie działają tylko na członkach tej klasy. Spójrz na java.lang.StringBuilder - działa na dowolnym typie referencyjnym lub poprzez auto-boxing, na dowolnym typie. PS Ten cytat odnosi się do książki, której nie czytałem: Multiparadigm Programming in Leda: Timothy Budd, 1995.


title: Logika domeny w warstwie usług uwidoczniona jako usługa WCF

text: Projektuję rozwiązanie korporacyjne, które składa się z produktów modularnych w ramach gamy produktów, używając najpierw kodu Entity Framework do zdefiniowania modelu domeny i zapewnienia dostępu do danych. np. Rozwiązania: ProductRange.Authentication ProductRange.Gateway ProductRange.OrderSystem ProductRange.MarketingSystem Każdy z tych produktów (rozwiązań) będzie miał podobne warstwy, obecnie: Projekty w każdym rozwiązaniu: ProductRange.OrderSystem.Model (zawiera najpierw kod POCO) ProductRange.OrderSystem.DataContext ( zawiera dbContext) ProductRange.OrderSystem.DataAccess (zawiera ogólne repozytorium) ProductRange.OrderSystem.Service.DomainLogic (zawiera logikę biznesową) ProductRange.OrderSystem.Service.ApplicationLogic (zawiera logikę aplikacji) ProductRange.OrderSystem.Presentation.AdminWebsite ProductRange.OrderSystem. Presentation.CustomerWebsite Niektóre produkty będą musiały uzyskać dostęp do logiki domeny innego produktu, w szczególności wszystkie będą musiały uzyskać dostęp do ProductRange.Authentication, ale także ProductRange.MarketingSystem będzie musiał wysłać zapytanie do ProductRange.OrderSystem Zastanawiam się, aby ujawnić domenę logika między produktami w asortymencie za pośrednictwem usługi WCF. Ale będę również musiał odwołać się do produktu lokalnie (np. tworząc referencje projektu). Jak mam to zrobić? Czy powinienem utworzyć usługę WCF, np. ProductRange.OrderSystem.WCF, który wywołuje logikę domeny i ujawnia ją, czy sama logika domeny powinna być usługą WCF? Jeśli to drugie, czy zawsze musiałbym odwoływać się do logiki domeny za pośrednictwem WCF, nawet z lokalnego ApplicationLogic? Myślę, że szukam wskazówek na temat tego, jakie warstwy należy mieć i jak najlepiej zapewnić łączność między rozwiązaniami.


title: Najlepsze praktyki dotyczące refaktoryzacji struktury plików parametrów w wielu środowiskach

text: **Informacje w tle i to, czego próbowałem** W każdym z dwóch w większości odrębnych środowisk, powiedzmy „Badania” i „Produkcja”, istnieje zapotrzebowanie na ustrukturyzowany plik parametrów. Plik zawiera takie rzeczy, jak połączenia z bazą danych, tabele i kilka innych parametrów, nic niezwykłego. Obecnym podejściem jest posiadanie dwóch odrębnych plików parametrów, powiedzmy „params.txt” i „params_prod.txt” (dla produkcji). (Ponadto, na wypadek, gdyby to pomogło, w rzeczywistości nie używamy do tego .txt, używamy języka znaczników, ale szczegóły tego nie mają tak naprawdę znaczenia w przypadku tego pytania). Większość informacji jest zduplikowana między nimi dwa pliki, co prowadzi do dużej ilości kopiowania/wklejania. Ponadto w kontroli wersji każdy musi ręcznie wprowadzać zmiany w dwóch plikach i musimy ufać, że propagują zmiany podczas sprawdzania. Nie trzeba dodawać, że prowadzi to do bólów głowy, które należy rozwiązać, gdy wystąpią jakieś rozbieżności między plikami. Próbowaliśmy obejść, takich jak pisanie testów, aby sprawdzić, czy pliki są identyczne pod każdym względem, ale nie jest to doskonała nauka, ponieważ struktura plików może się zmieniać i definicja tego, co dokładnie musi być identyczne między nimi też się zmienia. Wpadłem na jeden pomysł: po prostu użyj jednego pliku, ale utwórz podsekcje w pliku. Może istnieć podsekcja z parametrami ogólnymi, które są zawsze udostępniane, inna sekcja z elementami, które powinny być traktowane jako parametry „domyślne” (ustawienia środowiska „Badania”), a następnie inna sekcja z ustawieniami środowiska „Produkcja”. Mamy już kod, który analizuje pliki parametrów i tworzy instancje obiektów, ładuje dane itp. itd. Na podstawie parametrów. Moglibyśmy się cofnąć i dodać kilka opcji do tego kodu, tak aby ładował dane zgodnie z podsekcją pliku parametrów, którego ma użyć, i ignorował parametry z drugiej sekcji. Ma to pewne zalety: (1) wszystko jest w jednym pliku, więc nie ma „po prostu ufania”, że ludzie propagują zmiany. (2) Nie wymaga również kopiowania/wklejania kodu, ponieważ wszystko, co jest współdzielone między obydwoma środowiskami, musi pojawić się tylko w jednej sekcji na górze jednego pliku parametrów. (3) Jeśli już, to powinno sprawić, że same pliki parametrów będą bardziej modularne i łatwiejsze w użyciu. (4) Oszczędzamy czas/koszty, które trzeba by poświęcić na tworzenie skomplikowanych obejść opartych na testach, które sprawdzają, czy pliki są propagowane razem podczas check-inów z kontrolą wersji. W tym przypadku nie musimy tego robić. Pociąga to za sobą również koszty: (1) czas poświęcony na tworzenie specyfikacji nowo sformatowanych plików parametrów w XSD, abyśmy mogli je zweryfikować i upewnić się, że są one wstecznie zgodne; (2) koszty, jeśli musimy przekodować i sprawić, by nasze oprogramowanie, które łączy się z plikami parametrów, miało opcje, czy użyć „Badania” lub „Produkcji”. (3) Jeśli którakolwiek z właściwości, które są obecnie uważane za znajdujące się w podsekcji, która jest współdzielona, ale która nagle staje się rzeczami, w których chcemy mieć różne opcje między „Badaniami” i „Produkcją”, musielibyśmy dokonać refaktoryzacji wszystkie pliki parametrów, aby przenieść ten element w dół do innych sekcji. (3) Wydaje się, że jest to największe zmartwienie, ale zmusza nas również do nieustannej refaktoryzacji tych plików parametrów, co moim zdaniem jest dobrą rzeczą. Poza tym, jeśli chcemy elastyczności w ponownym przypisywaniu parametru z jednej podsekcji do drugiej, powinny istnieć lepsze sposoby na osiągnięcie tego niż powielanie całego pliku. **Pytanie** Czy istnieją jakieś znaczące pułapki, z których nie zdaję sobie sprawy, w związku z proponowanym pomysłem dotyczącym kompromisów „nie powtarzaj się” w porównaniu z wbudowaną elastycznością w projektowaniu pliku parametrów?


title: Mapowanie listy opcjonalnych wartości na opcjonalną listę wartości

text: Podczas programowania w Haskell napotkałem następujący wzorzec (ale wzorzec mógł wystąpić w dowolnym języku obsługującym listy, typy opcji i mapowanie funkcji na liście). Mam typy `a` i `b` oraz funkcję f :: a -> Może b Teraz chcę zdefiniować funkcję, która odwzorowuje f na liście typu `[a]`, ale nie interesuje mnie posiadanie wynik typu `[Może b]`. Raczej chcę mieć `Tylko [y1, ..., yn]`, jeśli `[f(x1), ..., f(xn)] == [Tylko y1, ..., Tylko yn]` , a w przeciwnym razie „Nic” (tj. jeśli „f(xi) == Nic” dla co najmniej jednego i). Wynik musi więc być typu „Może [b]”. Rozwiązałem to za pomocą następującej funkcji pomocniczej: połącz :: Może b -> Może [b] -> Może [b] połącz mnie ml = do l <- ml e <- me Just (e : l) a potem g : : (a -> Może b) -> [a] -> Może [b] g f xs = foldr połącz (Tylko []) (map f xs) Czyli na przykład jeśli mam f x = if x > 0 to po prostu x else Nic xs0 = [1, 2, 3, 4] xs1 = [-1, -2, 3, 4] xs2 = [-1, -2, -3, -4] następnie map f xs0 = [Tylko 1 , Tylko 2, Tylko 3, Tylko 4] g f xs0 = Tylko [1, 2, 3, 4] map f xs1 = [Nic, Nic, Tylko 3, Tylko 4] g f xs1 = Nic map f xs2 = [Nic, Nic , Nic, Nic] g f xs2 = Nic Rozwiązanie z `combine` i `foldr` działa, ale chciałem zapytać, czy znasz bardziej kompaktowe rozwiązanie do zamiany `[Może a]` w `Może [a] ` jak opisano powyżej.


title: Jakie są najlepsze praktyki dotyczące pisania raportów?

text: Muszę przedstawić współpracownikowi kilka najlepszych praktyk dotyczących raportów. W tej chwili używam iReport jaspersoft do tworzenia moich raportów i muszę dać trochę wkładu do współpracownika. Poszukuję ogólnej wiedzy i wglądu w temat.


title: Awarię zasilania należy rozważyć jako scenariusz do wdrożenia?

text: Czy uważasz, że awaria zasilania jest scenariuszem do realizacji? W którym momencie ten scenariusz należy wziąć pod uwagę? Jeśli awaria zasilania spowoduje utratę danych, to czy Ci na tym zależy? if(IsImportant(data)) ... jeszcze .. ? Co sądzisz, jeśli nasza aplikacja już nie działa, nawet scenariusz awarii zasilania nie powinien być błędem, aby rozważyć, czy awaria zasilania spowodowała trwałe uszkodzenie aplikacji? Więc musimy zawsze brać pod uwagę te sytuacje? Czy możesz zaproponować pragmatyczne podejście do scenariuszy awarii zasilania?


title: Jak rozpocząć badania w dziedzinie informatyki

text: Zacząłem programować później w mojej karierze (w połowie lat 30-tych) po prostu dlatego, że mi się to podobało i miałem okazję przyczynić się do mojej pracy. Chociaż wciąż muszę się wiele nauczyć, na pewnym etapie chciałbym się dowiedzieć, co dzieje się w obszarze badań informatycznych. Zastanawiam się, czy ludzie na giełdzie mogą wskazać mi właściwy kierunek niektórych metod lub zasobów; dobre czasopisma itp. Czy są jakieś dobre tematy na początek? Ponadto, w jakich obszarach czytanie artykułów naukowych było dla Ciebie najbardziej pomocne?


title: Czy przydaje się do metod testów jednostkowych, w których jedyną logiką są strażnicy?

text: Powiedzmy, że mam taką metodę: public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } Mam kilka takich metod w moim kodzie (przednia połowa do asynchronicznego wywołania Web Service). Zastanawiam się, czy warto je objąć testami jednostkowymi. Tak, jest tu logika, ale to tylko logika strażnika. (Oznacza to, że upewniam się, że mam wszystko, czego potrzebuję, zanim zezwolę na wywołanie usługi sieciowej.) Część mnie mówi „na pewno możesz je przetestować jednostkowo, ale nie jest to warte czasu” (jestem w projekcie, który jest już opóźniony). Ale druga strona mnie mówi, że jeśli nie przetestujesz ich jednostkowo, a ktoś zmieni Strażników, mogą pojawić się problemy. Ale pierwsza część mnie mówi, że jeśli ktoś zmieni strażników, to po prostu robisz dla niego więcej pracy (bo teraz muszą zmienić strażników i testy jednostkowe dla strażników). Na przykład, jeśli moja usługa przejmuje odpowiedzialność za sprawdzanie dostępności widżetów, mogę już nie chcieć tego strażnika. Jeśli jest w testach jednostkowych, to muszę teraz zmienić dwa miejsca. W obu przypadkach widzę plusy i minusy. Pomyślałem więc, że zapytam, co zrobili inni.


title: Licencjonowanie: kod źródłowy a kod produkcyjny w JavaScript

text: W celach komercyjnych i licencyjnych, jakie jest poprawne sformułowanie odróżniające kod źródłowy JavaScript (napisany przez programistę i zawierający komentarze) od wersji zminifikowanej używanej w produkcji?


title: Kiedy niewłaściwe jest, aby obiekty były niezmienne?

text: Mam klasę, która reprezentuje obiekt encji w naszym systemie (dla przykładu obiekt Customer) public class Customer() { private int id; prywatna nazwa ciągu; ... // 30+ pól public Customer() { // pusty konstruktor! } // gettery i settery } Staram się to refaktoryzować, aby pola były wyodrębniane do własnych obiektów, gdzie są bardziej sensownie pogrupowane, a przy tym tworząc sparametryzowane konstruktory - z intencją mógłbym wtedy zgubić metody ustawiające i uczynić moje obiekty niezmiennymi (ponieważ najwyraźniej jest to Dobra Rzecz(TM)). To jednak nie ma sensu - czasami muszę zaktualizować informacje o kliencie! To wyraźnie nie jest niezmienne. Czy powinienem po prostu nie uczynić tej klasy niezmienną — i czy mogę zastosować ten sam argument do wszystkich moich klas jednostek?


title: Czy używanie parametrów „out” lub „ref” w metodach Java do zwracania dodatkowych wartości jest złe?

text: Zdarzyło mi się stworzyć mutowalną klasę tak: class Mutable<T> { private T value; public Mutable() { this.value = null; } public Mutable(wartość T) { this.value = wartość; } T get() { return this.value; } void set (wartość T) { this.value = wartość; } } A potem jest często używany w metodzie takiej jak ta: operacja logiczna(String input, Mutable<Set<String>> dataOut) throws ... { boolean result; spróbuj { Ciąg danych = zróbCoś(wejście); wynik = walidacja(dane); if (result && dataOut != null) { List<String> values = Arrays.asList(data.split(", ")); Kolekcje.sort(wartości); dataOut.set(nowy LinkedHashSet<String>(wartości)); } } catch(SpecificIgnorableException ex) { wynik = false; logger.debug(ex); } zwraca wynik; } ...co jest tylko przykładem, może być dowolnym przypadkiem użycia, w którym użyto by parametrów `ref` lub `out` w C#, lub niestałych parametrów referencyjnych w C++, lub wskaźników do parametrów wyjściowych w C. Po pierwsze, to samo można zrobić, używając tablicy (z jednym elementem) zamiast powyższego typu niestandardowego. Czy ma sens posiadanie tego niestandardowego typu, który wyraźnie określa _mutable_ , zamiast używać niejawnie modyfikowalnej tablicy? Po drugie, czy ten wzorzec jest zły i śmierdzi kodem w Javie? Ograniczmy się do przypadków, w których użycie parametru `out` miałoby sens w C#. Czy należy wymienić każdą instancję tego rodzaju kodu Java? Z czym?


title: Upokorzenie przez starszego programistę

text: Co byś pomyślał i zrobił jako junior?


title: Co byś zrobił? Dawno spóźnione w zasadzie wszystko i teraz klient nie chce z tobą rozmawiać

text: W zeszłym roku przejąłem dość skomplikowany projekt jako jedyny programista/kierownik projektu i tester. W listopadzie ubiegłego roku minął termin dostarczenia nowych funkcjonalności. Przejęty przeze mnie system, który podobno był gotowy do użycia, był daleki od gotowości. Siedząc z jednym z użytkowników naszych klientów wymyślił nowe funkcje i wymagania, które były wymagane. Mimo że funkcje, o które prosili, zostały zaimplementowane, twierdził, że nie przypominają tego, co określono w wymaganiach. Musiałem więc wrócić do deski kreślarskiej i dokonać rozległych zmian w systemie. Obietnica za obietnicą, to moja wina, nie dotrzymałem kolejnego terminu z różnych powodów: zbyt optymistyczne planowanie w moim imieniu, chore dzieci i różne inne sprawy osobiste. Po stronie klienta były też niedociągnięcia: testowanie tylko wtedy, gdy patrzę przez ramię i tak dalej. Wczoraj uzgodniliśmy, że rozpoczniemy transmisję na żywo, jeśli ich użytkownicy zaakceptują zgłoszenie. Oczywiście pojawiły się pewne problemy i dzisiaj, kiedy próbowałem zadzwonić do naszego klienta, odłożył słuchawkę i nie odpowiedział na żaden z moich e-maili. To naprawdę mnie męczy, godziny i czas spędzony na tym znacznie przekracza normalne godziny pracy i odbił się również na mojej rodzinie Oczywiście są rzeczy w tej sytuacji, które są specyficzne dla tego projektu, ale nie sądzę, aby ogólny wzór (wiele małych problemów prowadzących do awarii projektu) jest rzadkością. Co byś zrobił w podobnym scenariuszu?


title: Pojedynczy punkt dostępowy dla kilku aplikacji

text: Zostałem poproszony o stworzenie strony internetowej, z której użytkownicy mogą uzyskać dostęp do kilku innych aplikacji stworzonych przy użyciu formularzy oracle i jsf, w tym również sso. Nie mogę wymyślić prostego sposobu na zrobienie tego, myślałem o tym, że użytkownik powinien zarejestrować się i wprowadzić wszystkie swoje nazwy użytkownika/hasła dla każdej aplikacji, po czym zajmie się tylko nazwą użytkownika/hasłem, które utworzył dla tej strony. Chciałem zapytać, czy to dobry pomysł, czy jest lepszy sposób na poradzenie sobie z tym?


title: Przyjazny dla kontroli wersji format pliku tylko z dołączaniem: "binarny" czy "tekstowy"?

text: Projektuję format pliku tylko do dołączania ("dziennik") i chciałbym, aby był przyjazny dla przechowywania w VCS (git/Mercurial/...). Z jednej strony chciałbym, aby po każdej zmianie do repozytorium była dodawana tylko delta (różnica) od poprzedniego stanu pliku (czyli kilka końcowych bajtów), a nie cała zawartość pliku. W tym celu rozważam utworzenie formatu „pseudo-tekst”, to znaczy bez bajtu NUL (0x00) w treści (lub może nawet bardziej rygorystycznego podzbioru UTF-8), aby można go było łatwo różnicować przez git/Mercurial. Z drugiej strony, "pseudotekstowy" format pliku nie byłby predysponowany do łączenia, całkowicie uszkodziłby zawartość. Tak więc, aby uniknąć tej możliwości, jestem skłonny uczynić to "binarnym", nawet jeśli tylko umieszczając bajt NUL pod offsetem 0 w pliku. Ale z drugiej strony scalanie nawet „tekstowych”, ale strukturalnych formatów plików nie zawsze jest możliwe, nawet w „typowych” przypadkach, takich jak kod źródłowy, więc może nie musisz się tutaj martwić? Jestem przekonany, że jeśli ktokolwiek spróbuje połączyć takie pliki, wszędzie będą totalne konflikty, więc to może być wystarczającym znakiem ostrzegawczym. Czy miałeś w przeszłości doświadczenia z podobnym wyborem? Jakiego wyboru powinienem dokonać i dlaczego?


title: Jak wiele wartości jest zwracanych w Javie?

text: Czasami chcesz zwrócić wiele wartości z funkcji. **Jak to się _normalnie_ robi w Javie?** Jedną z opcji jest użycie tablicy, takiej jak ten fragment kodu Pythona, który zwraca listę lub krotkę: wartość, sukces = read_unreliably() if success: print value Inną opcją byłoby zwrócenie hash/dict, jak ten przykład JavaScript: var wynik = readUnreliably() if (result.success) { alert(value); } Jeszcze jednym byłoby utworzenie własnego obiektu tylko w tym celu, jak ten przykład w Javie: ReadUnreliablyResult result = readUnreliably() if (result.getSuccess()) { System.out.println(result.getValue()); } Oczywiście możesz też po prostu użyć kilku zmiennych globalnych do przechowywania tego, czego potrzebujesz, zamiast przekazywać rzeczy, ale powiedzmy, że to nie jest opcja.


title: Czy ktoś ma sugestie dotyczące projektowania lub bibliotek open source specjalnie dla jednej strony aplikacji AJAX?

text: Pracuję nad główną nową wersją aplikacji opartej na przeglądarce i szukam komentarzy/sugestii dotyczących architektury/projektu. Jest to jednostronicowa aplikacja wykorzystująca AJAX i szablony po stronie klienta, aby uzyskać nowe „strony”. Korzystam już z biblioteki Sammy Javascript do obsługi zakładek i przycisków do przodu/do tyłu. Do tej pory używam JQuery, części JQueryUI, SlickGrid i trochę Dojo (głównie dojox/rpc/jsonrpc i jego zależności). Komunikuję się z serwerem za pomocą wywołań JSON RPC za pośrednictwem bardzo cienkiej warstwy serwera sieci Web, która po prostu przekazuje ciągi JSON do serwera biznesowego, który ma interfejs API dostępny na różne sposoby, ale przeglądarka używa tylko JSON RPC. Śledzenie stanu sesji odbywa się w warstwie biznesowej w ramach implementacji tego interfejsu API, chociaż oczywiście mechanizm RPC musi dostarczyć wystarczającą ilość informacji, aby zidentyfikować, która sesja go wywołuje. Wszystko to było kontekstem; mam pytanie: czy ktoś wie o jakichkolwiek zasobach wspierających ten rodzaj projektowania? W szczególności szukałbym bibliotek JavaScript o otwartym kodzie źródłowym oprócz Sammy, które obsługują jednostronicowe aplikacje internetowe. Sammy oczekuje, że będziesz korzystać z szablonów po stronie klienta i ma do tego pewne wsparcie oraz kilka wtyczek dla konkretnych bibliotek szablonów, ale nie obsługuje podobnej funkcjonalności do używania AJAX do stosowania arkuszy stylów CSS (oraz usuwania lub dezaktywowania innych) podczas zmiany ekranów i zmieniłby strony w bardziej tradycyjnej aplikacji internetowej. Chciałbym również usłyszeć od każdego, kto próbował czegoś podobnego. Czy zgadzasz się z jednym arkuszem stylów dla całej aplikacji? Czy masz problemy z wyciekiem pamięci z powodu pozostawania na jednej stronie przez tak długi czas? Jakieś sugestie dotyczące projektu po stronie klienta? Czy MVP brzmi rozsądnie, z modelem zaimplementowanym w JavaScript, klasami prezentera do implementacji zdarzeń w sposób abstrakcyjny, który jest łatwiejszy do testowania jednostkowego i widokiem do obsługi rzeczywistych rzeczy DOM? Jakiś menedżer aplikacji do śledzenia, które strony są aktywne i czyściłby zasoby po zamknięciu ekranu? Nie widziałem wielu wyczerpujących odniesień ani bibliotek do projektowania jednostronicowego, więc wszystko, co ludzie mogą mi powiedzieć lub polecić, będzie mile widziane. Zauważ, że przeczytałem podejście Dev do złożonych interfejsów użytkownika JavaScript, co jest świetnym pytaniem, ale nie dotyczy tylko złożonych interfejsów JavaScript na jednej stronie.


title: Czy jest jakiś powód, aby nie umieszczać numerów problemów w dziennikach debugowania?

text: Przeglądałem odpowiedzi na to pytanie: Jakie informacje nigdy nie mogą pojawiać się w logach? I zauważyłem, że nikt nie wspomniał o tym konkretnym atrybucie. Jest to coś, co uważam za przydatne — za każdym razem, gdy jakiekolwiek logowanie jest dodawane do systemu w wyniku śledzenia konkretnego problemu zgłoszonego w module do śledzenia błędów lub dodawania funkcji, **_Zwykle dołączam numer zgłoszenia powiązanego elementu helpdesk._* * Oznacza to, że podczas przeglądania dziennika każdy programista może odnieść się do każdego komunikatu dziennika z powiązanym numerem biletu. Teraz rozumiem, że użycie odpowiedniej integracji VCS/helpdesku oznacza, że większość zatwierdzeń i tak jest dołączona do numeru zgłoszenia - ale z czasem ułatwia nam to diagnozowanie problemów podczas inspekcji, gdy pojawi się komunikat dziennika. Jednak nadal trochę niepokoi mnie pozostawienie tego w dziennikach. Problem polega na tym, że nie mogę wymyślić scenariusza, w którym mogłoby to stać się problemem. Mam nadzieję, że SE może mi pomóc. Przy okazji - mówię o "pełnym" poziomie dziennika. Nigdy nie jest to wykonywane na poziomie rejestrowania, który pojawi się w produkcji.


title: Miksowanie licencji GPL

text: Ze zrozumienia, które stopniowo zbieram na temat GPL, nie można mieszać licencji, chyba że obie mają dodaną specjalną klauzulę zezwalającą na to. Jak więc możliwe są następujące rzeczy? Użyjmy Joomla jako podstawy tego przykładu: * Ludzie tworzą skrypty wtyczek, które muszą wywoływać funkcjonalność biblioteki z jądra Joomla, aby funkcjonować. To z pewnością oznacza, że wtyczka musi być na licencji GPL. * Powiedzieli, że ludzie decydują się na sprzedaż skryptów wtyczek, które zbieram, są w porządku, ponieważ zasadniczo sprzedają usługi dystrybucji / wsparcia. Ale po zakupie użytkownik końcowy ma pełne prawo do odsprzedaży lub robienia z nim, co mu się podoba (pod warunkiem, że podlega warunkom GPL). Q1. Jak więc ludzie mogą sprzedawać wtyczki do Joomla nie objęte licencją GPL? Q2. Jak można dodać jakiś system aktywacji, który ogranicza korzystanie ze źródła GPL? Czy nie jest to sprzeczne z samym celem GPL? Q3. W jaki sposób wtyczka do Joomla nie objęta licencją GPL może być ograniczona do użytku niekomercyjnego? Oto odpowiedź, którą niedawno otrzymałem od dostawcy wtyczek Joomla, który nie jest na licencji GPL. Oferują dwie odmiany, niekomercyjną i komercyjną (ale żadne z nich nie są objęte GPL). > GPL nie oznacza, że całe powiązane lub używane oprogramowanie musi być na licencji GPL. Reguluje jego użycie. Nazwalibyśmy również „Joomla” nie produktem, jest to oprogramowanie o otwartym kodzie źródłowym na licencji GPL. > > Nasze rozszerzenia to oprogramowanie typu open source objęte naszą własną konkretną licencją > > > W przypadku, gdy chcesz odsprzedać strony, które używają naszych rozszerzeń lub samego rozszerzenia, które nie są objęte naszą licencją. W przypadku, gdy chcesz go używać na > swojej własnej witrynie lub witrynach, które tworzysz jako projektant dla swoich klientów, > jest to objęte naszą licencją. W żadnym momencie tego pytania nie będę odnosić się do dostawcy wtyczek, ponieważ nie chcę stawiać fałszywych zarzutów. Jestem po prostu zdezorientowany. W moim doświadczeniu z Joomla widziałem tę sytuację w kółko i otrzymałem podobne odpowiedzi. Jestem pewien, że po prostu źle rozumiem fundamentalny aspekt GPL, ale naprawdę chcę go zrozumieć. Dodano: Proszę zauważyć, że moim zamiarem nie jest pozwanie ani nic takiego. Chcę to zrozumieć, aby uniknąć tego, co przydarzy się projektowi, który wydam jako open source jeszcze w tym roku. Chcę tylko zrozumieć każdy kąt.


title: Czy powinienem zadbać o warunki wyścigowe, które prawie na pewno nie mają szans na wystąpienie?

text: Rozważmy coś w rodzaju aplikacji GUI, w której główny wątek aktualizuje interfejs użytkownika niemal natychmiast, a inny wątek odpytuje dane przez sieć lub coś, co gwarantuje, że ukończenie zadania zajmie 5-10 sekund. Otrzymałem wiele różnych odpowiedzi na to, ale niektórzy twierdzą, że jeśli jest to sytuacja wyścigowa, której statystycznie niemożliwa jest sytuacja, to w ogóle się tym nie przejmuj, ale inni mówią, że jeśli jest nawet 0.000000000000000000000000000000000000000000000000000001% (nie żartuję jeśli chodzi o liczby, to słyszałem) o jakiejś magii voodoo, która dzieje się z powodu warunków rasowych, zawsze uzyskuj/zwalniaj blokady w wątku, który tego potrzebuje. Jakie są Twoje myśli? Czy dobrą praktyką programistyczną jest radzenie sobie z sytuacją wyścigu w takich statystycznie niemożliwych sytuacjach? czy też dodanie większej liczby linii kodu, aby utrudnić czytelność, byłoby całkowicie niepotrzebne lub nawet przyniosłoby efekt przeciwny do zamierzonego?


title: Czego powinienem użyć dla nazwy pakietu, jeśli nie mam domeny?

text: > **Possible Duplicate:** > Jaki jest sens konwencji nazewnictwa pakietów w Javie? > Jaką nazwę pakietu wybrać dla małego projektu Java o otwartym kodzie źródłowym? Piszę Javę (i języki pochodne z nazwami pakietów) do użytku osobistego, ale nie mam osobistej nazwy domeny, więc standardowa konwencja nazewnictwa opakowań nie jest zgodna. Ponieważ ta sama konwencja jest używana w identyfikatorach grup Maven, problem jest taki sam. Czego powinienem użyć jako katalogu głównego nazwy mojego pakietu?


title: Jaką nazwę pakietu wybrać dla małego projektu Java o otwartym kodzie źródłowym?

text: Chciałbym opublikować małą bibliotekę open-source w Javie. Zastanawiam się, jaką nazwę pakietu wybrać? Nie jestem firmą i nie posiadam domeny, której mógłbym użyć jako podstawy do nazewnictwa pakietu zgodnie z konwencjami nazewnictwa. Mimo to chciałbym jakoś przestrzegać konwencji nazewnictwa, aby zapobiec przypadkowemu konfliktowi i zachować standard.


title: utworzyć wystąpienie lub zainicjować podczas korzystania z nowej klasy?

text: moje pytanie jest raczej kwestią języka angielskiego. Aby poprawnie komentować mój kod, chcę wiedzieć, kiedy robisz na przykład poniższy kod, jaki komentarz możesz do niego napisać? public class TestClass { public double volt {get; set;} public double curr {get; set:} } Gdzieś indziej w tej samej przestrzeni nazw public class AnotherTest { TestClass test; public AnotherTest(TestClass test) { this.test = new TestClass(); //jak to skomentować? } }


title: Jak udokumentować samoobjaśniające się funkcje ustawiacza?

text: Często ustawiające wartości logiczne są dość oczywiste, jak `setLogErrors($bool)`. Widzę pewną korzyść z podania dodatkowych informacji w dokumentacji, w tym przypadku być może, gdy te błędy są rejestrowane. Ale ile dokumentacji to za dużo, zwłaszcza jeśli chodzi o dokumentowanie wartości, która jest przekazywana do ustawiającego? Narzędzia dokumentacji, takie jak phpDocumentor, chciałyby, aby ta zmienna była również udokumentowana, ale z kontekstu jest całkiem jasne, że wymaga ona wartości logicznej. Często osobiście uważam, że lepiej, gdy kod mówi sam za siebie, zwłaszcza w takich sytuacjach. Jaka jest najlepsza praktyka w takich sytuacjach? **Czy kłótnia powinna być udokumentowana** czy nie, co powiesz na **ustawiający, czy powinien być udokumentowany**? Czy czytelność kodu nie poprawiłaby się, gdyby w takich okolicznościach było mniej dokumentacji? Nie jestem częścią dużego zespołu programistów i nie czytam dużo kodu napisanego przez innych. Miałem nadzieję, że uzyskam wgląd w **jakie standardy są ustalane w większych organizacjach i co jest najłatwiejsze do odczytania dla ludzi, gdy kod nie jest ich własnym**. Mam nadzieję, że te pytania nie są oparte na opiniach.


title: SCRUM od podstaw, bez ustalonych ram bazowych?

text: Jesteśmy małą 5-osobową grupą, która rozpoczyna nowy projekt. To pierwszy projekt, w którym pójdziemy all-in na scrum. Trochę zmagamy się z tym, jak zamierzamy stworzyć bazę pod projekt (frameworki i tym podobne). Takie zadania nie są czymś, z czego użytkownik odniesie bezpośrednie korzyści, więc trudno nam wymyślić, w jaki sposób piszemy dla nich historyjki użytkowników. Ogólnie rzecz biorąc, jak używać scrum, kiedy zaczynasz projekt od zera, bez frameworków i biblioteki bazowej?


title: Kiedy utworzyć nowy kontroler MVC dla modelu?

text: **Projekt:** mam kilka przypadków, w których nie jestem pewien, czy powinienem zastosować podejście „separacji obaw”, czy też uproszczone. Wszystkie są podobne do poniższej konfiguracji. np. Szacunek zawiera wiele „Uwag” EstimateController.Details -> Wyświetla szczegóły oszacowania (nazwę, opis itp.), a poniżej wyświetla tabelaryczny widok notatek (oddzielonych typem). **Moje przemyślenia:** z jednej strony byłoby to oddzielenie obaw i utworzenie nowego kontrolera, który brzmi jak właściwy sposób robienia rzeczy, korzystając w razie potrzeby z widoków częściowych. Z drugiej strony posiadanie kontrolera dla wszystkich takich przypadków wydaje się trochę przesadą. (tj. Szacunki zawierają: uwagi, numery specyfikacji, numery rysunków i załączniki. Jest to również podobne do wielu innych modeli w modelu biznesowym). **Pytanie:** * Jak trywialne jest to, aby uzasadnić tworzenie osobnego kontrolera dla podmodelu? Znalazłem wiele miejsc mówiących, że powinieneś mieć osobny kontroler dla każdego modelu widoku, ale z tych, które widziałem, żadne z nich nie wspomina **dlaczego** ani nie wspomina **jak trywialny model jest zbyt trywialny** ?


title: Kod ISBN — Jaki jest cel kodu wydawcy w numerze ISBN?

text: Chcę zrozumieć logikę tego, w jaki sposób zakres kodów wydawcy dostarczony przez urząd ISBN jest mapowany na numer ISBN. Z poniższych łączy http://xml.coverpages.org/costello-isbn-xsd.txt http://www.booklore.co.uk/Articles/Nigel/ISBNAtricle.htm Kraj Identyfikator wydawcy Jeśli zakresy numerów Wstaw myślnik Blokuj Rozmiar zawiera się pomiędzy: po: -------------------------------------------- --------------------------- 0 00.......19 00-19 3. cyfra 1 000 000 0 200..... .699 20-69 czwarta cyfra 100 000 0 7000.....8499 70-84 piąta cyfra 10 000 0 85000....89999 85-89 szósta cyfra 1000 0 900000...949999 90-94 siódma cyfra 100 0 9500000. .9999999 95-99 8. cyfra 10 1 55000....86979 5500-8697 6. cyfra 1000 1 869800...998999 8698-9989 siódma cyfra 100 1 9990000..9999999 9990-9999 ósma cyfra 10 Rozumiem, że z powyższej tabeli: w podanych wyżej zakresach. 2. Przykładowy numer ISBN 978-0-00-000000-2, następujący po podziale, 978 jako prefiks, 0 jako obszar anglojęzyczny, 00 jako kod wydawcy, cyfra tytułu - 6 cyfr (od 000000 do 999999) oraz ostatnia cyfra kontrolna obliczona na podstawie liczby utworzonej wcześniej. Pytania: 1. Czy moje powyższe założenia i zrozumienie są poprawne? Daj mi znać, jeśli potrzebujesz więcej informacji, podaj wyjaśnienie dotyczące powyższej tabeli.


title: Gdzie jest droga dla doświadczonego programisty finansowego IT

text: Jestem programistą Java z ponad 10-letnim doświadczeniem zawodowym. W branży bankowości inwestycyjnej pracuję od 2002 roku i planuję kontynuować karierę w tej branży. Ale ostatnio jestem trochę zdezorientowany co do kierunku mojej kariery. Chcę być ekspertem w niektórych aspektach, ale nie wiem jak się rozwijać. Czy eksperci z tej branży mogą pomóc rzucić na to światło? Z góry dziękuję. Większość mojego doświadczenia koncentruje się na rozwoju systemów transakcyjnych, w tym o stałym dochodzie i gotówce.


title: Jeśli zamkniemy okno przeglądarki bez wylogowania, co się stanie, gdy podamy ten sam adres URL w przeglądarce?

text: Kilka dni temu pojawiłem się w wywiadzie dla firmy programistycznej dla programisty .net. Tam zadano mi następujące pytanie: > Jeśli zamkniemy okno przeglądarki bez wylogowania, co się stanie, gdy > podamy ten sam adres URL w przeglądarce? Moja odpowiedź była taka, że użytkownik będzie mógł wyświetlić stronę główną z danymi logowania, zamiast być proszony o podanie nazwy użytkownika i hasła, ponieważ sesja użytkownika nie została zakończona. Dane logowania będą faktycznie pobierane z plików cookie. Ale to zależy od logiki, którą zaimplementowaliśmy dla logowania. Ale ankieter nie wydawał się być zadowolony z mojej odpowiedzi i nie przyjął mojej odpowiedzi. Zastanawiam się, jaka może być odpowiedź na to pytanie. Potrzebuję więc uprzejmych wskazówek dotyczących poprawnych odpowiedzi. Więc proszę wyjaśnij, co miałem odpowiedzieć.


title: Jak oznaczyć pusty blok warunkowy w Javie?

text: W C++, gdy chciałem zaznaczyć, że if jest pusty z założenia, dodałem `NULL;` jako instrukcję: if (cond1) { ... } else if (cond2) { NULL; } else { ... } Jednak w Javie wydaje się niemożliwe, aby wyrażenie `null;` było niemożliwe. Jaki jest poprawny sposób oznaczania pustego według projektu w Javie (czy to tylko komentarz)?


title: Czuję się nieswojo ze składnią rekordów Haskella

text: Większość składni Haskella ma piękno czystości. Ale składnia rekordu wygląda brzydko. To niewygodne. Czuje jakąś mieszankę z C. Wymaga przecinka i nawiasów klamrowych. Haskell ma tabulator, separację opartą na linii. Wygląda więc na zbyt gadatliwy, niż pierwotnie wymagał. Dlaczego jest tak zaprojektowany?


title: Czy jest jakiś dobry powód, aby otwierać pliki w trybie tekstowym?

text: (Prawie) zgodne z POSIX systemy operacyjne i Windows są znane z rozróżniania między 'trybem binarnym' i 'trybem tekstowym' plików we/wy. Podczas gdy pierwszy tryb nie przekształca żadnych danych między rzeczywistym plikiem lub strumieniem a aplikacją, drugi „tłumaczy” zawartość do jakiegoś standardowego formatu w sposób specyficzny dla platformy: zakończenia linii są przezroczyście tłumaczone na `'\n'` w C i na niektórych platformach (CP/M, DOS i Windows) odcinają plik, gdy zostanie znaleziony bajt o wartości `0x1A`. Te przemiany wydają mi się trochę bezużyteczne. Ludzie udostępniają pliki między komputerami z różnymi systemami operacyjnymi. Tryb tekstowy spowodowałby, że niektóre dane byłyby obsługiwane inaczej na niektórych platformach, więc jeśli ma to znaczenie, prawdopodobnie zamiast tego użyjesz trybu binarnego. Jako przykład: podczas gdy Windows używa sekwencji `CR LF` do zakończenia linii w trybie tekstowym, tryb tekstowy UNIX nie traktuje `CR` jako części sekwencji kończącej linię. Aplikacje musiałyby same filtrować ten szum. Starsze wersje Mac używają tylko `CR` w trybie tekstowym jako końcówek linii, więc ani UNIX, ani Windows nie zrozumieją jego plików. Jeśli to ma znaczenie, przenośna aplikacja prawdopodobnie sama zaimplementowałaby parsowanie zamiast używać trybu tekstowego. Zaimplementowanie interpretacji nowego wiersza w parserze może również usunąć pewne obciążenie związane z używaniem trybu tekstowego, ponieważ bufory musiałyby zostać przepisane (i prawdopodobnie zmienione rozmiarem) przed powrotem do aplikacji, podczas gdy może to być mniej wydajne niż wtedy, gdy miałoby to miejsce w aplikacji. Tak więc moje pytanie brzmi: czy jest jakiś dobry powód, aby nadal polegać na systemie operacyjnym hosta do tłumaczenia końcówek linii i obcinania plików?


title: Jakie mogą być powody, dla których programista chciałby wyłączyć hiperwątkowość?

text: Moja firma właśnie kupiła nowe komputery, aby zastąpić stare komputery z systemem Windows XP 2 GB. Ktoś z mojego zespołu zauważył, że przyszli z wyłączoną hiperwątkowością i kazał wszystkim zrestartować komputer i włączyć go. Czy istnieje korzyść z programowania na maszynie z wyłączoną hiperwątkowością?


title: Co oznaczają pytania do rozmowy kwalifikacyjnej dotyczące systemów rozproszonych?

text: Powiedziano mi, że podczas wywiadu zostaną mi zadane pytania dotyczące kodowania i że kontekst będzie związany z systemami rozproszonymi (ukończyłem JEDEN kurs dotyczący systemów rozproszonych i nawet niewiele z niego pamiętam!). Widziałem wiele pytań dotyczących struktury danych / algorytmów kodowania, ale w przypadku systemów rozproszonych wszystko, o czym mogę myśleć, to pytania dotyczące różnych koncepcji. O co mogliby mnie poprosić, żebym dla nich zakodował? Próbowałem poszukać przykładów do praktyki lub przynajmniej zorientować się, jakich rzeczy się spodziewać, ale nie znalazłem żadnego, ponieważ wszystkie wydają się skupiać na koncepcjach, a nie na projektowaniu. Jakieś pomysły?


title: Visual Web Developer 2010 Express, automatyczne testowanie i SVN

text: Mamy projektanta HTML, który nie jest programistą, ale musi od czasu do czasu modyfikować pliki .aspx z naszych projektów ASP.NET 2.0, aby CSS działał z nimi poprawnie. Obecnie wiąże się to z przekazaniem jej samej strony .aspx, którą otwiera i edytuje za pomocą programu Visual Studio 2008 (jej komputer był kiedyś komputerem programisty). Rozważam skonfigurowanie jej z Visual Web Developer 2010 Express i dostępem do Subversion, aby mogła być bardziej niezależna, ale chciałem się upewnić, że VS Express będzie działał poprawnie z tym, co robimy. A więc: * Czy VWD 2010 Express obsługuje testy automatyczne? * Jeśli nie, co się stanie, gdy otworzy plik rozwiązania zawierający projekt testowy, zmodyfikuje go i zapisze? * Czy istnieją potencjalne problemy związane z konfiguracją AnkhSVN z VWD 2010 Express?


title: Czy Rebol to funkcjonalny język programowania?

text: Wpadłem na Rebol i zastanawiałem się nad tym. Natrafiłem tutaj na następujący skrypt: użyj [odpowiedzi na pytania do kanału][ feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol pytania: map-each entry feed/get-by-tag < wpis> [ znajdź/dopasuj wpis/pobierz <id> "http://stackoverflow.com/q/" ] odpowiedzi: wykonaj blok! długość? pytania dla każdego pytania pytania [ pytanie: load-xml/dom join http://stackoverflow.com/feeds/question/ pytanie dla każdego wpisu następne pytanie/get-by-tag <entry> [dołącz wpis/drzewo odpowiedzi]] wstaw wyczyść kanał /find-element <entry> Answers feed/flatten ] Wszystkie operacje manipulacji kolekcjami, takie jak `map-each` przypominają mi JavaScript i C#, które mają możliwości funkcjonalne. Czy Rebol jest językiem funkcjonalnym? Czy obsługuje programowanie funkcjonalne? Czy zostałby zaklasyfikowany jako czysto funkcjonalny język (PFL)?


title: Jak wytłumaczyć nie-programistom, aby skompilowali mój kod źródłowy programu Visual Studio w trybie „Release”?

text: Piszę dokumentację do oprogramowania, które napisałem. W szczególności piszę przewodnik po instalacji oprogramowania. Dostarczam kod źródłowy do mojego klienta, więc spodziewam się, że będzie chciał móc budować ze źródeł. Wyjaśniam otworzyć rozwiązanie w Visual Studio 2010 i kliknąć prawym przyciskiem myszy na projekcie i wybrać "Publikuj". Wydaje się, że nie ma jasnego i prostego sposobu na wyjaśnienie, że muszą zbudować go w trybie „Wydanie” lub jaki jest najprostszy sposób wyjaśnienia, jak to zrobić. Jak najlepiej to wyjaśnić? **Edycja:** W odpowiedzi na komentarze, w których proszono mnie o bardziej szczegółowe informacje, w mojej konfiguracji Visual Studio 2010 obok zielonej ikony znajduje się lista rozwijana, która uruchamia debuger. Obok nie ma żadnej etykiety. W ten sposób jestem zaznajomiony ze zmianą tego ustawienia, ale nie chcę pisać w mojej dokumentacji „Kliknij na rozwijaną listę obok zielonego przycisku i wybierz „Zwolnij”. Musi być lepszy sposób Szczególnie obawiam się, że jeśli się pomylę, może to spowodować, że ktoś zmieni ustawienie na poziomie projektu zamiast na poziomie rozwiązania.


title: Visual Studio buduje za każdym razem, gdy zmienia się JS i CSS?

text: Jestem stosunkowo nowy w Visual Studio Development i zastanawiałem się - wydaje się, że za każdym razem, gdy dokonuję zmian w moim JS lub CSS w moim projekcie - muszę "zbudować" projekt od nowa. Czy istnieje sposób, aby po prostu odświeżyć przeglądarkę, a nie budować za każdym razem? Rozumiem, że wszystkie pliki są kopiowane do jakiegoś katalogu tymczasowego, ale miałem nadzieję, że mogę szybko debugować/zapisywać JS i CSS w rozwiązaniu i po prostu odświeżyć przeglądarkę, aby zobaczyć zmiany?


title: Przejście od samodzielnego programisty do zespołu

text: Przez ostatnie 5 lat rozwijałem się jako samotny programista. Firma podaje mi wymagania, harmonogramy itp., a ja zajmuję się resztą. Wybieram technologię, która najlepiej pasuje do wymagań, decyduję o architekturze, zajmuję się całym kodowaniem, wydawaniem, testowaniem i wsparciem. Patrzyłem na przeprowadzkę, ponieważ czuję, że brakuje mi doświadczenia Agile, interakcji w zespole i kontaktu z niektórymi praktykami. Byłem dzisiaj na rozmowie kwalifikacyjnej i zapytano mnie, jak czułbym się mając mniejszą kontrolę nad kodem, który piszę, ponieważ mają architektów i kierowników projektów. Szczerze mówiąc, nie myślałem o tym i teraz się zastanawiam. Wiem, co mogę zyskać dzięki przeprowadzce, interakcji z innymi programistami, ekspozycji na agile/scrum, a także ekspozycji na nowe technologie. Moje pytanie brzmi: co mam do stracenia? Wiem, że nie będę już wybierać technologii, której używam, ale do jakiej kontroli będę ograniczony? Jak mogę powstrzymać się od zostania kimś innym kodującą małpą, która po prostu musi napisać wszystko, co im się powie? Nie spotkałem się z architektami, licencjatami, kierownikami projektów itp., więc nie jestem pewien, czego się spodziewać. Zespoły składają się z około 2-3 programistów z architektem i/lub głównym programistą.


title: Projektowanie w jednym zespole, kodowanie w innym

text: Będę zaangażowany w projekt, w którym cały projekt oprogramowania jest wykonywany przez lokalny zespół, a te projekty są wysyłane do zespołu offshore w celu kodowania. Po raz pierwszy spotykam się z projektem o takiej charakterystyce i wydaje mi się to trochę dziwne: menedżerowie oczekują od nas opracowania bardzo szczegółowych dokumentów projektowych, więc nie ma miejsca na błędy dla zespołu offshore; z mojej perspektywy zmuszają nas do kodowania na papierze, podczas gdy możemy to zrobić w IDE. Więc moje pytanie brzmi, czy to podejście jest dobre, czy sprawdzone? Jakie są główne względy naszego procesu tworzenia oprogramowania, aby odnieść sukces w naszym projekcie?


title: Czy istnieje nazwa aplikacji internetowych, które wykonują większość nawigacji po stronie klienta?

text: Czy branża internetowa ma jakąkolwiek standardową lub powszechną nazwę, która odnosi się _konkretnie_ do aplikacji internetowych, które nie korzystają z konwencjonalnego modelu nawigacji w oknie HTTP, zamiast tego polegają głównie lub całkowicie na manipulacji DOM? Aplikacje te zwykle mają następujące atrybuty: * ładują ramkę aplikacji z serwera raz (lub rzadko) * używają kombinacji żądań Ajax, modyfikacji DOM i manipulacji historią (poprzez fragment sieciowy lub `pushState`), aby później zmienić stan (podczas gdy zachowanie możliwości ponownego ładowania) * zazwyczaj nie wyzwalają nowych konwencjonalnych zdarzeń nawigacji na pasku adresu (żądania HTTP na poziomie okna lub ramki) * najprawdopodobniej prezentują interfejsy użytkownika, które są wysoce interaktywne z kombinacją okien dialogowych, warstw nakładek, nieskończonego przewijania itp. Przykłady : * Facebook * Twitter * Gmail * USAToday Popularne kontrprzykłady, nadal opierające się głównie na tradycyjnych modelach * YouTube (część nawigacji odbywa się w ten sposób, ale nie wystarcza) * cnn.com Interesują mnie konkretnie nazwy dla tego typu aplikacji webowych. Wydaje mi się, że musiałem już to słyszeć, ale nie mogę nic konkretnie wymyślić. Te wydają się zbyt szerokie: * Aplikacja internetowa (może cokolwiek znaczyć) * Aplikacja AJAX (może znaczyć cokolwiek)


title: Grupowanie liczb w celu zminimalizowania średnich grup

text: Muszę znaleźć sposób lub algorytm, który grupuje elementy danego zbioru danych (liczb całkowitych dodatnich), aby zminimalizować różnicę między średnimi grupowymi (a nie jak zwykle maksymalizować). Istnieją dwa ograniczenia: 1. Liczba grup nie powinna przekraczać log(N) podstawy 2. N to rozmiar tablicy wejściowej. Załóżmy, że N = 16, zawsze. 2. Wielkość grupy powinna wynosić co najmniej log(N) o podstawie 2. W poniższym przykładzie wielkość grupy powinna wynosić co najmniej 4. Wyszukując w sieci, znalazłem następujący algorytm zachłanny. Zobacz także poniższy przykład. 1. posortuj liczby w kolejności malejącej 2. weź pierwsze K elementów i podziel je na różne grupy. Tutaj K to liczba grup. 3. dla kolejnych (N - K) elementów umieść je w grupie o najniższej sumie. powtarzaj to aż do zakończenia wszystkich liczb. Czy możemy uzyskać lepszy algorytm pod względem złożoności czasowej? Doceniane są wskazówki dotyczące lepszego rozwiązania tego problemu. Przykład: dla tablicy wejściowej = (11, 11, 14, 16, 17, 18, 18, 19, 20, 21, 22, 25, 25, 26, 28, 31) Rozwiązanie: (gdzie sd: odchylenie standardowe, cv : współczynnik zmienności) średnia grupa sd cv (31, 20, 17, 11) 19,8 8,4 0,4 (28, 21, 18, 11) 19,5 7,1 0,4 (26, 21, 19, 14) 20,0 5,0 0,3 (25, 22, 18, 16) 20,3 4,0 0,2


title: Hosting zorientowanej na obraz witryny ASP.NET MVC; jak zachować szybkość?

text: Mam witrynę, która w dużym stopniu opiera się na ciągłym przesyłaniu i przeglądaniu obrazów w wysokiej rozdzielczości. Obecnie jest hostowany wewnętrznie, dzięki czemu wszystko działa szybko. Teraz chcę przenieść witrynę na zewnątrz, ale nie jestem pewien, jak szybko wyświetlać obraz. Ważne jest, aby wiedzieć, że połączenie z lokalizacji wewnętrznej do witryny zewnętrznej jest powolne. Dzięki komunikatorom (RabbitMQ) mogę sprawić, że część wysyłająca będzie działać całkiem ładnie. Nie potrafię rozgryźć części dotyczącej oglądania. Chciałbym, aby podczas przeglądania obrazu najpierw wymagana była wersja lokalna, jeśli nie jest dostępna, zażąda jej z zewnętrznego serwera. Myśli?


title: Rekurencja ogólna do rekurencji ogonowej

text: Czy teoretycznie możliwe jest przekształcenie każdego rodzaju ogólnej rekurencji w rekurencję ogonową? Czy są one równoważne na przykład z punktu widzenia rachunku lambda? To debata między mną a znajomym. Moim zdaniem nie jest to możliwe za każdym razem. Na przykład, jeśli masz funkcję, która wywołuje się rekurencyjnie dwa lub trzy razy, to nie możesz przekształcić wszystkich wywołań rekurencyjnych w wywołania końcowe, prawda? Czy zawsze istnieje sposób na zmniejszenie liczby wywołań rekurencyjnych do jednego wywołania rekurencyjnego?


title: Jak mogę oszacować projekty, gdy muszę uwzględnić krzywą uczenia się dla nowej technologii?

text: Czasami zdarzają się projekty badawczo-rozwojowe, w których nic nie wiadomo z góry o technologii, koncepcjach i kliencie. Jednak menedżer nadal potrzebuje szacowania czasu. Co mogę zrobić, aby uzyskać przydatne szacunki?


title: Czy istnieją publiczne statystyki dotyczące czasu realizacji zadań oprogramowania?

text: Chciałbym lepiej szacować, ile czasu zajmie mi wykonanie zadań. Oceniając rzeczy, o których wiem niewiele, myślę, że najlepiej zacząć od informacji o stawce podstawowej i dostosować ją w oparciu o rzeczy, które _ja_ wiem, zamiast iść na „przeczucie”, które zwykle robię i jest generalnie optymistyczne. Brakuje mi informacji o stawce podstawowej. Czy są dostępne statystyki, które podają typowe idealne koszty roboczogodziny (lub inne wskaźniki) w oparciu o pewne właściwości/właściwości danego zadania? W pewnym kontekście pracuję jako programista w branży gier wideo i mówię o kawałkach pracy, które zwykle zajmują od 2 do 16 godzin, choć czasami ciągną się znacznie dłużej... ;) Zdaję sobie z tego sprawę to wielka prośba, ale od czegoś muszę zacząć! Rzeczy, których już próbowałem: * google – moje wyszukiwane hasła wydają się zbyt ogólne – wiele nietrafnych wyników. * To pytanie \- dotyczy ogólnego oszacowania, w innej domenie. Niezadowalające odpowiedzi.


title: Czy to hybryda interfejsu / kompozycji jest koszerna?

text: Pracuję nad projektem, w którym rozważam użycie hybrydy interfejsów i kompozycji jako jednej _rzeczy_. Mam na myśli to, że klasa container*ee* może być użyta jako front dla funkcjonalności zaimplementowanej w klasie container*er*, gdzie kontener uwidacznia kontener jako własność publiczną. Przykład (pseudokod): class Visibility(lambda doShow, lambda doHide, lambda isVisible) metoda publiczna Show() {...} metoda publiczna Hide() {...} właściwość publiczna IsVisible zdarzenie publiczne Pokazane zdarzenie publiczne Ukryta klasa SomeClassWithVisibility członek prywatny widoczność = new Visibility(doShow, doHide, isVisible) public property Widoczność z get() = widoczność metoda prywatna doShow() {...} metoda prywatna doHide() {...} metoda prywatna isVisible() {...} Są trzy powody, dla których to rozważam: 1. Język, w którym pracuję (F#) ma pewne niedogodności w.r.t. implementowanie interfejsów w sposób, w jaki potrzebuję (chyba, że czegoś mi brakuje), a to pomoże uniknąć wielu szablonowych kodów. 2. Klasy kontenerów można naprawdę uznać za właściwości klas kontenerów; tj. wydaje się, że istnieje dość silny związek. 3. Klasy kontenerów prawdopodobnie zaimplementują kod, który byłby prawie taki sam po zaimplementowaniu we wszystkich klasach kontenerów, więc dlaczego nie zrobić tego raz w jednym miejscu? W powyższym przykładzie obejmowałoby to zarządzanie i emitowanie zdarzeń Shown/Hidden. Czy ktoś widzi jakiś problem z tą metodą Composiface/Intersition lub zna lepszy sposób? **EDYTUJ 2012.07.26** \- Wygląda na to, że trochę podstawowych informacji jest uzasadnione: Tam, gdzie pracuję, mamy kilka front-endów aplikacji, które mają ograniczony dostęp do zasobów systemowych - potrzebują dostępu do tych zasobów, aby w pełni funkcjonować . Aby temu zaradzić, mamy aplikację back-endową, która może uzyskać dostęp do potrzebnych zasobów, z którymi mogą się komunikować front-endy. (Istnieje API napisane dla front-endów, aby uzyskać dostęp do funkcjonalności back-endu tak, jakby był częścią front-endu.) Program back-endu jest nieaktualny i jego funkcjonalność jest niekompletna. Kilka razy przechodził z firmy do firmy i nie możemy go już nawet skompilować. Więc staram się to przepisać w wolnym czasie. Próbuję zaktualizować rzeczy, aby stworzyć ładny (r) interfejs/API dla front-endów (przy jednoczesnym umożliwieniu wstecznej kompatybilności ze starszymi front-endami), mam nadzieję, że coś pełnego dobroci OOPy. Chodzi o to, że nie chcę pisać interfejsu API frontonu po tym, jak napisałem prawie ten sam kod w F# do implementacji zaplecza; więc to, co zamierzam zrobić, to zastosowanie atrybutów do klas/metod/właściwości, dla których chciałbym mieć kod w interfejsie API, a następnie wygenerować ten kod z zestawu F# przy użyciu odbicia. Metoda opisana w tym pytaniu jest możliwą alternatywą, którą rozważam zamiast implementowania prostych interfejsów w klasach w F#, ponieważ są one rodzajem niedźwiedzia: Aby uzyskać dostęp do czegoś z interfejsu, który został zaimplementowany w klasie, musisz trzeba jawnie rzutować instancję tej klasy na typ interfejsu. Byłoby to bolesne podczas odbierania połączeń z front-endów. Jeśli nie chcesz tego robić, musisz wywołać wszystkie metody/właściwości interfejsu _ponownie_ w klasie, poza implementacją interfejsu (która jest oddzielona od zwykłych elementów klasy) i wywołać elementy członkowskie implementacji. To w zasadzie powtarzanie tego samego kodu, czego staram się unikać!


title: Zadeklaruj zmienną jako interfejs

text: Kiedy należy deklarować zmienną jako niestandardowy typ interfejsu, a kiedy nie? Przechodząc przez jakiś kod, musiałem wiedzieć, co się tutaj dzieje: Public Class MyMainProject .... Public Sub DoMyWork() Dim objIMyInterface As IMyInterface .... objIMyInterface = GetReturnObject() End Sub .... End Class Zgodnie z co widziałem, `objIMyInterface` jest używany tylko do jednej rzeczy. Nie wiedziałem, ile klas "implementuje" to, ale w tym kodzie nie ma rzutowania podobnych typów. `objIMyInterface` jest używany jak zwykły typ, a nie anonimowy. Po drugie, moje badania trochę pomogły... `GetReturnObject` zwraca instancję `IMyInterface`. Zwracany obiekt `GetReturnObject` ma oczywiście wywołanie innej metody. Funkcja publiczna GetReturnObject() As IMyInterface Dim retObject As IMyInterface ... retObject = AnotherMethod() ... Return retObject End Function Próbuję więc przejść do `AnotherMethod`, ale jest to projekt bez symboli. Więc po kilku poszukiwaniach znajduję źródło i przechodzę przez nie. Po kilkukrotnym powtórzeniu tego procesu w końcu dochodzę do czegoś takiego: Funkcja publiczna FinalMethod() As IMyInterface Dim FinalObject As MyClassType ... FinalObject = GetMyClassType() ... Return FinalObject Funkcja zakończenia Yay! `GetMyClassType` zwraca `MyClassType`! Idę do tej klasy i oczywiście: Klasa publiczna MyClassType Implementuje IMyInterface ... End Class To, co w końcu odkryłem, to to, że `IMyInterface` nie jest używany przez nic innego poza tą klasą. No biggie, wygląda na to, że wszystko jest w porządku. Ale potem wracam do mojego oryginalnego projektu. Zauważyłem to: Public Class MyMainProject .... Public Sub DoMyWork() Dim objIMyInterface As IMyInterface .... objIMyInterface = GetReturnObject() End Sub .... Public Sub OtherWork() Dim objMyType As MyClassType .... End Sub .... End Class Facet, który to stworzył, już dawno minął, ale chciałbym wiedzieć, co myślisz o której metodzie należy użyć. Czy powinienem zadeklarować oba jako „IMyInterface”? Lub oba jako `MyClassType`? Kod działa dobrze tak czy inaczej.


title: Porady dotyczące wdrażania kontroli wersji w starszych witrynach?

text: Zakładając, że nie masz doświadczenia z systemami kontroli wersji, tylko lokalne tworzenie stron internetowych na żywo. Zostałem wrzucony do kilku starszych projektów witryn internetowych i chcę mieć łatwiejszy i bardziej niezawodny sposób, aby móc szybko wprowadzać i masowo cofać zmiany. Obecnie jestem jedynym programistą w tych projektach, ale w przyszłości może zostać dodanych więcej i myślę, że byłoby korzystne skonfigurowanie systemu, z którego mogą korzystać inni.


title: Domniemana precyzja funkcji zmiennoprzecinkowych

text: Przeglądając implementację funkcji do obliczania rozkładu normalnego rozkładu CDF innego programisty, zasugerowałem, aby albo zastąpić całą implementację wbudowanymi funkcjami Pythona, albo użyć SciPy, wspólnej biblioteki naukowej. Inny programista zauważył, że ani `math.erfc()` ani `scipy.stats.norm.cdf()` nie zapewniają żadnych gwarancji dokładności w swojej dokumentacji. Dlatego powinienem być bardziej ostrożny przy zastępowaniu algorytmu aproksymacyjnego (który został pobrany z szanowanego źródła i który miał udokumentowane granice błędów). Szczerze mówiąc, nigdy nie przyszło mi do głowy, by wątpić w dokładność i precyzję wbudowanej lub bibliotecznej funkcji. W końcu przez lata wywoływałem funkcje takie jak `sin()` i `sqrt()` bez większego zastanowienia — dlaczego `math.erf()` lub `scipy.stats.norm.cdf()` miałyby być jakimikolwiek różne? Ale teraz martwię się. Moje pytania są następujące: 1. Ogólnie rzecz biorąc, jeśli w dokumentacji nie ma specjalnej wzmianki, czy sugeruje się, że tego rodzaju funkcje są całkowicie dokładne do ostatniego miejsca po przecinku, w zakresie precyzji oferowanej przez zmiennoprzecinkowe podwójnej precyzji IEEE? 2. Czy jest to prawdą w szczególności w przypadku `math.erf()` lub `scipy.stats.norm.cdf()` w Pythonie? Jak możesz powiedzieć? 3. Ta strona podręcznika dla `sin()` mówi… > Te funkcje mogą stracić dokładność, gdy ich argument jest bliski wielokrotności > pi lub jest daleki od 0.0. Dlaczego takie zastrzeżenia miałyby istnieć, skoro funkcja sinus jest okresowa i symetryczna? Wydaje się, że na dzwoniącym ciąży ciężar kanonizacji danych wejściowych w celu uzyskania optymalnej dokładności. Z drugiej strony, dokumentacja Mozilli dla `Math.sin()` nie mówi nic o dokładności ani precyzji. Czy to oznacza, że jest w pełni dokładna, czy też jest „powszechną wiedzą”, że `Math.sin()` w JavaScript będzie dokładny tylko w pewnych okolicznościach, jak wszędzie indziej?