title: Scentralizowane i zdecentralizowane mechanizmy logowania

text: Pracowałem z różnymi aplikacjami, zarówno posiadającymi scentralizowane, jak i zdecentralizowane mechanizmy logowania. Uważam, że scentralizowany mechanizm rejestrowania jest dobry, aby zobaczyć prawidłowy przepływ kodu i czas jego wykonania podczas debugowania problemów. Większość implementacji będzie miała mały, stały rozmiar pliku, aby łatwo zawęzić problem. Ale jeśli liczba komponentów w systemie jest zbyt duża, czuję, że katalog dziennika zostanie wyczerpany ogromną liczbą plików. Czy w takich sytuacjach warto stosować zdecentralizowane (modułowe) mechanizmy rejestrowania? Jakie są plusy i minusy tego samego?


title: Najlepsze rozwiązania dotyczące łączenia z ASP.NET do SQL Server?

text: Istnieje kilka różnych sposobów łączenia się z programem SQL Server z aplikacji ASP.NET. Obecnie pracuję nad przebudową środowiska ASP.NET / SQL Server i próbuję dowiedzieć się, którą metodę powinienem wybrać. Oto opcje, które widzę: * Połącz przez identyfikator SQL Server, który jest przechowywany w web.config. Za: proste. Minusy: hasło w web.config; trzeba specjalnie skonfigurować identyfikator SQL Server. * Połącz za pomocą identyfikatora NT użytkownika za pośrednictwem personifikacji ASP.NET. Pro: brak haseł w web.config; szczegółowa kontrola bezpieczeństwa na użytkownika. Wady: obciążenie administracyjne związane z konfiguracją kont użytkowników w SQL Server; Monitorowanie aplikacji SQL Server jest rozproszone na wielu kontach. * Uruchom ASP.NET jako niestandardowy identyfikator NT i skonfiguruj ten identyfikator NT w programie SQL Server. Plusy: łączenie się z SQL Server za pomocą jednego identyfikatora - proste; brak haseł w web.config. Minusy: skomplikowane z punktu widzenia bezpieczeństwa. Trzeba skonfigurować niestandardowe nazwy SPN w usłudze Active Directory na potrzeby uwierzytelniania Kerberos. Czy są inne opcje, których mi brakuje? Która z tych opcji jest używana w jakich sytuacjach? Które są bardziej standardowe? Czy są plusy i minusy, o których nie myślę? Zauważ, że moje założenie jest takie, że użytkownicy uwierzytelniają się za pomocą ASP.NET za pomocą zintegrowanego uwierzytelniania systemu Windows; dotyczy to aplikacji intranetowych.


title: Co powiedziałbyś grupie studentów inżynierii oprogramowania pierwszego dnia w college'u?

text: W następny piątek wygłoszę krótką (30 min.) przemowę z grupą studentów inżynierii oprogramowania, którzy będą studiować na tym samym uniwersytecie, co ja. Trochę kontekstu: * Miejscem jest Montevideo, Urugwaj * Uniwersytet to Universidad de la República (publiczny, bezpłatny uniwersytet) * Program Inżynierii Oprogramowania trwa 5 lat (jeśli jesteś bardzo dobry i nie zaczynasz wcześniej pracy). Około 800 nowych studentów rocznie, około 80 absolwentów rocznie. Warunki są trudne, szczególnie w pierwszych dwóch latach. Większość z nich prawdopodobnie nie ma pojęcia, czym jest inżynieria oprogramowania lub programowanie. Moim celem byłoby dać im w jakiś sposób wyobrażenie o tej dziedzinie i mam nadzieję, że zmotywują ich do znoszenia nadchodzących trudności, aby ostatecznie stać się odnoszącymi sukcesy programistami. Więc pytanie brzmi: co byś powiedział tym ludziom?


title: Płatna i oparta na reklamach aplikacja Windows Phone

text: Chcę zrozumieć, zanim opublikuję swoją aplikację w Windows Phone Marketplace, jaki jest najlepszy sposób na zarabianie na niej. Patrzę na 3 opcje: * Bezpłatna, oparta na reklamach (bez płatnej wersji) * Okres próbny, bez reklam + płatna pełna wersja * Bezpłatna wersja próbna (nieograniczona czasowo), oparta na reklamach + płatna pełna wersja, bez reklam ZRZECZENIE SIĘ: *Wszystkie poniższe pomysły zakładają, że aplikacja jest naprawdę dobra i ludzie jej używają :) Celem jest zarobienie jak największej ilości pieniędzy. Nie jestem wielkim fanem aplikacji opartych na reklamach, ale wydaje mi się, że stały przepływ gotówki z reklam może przynieść więcej pieniędzy na dłuższą metę niż jednorazowa wypłata. Chodzi mi o to, że aby uzyskać więcej pieniędzy z aplikacji płatnej tylko raz, potrzebujesz więcej klientów, podczas gdy oparte na reklamach wymagają tylko korzystania z aplikacji; Oparte na reklamach, w dłuższej perspektywie, mogą generować więcej pieniędzy przy mniejszej, lojalnej bazie użytkowników. Co sądzisz eksperci? Czy inni badali/mają doświadczenie z rzeczywistą kwotą pieniędzy, którą można wygenerować w każdym scenariuszu?


title: Czy możemy zbudować funkcjonalny komputer?

text: Jak papka, jaką zrobiła FP, w końcu wszystkie nasze programy są ustrukturyzowane. Oznacza to, że nie ma znaczenia, jak czyste lub funkcjonalne je wykonamy - zawsze są tłumaczone na montaż, więc to, co faktycznie biegnie za maskami, to instrukcje, stany i pętle. W pewnym sensie naśladujemy FP. Jako sprzętowy noob, moje pytanie brzmi: dlaczego nie używamy architektur komputerowych, które faktycznie obliczają rzeczy w funkcjonalnym stylu? Na przykład komputer może składać się z prymitywnych „układów funkcjonalnych”, takich jak „concat”, „map” i „reduce”, a program po prostu powiedziałby komputerowi, jak przepływać dane między tymi chipami w celu obliczenia pożądanego wyniku , na przykład w językach konkatenatywnych. ![Szkic nonsensu](http://i.stack.imgur.com/7RA0Q.png) To nie ma sensu, ale może ilustrować to, o czym myślę.


title: W Scrumie, jak radzić sobie z rywalizacją/obciążeniem na koniec sprintu

text: Mój zespół zaczął używać Scrum kilka sprintów temu. Nasz projekt polega na budowaniu oprogramowania współpracującego z urządzeniami fizycznymi (pomyśl o robotach i czujnikach), a nasz typowy backlog produktowy to zazwyczaj dodanie urządzenia sterującego do całego systemu. Dzielimy zadanie blisko przykładu tutaj. Każda funkcja integracji urządzenia jest podzielona na kod, testy, testy integracyjne, recenzowanie itp. Oczywiście istnieje kolejność właściwa dla każdego elementu Backlogu Produktu. Zazwyczaj nasze sprinty trwają 2 tygodnie, a zespół liczy od 4 do 6 osób. Pod koniec sprintu napotykamy na 2 problemy: * Pierwszym z nich jest zajęcie wszystkich pod koniec sprintu. * Drugi (powiązany) to rywalizacja w systemie. Kończymy się integracją w ciągu ostatnich kilku dni sprintu. Mamy tylko jeden system integracji, więc ludzie często nie mogą kontynuować pracy nad swoimi zadaniami, ponieważ nie mają dostępu do systemu. Ponieważ jest to koniec sprintu, nie ma wiele pracy do wykonania w backlogu sprintu. Nad czym ci ludzie powinni pracować? Odbieranie elementów z góry rejestru produktu nie jest dobrze odbierane od właściciela produktu, ponieważ bieżące elementy nie są wykonywane. Praca nad długiem technicznym wspomoże projekt jako całość, ale nie pomoże w ukończeniu sprintu. Czy są jakieś najlepsze praktyki dotyczące struktury sprintów, aby uniknąć tych problemów? Wskazówki do negocjacji z właścicielami produktów?


title: Czy można stworzyć i rozpowszechniać aplikację dla BlackBerry Playbook, która nie wchodzi do App World?

text: Moja firma chce stworzyć aplikację, której będziemy używać wewnętrznie na kilku (około 20) BlackBerry Playbooks. Nie chcemy, aby był on umieszczany w App World, ponieważ jest to tylko aplikacja wewnętrzna. Zastanawiam się, czy są jakieś: * Koszty związane z tym, poza płaceniem programiście za jej opracowanie - tj. Czy są jakieś opłaty licencyjne, opłaty za wdrożenie itp. * Problemy licencyjne związane z wdrażaniem aplikacji do wielu Playbooków bez wdrażania jej do Świat aplikacji * Ograniczenia funkcjonalności aplikacji * Inne rzeczy, które powinniśmy wziąć pod uwagę Jeśli ma to znaczenie, aplikacja będzie zbierać informacje i pobierać je na komputer przez USB.


title: Czy wyrażenia regularne to język programowania?

text: Czy w sensie akademickim wyrażenia regularne kwalifikują się jako język programowania? Motywacją do mojej ciekawości jest pytanie SO, które właśnie spojrzałem, które zapytało „czy regex może zrobić X?” i sprawiło, że zacząłem się zastanawiać, co można powiedzieć w sensie ogólnym o możliwych rozwiązaniach z ich wykorzystaniem. W zasadzie pytam "czy wyrażenia regularne Turinga są kompletne"?


title: Jeśli warunek nie jest spełniony: wartość domyślna czy klauzula w przeciwnym razie?

text: Przeszukałem programistów i Stackoverflow i nie mogłem znaleźć satysfakcjonującej odpowiedzi, chociaż jestem pewien, że musiałem o to pytać już wiele razy. Jedyne pytanie, które znalazłem, zawiera odpowiedzi dotyczące tylko czytelności. Poniższe fragmenty kodu pochodzą z rzeczywistego kodu C#, który pisałem. * * * Kiedy mamy do czynienia ze zmienną lokalną, która ma obliczoną wartość, gdy warunek jest prawdziwy, ale w przeciwnym razie jest wartością domyślną, czy: Najpierw ustawię wartość, a następnie zmień wartość, gdy warunek jest prawdziwy? wersja krótka = 1; // <-- ustaw tutaj wartość. if (separator != -1) { wersja = Int16.Parse(filename.Substring(separator + 1)); nazwapliku = nazwapliku.Substring(0, separator); } Lub _nie_ ustawić wartość i dodać else, gdy warunek jest fałszywy? krótka wersja; if (separator != -1) { wersja = Int16.Parse(filename.Substring(separator + 1)); nazwapliku = nazwapliku.Substring(0, separator); } w przeciwnym razie wersja = 1; // <-- ustaw tutaj wartość. Czy programista może mieć błędne oczekiwania w konfrontacji z którymkolwiek z rozwiązań (np. gdy klauzula if jest dość duża, a klauzula else jest daleko poza zasięgiem wzroku)? Czy masz jakieś doświadczenia, w których różnica miała znaczenie? Czy w Twojej firmie obowiązuje jeden konkretny styl i dlaczego? Czy są jakieś techniczne powody, dla których jeden byłby lepszy od drugiego? Pierwszy ustawia zmienną dwukrotnie, ale nie jestem pewien, czy miałoby to znaczenie we współczesnych kompilatorach optymalizujących.


title: Jak nazywa się IntelliSense w świecie innym niż Microsoft?

text: Mówiąc o oprogramowaniu IDE lub o tym, na co pozwala język programowania na poziomie źródłowym, często używam słowa IntelliSense, które ma dokładne znaczenie w świecie Microsoftu, ale jest nieodpowiednie w rozmowach z osobami, które tego nie robią. musisz znać program Visual Studio. W takim przypadku, jakiego terminu należy użyć? Zwykle używam terminu „autouzupełnianie”, ale to nie zawsze działa. W rzeczywistości technologia IntelliSense obejmuje automatyczne uzupełnianie, ale udostępnia również dokumentację i wskazówki.


title: Jak zarabiać pieniądze z mojego FOSS, pozostając anonimowym?

text: Powiedzmy, że: 1. Stworzyłeś projekt FOSS, który inni uznają za przydatny, być może na tyle przydatny, aby przekazać darowiznę lub zapłacić za modyfikacje, które mają zostać wykonane. 2. Jest to całkowicie legalny i nieszkodliwy projekt oprogramowania. Nie ma to nic wspólnego z kryptografią jako amunicją, muzyką p2p lub czymkolwiek, co może prowadzić do nakazu przeszukania lub bycia pozwanym. 3. Chcesz, aby Twoje zaangażowanie pozostało anonimowe lub pseudonimowe. 4. Chciałbyś otrzymać pieniądze za swoje wysiłki, jeśli ludzie są chętni. Czy to możliwe, a jeśli tak, to jak można to zrobić? Kiedy mówię o anonimowości, zdaję sobie sprawę, że konieczne jest określenie zakresu. Nie mówię o 20 warstwach proxy w stylu Wikileaks, wartych anonimowości. Spodziewam się, że trzyliterowa agencja będzie w stanie łatwo zidentyfikować tę osobę. Pożądane jest chronienie przed komercyjnymi konkurentami lub przypadkowymi osobami, od których nie oczekuje się, że będą w stanie skłonić pośrednika finansowego do ujawnienia twoich danych, prosząc o nie. Dlaczego chcesz pozostać anonimowy? Przychodzi mi do głowy kilka ważnych powodów, być może prowadzisz startup w trybie ukrycia i nie chcesz dawać konkurentom wskazówek co do używanej technologii. Może jest to projekt, który nie ma nic wspólnego z twoją codzienną pracą, nie jest tam rozwijany, ale firma, w której pracujesz, ma nieuczciwą (i prawdopodobnie niewykonalną) politykę, mówiącą, że każde kodowanie, które robisz, jest ich własnością. Może po prostu cenisz swoją prywatność. Za to, co jest warte, zamierzasz płacić odpowiednie podatki w swoim kraju od wszelkich darowizn.


title: Jakie są zalety „połączonych” metod Getter/Setter w porównaniu z metodami indywidualnymi?

text:
Nazywam to „połączoną” metodą pobierającą/ustawiającą (z jQuery): var foo = $("
To jest mój HTML
"), myText; mójTekst = foo.tekst(); // myHTML równa się teraz "To jest mój HTML" (Getter) foo.text("To jest nowa wartość"); // Tekst jest teraz równy "To jest nowa wartość") To ta sama logika z oddzielnymi (teoretycznymi) metodami: var foo = $("
To jest mój HTML
"), myText; mójTekst = foo.getTekst(); // myHTML równa się teraz "To jest mój HTML" (Getter) foo.setText("To jest nowa wartość"); // Tekst jest teraz równy "To jest nowa wartość") **Moje pytanie:** Kiedy projektujesz bibliotekę taką jak jQuery, dlaczego miałbyś wybrać pierwszą trasę, a nie drugą? Czy drugie podejście nie jest jaśniejsze i łatwiejsze do zrozumienia na pierwszy rzut oka?


title: Jak przechowywać prostą DB "w chmurze"?

text: Mimo że nazwa jest podobna, moje pytanie nie jest duplikatem bardzo dobrego pytania tutaj: Baza danych w chmurze? Mam serwer WWW (Java/Tomcat) z aplikacją webową (którą napisałem) na serwerze dedykowanym (który sam w pełni skonfigurowałem) i chciałbym, aby teraz używał małej trwałej bazy danych. Wiem, jak zainstalować i skonfigurować bazę danych SQL, np. PostgreSQL: robiłem to już kilka razy. Ale tym razem chciałbym zrobić coś innego. Schemat DB jest bardzo prosty. Tak prosty, że do przechowywania danych wystarczy arkusz kalkulacyjny (kilka kolumn i wiele wierszy). Wzrosłoby tylko o około 2000 wierszy dziennie (a ten wymóg, widziany w źródle danych, nie może się zmienić w przyszłości). (*) Nie chcę instalować PostgreSQL ani żadnej innej bazy danych na moim dedykowanym serwerze: nie chcę zawracać sobie głowy tworzeniem kopii zapasowych/konfiguracją/ponowną instalacją, jeśli przeprowadzam migrację/aktualizację serwera itp., więc chciałbym utrzymuj mój serwer dedykowany tak prostym, jak to tylko możliwe i przechowuj bazę danych gdzieś "w chmurze". Mam na myśli to, że chciałbym, aby Google, Amazon lub ktoś inny zajął się danymi (nie ma nic poufnego) i miał do nich łatwy dostęp. Idealnie powinno być bezpłatne. Oto, o czym myślę w tej chwili: * za każdym razem, gdy pojawiają się nowe dane (od grubego klienta) _a)_ aktualizuję arkusz kalkulacyjny Google Doc za pomocą dostarczonego interfejsu Java API i _b)_ ostrzegam moją aplikację internetową Java, że nowe dane dotarły (mniej więcej raz na 10 minut) * za każdym razem, gdy aplikacja internetowa Java jest uruchamiana i za każdym razem, gdy otrzymuje powiadomienie, że pojawiły się nowe dane, pobiera dane z arkusza kalkulacyjnego Google Doc za pomocą interfejsu Java API. Zaletą jest to, że: * jest bezpłatny * limity arkusza kalkulacyjnego Google Doc wynoszące 400 000 komórek na dokument pozwalają mi mieć jeden arkusz kalkulacyjny na tydzień (na przykład) * baza danych jest przechowywana w chmurze Google, co sprawia, że jest bardzo mało prawdopodobne, abym zgubić * Mogę łatwo wizualizować swoje dane z dowolnego miejsca: mogę po prostu zalogować się do Dokumentów Google i otworzyć arkusz kalkulacyjny I oczywiście nadal mogę tworzyć własne codzienne lub cotygodniowe kopie zapasowe danych (offline na miejscu i online na miejscu na przykład). Nie widzę tutaj żadnych szczególnie trudnych problemów technicznych, ale zastanawiam się, jakie byłyby inne opcje? Jak byś podszedł do przechowywania bardzo prostej bazy danych „w chmurze”? _(*) Jeśli wymagania zmienią się później, zawsze mogę przejść do „prawdziwej” bazy danych, którą zainstaluję na swoim serwerze, ale od tej pory naprawdę chcę mieć moje dane w chmurze_


title: Na ścieżce do Oświecenia: Schemat, Common Lisp, Clojure?

text: Wielu ludzi mądrzejszych ode mnie pisze o tym, że kiedy uczysz się Lisp, stajesz się lepszym programistą, ponieważ „rozumiesz”. Może wszystko, co słyszę o Lispach zmieniających twoje życie, to tylko wielki praktyczny żart dla nowicjuszy, ale uważam, że nie ma nic złego w poznawaniu świata, nawet jeśli dowiem się, że zostałem wysłany po bekasie czy coś . Chciałbym podążać za książką SICP lub ANSI Common Lisp, ale jednocześnie studiować dialekt i implementację, których mógłbym używać w swoich osobistych projektach. SICP skupia się na Scheme, więc to jeden wielki głos. Paul Graham powiedział, że gdyby miał uczyć nowicjuszy, zrobiłby to w Scheme, ale brzmiało to tak, jakby Scheme nadal był gorszy od Common Lisp. Ale jest też Clojure -- które, jak mi powiedziano, jest ograniczone w pewien sposób, ale bardziej praktyczne w innych (biblioteki JVM). Wygląda na to, że mógłbym łatwiej przejść przez materiały Schematu, osiągnąć „prawdziwe” oświecenie od CL lub zbliżyć się wystarczająco blisko z Clojure i być w stanie zrobić z nim więcej na dłuższą metę. Ile z tego jest prawdą? Kiedy powinienem przestać myśleć o tym, czego się nauczyć i po prostu iść i się o tym dowiedzieć?


title: Jaki jest elegancki i OOP sposób tworzenia drzewa z tablic i renderowania go jako zagnieżdżonego UL

text:
Mam szereg tablic, które reprezentują ścieżki systemu plików, więc każda następna wartość jest w rzeczywistości katalogiem głębiej, na przykład: var a1 = ["Pulpit", "Obrazy", "Lato 2011"]; jest odpowiednikiem Desktop |-Pictures |-Summer 2011 Próbuję znaleźć elegancki sposób, aby: 1. Spłaszczyć/scalić wszystkie różne tablice, aby stworzyć jeden obiekt/słownik/tablicę wielowymiarową. 2. Przeanalizuj wynik i wyrenderuj zagnieżdżoną **`UL`** (listę html) na stronie, która poprawnie reprezentuje hierarchię. 3. Napisz co już mam w bardziej 'OOP'.. Mam już działającą wersję: <!DOCTYPE html>

    Dzięki! EDYCJA: Zaczynam od ciągów, które reprezentują ścieżki, tj. „Desktop/Pictures/Summer 2011””, które są podzielone na tablice.


title: Czy JSP jest dobrą alternatywą dla PHP?

text: Zastanawiam się, czy JSP jest bezpieczną alternatywą dla PHP? Niektóre rzeczy, o które się martwię, to użycie procesora, użycie pamięci i bezpieczeństwo.


title: Rozpoczęcie pracy z repozytoriami: czy to jest to, czego potrzebuję, czy są jakieś alternatywy?

text: Jestem samotnym programistą iOS - głównie samoukiem, ale do tej pory stworzyłem kilka udanych aplikacji i potencjalnie zacząłem trochę większe projekty. ## Co chcę zrobić: Ponieważ pracuję teraz nad większymi i bardziej złożonymi aplikacjami, jest kilka rzeczy, które chcę zrobić – z tego, co zbieram, repozytoria są tym, na co powinienem patrzeć. Zasadniczo chcę: * Kopia zapasowa całego mojego kodu online (na razie dropBox działa dobrze) * Pracować nad nowymi funkcjami aplikacji, jednocześnie w jakiś sposób będąc w stanie zaktualizować/naprawić starszą wersję i zastosować zmiany do obu wersji. czy repozytoria są tym, czym powinienem się zająć? Z krótkiego spojrzenia, które miałem, wygląda to na trochę krzywej uczenia się, z tą wadą, że mogę pracować tylko wtedy, gdy dostępne jest połączenie internetowe (czasami nie jest to przypadek). ## Czy istnieje: jakakolwiek alternatywa dla repozytoriów, która osiągnęłaby „rozgałęzienie”/nowe funkcje – np. czy jest jakiś sposób, aby już to osiągnąć za pomocą Xcode i nie polegać na jakimś serwerze? To byłaby łatwiejsza opcja w moim przypadku. Alternatywnie, jeśli nie ma: Jaki system repozytoriów byłby dla mnie najlepszy i najłatwiejszy w użyciu (i prawdopodobnie darmowy!)?


title: Przeciążanie przycisków interfejsu, jakie są najlepsze praktyki?

text: Wyobraź sobie, że zawsze będziesz mieć przycisk „Kontynuuj” w tej samej pozycji w interfejsie graficznym Twojej aplikacji. Czy wolałbyś utworzyć instancję pojedynczego przycisku, która wykonuje różne akcje w zależności od aktualnego stanu? stan prywatny stan bieżący = Stan.Krok1; private ContinueButton_Click() { switch(currentState) { case State.Step1: DoThis(); bieżący stan = Stan.Krok2; przerwanie; case State.Step2: DoThat(); przerwanie; } } A może wolisz coś takiego? public Form() { this.ContinueStep2Button.Visible = false; } private ContinueStep1Button_Click() { DoThis(); this.ContinueStep1Button.Visible = false; this.ContinueStep2Button.Visible = true; } private ContinueStep2Button_Click() { DoThat(); }


title: Zamknięcia JS - Przekazywanie funkcji dziecku, w jaki sposób należy uzyskać dostęp do współdzielonego obiektu

text: Mam projekt i zastanawiam się, jaki jest właściwy sposób dostępu do zmiennych. Zademonstruję na tym przykładzie, ponieważ nie wydaje mi się, żebym mógł go lepiej opisać niż tytuł. * `Term` to obiekt reprezentujący zbiór danych czasowych (powtarzalny czas trwania zdefiniowany przez zbiór atrybutów) * `Term` posiada pewne funkcje drukowania, ale nie implementuje samych funkcji drukowania, raczej są one przekazywane jako anonimowe funkcje rodzica. Byłoby to podobne do tego, w jaki sposób shadery mogą być przekazywane do renderera, a nie definiowane przez renderer. * Kontener (nazwijmy go `Box`) zawiera obiekt `Schedule`, który może rozumieć i używać obiektów `Term`. * `Box` tworzy obiekty `Term` i przekazuje je do `Schedule` zgodnie z wymaganiami. `Box` definiuje również funkcje `print` przechowywane w `Term`. * Funkcja `print` zwykle pobiera argument i używa go do zwrócenia łańcucha na podstawie tego argumentu i wewnętrznych danych `Term`. Czasami jednak funkcja `print` może również wykorzystywać dane przechowywane w `Schedule`. Nazywam te dane `shared`. Tak więc pytanie brzmi, jaki jest najlepszy sposób na dostęp do tych „udostępnionych” danych. Mam wiele opcji, ponieważ JS ma domknięcia i nie jestem wystarczająco zaznajomiony, aby wiedzieć, czy powinienem ich używać, czy ich unikać w tym przypadku. Opcje: 1. Utwórz lokalne "odniesienie" (termin używany lekko) do danych `shared` (dane nie są danymi pierwotnymi) podczas definiowania funkcji `print` poprzez dostęp do danych `shared` poprzez `Schedule` z `Box` . Przykład: var schedule = function(){ var sched = Schedule(); var t1 = Term( function(x){ // Term.print() return (x + sched.data).format(); }); }; 2. Powiąż go wyraźnie z `Term`. (Przekaż to w konstruktorze `Term`'s czy coś takiego). Lub powiąż go w „Schedule” po przekazaniu go przez „Box”. A następnie uzyskaj do niego dostęp jako atrybut „Term”. 3. Przekaż go w tym samym czasie, gdy `x` jest przekazywany do funkcji print (z sched). Jest to najbardziej znany sposób dla mnie, ale nie wydaje mi się to właściwe, biorąc pod uwagę zdolność zamykania JS. 4. Zrób coś dziwnego, jak np. „powiąż” jakiś kontekst i argumenty do „drukowania”. Mam nadzieję, że prawidłowa odpowiedź nie jest czysto subiektywna. Jeśli tak, to chyba odpowiedź brzmi po prostu „rób wszystko, co działa”. Ale czuję, że istnieją pewne znaczące różnice między podejściami, które mogą mieć duży wpływ, gdy zostaną rozciągnięte poza mój mały przykład. **Edytuj** Zamieszczę rozwiązanie, którego używam, ale nadal z zadowoleniem przyjmę krytykę: Wszystkie funkcje `print` przyjmują jako argumenty wszystko, czego `term` nie posiada. W ten sposób `term` nie jest w żaden sposób sprzężony z `schedule` (oczywiście `schedule` nadal jednak zależy od `term`). Pozwala to na inicjowanie/konstruowanie `term` w dowolnym miejscu bez konieczności znajomości harmonogramu. Tak więc, jeśli `term` ma funkcję `init()`, może przyjąć obiekt, który wygląda mniej więcej tak: { inc: moment.duration(1,"d"), period: 3, class: "long", text :"Weekly", pRange: moment.duration(7,'d'), //*...other attr*// printInc: function(increments,period){ return moment(this.start).add(this. inc.product(przyrosty) .add(ta.przerwa początkowa)) .add(ta.pRange.product(okres)) .format(DATEDISPLAYFORMAT); }, printLabel: function(datetime){ return (datetime).format(DATEDISPLAYFORMAT); } } Gdzie inkrementacja, okres, data i godzina byłyby przekazywane z tego, co używa metod drukowania term (w tym przypadku harmonogram).


title: Kiedy testowanie typu jest OK?

text: Zakładając język z pewnym nieodłącznym bezpieczeństwem typów (np. nie JavaScript): Biorąc pod uwagę metodę, która akceptuje `SuperType`, wiemy, że w większości przypadków możemy ulec pokusie wykonania testów typu, aby wybrać akcję: public void DoSomethingTo(SuperType o) { if (o isa SubTypeA) { o.doCośA() } else { o.doCośB(); } } Powinniśmy zwykle, jeśli nie zawsze, utworzyć pojedynczą, nadrzędną metodę na `SuperType` i zrobić to: public void DoSomethingTo(SuperType o) { o.doSomething(); } ... gdzie każdy podtyp ma własną implementację `doSomething()`. Reszta naszej aplikacji może wtedy nie wiedzieć, czy dany `SuperType` jest naprawdę `SubTypeA` czy `SubTypeB`. Wspaniale. Ale nadal otrzymujemy operacje typu `is a` w większości, jeśli nie we wszystkich, językach bezpiecznych dla typów. A to sugeruje potencjalną potrzebę jawnego testowania typu. **Więc, w jakich sytuacjach, jeśli w ogóle, _powinniśmy_ lub _musimy_ przeprowadzać testy typu jawnego?** Wybaczcie moje roztargnienie lub brak kreatywności. Wiem, że robiłem to już wcześniej; ale szczerze to było tak dawno temu, że nie pamiętam, czy to, co zrobiłem, było dobre! A w ostatnich czasach nie sądzę, że napotkałem _potrzebę_ testowania typów poza moim kowbojskim JavaScriptem.


title: MVC, kiedy rozdzielić kontrolery?

text: Zaczynam od MVC i mam pytanie dla początkujących. Jakie byłyby kryteria logiczne określające, co powinien obejmować kontroler? Załóżmy na przykład, że witryna zawiera sekcję „pomoc”. Jest tam kilka opcji, takich jak: „o nas”, „instrukcje zwrotu”, „skontaktuj się z nami”, „możliwości zatrudnienia”. Każdy z nich będzie wtedy dostępny, np. „mysite.com/help/aboutus”, „mysite.com/help/returns”, „mysite.com/help/contactus” itd. Moje pytanie brzmi, czy powinienem mieć kontroler „help” który ma „o nas”, „zwroty”, „skontaktuj się z nami”, „zatrudnienie” jako działania z odpowiednim widokiem, czy też każdy z nich powinien być innym zestawem kontroler-działanie-widok? Jaki powinien być tok rozumowania, aby określić, kiedy oddzielić kontrolerów?


title: Jak zaimplementować lepsze zabezpieczenia w Linuksie?

text: Po prostu badam bezpieczeństwo i kontrolę platformy Linux w porównaniu z Androidem. W Androidzie wydaje się, że nastąpił ogromny rozwój w zakresie bezpieczeństwa - aplikacje muszą prosić o uprawnienia systemowe, a jeśli użytkownik przyzna je, system pozwala tej aplikacji na działanie z przyznanymi uprawnieniami. To nie jest tak na waniliowym Linuksie. Aplikacje mogą uzyskiwać dostęp do wszystkiego, co chcą, aczkolwiek nie zezwalając im na modyfikowanie plików, ale mimo to. Użytkownicy po prostu nie wiedzą, jak działają aplikacje i jakie informacje - poufne informacje - pobierają i co z nimi robią (przesyłają je do bazy danych i sprzedają stronom trzecim). Więc o co chodzi? Wyobrażam sobie, że jądro Linuksa musi zostać zmodyfikowane, aby akceptowało tokeny dostępu na podstawie aplikacji lub coś podobnego. Windows ma przynajmniej jakiś system bezpieczeństwa z wbudowaną zaporą ogniową i usługą władz lokalnych. (Niewiele wiem o systemie Windows.)


title: Dlaczego średniki i przecinki są zamienione w pętlach for?

text: W wielu językach (szeroka lista, od C do JavaScript): * przecinki `,` oddzielne argumenty (np. `func(a, b, c)`), a * średniki `;` oddzielne instrukcje sekwencyjne (np. `instrukcja1; instrukcja2 ; instrukcja3'). Dlaczego więc to mapowanie jest odwrócone w tych samych językach dla **pętli for** : for ( init1, init2; condition; inc1, inc2 ) { instrukcja1; instrukcja2; } zamiast (co wydaje mi się bardziej naturalne) for (init1; init2, warunek, inc1; inc2 ) { instrukcja1; instrukcja2; } ? Oczywiście, „for” nie jest (zazwyczaj) funkcją, ale argumenty (tj. „początek”, „warunek”, „przyrost”) zachowują się bardziej jak argumenty funkcji niż sekwencja instrukcji. Czy jest to spowodowane względami historycznymi / konwencją, czy też istnieje dobre uzasadnienie dla zamiany `,` i `;` w pętlach?


title: Algorytm Cohena-Sutherlanda

text: Czytałem algorytm Cohena-Sutherlanda na Wikipedii i jestem zdezorientowany w tych dwóch częściach, int ComputeOutCode(double x, double y) { ... if (x < xmin) code |= LEFT; else if (x > xmax) kod |= PRAWY; if (y < ymin) kod |= DOL; else if (y > ymax) kod |= TOP; ... } i if (outcodeOut & TOP) { // punkt znajduje się nad prostokątem klipu x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0); y = ymaks; } else if (outcodeOut & BOTTOM) { // punkt znajduje się poniżej prostokąta klipu x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0); y = ymin; } else if (outcodeOut & RIGHT) { // punkt znajduje się na prawo od prostokąta przycinania y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0); x = xmaks; } else if (outcodeOut & LEFT) { // punkt znajduje się na lewo od prostokąta przycinania y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0); x = xmin; } Jestem zdezorientowany, w jaki sposób obsługuje punkty, które są w lewym górnym rogu, w prawym górnym rogu itp. Po prostu obsługuje górę, lewo, prawo i dół. Po co używać `|` w `code |= LEFT;` i `outcodeOut & TOP` w `if-else` poniżej? Wiem, że ci dwaj jakoś radzą sobie ze wszystkimi 8 możliwymi przypadkami, ale nie wiem jak.


title: Jak najlepiej zabezpieczyć się przed zerem przekazanym do parametrów std::string?

text: Właśnie zdałem sobie sprawę z czegoś niepokojącego. Za każdym razem, gdy pisałem metodę, która akceptuje `std::string` jako parametr, otwierałem się na niezdefiniowane zachowanie. Na przykład to... void myMethod(const std::string& s) { /* Zrób coś z s. */ } ...można nazwać tak... char* s = 0; moja metoda(y); ...i nic nie mogę zrobić, aby temu zapobiec (o czym jestem świadomy). Więc moje pytanie brzmi: jak ktoś się przed tym broni? Jedyne podejście, które przychodzi mi do głowy, to zawsze napisać dwie wersje dowolnej metody, która akceptuje `std::string` jako parametr, na przykład: void myMethod(const std::string& s) { /* Zrób coś. */ } void mojaMetoda(char* s) { if (s == 0) { throw std::exception("Null przeniesiony."); } else { mojaMetoda(ciąg(i)); } } Czy jest to powszechne i/lub akceptowalne rozwiązanie? **EDYTUJ:** Niektórzy wskazywali, że jako parametr powinienem przyjąć `const std::string& s` zamiast `std::string s`. Zgadzam się. Zmodyfikowałem post. Nie sądzę jednak, żeby to zmieniało odpowiedź.


title: Jak podszedłbyś do nauczania programowania internetowego dla nastolatków?

text: Otrzymałem zadanie zbudowania 8-godzinnego programu pracy, który ma na celu nauczenie nastolatków (12-15) podstaw tworzenia stron internetowych. Nie wiem, od czego zacząć tak wielki temat. Nie jestem nawet pewien, jaki powinien być cel. Wszelkie wskazówki byłyby świetne.


title: C++ silnie wpisane typedef

text: Próbowałem wymyślić sposób deklarowania silnie typizowanych typedefów, aby wyłapać pewną klasę błędów na etapie kompilacji. Często jest tak, że wpisuję int do kilku typów identyfikatorów lub wektor do pozycji lub prędkości: typedef int EntityID; typedef int IDModelu; typedef Vector3 Pozycja; typedef Prędkość Vector3; Może to uczynić intencję kodu bardziej jasną, ale po długiej nocy kodowania można popełnić głupie błędy, takie jak porównywanie różnych rodzajów identyfikatorów lub dodanie pozycji do prędkości. identyfikator podmiotu eID; ID modelu mID; if ( eID == mID ) // <- Kompilator nie widzi nic złego { /*błąd*/ } Pozycja p; Prędkość v; Pozycja nowaP = p + v; // błąd, oznaczał p + v*s ale kompilator nie widzi nic złego Niestety, sugestie jakie znalazłem dla silnie typowanych typedefów obejmują użycie boost, co przynajmniej dla mnie nie jest możliwe (mam co najmniej c++ 11 ). Więc po krótkim zastanowieniu wpadłem na ten pomysł i chciałem go przez kogoś pokierować. Najpierw deklarujesz typ podstawowy jako szablon. Jednak parametr template nie jest używany do niczego w definicji: template < nazwa_typu T > class IDType { unsigned int m_id; public: IDType( unsigned int const& i_id ): m_id {i_id} {}; znajomy operator logiczny==<T>( IDType<T> const& i_lhs, IDType<T> const& i_rhs ); }; Funkcje zaprzyjaźnione w rzeczywistości muszą być zadeklarowane do przodu przed definicją klasy, co wymaga deklaracji do przodu klasy szablonu. Następnie definiujemy wszystkie składowe typu bazowego, pamiętając tylko, że jest to klasa szablonu. Wreszcie, kiedy chcemy go użyć, wpisujemy go jako: class EntityT; typedef IDType<EntityT>EntityID; klasa Model T; typedef IDType<ModelT> IDModelu; Typy są teraz całkowicie oddzielne. Funkcje, które przyjmują EntityID, zgłoszą błąd kompilatora, jeśli zamiast tego spróbujesz podać im ModelID, na przykład. Oprócz konieczności deklarowania typów bazowych jako szablonów, z problemami z tym związanymi, jest również dość kompaktowy. Miałem nadzieję, że ktoś miał uwagi lub krytykę tego pomysłu? Jedną z kwestii, która przyszła mi do głowy podczas pisania tego, na przykład w przypadku pozycji i prędkości, było to, że nie mogę konwertować między typami tak swobodnie, jak wcześniej. Gdzie przed pomnożeniem wektora przez skalar dałoby inny wektor, więc mógłbym zrobić: typedef float Czas; typedef Vector3 Pozycja; typedef Prędkość Vector3; Czas t = 1,0f; Pozycja p = {0,0f}; Prędkość v = { 1.0f, 0.0f, 0.0f}; Pozycja nowaP = p + v*t; Z moim silnie wpisanym typedef musiałbym powiedzieć kompilatorowi, że mnożenie prędkości przez czas skutkuje pozycją. klasa Czas T; typedef Float<CzasT> Czas; klasa PozycjaT; typedef Wektor3<PozycjaT> Pozycja; klasa Prędkość T; typedef Vector3<VelocityT> Prędkość; Czas t = 1,0f; Pozycja p = {0,0f}; Prędkość v = { 1.0f, 0.0f, 0.0f}; Pozycja nowaP = p + v*t; // Błąd kompilatora Aby rozwiązać ten problem, myślę, że musiałbym wyraźnie wyspecjalizować każdą konwersję, co może być trochę kłopotliwe. Z drugiej strony to ograniczenie może pomóc w zapobieganiu innym rodzajom błędów (np. pomnożenie prędkości przez odległość, co nie miałoby sensu w tej dziedzinie). Jestem więc rozdarty i zastanawiam się, czy ludzie mają jakieś opinie na temat mojego pierwotnego problemu lub mojego podejścia do jego rozwiązania.


title: Jak odróżnić stare i nowe dane w kolekcjach szkieletowych?

text: Częstym wzorcem, z którym się spotykam, jest kolekcja szkieletowa, która jest początkowo pobierana z bazy danych. Jednak użytkownik może również dodać do kolekcji. Gdy użytkownik doda do kolekcji, powinno to zostać odzwierciedlone w bazie danych. Zwykle wiązałbym jakiś rodzaj wywołania serwera ze zdarzeniem `add` kolekcji. Jeśli jednak to zrobię, wezwanie zostanie wykonane nawet podczas początkowego siewu. Chcę tylko, aby była wywoływana na _nowych_ danych. Jaki jest właściwy sposób rozwiązania tego problemu?


title: logika biznesowa: po stronie klienta a po stronie serwera

text: Powiedzmy, że 3-5 lat temu (mniej więcej) n-warstwowa aplikacja po stronie serwera - a niektóre javascript/html/CSS dla interfejsu użytkownika były podstawowym podejściem do tworzenia stron internetowych. Obecnie widzimy, że tradycyjny paradygmat tworzenia stron internetowych bardzo się zmienia. Z każdym dniem widziałem coraz więcej aplikacji, które nie mają strony serwera w tradycyjny sposób. Po prostu korzystają z niektórych usług (usługi danych, usługi uwierzytelniania itp.), Ale logika biznesowa jest umieszczona po stronie klienta. Również wiele frameworków javascript tworzy już dla uproszczenia programowania według takiego modelu (Angular, Backbone, itp.) Jakie są główne zalety i wady nowego modelu w porównaniu z tradycyjnym podejściem?


title: Co mam zrobić, gdy lider mojego zespołu łamie schemat mojej bazy danych w związku z nadchodzącym wydaniem?

text: Lider mojego zespołu ma ten okropny zwyczaj grzebania w schemacie bazy danych i wprowadzania zmian, które mogą spowodować poważne uszkodzenia bazy kodu (bez rzeczywistej konsultacji ze mną, jak zmiany wpłyną na bazę kodu). Normalnie po prostu bym z tym żyła, ale mamy termin za 2 tygodnie i dzieje się tak odkąd zacząłem półtora miesiąca temu. Zostałem sprowadzony, aby przyspieszyć rozwój projektu. Ze względu na termin, w którym pracuję już ponad 60 godzin tygodniowo, i tak naprawdę nie mam energii, aby sobie z tym poradzić (próbowałem już na kilka sposobów). Jesteśmy tylko 2 osobowym zespołem, a poza tym, że codziennie zmieniamy bazę danych, nie wniósł on wiele w sensie faktycznego rozwoju (kodowania). Obecnie czuję, że wykonuję całą pracę, plus muszę „naprawić” to, co zepsuł swoimi zmianami. Jak sobie z tym radzić? Rozmawiałem już z naszym menedżerem o jego braku wysiłku w dziale rozwoju. Jest tam 6 miesięcy dłużej niż ja, ale napisałem 95% kodu, po wykluczeniu piątej potworności w bazie danych normalnej postaci, którą „przyczynił”. Jakieś sugestie? **Pośmiertne:** W piątek rozmawialiśmy z menedżerem i przedstawiłem swoje zmartwienia. Doprowadziło to do niewielkiej konfrontacji, ale ogólnie czułem, że kierownik jest po mojej stronie. Więc przynajmniej mamy teraz zamrożone dane, zobaczmy, jak to będzie odtąd.


title: Dlaczego Clojure zaniedbuje zasadę jednolitego dostępu?

text: Moje tło to Ruby, C#, JavaScript i Java. A teraz uczę się Clojure. To, co sprawia, że czuję się nieswojo w tym ostatnim przypadku, to to, że idiomatyczne Clojure wydaje się zaniedbywać zasadę jednolitego dostępu (wiki, c2), a zatem do pewnego stopnia również enkapsulację, sugerując użycie map zamiast pewnego rodzaju „struktur” lub „klas”. . Czuję się jak krok do tyłu. A więc kilka pytań, jeśli ktoś poinformował: * Z jakimi innymi decyzjami/problemami projektowymi było to sprzeczne i dlaczego uznano je za mniej ważne? * Czy miałeś te same obawy i jak to się skończyło, gdy zmieniłeś język domyślnie obsługujący UAP (Ruby, Eiffel, Python, C#) na Clojure?


title: Jak zintegrować lokalne środowiska programistyczne z centralnym rozwiązaniem SSO?

text: Mamy jednostronicową aplikację internetową i nową witrynę logowania jednokrotnego (również naszą własną) korzystającą z OAuth2 i chcemy ją podłączyć. W naszych wdrożeniach produkcyjnych/stagingowych/CI łatwo jest wszystko podłączyć. Na przykład: * w środowisku produkcyjnym będziemy mieli `https://app.company.com` dostęp do naszego punktu zaplecza prod do `https://sso.company.com` dla auth i odwrotnie * w CI będziemy mieli „https://app.ci.company.com” uzyskaj dostęp do naszego zaplecza programistycznego i wskaż „https://sso.ci.company.com” w celu uwierzytelnienia. Kiedy pracujemy nad aplikacją, uzyskujemy dostęp do niej lokalnie na coś takiego jak `http://localhost:8000/` i wskazuje na udostępniony backend deweloperski. W przeszłości używaliśmy go po prostu do samodzielnego uwierzytelniania w backendzie deweloperskim (pobieranie danych uwierzytelniających użytkownika końcowego i przesyłanie ich), ale chcielibyśmy, aby był on podłączony do korzystania z logowania jednokrotnego do uwierzytelniania. Pojawia się pytanie, jak możemy to zrobić bez konieczności konfigurowania i niestandardowej konfiguracji własnej usługi logowania jednokrotnego przez każdego programistę, który chce rozwijać się lokalnie. W szczególności, czy możemy użyć współdzielonego logowania jednokrotnego dev/CI i czy wskazywać na nasze lokalne wdrożenia? **Rozważyliśmy:** * Użyj pliku proxy/pliku hostów i ustaw `http(s)://sso.ci.company.com` wskazujący `http(s)://localhost:8000` . Obciąża nas to konfiguracją HTTPS lokalnie lub kierowaniem SSO do adresu URL innego niż HTTPS. Również konfiguracja jest trochę uciążliwa. * Czy nasza lokalna aplikacja przekierowuje do logowania jednokrotnego z argumentem identyfikującym samą siebie, a logowanie jednokrotne używa go, aby wiedzieć, gdzie przekierować. Na przykład przekieruj do `https://sso.ci.company.com/?appUrl=localhost:8000`. To zmusza nas do wciśnięcia otwartego przekierowania w SSO, które musielibyśmy wyłączyć na potrzeby produkcji i jest to trochę „dziwne”, ale działa i można je umieścić w czarnej skrzynce w aplikacji. * Po prostu uruchom SSO lokalnie na każdym urządzeniu deweloperskim. W zasadzie nie jest to rozwiązanie, ponieważ wymagałoby to wielu ustawień, aby dostać się do skryptu „jedno urządzenie, które może uruchomić wszystko”, a to neguje jedną z naszych cennych obecnie zalet, ponieważ w zasadzie wszystko, co musisz zrobić, to sprawdzić wypisz kod w dowolnym systemie i uruchom go. Widziałem to już wcześniej powszechnie (często na maszynach wirtualnych deweloperów); Chciałbym tylko zbadać opcje, do których jesteśmy potencjalnie bliżej. Czy istnieje rozwiązanie tego rodzaju problemu lub aspektów naszych pomysłów, których jeszcze nie rozważaliśmy?


title: Chcę trywialnego przykładu tego, gdzie MongoDB może się skalować, ale relacyjna baza danych będzie miała problem

text: Dopiero uczę się korzystać z MongoDB i podczas dyskusji z innymi programistami chciałbym podać szybki przykład, dlaczego NoSQL może być dobrym wyborem w porównaniu z tradycyjnym RDBMS - jednak scenariusze, które wymyślę i które mogę znaleźć w Internecie, wydają się dość wymyślne. Np. blog z dużym ruchem może być reprezentowany relacyjnie, ale będzie wymagał pewnego dostrojenia wydajności i złączeń między tabelami (zakładając, że używana jest pełna denormalizacja). Podczas gdy MongoDB pozwoliłoby na bezpośrednie pobieranie z jednej kolekcji z tym samym skutkiem. Ale odpowiedź, którą otrzymuję od innych programistów, brzmi: „dlaczego nie zachować relacji relacyjnej, a później dodać trochę trywialnego buforowania?” Czy ktoś ma mniej wymyślny przykład, w którym MongoDB naprawdę zabłyśnie, a relacyjna baza danych przewróci się znacznie szybciej? Im mniejszy projekt/system, tym lepiej, ponieważ pozostawia mniej miejsca na spory. Przydałoby się coś na wzór złożoności bloga. Dziękuję.


title: Strukturyzacja plików zasobów

text: W .NET mamy pliki zasobów, które świetnie nadają się do udostępniania tłumaczeń w całej aplikacji. W przeszłości widziałem, jak te pliki zasobów rozrastają się w monolityczne, niemożliwe do utrzymania listy słów i fraz. Jaki jest najlepszy sposób, aby tego uniknąć? * Pojedynczy plik zasobów dla całej aplikacji? Jest łatwy do przetłumaczenia, ma bardzo mało duplikatów, ale rozrasta się do niewiarygodnych rozmiarów * Plik zasobów na projekt, co ma tę zaletę, że utrzymuje zasoby i kod razem, rozkłada plik, ale stwarza znacznie większą szansę na duplikaty między plikami. * Wiele małych plików. Na przykład plik zasobów na projekt w BLL/Dal i jeden na obszar/widok w interfejsie użytkownika (przyjmijmy MVC). Mając w przeszłości problemy z utrzymaniem ogromnych plików zasobów, kusi mnie trzecia opcja. Aby utworzyć pojedynczą separację na kontroler/logiczną na poziomie interfejsu użytkownika. Chociaż może to kosztować więcej w tłumaczeniu (i prowadzić do większej liczby duplikatów), będzie znacznie łatwiejsze w utrzymaniu. Czy istnieje inne lub zalecane podejście do obsługi plików zasobów w większych aplikacjach?


title: Komentarze "// ..." na końcu bloku kodu po } - dobre czy złe?

text: Często widziałem, jak takie komentarze są używane: function foo() { ... } // foo while (...) { ... } // while if (...) { ... } // if a czasami nawet jeśli (warunek) { ... } // if (warunek) Nigdy nie rozumiałem tej praktyki i dlatego nigdy jej nie stosowałem. Jeśli twój kod jest tak długi, że musisz wiedzieć, czym jest to zakończenie `}`, być może powinieneś rozważyć podzielenie go na osobne funkcje. Ponadto większość narzędzi programistycznych jest w stanie przejść do pasującego nawiasu. I wreszcie ostatnia jest dla mnie wyraźnym naruszeniem zasady DRY; jeśli zmienisz warunek, będziesz musiał pamiętać, aby zmienić również komentarz (w przeciwnym razie może to być bałagan dla opiekuna, a nawet dla ciebie). Dlaczego więc ludzie tego używają? Czy powinniśmy go używać, czy to zła praktyka?


title: Wdrażanie aplikacji internetowych

text: **Tło** Opracowałem więc system zamówień i śledzenie zamówień dla organizacji. Obecnie działa w oparciu o przeglądarkę internetową z planami stworzenia aplikacji mobilnej oraz aplikacji desktopowej. Model biznesowy to ekskluzywne członkostwo, w którym rejestrujesz się, aby móc dystrybuować swoje produkty po niższej cenie niż inni konkurenci. EDYCJA: Aby wyjaśnić, że jest obecnie rozwijany przy użyciu Yii Framework dla PHP, ale mam podstawową, uproszczoną wersję w PHP bez użycia frameworka. Nadal jest w środowisku programistycznym, żaden kod nie jest jeszcze dostępny. **Pytanie** Jaki (Twoim zdaniem lub zdaniem branży) najskuteczniejszy sposób rozpowszechniania tej aplikacji wśród członków? Ewentualnie na każdym z etapów rozwoju (takich jak dystrybucja aplikacji webowej, desktopowej czy mobilnej).


title: Jak napisać algorytm liniowo-rytmiczny?

text: > Napisz pseudokod, aby określić liczbę par wartości w pliku wejściowym > które są równe. Jeśli twoja pierwsza próba jest kwadratowa, pomyśl jeszcze raz i opracuj > rozwiązanie liniowe. Znalazłem to pytanie w podręczniku i nie jestem pewien, jak napisać ten algorytm. Domyślałem się na początku, aby zapisać to według wzoru nC2 = (n(n+1))/2. Każda pomoc jest mile widziana.


title: JavaFX 2.0 vs Qt dla wieloplatformowej aplikacji autonomicznej

text: Potrzebuję porady od was programistów, którzy zajmują się aplikacjami wieloplatformowymi (w szczególności programami z GUI). Wkrótce będę tworzyć aplikację, która musi być wieloplatformowa, dlatego przeprowadziłem wstępne badania na dwóch różnych frameworkach: JavaFX 2.0 i Qt. Szczerze, obydwa pasowałyby bardziej niż do moich potrzeb. Więc wtedy zadałem sobie pytanie, dlaczego miałbym wybrać jedno nad drugie (SPOILER ALERT: nie znam odpowiedzi :P ). Wiem, że JavaFX 2.0 jest raczej nowa (stan na 2012 r.) i nie jest w pełni obsługiwana na różnych platformach, ale w końcu tak się stanie. Pytanie, które stawiam, brzmi: którego z nich użyjesz w przypadku aplikacji wieloplatformowej i jakie kryteria uwzględniłeś przy podejmowaniu tej decyzji? Dziękuję za poświęcenie czasu na przeczytanie tego! :)


title: Rozpoczęcie rozwoju medycznego

text: Chciałbym zacząć kodować dla technik medycznych, takich jak Echokardiogramy 3D i inne technologie obrazowania i oparte na czujnikach. Jestem w porządku z aspektem kodowania i projektowania, ale czy są jakieś zasoby dotyczące znajdowania szpitali lub organizacji poszukujących tej technologii, czy po prostu musisz wysyłać list za listem do biura biznesowego różnych szpitali?


title: Hosting własnej usługi Git?

text: Zastanawiałem się, czy dałoby się zainstalować usługę git do użytku przez mały zespół. Czy byłaby możliwa instalacja w sieci prywatnej/lokalnej, czy też bardziej praktyczne byłoby zainstalowanie przez sieć internetową (np. domena strony internetowej). Dzięki i proszę wskazać mi właściwy kierunek, ~Daniel


title: Implementacja ogólnego wykresu listy sąsiedztwa

text: Próbuję wymyślić przyzwoitą implementację grafu Listy sąsiedztwa, abym mógł zacząć pracować z wszelkiego rodzaju problemami grafowymi i algorytmami, takimi jak komiwojażer i inne problemy... Ale nie wydaje mi się, aby wymyślić przyzwoitą implementację. Dzieje się tak prawdopodobnie dlatego, że próbuję odkurzyć pajęczyny z mojej klasy struktur danych. Ale to, co mam do tej pory... i jest to zaimplementowane w Javie... jest w zasadzie klasą edgeNode, która ma typ ogólny i wagę - w przypadku, gdy wykres jest rzeczywiście ważony. public class edgeNode<E> { private E y; prywatna waga int; //... pobierające i ustawiające oraz konstruktory... } Mam klasę grafu, która ma listę krawędzi, wartość liczby wierzchołków i wartość int dla krawędzi, a także wartość logiczną określającą, czy lub nie jest skierowany. Pojawia się moje pierwsze pytanie, jeśli wykres jest rzeczywiście skierowany, czy nie powinienem mieć wartości w mojej klasie edgeNode? A może musiałbym po prostu dodać kolejne wierzchołki do mojej LinkedList? To by sugerowało, że graf skierowany jest 2X tak duży jak graf nieskierowany, prawda? public class graph { private List<edgeNode<?>> edge; prywatne int nVertices; prywatne krawędzie int; prywatny, kierowany boolowski; //... gettery i settery oraz konstruktory... } Wreszcie czy ktoś ma standardowy sposób inicjowania tam grafu? Myślałem o czytaniu w pliku rozdzielanym potokami, ale tak jest 1997. Wykres publiczny GenereateGraph (kierowany boolean, plik String) { List<edgeNode<?>> krawędzie; wykres g; try{ int liczba = 0; Linia sznurka; FileReader input = new FileReader("C:\\Users\\derekww\\Documents\\JavaEE Projects\\graphFile"); BufferedReader bufRead = nowy BufferedReader(wejście); linia = bufRead.readLine(); liczyć++; krawędzie = new ArrayList<edgeNode<?>>(); while(linia != null){ linia = bufRead.readLine(); Obiekt edgeInfo = line.split("|")[0]; int waga = Integer.parseInt(line.split("|")[1]); edgeNode<String> e = new edgeNode<String>((String) edge.add(e); } return g; } catch(Exception e){ return null; } } Myślę, że kiedy dodaję krawędzie, jeśli boolean jest prawdziwe I dodałby drugą krawędź. Jak dotąd wszystko zależy od pliku, który piszę. Więc jeśli napisałem plik z następującymi wierzchołkami i wagami... Buffalo | 18 br Pittsburgh | 20 br New York | 15 br DC | 45 br Oczywiście wczytałbym je do mojej listy krawędzi, ale jak mogę reprezentować jeden wierzchołek połączony z drugim... tak dalej... Potrzebuję przeciwnych wierzchołków? Powiedzmy, że przedstawiałem autostrady połączone z każdym miastem ważone i nie -directed (każda krawędź jest dwukierunkowa z wagami w jakiejś fikcyjnej jednostce odległości)... Czy moja implementacja byłaby najlepszym sposobem na to?Znalazłem ten samouczek online Graph Tutorial, który ma obiekt łącznika.Wydaje mi się, że jest to kolekcja wierzchołki wskazujące na siebie. Więc miałbyś A i B, każde z wagami itd., i dodałbyś to do listy i tej listy złączy do swojego wykresu... To wydaje mi się nieco kłopotliwe i trochę lekceważące koncepcję listy sąsiedztwa? Czy się mylę i to jest nowatorskie rozwiązanie? Wszystko to jest inspirowane podręcznikiem projektowania algorytmów Steve'a Skiena. Co muszę powiedzieć, jak dotąd jest całkiem niezłe. Dzięki za wszelką pomoc, której możesz udzielić.


title: Skąd mam wiedzieć, czy konkretna kompilacja zawiera określoną zmianę kontroli wersji?

text: Powiedzmy, że mam kompilację. Muszę wiedzieć, czy w tej kompilacji znajduje się konkretna lista zmian/zatwierdzenie. Jak rozwiązałbym ten problem? Przychodzi mi do głowy kilka możliwych podejść: 1) Dodaj numer listy zmian do pliku binarnego, abym mógł zajrzeć gdzieś w GUI i wiedzieć, jaki jest numer listy zmian. Następnie mogę użyć tych informacji, aby określić, czy interesująca mnie zmiana znajduje się w tej kompilacji. 2) Oznacz kontrolę wersji przy użyciu jakiegoś ciągu, który jednoznacznie identyfikuje tę kompilację. Jakiego unikalnego ciągu mam użyć? Czy któryś z tych dwóch jest lepszy? Czy istnieją inne lepsze podejścia? Rozwiązanie musiałoby działać zarówno w przypadku kompilacji Mac, jak i Windows.


title: Czy (nad)używanie refleksji to zły nawyk?

text: Czy dobrą praktyką jest używanie refleksji, jeśli znacznie zmniejsza się ilość kodu wzorcowego? Zasadniczo istnieje kompromis między wydajnością i być może czytelnością z jednej strony, a abstrakcją/automatyzacją/redukcją kodu wzorcowego z drugiej strony. Edycja: Oto przykład zalecanego użycia refleksji. Jako przykład załóżmy, że istnieje klasa abstrakcyjna `Base`, która ma 10 pól i 3 podklasy `SubclassA`, `SubclassB` i `SubclassC` każda z 10 różnymi polami; wszystkie są prostymi fasolami. Problem polega na tym, że otrzymujesz dwa referencje typu `Base` i chcesz sprawdzić, czy odpowiadające im obiekty są tego samego (pod)typu i są równe. Jako rozwiązania istnieje rozwiązanie surowe w którym najpierw sprawdzasz czy typy sąrówne a następnie sprawdzasz wszystkie pola lub możesz użyć refleksji i dynamicznie sprawdzićczy sątego samego typu i iterować po wszystkich metodach zaczynających się od "get" (konwencja nad konfiguracją), wywołaj je na obu obiektach i wywołaj równe wyniki. wartość logiczna porównaj(Podstawa podstawowa1, podstawa, podstawa2) { if (instancja podstawowa1podklasy A && wystąpienie podstawowa2podklasyA) { PodklasaA podklasaA1 = (PodklasaA) podstawa1; PodklasaA podklasaA2 = (PodklasaA) podstawa2; porównaj(podklasaA1, podklasaA2); } else if (instancja base1PodklasyB && base2instancjaPodklasyB) { //ta sama } //boilerplate } wartość logiczna(SubclassA subA1, SubclassA subA2) { if (!subA1.getField1().equals(subA2.getField1)) { return fałszywy; } if (!subA1.getField2().equals(subA2.getField2)) { return false; } //boilerplate } boolean Compare(PodklasaB podklasaB1, PodklasaB podB2) { //boilerplate } //boilerplate //alternatywa z odbiciem boolowskie porównanie(baza podstawowa1, podstawa podstawowa2) { if (!base1.getClass().isAssignableFrom(base2. getClass())) { System.out.println("nie to samo"); System.wyjście(1); } Method[] method = base1.getClass().getMethods(); wartość logiczna isOk = prawda; for (Metoda metoda : metody) { końcowy String nazwaMetody = method.getName(); if (nazwaMetody.startsWith("get")) { Obiekt obiekt1 = method.invoke(base1); Object object2 = method.invoke(base2); if(obiekt1 == null || obiekt2 == null) { kontynuuj; } if (!object1.equals(object2)) { System.out.println("nie jest równy, ponieważ " + obiekt1 + " nie jest równy " + obiekt2); isOk = fałsz; } } } if (jest OK) { System.out.println("jest OK"); } }


title: Książka Entity Framework dla początkujących

text: Wziąłem książkę Julii Lerman 1. wydanie: Entity Framework book 1. wydanie Zacząłem to czytać i było całkiem nieźle, ale zastanawiam się, czy jest jeszcze książka o wyższym poziomie dla EF? Z tego, co czytałem w pierwszym wydaniu, było to dość techniczne. Szukam książki na naprawdę wysokim poziomie. Prawie jak prekursor książki Julii (wydanie drugie). Czy są jakieś osoby, które ta grupa poleciłaby?


title: Cyklomatyczne zakresy złożoności

text: Jakie są kategorie złożoności cyklomatycznej? Na przykład: 1-5: łatwe do utrzymania 6-10: trudne 11-15: bardzo trudne 20+: zbliżanie się niemożliwe Od lat zakładam, że 10 to granica. A wszystko poza tym jest złe. Analizuję rozwiązanie i próbuję określić jakość kodu. Z pewnością złożoność cyklomatyczna nie jest jedyną miarą, ale może pomóc. Istnieją metody o złożoności cyklomatycznej 200+. Wiem, że to okropne, ale ciekawi mnie dolne zakresy, jak w moim przykładzie powyżej. Znalazłem to: > Wyżej wymienione wartości referencyjne Carnegie Mellon definiują cztery przybliżone > zakresy dla wartości złożoności cyklomatycznej: > > * metody od 1 do 10 są uważane za proste i łatwe do zrozumienia > * wartości od 10 do 20 wskazują na bardziej złożony kod, który może nadal być > zrozumiałe; jednak testowanie staje się trudniejsze ze względu na większą > liczbę możliwych gałęzi, które kod może przyjąć > * wartości 20 i wyższe są typowe dla kodu z bardzo dużą liczbą > potencjalnych ścieżek wykonania i mogą być w pełni uchwycone i przetestowane tylko z > świetnie trudność i wysiłek > * metody idą jeszcze wyżej, np. > 50, są z pewnością nie do utrzymania > Podczas uruchamiania metryk kodu dla rozwiązania, wyniki są zielone dla wartości poniżej 25. Nie zgadzam się z tym, ale miałem nadzieję uzyskać inne dane wejściowe. Czy istnieje ogólnie akceptowana lista zakresów dla złożoności cyklomatycznej?


title: Testowanie jednostkowe w świecie „bez setera”

text: Nie uważam się za eksperta DDD, ale jako architekt rozwiązań staram się stosować najlepsze praktyki, gdy tylko jest to możliwe. Wiem, że toczy się wiele dyskusji wokół zalet i wad „stylu” rozgrywającego w DDD bez (publicznego) setera i widzę obie strony sporu. Mój problem polega na tym, że pracuję w zespole o dużej różnorodności umiejętności, wiedzy i doświadczenia, co oznacza, że nie mogę ufać, że każdy programista zrobi wszystko we „właściwy” sposób. Na przykład, jeśli nasze obiekty domeny są zaprojektowane w taki sposób, że zmiany stanu wewnętrznego obiektu są wykonywane przez metodę, ale zapewniają ustawienia właściwości publicznych, ktoś nieuchronnie ustawi właściwość zamiast wywoływać metodę. Użyj tego przykładu: public class MojaKlasa { public Boolean IsPublished { get { return PublishDate != null; } } public DateTime? Data opublikowania { get; ustawić; } public void Publish() { if (IsPublished) throw new InvalidOperationException("Już opublikowano."); DataOpublikowania = DataGodzina.Dzisiaj; Podnieś(nowe WydanieOpublikowane()); } } Moje rozwiązanie polegało na uczynieniu ustawiaczy właściwości prywatnymi, co jest możliwe, ponieważ ORM, którego używamy do uwadniania obiektów, wykorzystuje odbicie, dzięki czemu jest w stanie uzyskać dostęp do prywatnych ustawiaczy. Stanowi to jednak problem podczas próby pisania testów jednostkowych. Na przykład, gdy chcę napisać test jednostkowy, który weryfikuje wymaganie, że nie możemy ponownie opublikować, muszę wskazać, że obiekt został już opublikowany. Z pewnością mogę to zrobić, wywołując dwukrotnie Publish, ale mój test zakłada, że Publish jest poprawnie zaimplementowana dla pierwszego wywołania. To wydaje się trochę śmierdzące. Zróbmy scenariusz trochę bardziej realny za pomocą następującego kodu: public class Document { public Document(String title) { if (String.IsNullOrWhiteSpace(title)) throw new ArgumentException("title"); Tytuł = tytuł; } public String ApprovedBy { get; zestaw prywatny; } public DateTime? Zatwierdzono w dniu { get; zestaw prywatny; } public Boolean IsApproved { get; zestaw prywatny; } public Boolean IsPublished { get; zestaw prywatny; } public String Opublikowany przez { get; zestaw prywatny; } public DateTime? Opublikowano w dniu { get; zestaw prywatny; } public String Title { get; zestaw prywatny; } public void Approve(String by) { if (IsApproved) wyrzuć nowy InvalidOperationException("Już zatwierdzono."); Zatwierdzony przez = przez; ApprovedOn = DataGodzina.Dzisiaj; IsApproved = prawda; Podnieś (nowe zdarzenie zatwierdzone (tytuł)); } public void Publish(String by) { if (IsPublished) throw new InvalidOperationException("Już opublikowano."); if (!IsApproved) wyrzuć nowy InvalidOperationException("Nie można publikować do momentu zatwierdzenia."); Opublikowane przez = przez; OpublikowaneW dniu = DataGodzina.Dzisiaj; IsPublished = prawda; Raise(nowe Wydanie Opublikowane(Tytuł)); }{ dostęp do ustawiaczy, nie mogę doprowadzić obiektu do stanu potrzebnego do wykonania testów. Otwarcie dostępu do ustawiaczy jest sprzeczne z celem uniemożliwienia dostępu. Jak rozwiązujesz ten problem?


title: Jak oznaczyć wymagania oprogramowania?

text: Jaka jest dobra strategia oznaczania wymagań oprogramowania w SRS? Zazwyczaj numeracja konspektu jest stosowana w nagłówkach - ale zmienią się one, jeśli do dokumentu zostanie wstawiony nowy nagłówek. Wydaje mi się, że dobrym pomysłem jest dążenie do bardziej stabilnego oznaczenia dla każdego wymagania oprogramowania. Powinno to ułatwić odwoływanie się do konkretnego wymagania nawet w obliczu zaktualizowanego SRS. Jakie są twoje doświadczenia w tej sprawie?


title: Czy Silverlight5 zapewnia coś nowego dla WCF?

text: Z punktu widzenia WCF, zastanawiasz się, czy mogę coś wykorzystać po uaktualnieniu z „Silverlight 4” do „Silverlight 5”? Zrobiłem kilka badań dotyczących nowych funkcji `SL5` i nie mogę znaleźć niczego o zmianach w przestrzeniach nazw `System.ServiceModel` i `System.ServiceModel.Web`, czy to prawda, że nic nie zostało dodane, czy czegoś mi brakuje? **Moje pytania:** * Czy nastąpiły jakieś zmiany w WCF w Silverlight 5? * Jeśli tak, czy nastąpiły jakieś zmiany w odpytywaniu dupleksowym w HTTP?


title: Mam złą pamięć. Czy język dynamicznego pisania + vim jest dla mnie odpowiedni?

text: Na kilka miesięcy przechodzę z C#+Visual Studio na Ruby+Vim. **Jedyną** rzeczą, której brakuje mi w C#/Visual Studio, jest **intellisense** , zwłaszcza gdy mam nowy klejnot rubinowy do zapoznania się. Jako programista z pamięcią poniżej średniej, jak Joel, tęsknię za szczęśliwym czasem w Visual Studio, w którym mogę wszędzie `Ctrl`+`Spacja` uzyskać listę wskazówek, dzięki czemu nie muszę zapamiętywać jednej metody, czy to nazwa, czy lista parametrów. Mogę nawet uzyskać kod użycia/przykładu w witrynie MSDN, naciskając tylko klawisz „F1”. Tak więc, ruby(dynamiczny język pisania)+vim/TextMate programiści, kiedy kodujesz Czy używasz podręcznika API google/gem/irb/ri obok swojego vima/TextMate, tak jak ja przez większość czasu? lub Dobra pamięć jest koniecznością dla programistów ruby (lub innego języka dynamicznego)?


title: Jakiego oprogramowania używasz do planowania pracy zespołowej i dlaczego?

text: Planowanie jest bardzo trudne. Nie jesteśmy z natury dobrzy w szacowaniu własnej przyszłości, a wiele błędów poznawczych pogłębia problem. Planowanie grupowe jest jeszcze trudniejsze. Trudność pogłębiają niekompletne informacje, niespójne poglądy na sytuację i problemy z komunikacją. Metody zwinne zapewniają jedną strukturę do organizowania planowania grupowego — czyniąc planowanie widocznym dla wszystkich (historie użytkowników), dzieląc je na mniejsze części (sprinty) i zapewniając analizę retrospektywną, dzięki czemu możesz lepiej planować. Jednak znalezienie dobrych narzędzi wspierających te praktyki okazuje się trudne. Jakich narzędzi programowych używasz do osiągnięcia tych celów? Dlaczego używasz tego narzędzia? Jakie sukcesy odniosłeś** z konkretnym narzędziem?


title: Dlaczego pięciu filozofów kulinarnych?

text: Zastanawiałem się, dlaczego problem filozofów Dining opiera się na przypadku pięciu filozofów. Dlaczego nie cztery? Przypuszczam, że wszystkie nieprzyjemne kwestie, które mogą się pojawić przy omawianiu przykładu pięciu filozofów, możemy zaobserwować także wtedy, gdy mamy do dyspozycji czterech myślicieli. Czy to tylko z powodów historycznych?


title: Czy programowanie w filozofii UNIX to to samo, co programowanie funkcjonalne?

text: Środowisko programistyczne UNIX (klasyczny tekst) stwierdza, że podejście UNIX do programowania polega na budowaniu małych, dobrze zdefiniowanych narzędzi, które można łączyć w celu rozwiązywania bardziej złożonych problemów. Podczas nauki C i powłoki Bash odkryłem, że jest to potężna koncepcja, która może być wykorzystana do radzenia sobie z szerokim zakresem problemów programistycznych. Po prostu przy użyciu platformy Linux koncepcja jest dość jasna i używana przez cały czas. Każde wyrażenie utworzone w wierszu poleceń, które przekierowuje I/O, łącząc narzędzia systemowe, takie jak ls, grep, i tak dalej, pokazuje, jak potężny jest ten koncept. Rzeczą, która mnie dezorientuje, jest to, że wiele z tych programów jest napisanych w C, przy użyciu imperatywnego/proceduralnego stylu programowania, ale sposób, w jaki są one używane i łączone w wierszu poleceń, wydaje mi się bardziej jak programowanie funkcjonalne, w którym każdy program jest izolowana funkcja, która nie zależy od stanu żadnego innego programu, do którego może być dołączona. Czy to trafne, zrozumienie filozofii programowania UNIX jest w zasadzie programowaniem funkcjonalnym przy użyciu narzędzi, które mogły zostać zbudowane przy użyciu imperatywnego stylu programowania?


title: Kto jest właścicielem napisanego przeze mnie kodeksu, jakie mam prawa w stosunku do pracodawcy

text: To jest pytanie prawne z mieszaniem kodu, który napisałem w swoim własnym czasie, z kodem, za który otrzymywałem wynagrodzenie dla pracodawcy. Jestem zatrudniona w firmie na umowę o pracę i otrzymuję wynagrodzenie godzinowe. To jest w Ontario w Kanadzie, na wypadek, gdyby miało to wpływ na sprawy. Pracowałem nad projektem dla mojego pracodawcy i w tym projekcie włączyłem kod, który napisałem wcześniej w moim domu w innym projekcie (jako że wprost posiadam kod). Mój kod jest teraz ściśle powiązany z projektem w pracy (ponieważ bez niego nie będzie działał). Czasami musiałem wprowadzić zmiany w moim oryginalnym kodzie, aby działał z moim projektem roboczym, a ponieważ otrzymuję wynagrodzenie godzinowe za swój czas, technicznie otrzymuję wynagrodzenie za pracę nad własnym kodem. Ale skoro mi za to zapłacono, czy mój pracodawca jest teraz technicznie właścicielem tego kodu? Załóżmy, że jutro opuszczę tę firmę, czy muszę zostawić swój kod źródłowy? Nie mówię, że zrobiłbym to, ale czy nadal zachowam wyłączne i nieograniczone prawa do mojego oryginalnego kodu?


title: Czy Entity Framework jest odpowiedni dla witryn internetowych o dużym natężeniu ruchu?

text: Czy Entity Framework 4 to dobre rozwiązanie dla publicznej witryny internetowej z potencjalnie 1000 trafień na sekundę? W moim rozumieniu EF jest realnym rozwiązaniem dla głównie mniejszych lub intranetowych witryn internetowych, ale nie skalowałby się łatwo dla czegoś takiego jak popularna witryna społecznościowa (wiem, że SO używa LINQ to SQL, ale... Chciałbym więcej przykładów/dowodów. ..) Teraz stoję na rozdrożu wyboru czystego podejścia ADO.NET lub EF4. Czy uważasz, że zwiększona produktywność deweloperów dzięki EF jest warta utraty wydajności i szczegółowego dostępu do ADO.NET (z procedurami składowanymi)? Jakiekolwiek poważne problemy, z którymi może się zmierzyć witryna o dużym ruchu, czy korzystała z EF? Z góry dziękuję.


title: Jak uzasadnić posiadanie jednego (lub więcej) programistów mobilnych na platformę?

text: W pracy spotkałem się z sytuacją, w której muszę uzasadnić, dlaczego potrzebuję jednego (lub więcej) programistów mobilnych na platformę. Chociaż zdaję sobie sprawę z tego, dlaczego (każda platforma jest zasadniczo inna, ma swoją własną filozofię itp.), nie mogę wymyślić czegoś więcej. Czy są jakieś artykuły, które mogę przeczytać, a nawet książki, które dostarczą mi twardych danych o zaletach?


title: Czy aplikacja może sprawdzać automatyczne aktualizacje w odstępach krótszych niż 20 godzin?

text: Mam aplikację desktopową, która ma możliwość automatycznej aktualizacji przy kolejnym restarcie (bez zgody użytkownika - ale to już zupełnie inna sprawa). Zakładając, że użytkownik nigdy nie zauważyłby niczego związanego z aktualizacją aplikacji (takiego jak pasek postępu lub wyskakujące okienko wymagające ponownego uruchomienia) i że nasz serwer obsługiwałby ładowanie spamu żądań, czy jest jakiś powód, dla którego nie powinien sprawdzać aktualizacji w mniej niż 20 godzin przerwy? Powodem, dla którego o to pytam, jest to, że wszystkie znane mi aplikacje, które mają możliwość automatycznej aktualizacji, sprawdzają aktualizację co 20 do 24 godzin i podczas uruchamiania. Zastanawiałem się tylko, czy istnieje zasada etyczna, czy po prostu ze względu na ryzyko przeciążenia serwera.


title: Jakich technik użyłbyś w aplikacji internetowej Java nowej generacji?

text: Pracuję w witrynie podobnej do Foursquare i Yelp, z około 100000 unikalnych żądań każdego tygodnia, które generują zawartość, która stale rośnie. Obecnie używamy: * Seam jako framework webowy Java. * MySQL jako DB * Hibernate jako ORM * Hibernate Search jako indeks * EhCache do buforowania. Ponieważ nasza strona powoli wyrasta z obecnej konfiguracji i ma dużo starszego kodu, nadszedł czas, abyśmy zaczęli myśleć o poważnej konfiguracji refaktoryzacji/zmiany. 1. Framework webowy Nie jesteśmy gotowi na zmianę języka, ale skłaniamy się ku Spring Web Framework, ponieważ: * Szew już nie istnieje. * Prawie każdy z nas pracował ze Springiem i polubił to. 2. DB i ORM Zrobiliśmy mały research i myślimy o MongoDB. 3. Indeks Czy musimy mieć osobny indeks, jeśli korzystamy z MongoDB? 4. Pamięć podręczna ? Więc moje pytanie brzmi po prostu: Jeśli weźmiesz pod uwagę Spring Web Framework i MongoDB, jaka byłaby dobra konfiguracja dla aplikacji internetowej, która się rozwija i obsługuje wielu zalogowanych użytkowników generujących dane wejściowe i wykonujących wyszukiwania? **EDYTUJ** Chciałbym podziękować wszystkim za poświęcenie czasu na udzielenie mi odpowiedzi, ale odpowiedź, której szukam, powinna być bardziej konkretna: „Wybieramy Spring jako naszą platformę internetową i **Freemarker** jako nasz język szablonów, ponieważ freemarker jest szybki.... Jeśli używasz **MongoDB**, nie będziesz potrzebować osobnego indeksu do wyszukiwania geograficznego, ponieważ **MongoDB** obsługuje zapytania oparte na lokalizacji od razu po zainstalowaniu... Bardzo dobrym rozwiązaniem dla tej konfiguracji jest pamięć podręczna.... W moim poprzednim projekcie wybraliśmy **Apache Solr** jako naszą platformę wyszukiwania, ponieważ to rozwiązało problem z szybkimi aktualizacjami..." Dziękuję // Jakob


title: Ponowne otwarcie błędu w porównaniu z nowym

text: Błąd został otwarty, naprawiony, zweryfikowany i zamknięty. Miesiąc później pojawił się ponownie w kolejnej wersji po kilku iteracjach bez żadnej regresji. Zakładając, że charakterystyka błędu jest taka sama, czy **otworzyłbyś** ponownie istniejący identyfikator błędu, czy też **nowy** z linkiem do zamkniętego błędu?


title: W obliczu problemów z jakością

text: Oprogramowanie do zarządzania pracownikami ma złożony graficzny interfejs użytkownika (na przykład wartości na stronie zależą od stanu (zamknięte lub otwarte) innych stron). Tylko najnowsze i prawie przeszłe opracowania mają zasięg testowy. Podczas naszego ostatniego wydania otrzymaliśmy wiele błędów od klienta pomimo 2 tygodni testowania Sprint. Nie mamy dedykowanego zespołu testowego. Deweloperzy przeprowadzają test jednostkowy i test akceptacji użytkownika. Codziennie uruchamia automatyczny test regresji. Obawiam się, że programiści nie testują całego przepływu pracy, ponieważ jest czasochłonny i nie jest w stanie go zautomatyzować ze względu na jego złożoność. Jakieś sugestie? Starszy kod (15 lat rozwoju) ma mniejszy zasięg kodu. Jak mogę poprawić jakość? Uwaga: teraz nie można zatrudnić testerów do niezależnego zespołu testowego.


title: Którą metodologię rozwoju dla programisty solo na 1 miesięczny projekt?

text: Dostałem zadanie samodzielnego projektu, aby zbadać i rozwiązać wycieki pamięci w 8000 linijkach kodu JavaScript. Przewiduję, że projekt potrwa do miesiąca. Proszę polecić metodologię rozwoju, której mogę użyć do ustrukturyzowania moich działań. Wolisz coś lekkiego i łatwego do odebrania i biegania. Dziękuję


title: Co miał na myśli Alan Perlis, jeśli chodzi o sposoby pisania programów bez błędów?

text: Oto cytat Alana J. Perlisa, który mówi: > Są dwa sposoby na pisanie programów bez błędów; tylko trzeci działa. Niedawno usłyszałem ten cytat od mojego przyjaciela i nie byłem w stanie zrozumieć głębszego jego znaczenia. O czym mówi tutaj Perlis?


title: Jak przekonać członka zespołu, który uważa się za seniora, do nauczenia się podstaw koncepcyjnych SVN?

text: Na początek tego lata objąłem nowe stanowisko programisty i zostałem najnowszym członkiem zespołu, ale z największym doświadczeniem na koncie. Do tej pory udało mi się przeforsować inicjatywy dotyczące zdrowego rozsądku wystarczająco łatwo ze względu na niskie koszty przyjęcia (pod względem czasu i wysiłku). Jednak sytuacja nieco się poprawiła. Jeden z moich kolegów z drużyny, choć doświadczony, tak naprawdę nie rozumie SVN. Naturalnie, puste obszary na jego mentalnej mapie przedstawiające oceany SVN powodują, że przyjmuje dość dziwne wzorce użytkowania. Na przykład zadeklarował politykę „1 zatwierdzenie SVN dziennie na programistę”, ponieważ w przeciwnym razie „serwerowi wkrótce zabraknie miejsca na dysku”. Kiedy wyjaśniłem mu, że commity SVN to delty, a nie pełne kopie, odpowiedział z powątpiewaniem i nawet dzisiaj nie jestem do końca pewien, czy rozumie, co to znaczy. Mieliśmy również gorący spór o to, czy włączyć konfigurację Eclipse `.project` do SVN. Mój kolega z drużyny nalegał, że powinniśmy, chociaż spowodowało to wiele bezsensownych konfliktów. Byłem przeciwny utrzymywaniu indywidualnych plików konfiguracyjnych programistów w SVN. Ostatecznie okazało się, że mój kolega z zespołu miał praktykę ponownego sprawdzania całego drzewa źródłowego po każdym zatwierdzeniu, aby upewnić się, że "kod wprowadzony do repozytorium działa". To był powód, dla którego był tak nieugięty w utrzymywaniu konfiguracji projektu w SVN - aby łatwo było ponownie zaimportować projekt. Kiedy wyjaśniłem, że commit synchronizuje kopię roboczą ze zdalnym bajt po bajcie, co sprawia, że ponowne sprawdzanie jest niepotrzebne, mój kolega z zespołu ponownie odpowiedział z wątpliwościami i ostatecznie odrzucił cały problem jako nieistotny. Moim zdaniem nasz zespół marnuje czas, rozwiązując konflikty SVN w plikach konfiguracyjnych projektu, które zawierają tylko ustawienia specyficzne dla programisty, które w ogóle nie muszą być udostępniane SCM. Cały ten bałagan, ponieważ ktoś dostosował proces do błędnych założeń. Jak przekonać członka zespołu, który uważa się za seniora, aby lepiej zrozumiał podstawy SVN?


title: Jak obliczyć „Zasoby ludzkie/wysiłek” dla projektu programistycznego?

text: jako kierownik projektu lub CTO, jak obliczyć „czas” potrzebny do opracowania systemu oprogramowania? Na przykład byłbym odpowiedzialny za stworzenie dużej aplikacji internetowej w Javie, MySQL, HTML, JSF. Jak poprawnie obliczyć, ile czasu to zajmie? Wymagania wstępne: Nie znam zespołu, który wykona tę pracę (więc nie mogę ich zapytać, jak długo mogą potrzebować). Nie robiłem wcześniej takich obliczeń. Jestem w tej roli zupełnie nowy. Ale mam bardzo podstawowe/nieznaczne podstawy programowania... Również wszelkie dobre zasoby (=linki) lub odpowiedzi są bardzo mile widziane.


title: Czy powinienem używać apletów Java czy JavaScript/PHP, aby moja witryna była bardziej interaktywna?

text: Mam stronę o elektronice. Chcę zrobić kilka funkcjonalnych kalkulatorów, takich jak obliczenia dla filtrów analogowych, które będą musiały pokazywać wiele wykresów i tego typu rzeczy. To jest próbka tego, czego szukam i oczywiście jest to tylko PHP i jego funkcje graficzne. Chcę mieć coś podobnego, ale o wiele bardziej interaktywnego z suwakami w czasie rzeczywistym i podobnymi rzeczami. Po co mam się udać? Aplety Java? lub trzymać się JavaScript/PHP? Pytam o to, bo ja za pomocą Javy mogę to zrobić znacznie szybciej (znam to lepiej niż JavaScript i PHP). Ale obawiam się niezgodności przeglądarek, opcji bezpieczeństwa dla apletów i podobnych rzeczy. Co sugerujesz?


title: Jaka jest różnica między metodami zachłannymi a hamiltonowskimi?

text: Biorąc pod uwagę _T={CTAGC, GAGCG, AGCGG, CGGAG}_ , używając algorytmu zachłannego, superciąg _S_ będzie miał postać _CTAGCGGAGCG_. Od `S` kombinacja trójek będzie podana jako _s = {CTA, TAG, **AGC** , **GCG** , CGG, GGA, GAG, **AGC** , **GCG** } _. Oba _GCG_ i _AGC_ są powtarzane. Jeśli użyjesz _s_ do pobrania superciągu za pomocą metody Hamiltona, czy powtórzone słowa zostaną użyte, czy pominięte? Jeśli powtórzone słowo zostanie pominięte, odtworzone _CTA_ , _TAG_ , _AGC_ , _GCG_ , _CGG_ , _GGA_ i _GAG_ zmienią się w _GTAGCGGAGC_. Tak więc w końcu zarówno metoda zachłanna, jak i hamiltonowska dadzą różne wyniki w superstrunie. Dlaczego są różne? W moich badaniach wszystkie znalezione przeze mnie przykłady pokazały, że w kombinacji nie ma powtarzających się słów, więc jeśli zrekonstruuję superstrunę metodą hamiltonowską, wynik metody zachłannej i hamiltonowskiej będzie taki sam. Ale co z powtarzającymi się słowami?


title: Czy to jest antywzór?

text: Często widziałem to w naszym przestarzałym systemie w pracy - funkcje, które działają mniej więcej tak: bool todo = false; if(warunek1) { ... // dużo kodu tutaj if(warunek2) todo = true; ... // inny kod tutaj } if(todo) { ... } Innymi słowy, funkcja składa się z dwóch części. Pierwsza część wykonuje jakieś przetwarzanie (potencjalnie zawiera pętle, efekty uboczne itp.), a po drodze może ustawić flagę "todo". Druga część jest wykonywana tylko wtedy, gdy ustawiono flagę „todo”. Wydaje się, że jest to dość brzydki sposób robienia rzeczy i myślę, że większość przypadków, na których zrozumienie poświęciłem czas, można by zmienić, aby uniknąć używania flagi. Ale czy jest to prawdziwy anty-wzorzec, zły pomysł, czy też całkowicie akceptowalny? Edycja: Pierwsza oczywista refaktoryzacja polegałaby na podzieleniu jej na dwie metody. Jednak moje pytanie dotyczy bardziej tego, czy kiedykolwiek istnieje potrzeba (w nowoczesnym języku OO) utworzenia zmiennej flagi lokalnej, potencjalnie ustawiając ją w wielu miejscach, a następnie używając jej później do podjęcia decyzji, czy wykonać następny blok kodu.


title: Jak mogę wprowadzić nową technologię do mojego zespołu?

text: Pracuję w kilku zespołach żyjących w przeszłości i staram się wprowadzić je do nowych technologii, takich jak ASP.NET MVC2. Jakie są dobre sposoby na wprowadzenie nowej technologii w pozytywnym świetle?


title: Dlaczego niektórzy programiści uważają, że istnieje kontrast między teorią a praktyką?

text: Porównując inżynierię oprogramowania z inżynierią lądową, z zaskoczeniem zauważyłem inny sposób myślenia: każdy inżynier budownictwa wie, że jeśli chcesz zbudować małą chatkę w ogrodzie, możesz po prostu zdobyć materiały i je zbudować, a jeśli chcesz zbudować 10-piętrowy dom (lub np. coś takiego) trzeba trochę policzyć, żeby mieć pewność, że się nie rozpadnie. W przeciwieństwie do tego, rozmawiając z niektórymi programistami lub czytając blogi lub fora, często spotykam się z powszechną opinią, którą można sformułować mniej więcej w następujący sposób: _teoria i metody formalne są dla matematyków/naukowców, podczas gdy programowanie polega bardziej na wykonywaniu zadań_. Zwykle sugeruje się tutaj, że programowanie jest czymś bardzo praktycznym i że chociaż metody formalne, matematyka, teoria algorytmów, czyste/spójne języki programowania itp. mogą być interesującymi tematami, często nie są potrzebne, jeśli chce się tylko ** załatwiać sprawy**. Zgodnie z moim doświadczeniem powiedziałbym, że o ile nie potrzeba wiele teorii, aby złożyć 100-wierszowy skrypt (chata), to do opracowania złożonej aplikacji (budynek 10-piętrowy) potrzebny jest ustrukturyzowany projekt, cóż - zdefiniowane metody, dobry język programowania, dobre podręczniki, w których można znaleźć algorytmy itp. Tak więc IMO (właściwa ilość) **teoria** jest jednym z narzędzi do **załatwiania spraw**. Moje pytanie brzmi: dlaczego niektórzy programiści uważają, że istnieje kontrast między teorią (metodami formalnymi) a praktyką (załatwianie spraw)? Czy inżynieria oprogramowania (budowanie oprogramowania) jest postrzegana przez wielu jako **łatwa** w porównaniu, powiedzmy, do inżynierii lądowej (budowa domów)? A może te dwie dyscypliny naprawdę się różnią (oprócz oprogramowania o znaczeniu krytycznym, awaria oprogramowania jest znacznie bardziej akceptowalna niż awaria budynku)? **EDYTUJ** Dzięki za wszystkie odpowiedzi i zainteresowanie tym tematem. Uprzejmie proszę o nie zamieszczanie nowych odpowiedzi, jeśli nie trzeba dodawać uwagi, która nie została jeszcze ukryta w istniejących odpowiedziach. Dlatego prosimy o uważne przeczytanie wszystkich odpowiedzi przed opublikowaniem nowych. Próbuję podsumować to, co zrozumiałem z dotychczasowych odpowiedzi. 1. W przeciwieństwie do inżynierii oprogramowania, w inżynierii lądowej jest znacznie jaśniejsze, jaka ilość teorii (modelowanie, projektowanie) jest potrzebna do określonego zadania. 2. Wynika to częściowo z faktu, że inżynieria lądowa jest tak stara jak ludzkość, podczas gdy inżynieria oprogramowania istnieje tylko od kilku dekad. 3. Innym powodem jest fakt, że oprogramowanie jest bardziej zmiennym rodzajem artefaktu, z bardziej elastycznymi wymaganiami (może ulec awarii), różnymi strategiami marketingowymi (dobry projekt można poświęcić, aby szybko wprowadzić go na rynek), itd. W konsekwencji dużo trudniej jest określić, jaka odpowiednia ilość projektu/teorii jest odpowiednia w inżynierii oprogramowania (za mało -> niechlujny kod, za dużo -> nigdy nie mogę dokończyć), ponieważ nie ma ogólnej zasady i tylko (duże) doświadczenie może pomóc. Więc jeśli poprawnie zinterpretuję twoje odpowiedzi, ta niepewność dotycząca **ile** teorii jest naprawdę potrzebna, przyczynia się do mieszanych uczuć miłości/nienawiści, które niektórzy programiści mają do teorii.


title: Czy ktoś może polecić dobry zestaw robota do nauki programowania robotyki w C++?

text: Najlepiej coś, co jest kombinacją niedrogiego i zbliżonego do rzeczywistego programowania robotyki i pozwoli mi na programowanie w C++.


title: Nazwy metod przedrostków i przyrostków

text: Jakiś czas temu czytałem artykuł (lub rozdział w jakiejś książce, którego nie pamiętam) o nazewnictwie przedrostków metod, które odzwierciedlają zachowanie metody, takie jak `addFoo()`, `setFoo()`, `removeFoo()` itp. Czy ktoś mógłby wskazać mi ten artykuł? Nie mogę tego wygooglować i sprawia mi to smutek panda :-(


title: Jak mogę zmienić niechlujną kulturę firmy?

text: Czasami, gdy mam problem, który wymaga rozwiązania, uważam, że najłatwiej go rozwiązać, pisząc mały program jako osobiste narzędzie. Nie czynię tego super użytecznym ani super wytrzymałym, ponieważ tylko ja go użyję i nie mam czasu, aby go dopracować i dokładnie przetestować. Następnie współpracownik widzi program i prosi o to, ponieważ napotkał ten sam problem i narzędzie może pomóc. Daję mu zastrzeżenie „To nie jest ładne, ale załatwi sprawę” i daję mu to. Następna rzecz, którą wiem, dzwoni do mnie przełożony i mówi, że próbuje uruchomić oprogramowanie na komputerze klienta, ale wyświetla komunikat o błędzie X. WTF? To oprogramowanie nie jest gotowe do wydania, ani nie powiedziano mi, że musi być gotowe do wydania. Ale z jakiegoś powodu mój przełożony uznał, że jest wystarczająco dobry i wydał go bez informowania oryginalnego dewelopera. Teraz ten konkretny problem można łatwo rozwiązać za pomocą `MessageBox.Show("NIE DAWAJ KLIENTOM!");`. Jednak problem wskazuje na znacznie głębszy problem: kultura naszej firmy jest niechlujna. Niechlujne oprogramowanie jest w porządku, a niechlujne procesy są w porządku. Nie martw się o przyszłość — włóż wystarczająco dużo wysiłku, aby teraz ledwo działała, umieść pliki binarne w pliku .zip i wyślij. Wystarczająco dobry do pracy rządowej. Jest to mała firma, zatrudniająca 10 pełnoetatowych pracowników, rozwija się i istnieje już od jakiegoś czasu. Nie zrozum mnie źle; Uwielbiam tu pracować i kocham firmę. Nie każ mi uciekać; Chcę być częścią ulepszania firmy. Jak zacząć wprowadzać dobre zmiany w tego rodzaju kulturze?


title: Cel C - zagnieżdżone wiadomości ... zamieszanie wokół

text: Zastanawiam się, czy ktokolwiek mógłby rzucić trochę światła na tę konstrukcję przesyłania wiadomości: Dokumentacja mówi, że komunikaty pojawiają się w nawiasach kwadratowych [] i że cel/obiekt msg znajduje się po lewej stronie, podczas gdy sam msg (i wszelkie parametry) jest po prawej: [msgTarget msg], np. `[myArray insertObject:anObject atIndex:0]` OK, dość proste... ale potem wprowadzają ideę, że wygodnie jest zagnieżdżać msgs zamiast używania zmiennych tymczasowych — wezmę ich słowo na to — więc powyższy przykład wygląda następująco: `[[myAppObject theArray] insertObject:[myAppObject obiektDoWstawienia] atIndex:0]` Innymi słowy,` [myAppObject theArray] ` jest zagnieżdżoną wiadomością, jeden i dwa, ' tablica” to „wiadomość”. Cóż, powiedzenie, że uważam to za mylące, jest trochę niedopowiedzeniem ... Może to tylko ja, ale „theArray” nie wywołuje wiadomości semantycznie ani gramatycznie. Jak to wygląda dla faceta, który wie, że Java to typ/klasa. W Javie robimy takie rzeczy jak `Class objectInstance = new Class() ... ` bit po lewej stronie operatora przypisania przypomina mi ten tak zwany zagnieżdżony komunikat ... z wyłączonymi pozycjami obiektu i klasy/typu kurs. W każdym razie każdy wgląd bardzo doceniany.


title: Jaki jest cel stand-upu i czas jego trwania w zwinnych metodykach?

text: Kiedyś pracowałem w metodologii kaskadowej, a teraz jestem w zespole stosującym metodykę zwinną. Wygląda na to, że robią to źle. Na przykład mamy stand-upy, które trwają ponad 25 minut dziennie, co jest naprawdę denerwujące. Dodatkowo czuję, że bardziej uzasadniam swoją pensję dla kierownictwa niż cokolwiek innego. Czy źle się czuję? Czy tak zwykle przeprowadza się stójki?


title: Jak utworzyć pliki aktualizacji „git push” na swoim hoście internetowym?

text: Mam kilka witryn, które są hostowane na tej samej usłudze hostingowej w ramach hostingu współdzielonego. Mój host internetowy obsługuje Git i mam do niego dostęp przez SSH, a także mam konfigurację Git na moim laptopie. Chcę to zrobić tak, że kiedy zrobię "git push origin master", automatycznie zaktualizuje pliki na moim serwerze sieciowym, a także zapisze kopię zapasową plików poprzedniego zatwierdzenia, abym mógł łatwo wycofać, jeśli chcę. czy to możliwe?


title: Używanie Java Reflection do rozdzielenia modułów kodu

text: Jestem zaangażowany w projekt składający się z kilku modułów. Odkryłem, że programiści zaprojektowali jeden moduł, który można łatwo oddzielić od zależnych od niego modułów za pomocą Java Reflection. Jeśli inne moduły muszą wywołać metodę w tym module, programiści oczekują, że użyją odbicia do wywołania tej metody. Doprowadziło to do powstania wielu miejsc z **zakodowanymi na stałe** wywołaniami odbicia. Przez _zakodowane na sztywno_ rozumiem, że nazwy klas i metod są trwale ustalone jako Strings, co w pewnym sensie niweczy cel refleksji, którym ma być programowanie dynamiczne. Jak można to usprawiedliwić? Czuję, że są nowicjuszami i nadużywają interfejsu API refleksji. Myślę, że polimorfizm to właściwy sposób na oddzielenie modułu od innego bez naruszania funkcjonalności. (Niestety zmiana całej bazy kodu na polimorfizm to zbyt duża konserwacja.)


title: migracja i interoperacyjność

text: Duży system został już wykonany w Visual Fox Pro. Chcą dodać więcej wymagań do modułu i dokonać pewnych zmian w systemie. Jednocześnie myślą o migracji do .net. Niektóre części, takie jak generowanie raportów, zostały wykonane w .net przy użyciu bazy danych Visual Fox Pro i załadowane do vfp. Czy dobrym pomysłem jest również rozpoczęcie migracji bazy danych? Chodzi mi o to, czy dobrze jest tworzyć bazę danych (i tabele) dla modułu dla nowych wymagań i zmian? Myślę, że spowoduje to problemy i trudności w utrzymaniu oprogramowania. Jak rozpoczyna się proces migracji danych? Czy powinno się to robić stopniowo (częściowo w Visual Fox Pro, a częściowo w sql), czy powinno się to robić jednocześnie?


title: Czy wykresy Gantta odgrywają rolę w zwinnym tworzeniu oprogramowania?

text: Słyszałem, że mówiono, że wykresy Gantta są reliktem technik kaskadowego zarządzania projektami. Zazwyczaj stosuję podejście zwinne do planowania projektu i śledzenia postępów, które zapewnia dobry wgląd w kompromisy w czasie funkcji w miarę postępu projektu. Jesteśmy na początku projektu, w którym o ile dokładny projekt front-endowej interakcji użytkownika jest nieco niejasny na tym wczesnym etapie, wymagania back-endowe są dość jasne (komponenty, które komunikują się z różnymi interfejsami API innych firm, infrastruktura serwerowa itp.). Będziemy przechodzić przez proces opracowywania dobrego projektu interakcji z użytkownikiem dla front-endu (zaczynając od historyjek użytkownika i dalej idąc dalej), ale chcieliśmy również zorientować się, jak długo zajmie back-end. Zdecydowałem, że najlepszym podejściem będzie rozbicie go na podkomponenty, gdzie każdy komponent składał się ze ściśle powiązanego kodu, nad którym prawdopodobnie należałoby pracować w ciągłym okresie czasu. Każdemu komponentowi i podkomponentowi przypisałem przybliżone szacunki czasu, zwykle od 1 do 10 dni. Następnie wykorzystałem OmniPlan, aby wskazać zależności między tymi różnymi komponentami i przypisać programistów do każdego zadania, aby rozłożyć wysiłek tak równomiernie, jak to możliwe. Następnie użyłem narzędzia do poziomowania OmniPlan. Myślę, że to dość standardowy sposób korzystania z OmniPlanu i pomyślałem, że jest to rozsądny sposób na wymyślenie przybliżonego oszacowania czasu. Powinienem wyjaśnić, że intencją nie było wymyślenie sztywnego planu dotyczącego tego, kto będzie pracował nad czym i kiedy, ale co najmniej jeden prawdopodobny sposób, abyśmy mogli zbudować to, czego potrzebowaliśmy w ciągu dwóch miesięcy. Wykres Gantta sugerował, że jest to wykonalne. Ku mojemu zdziwieniu otrzymałem dość silny odzew od innego członka zespołu, który zna zwinny proces rozwoju, który oskarżył mnie o przyjęcie metodologii kaskadowej. Ich bardziej szczegółową krytyką było to, że wykres Gantta został określony w kategoriach elementów architektonicznych, a nie elementów widocznych dla użytkownika. Byli sfrustrowani, że nie można powiedzieć, że „powinniśmy mieć funkcjonalność X do daty Y”. Gdzie, jeśli gdziekolwiek, popełniłem błąd?


title: Jakie są świetne narzędzie do recenzji kodu online dla projektów Open Source?

text: Chciałbym rozpocząć nowy projekt Open Source i uważam, że wszystkie check-iny powinny zostać przejrzane przed połączeniem z bagażnikiem. Jakie są świetne narzędzia **online** do sprawdzania kodu dla projektów Open Source, które mają tę funkcjonalność i co sprawia, że są świetne?


title: Czy powinienem używać TDD i BDD, jeśli mój projekt szybko się zmienia?

text: Mam swój mały projekt, który tworzę w RoR, planuję mieć mały-średni ładunek. Bez wątpienia zacząłem od BDD i TDD (dokładnie Cucumber i RSpec, ale mam też doświadczenie z TestUnit), podoba mi się, ale ponieważ jest to mój własny projekt i jest trochę startupowy - zmieniam w nim wiele rzeczy, wiele wymagania, wiele pomysłów jak rzeczy powinny działać i wyglądać. Tak więc kodowanie zawsze za pomocą BDD i TDD staje się zbyt czasochłonne, nawet jeśli omawiam tylko typowe przypadki. Co powinienem zrobić? Czy powinienem poświęcić BDD i TDD na rzecz produktywności, dopóki nie dojdę do punktu, w którym będę miał solidne podstawy i nadejdzie czas na produkcję, a potem piszę testy? Czy powinienem je teraz napisać, ale jak najmniej? Czy powinienem napisać tylko RSpec i zapomnieć na razie o Cucumber? A może po prostu TestUnit, aby na razie przetestować model, bo to jest najważniejsze i wszystko inne może się zmienić? Z góry dziękuję! **Aktualizacja:** Znam wszystkie zalety TDD i BDD, w żadnym wypadku nie ułatwia to skalowania i naprawiania błędów w aplikacji w przyszłości i oszczędza czas, ale może rozsądniej w mojej sytuacji jest poczekać kilka tygodni, aż będę miał na przynajmniej jakąś szkieletową architekturę mojej aplikacji i niż raz mam pewność, że mogę ją przetestować, aby mieć solidną podstawę? Następnie kontynuuj z TDD i wykonaj wszystkie testy z TDD.


title: Czy istnieje nazwa tego rodzaju ograniczenia bazy danych? „Funkcjonalny klucz obcy”? Czy to dobry pomysł?

text: Powiedzmy, że chcemy wymusić, że tabela reprezentuje drzewo. Znalazłem tę metodę, aby to zrobić: utwórz drzewo tabeli ( klucz podstawowy id integer [], nadrzędne drzewo integer [] referencje (id), tekst elementu nie jest null, ograniczenie tree_parent check ( (id = array []:: integer [] a rodzic ma wartość null) lub rodzic = id[1:array_length(id,1)-1]) ); Węzeł w drzewie jest identyfikowany przez jego _ścieżkę_ z węzła głównego. Jako taki, klucz obcy `parent` jest po prostu tą ścieżką, w której jeden element został usunięty na końcu. Kombinacja „klucza obcego” i „czeku” gwarantuje strukturę drzewa. **Pierwsze pytanie:** czy to dobry pomysł? Czy istnieją lepsze podejścia? Przynajmniej w Oracle jestem w stanie zdefiniować `rodzica` jako wirtualną kolumnę, która jest elegancka. **Drugie pytanie:** czy istnieje nazwa tego podejścia? Lubię myśleć o tym jako o „funkcjonalnym kluczu obcym”: `tree.id` odwołuje się do `tree.id`, ale _poprzez funkcję_, która upuszcza ostatni element w ścieżce. Myślę, że ta koncepcja ma bardziej ogólne zastosowanie niż powyższy przykład drzewa.


title: Czy powinienem płacić za korzystanie z subversion?

text: Jestem zdezorientowany płaceniem za działalność wywrotową. Nasza firma ma rozwiązanie i chce zarządzać wersją źródła. Produkt naszej firmy jest oczywiście produktem komercyjnym, a nie open source. i nie jest przeznaczony do dystrybucji. 1. Czy mogę korzystać z subversion bez opłat dla firmy? 2. Czy powinienem otworzyć źródło naszego rozwiązania, ponieważ używamy subversion za darmo? 3. Czy jest to jakiś obowiązek? 4. Dokładnie, w jakim przypadku muszę płacić za korzystanie z subversion? Dziękuję Ci.


title: Czy moje historyjki dla początkujących użytkowników są poprawnie skomponowane?

text: Czy ta historyjka użytkownika jest merytorycznie poprawna: > Jako właściciel systemu chcę, aby każdy, kto korzysta z systemu, musiał > logować się > przy użyciu bezpiecznego hasła i systemu logowania, aby zapobiec nieautoryzowanemu i przypadkowemu > dostępowi do danych systemowych. A następnie: > Jako użytkownik chcę mieć możliwość logowania się przy użyciu bezpiecznego hasła, aby tylko > mieć dostęp do tych obszarów systemu, których potrzebuję do pracy. Mam kilka innych historii dla właściciela systemu, takich jak format hasła, blokady itp. Czy to dobre miejsce na te wymagania? Jak historie dla właściciela systemu?


title: Wdrażanie artefaktów i zależności w innym systemie za pomocą Maven

text: Koduję program Java na moim komputerze deweloperskim. Maven pakuje to jako `myjar.jar` i mogę go uruchomić z wiersza poleceń za pomocą `java -cp myjar.jar my.FantasticClass`. Używa biblioteki `somelib.jar`. Używam Mavena, a projekt jest hostowany na githubie. Kiedy chcę uruchomić projekt na maszynie docelowej, jaka jest najlepsza droga? Mógłbym spakować mój kod jako jar, pobrać `somelib.jar` i przenieść go ręcznie na maszynę docelową, ale przypuszczam, że mógłbym również sprawdzić projekt Maven z github na maszynie docelowej, uruchomić go i mieć Mavena oba wygeneruj jar i pobierz plik `somelib.jar`. A może po prostu coś przeoczam?


title: Jakie funkcje/zmiany najbardziej chciałbyś zobaczyć w programie Visual Studio 2012?

text: A przynajmniej „następna wersja”. Istnieje kilka bardzo interesujących, wspaniałych pomysłów, które mogą zrewolucjonizować sposób, w jaki kodujemy. Podobnie, prawdopodobnie istnieje cała masa drobnych ulepszeń, które mogą sprawić, że całe wrażenia będą lepsze. Uwielbiam Visual Studio 2010, jest to luksusowe środowisko dla programistów (moim zdaniem). Co można zrobić dalej?


title: Dlaczego powinniśmy być świadomi licencji?

text: Wiem, że to częste pytanie, ale dlaczego programista miałby znać licencje na oprogramowanie, a także licencje rozszerzeń i wtyczek? Pracuję w firmie, która skupia się na procesie biznesowym (Ruby on Rails) i jestem ciekaw, dlaczego tak rygorystycznie stosują takie licencje w rozwoju projektu. O jakich licencjach powinienem wiedzieć i dlaczego?


title: Czy Java została pierwotnie zaprojektowana dla tostera?

text: Słyszałem to kilka razy, ale nigdy tak naprawdę nie było źródła. Strona wiki mówi, że została zaprojektowana z myślą o urządzeniach domowych, ale nigdy tak naprawdę nie odnosi się do tostera. Czy ktoś ma źródło?


title: Czy to źle dołączać do projektów open-source jako amator?

text: Od około sześciu miesięcy myślałem, że powinienem dołączyć do projektu open source na iPhone'a lub iPada, aby doskonalić swoje umiejętności w Objective-C, ale za każdym razem, gdy to robię, widzę tysiące wierszy kodu w dużych projektach, które przekonuję się, że nigdy nie zrozumiem. Zawsze myślę, że moje zmiany byłyby kłopotliwe dla administratorów projektów i starszych współpracowników, więc zawsze wycofuję się w ostatniej chwili. Moje pytanie zasadniczo brzmi: **czy to kłopotliwe, gdy średnio doświadczony programista dołącza do projektu open source?**


title: Czym dokładnie jest język programowania? Co pozwala nam pisać w takim języku?

text: W porządku, jestem nowy w programowaniu i przyznaję, że to dość abstrakcyjne pytanie. Język naturalny, którym posługujemy się na co dzień, istnieje, ponieważ ludzie mogą się nawzajem rozumieć. Jak komputery mogą zrozumieć mój kod napisany w określonym języku? Powiedzmy, że pan A tworzy nowy język. Jak to jest akceptowane przez maszyny? Czy twórca musi komunikować się z maszyną za pomocą języka maszynowego, aby stworzyć nowy język? Co gwarantuje, że potrafimy pisać w języku, jednocześnie będąc poprawnie zrozumianym przez maszynę?


title: Najlepsze praktyki dotyczące pokrycia kodu pustych metod interfejsu

text: Biorąc pod uwagę klasę, która implementuje interfejs, ale nie potrzebuje wszystkich zaimplementowanych metod, jaka jest najlepsza praktyka testowania jednostkowego tej klasy w odniesieniu do pokrycia kodu? - czy jest uważany za znak zapachu kodu? Aby problem był bardziej konkretny, rozważ klasę Javy (choć pytanie nie ogranicza się do Javy), która implementuje `ComponentListener`, ale wywodzi się z jakiegoś `X` (aby wykluczyć wybór użycia `ComponentAdapter`). Klasa jest jednak zainteresowana tylko metodą `componentResized()` i pozostawia puste treści pozostałych metod wywołania zwrotnego. Podczas sprawdzania pokrycia kodu otrzymujemy raport, który poprawnie wskazuje, że pozostałe metody są nieprzetestowane. Z oczywistych powodów waham się przed dodaniem testu, który po prostu wywołuje metodę no-op ze względu na zasięg. Chociaż nie jestem zobowiązany do osiągnięcia pewnego zasięgu, nadal uważam, że zjawisko to samo w sobie może wskazywać na zapach kodu w odniesieniu do zasady pojedynczej odpowiedzialności. Z drugiej strony nie jest zbyt daleko idące, że reprezentacja komponentu jest odpowiedzialna za aktualizację swojego stanu przy zmianie rozmiaru. Czy istnieje jakiś konsensus lub najlepsza praktyka, jak postępować z takimi metodami, czy też pytanie jest nieuzasadnione, ponieważ wynika z rzekomo złego projektu?


title: jakie są praktyczne etapy cyklu życia oprogramowania?

text: Tworzę oprogramowanie i próbuję nauczyć się typowych kroków cyklu życia oprogramowania, nie jestem pewien, czy to, co zrobiłem, jest poprawne, czy wystarczające, więc chciałbym zapytać o typowe kroki, które wykonujesz podczas cyklu życia pod względem rzeczywistych kroków wzięte na przykład zbieranie wymagań nie jest krokiem, o którym mówię, ale zbieranie wymagań za pomocą User Stories od klienta lub z dokumentów wymagań jest krokiem, który mam na myśli. Oto, co robię teraz: 1. Napisz historie użytkowników z dokumentu wymagań, który miałem. 2. Napisz przypadki użycia dla tych historii. 3. Zebrać rzeczowniki z dokumentów wymagań i wykorzystać je jako klasy do zbudowania diagramu klas. 4. Narysuj diagramy stanów dla głównych encji na diagramie klas. 5. Narysuj diagram bazy danych, aby zmapować diagram klas do tabel bazy danych. 6. Rozpoczął kodowanie w architekturze trójwarstwowej. Proszę powiedz mi, czy robię to dobrze, czy czegoś brakuje.


title: Kiedy junior nie powinien pomagać seniorowi?

text: Co robisz, gdy osoba, której pomagasz, jest seniorem, czy nadal jej pomagasz? Widziałem to w poprzedniej pracy. Starszy programista stracił kontakt i miał problemy z podstawami. Przez lata był leniwy i był przyzwyczajony do obciążania juniorów pracą. Restrukturyzacja oznaczała, że seniorzy musieli teraz ciężko pracować na pieniądze. Co robisz? Pomóż lub oczekuj od nich więcej. **EDYTUJ:** Ja i inni seniorzy pomogliśmy i juniorzy. Jednak starszy programista był przyzwyczajony do delegowania zadań i wielu uważało, że starszy programista po prostu starał się, aby inni wykonali swoją pracę. Zadawałem pytanie w związku z czytaniem: Kiedy nie pomagasz mniej doświadczonym programistom? Zasadniczo, kiedy należy narysować linię na piasku.


title: Jaki jest najlepszy sposób przechowywania plików podczas korzystania z winform i sieci?

text: Muszę opracować aplikację (w języku C#), która ma pracować z plikami. Aplikacja składa się z dwóch wersji: wersji webowej i wersji dla systemu Windows. Dlatego pliki muszą być przechowywane w miejscu, w którym obie wersje mają dostęp do plików. W obu wersjach pliki można edytować i tworzyć nowe pliki. Zastanawiałem się nad następującymi opcjami przechowywania plików: * IIS przy użyciu WebDav * Sharepoint * Używanie udziału i sprawienie, by ten udział był katalogiem wirtualnym w IIS. Nie mam doświadczenia z jedną z tych opcji i to były opcje, które przyszły mi do głowy. Jaki jest twoim zdaniem najlepszy sposób przechowywania plików?


title: Ładne nazewnictwo iteratorów

text: Jak nazywasz swoje iteratory, gdy zwracasz iterator początku i końca z klasy? Bez tego brzmi to niezgrabnie. Przykład: typedef std::vector<Idea> Ideas_Type; Ideas_Type::const_iterator GetIdeasBegin() const; Ideas_Type::const_iterator GetIdeasEnd() const; Czy powinno to być GetIdeasBeginIter? PomysłyRozpocząć?