title: Czy to zły znak, że często przeprojektowuję podczas opracowywania projektu?

text: Kiedy po raz pierwszy zacząłem programować, zakładałem, że pewnego dnia dojdę do punktu, w którym zacznę projekt od siadania i szkicowania diagramu UML wszystkich klas, a potem w zasadzie się tego trzymam. Programuję od kilku lat i tak się nie dzieje. Kiedy przechodzę przez projekt, często mówię: * „Hej, potrzebuję zajęć do zrobienia ___ _. Nie myślałem o tym wcześniej”. * „Czekaj, ta funkcja naprawdę powinna być w tej klasie, a nie w tej. Przeniosę ją”. * "Powinny to być dwie klasy zamiast jednej. Podzielę to." * „Powinienem sprawić, by wszystkie te trzy samodzielne klasy dziedziczyły po jednej klasie abstrakcyjnej”. * I tak dalej, itd. Czy to zły znak, że często przebudowuję w ten sposób w miarę postępów? Czy to oznacza, że jestem słabym programistą, czy to normalne?


title: Przekazywanie powiadomień między programami napisanymi w różnych językach programowania

text: Pracuję w zespole ludzi z doświadczeniem w różnych językach programowania. Ostatnio byliśmy zobowiązani do zbudowania raportu, gdy zamówienie jest składane w naszym systemie. Nasz sklep internetowy działa na PHP, a program do wysyłania raportu został napisany w Javie. Największym wyzwaniem, z jakim się zmierzyliśmy, było ustalenie sposobu, aby proces Java uruchamiał się zaraz po złożeniu zamówienia. W tym samym duchu mamy wiele programów napisanych w Pythonie, Scali itp., które muszą być skoordynowane i być świadomym, kiedy wykonać zadanie X, gdy dzieje się zadanie Y. W tej chwili naszym rozwiązaniem tego problemu jest skonfigurowanie crona do rutynowego sprawdzania, czy plik lub wartość w bazie danych istnieje, a następnie uruchomienie (proste odpytywanie). Uważam, że kolejka zadań to właściwy sposób na rozwiązanie tego problemu. Jednak nie jestem pewien, jak go skonfigurować i skąd proces Java będzie wiedział, że zadanie na niego czeka? Ponadto, czy mój program PHP wymagałby wielu zmian, aby umieścić coś w kolejce zadań? Wielkie dzięki!


title: Z perspektywy programowania wysokiego poziomu, gdzie naprawdę pojawia się bariera „innego paradygmatu” między C# i F#?

text: Zdaję sobie sprawę, że obaj używają różnych paradygmatów programistycznych, ale z perspektywy wysokiego poziomu, poza różną składnią, wydaje się, że większość podstawowych zadań można wykonać w podobny sposób. Mówię to tylko dlatego, że kiedy wcześniej dotykałem funkcjonalnych języków programowania, takich jak Haskell, pisanie kodu do podstawowych zadań było (na początku) trudne, frustrujące i wymagało zupełnie innego sposobu myślenia. Na przykład zajęło trochę czasu, aby poradzić sobie z użyciem składni rekurencyjnej: loop :: Int -> IO () loop n = if 0 == n then return () else loop (n-1) Gdzie jako pętla F# jest rozpoznawalne i zrozumiałe niemal natychmiast: niech lista1 = [1; 5; 100; 450; 788 ] for i in list1 do printfn "%d" i Kiedy programiści C# zaczynają uczyć się F#, zaleca się, aby całkowicie przemyśleli swój wzorzec myślowy (co było zdecydowanie wymagane dla Haskella), ale teraz napisałem kilka programów F# zajmujących się warunki, pętle, zbiory danych itp. do wykonywania praktycznych zadań, i zastanawiam się, gdzie naprawdę pojawia się bariera „innego paradygmatu”?


title: Środowisko deweloperskie inne niż środowisko testowe

text: Pracuję nad projektem aplikacji internetowej .net, w którym rozwijamy się na naszych osobistych komputerach, ale nasze środowiska testowe i produkcyjne znajdują się w korporacyjnym intranecie. Problem polega na tym, że napotykam błędy, które występują tylko w środowisku testowym/produkcyjnym, ale nie w dev. Uważam, że to naprawdę utrudnia wyśledzenie przyczyny problemu. Czy są jakieś wskazówki/strategie, jak poradzić sobie z tym problemem? **Pamiętaj, że nie mam kontroli ani opcji, jeśli chodzi o konfigurowanie nowych serwerów lub modyfikowanie środowiska testowego. Mogę wprowadzać zmiany tylko na moim lokalnym komputerze. Nie mam również dostępu do pliku obrazu firmy, aby zobrazować mój komputer.


title: Więcej wymagań w pojedynczym przypadku użycia – prawda?

text: Kłóciłem się z deweloperem, który upiera się, że 1 FR = 1 UC. Myślę, że to nie ma sensu, ponieważ istnieją wymagania często opisujące sytuacje wynikające z tego samego punktu - w tym celu przypadki użycia mają alternatywne przepływy. Na przykład: FR01 - Użytkownik może się zalogować FR02 - Konto użytkownika zostanie zablokowane po 3 błędnych hasłach. FR03 - Zalogowany użytkownik może się wylogować Uważam, że wszystko to można dobrze uchwycić w jednym przypadku użycia, opisując interakcję między użytkownikiem a systemem. Ale może czegoś mi brakuje? EDIT: Zgodnie z książką „Use Case Modeling” firmy Bittner, Spence: > przypadek użycia zawiera zestaw opisu wymagań, wymagania > są prezentowane w formie narracyjnej, a nie szczegółowej listy... ... Tak więc Powiedziałbym, że zdecydowanie więcej wymagań można uchwycić w jednym przypadku użycia.


title: Znalazłem projekt wolnego oprogramowania, którego pliki wykonywalne rozprzestrzeniają wirusa. Jaki jest właściwy powód działania?

text: Dzisiaj znalazłem na SourceForge projekt na licencji GPL, którego pliki wykonywalne rozprzestrzeniają wirusa. Fakt ten był wielokrotnie wskazywany w recenzjach projektu, a zainfekowany plik wykonywalny jest nadal dostępny do pobrania. Najwyraźniej starsze pliki wykonywalne nie są zainfekowane, więc sam projekt nie wydaje się być tworzony w złym celu. Nie ma preferowanego sposobu skontaktowania się z programistami, a fora projektu są martwe. Co powinienem zrobić?


title: Dlaczego złożoność cyklomatyczna jest równa dwa dla prostego Hello World?

text: Miałbym dwa pytania związane ze złożonością cyklomatyczną: 1. Czy mogę użyć tej metryki dla całej aplikacji? Chyba nie mogę, bo byłoby to niesamowicie dużo, biorąc pod uwagę funkcje wywołujące funkcje itp. Czy to tylko moduł/metoda/jednostka? 2. W Visual Studio, aby uruchomić aplikację za pomocą wywołania metody `Main`, wartość złożoności cyklomatycznej wynosi 2. Dlaczego? Jest tylko jeden sposób, jeśli uruchomię program - kończy się.


title: Jak zaimplementować luźne sprzęgło?

text: Chcę zaimplementować luźne sprzężenie w projekcie. Znam dwa przykłady udanych projektów luźnego sprzężenia: 1. Na stacji roboczej uniksowej skrypty powłoki realizują luźne sprzężenie między podstawowymi narzędziami. Luźne sprzężenie opiera się na zdolności powłoki do _na ślepo_ przekierowywania przepływów danych między narzędziami, bez posiadania jakiejkolwiek wiedzy na temat struktury. Narzędzia zgadzają się na wspólną formę współpracy, taką jak _format rozdzielany potokami_ do sortowania, wycinania, wklejania, awk itp., zrzut svn lub _trywialny zrzut_ znormalizowanego dokumentu SGML (z onsglmls). 2. W systemie Mac OS X Applescripts można uznać za luźne połączenie. W tych dwóch przykładach widzę, że współpracujące komponenty uzgadniają wspólny protokół do serializacji i deserializacji danych, które muszą zostać wymienione. W związku z tym komponenty zależą od protokołu serializacji, a nie od wewnętrznej reprezentacji danych. Czy implementacja stabilnego protokołu komunikacyjnego między komponentami aplikacji jest zwycięską strategią implementacji luźnego łączenia (i dobrej enkapsulacji)? Aby rozwiązać powiązania, pytam również, jaka byłaby ładna nazwa dla artefaktów protokołu: „dane” są nieco niejasne i jest ich wiele w różnych miejscach w oprogramowaniu!


title: Czy istnieje coś takiego jak super programista?

text: Czy spotkałeś super programistę? Co go jako takiego identyfikuje w porównaniu z „normalnymi” doświadczonymi/świetnymi programistami? Również. jak radzisz sobie z osobą w swoim zespole, która uważa, że jest super programistą? Czy tak naprawdę jest, czy nie? **Edytuj** : Ciekawe dane wejściowe przez cały czas, dzięki. Można zebrać kilka rzeczy: Pojawiło się kilka definicji. Pomijając zbyt zlokalizowane definicje (które identyfikowały autorów lub ich znajomych jako super programistów), spodobało mi się kilka definicji: 1. Definicja Thorbjørna: osoba, która przez długi czas konsekwentnie wykonuje ekwiwalent dobrego zespołu. 2. Wolny elektron, powiązany z odpowiedzią Henry'ego. Bardzo produktywna osoba o wyjątkowych zdolnościach. Wyjaśnienie jest dobrą lekturą. > Wolny elektron może zrobić wszystko, jeśli chodzi o kod. Potrafią napisać > kompletną aplikację od podstaw, nauczyć się języka > w weekend i, co najważniejsze, mogą zanurzyć się w ogromnym stosie kodu spaghetti, > nadać mu sens i sprawić, by działał. Możesz zbudować całe > przedsiębiorstwa wokół Wolnego Elektronu. Są tak dobre. Kontrastujący z ostatnią definicją jest punkt, do którego odnosi się James na temat mitu genialnego programisty (wideo). Ta sama idea została wyrażona jako programowanie bez ego w komentarzu rwong. Przedstawiają przeciwne opinie, czy optymalizować dla tak wyjątkowego programisty, czy dla zespołu. Definicje te są zdecydowanie różne, więc byłbym wdzięczny za informację, która z nich jest lepsza. Lub dodaj własne, jeśli chcesz, ale pomogłoby to powiedzieć, dlaczego różni się od tych.


title: Wersje programu Visual Studio i etykieta zespołu

text: Mam projekt na CodePlex, który otworzyłem w zasadzie dla każdego, kto może dołączyć i pomóc. Jestem głównie entuzjastą kodowania, chociaż w ramach mojej pracy wykonywałem pewne prace programistyczne, zawsze były to projekty solowe, które mój zespół wykorzystuje do wsparcia IT. Dzięki mojemu projektowi CodePlex wczoraj dostałem swój pierwszy nowy widelec. Sklonowałem go, aby zobaczyć niektóre zmiany i zdałem sobie sprawę, że zaktualizował pakiet do VS 2012 z mojego 2010. Czym jest etykieta zespołu dla Visual Studio w środowisku zespołowym? Widzę korzyści płynące z korzystania z najnowszych i najlepszych, ale zmuszanie zespołu do aktualizacji też wydaje się trochę chybione. Moje założenie jest takie, że ten programista tego nie rozważył. Czy utrzymanie standardu jest uważane za dobrą etykietę, nawet jeśli jest przestarzałe, jak w przypadku VS 2010? A może najlepszą etykietą jest korzystanie z najnowszego stabilnego programu Visual Studio, a osoby bez uaktualnienia mogą korzystać z najnowszych wersji Express? A może istnieje standardowy sposób na niezależne od IDE rozwiązania między wersjami VS? * * * **Edytuj** Mnóstwo wspaniałego wkładu. I wydaje się, że werdykt nie ma uniwersalnej i ustalonej etykiety. Że tak naprawdę sprowadza się to do moich własnych preferencji co do projektu i tego, jaki wpływ na projekt ma zmiana.


title: Słownik przedmiotów

text: Mam słownik obiektów klasy Kolumny Słownik<podwójne, Kolumny> Kolumny to klasa kolumn, tj. imię i nazwisko, kod pocztowy itp., telefon komórkowy. Chciałbym, aby klasa Columns była jak najbardziej otwarta na rozszerzenie, więc nie będzie problemu z dodawaniem kolejnych klas. Muszę ustawić kilka kolumn, aby były tam zawsze, i chciałbym, aby użytkownik mógł zdefiniować, które kolumny mają być wyświetlane z pozostałych, a także dodać niestandardowe kolumny. Każda kolumna musi mieć metodę getValue() Moim pomysłem jest stworzenie abstrakcyjnej klasy Column i wyprowadzenie z niej określonych kolumn. Spraw, aby każda klasa potomna implementowała metodę getValue(), czyniąc ją abstrakcyjną, co powinno wymusić jej nadpisanie (czy mam rację?). Zdefiniuję enum, które będzie zawierało wszystkie dostępne typy kolumn. Wreszcie, klasa Kolumny zachowałaby wszystkie dostępne kolumny w słowniku Słownik<enum, Kolumna> Moje pytanie brzmi: czy mój proces myślenia jest prawidłowy? Czy jest miejsce na poprawę? Czy lepszym pomysłem byłoby użycie interfejsów? Wreszcie, czy ten projekt będzie wydajny i szybki dla szybko zmieniających się wartości w kolumnach, tj. W ciągu sekundy może będę musiał zaktualizować 50 różnych rekordów w tym słowniku.


title: jak stworzyć nową "Niestandardową instrukcję warunkową" w języku programowania

text: Czy możliwe jest utworzenie nowej "Niestandardowej instrukcji warunkowej" w java. Tutaj zamierzam utworzyć nowy niestandardowy komponent dla instrukcji switch, aby zapewnić lepszą wydajność. Niestandardowa kontrolka Switch, którą zamierzam utworzyć, będzie miała tylko operatory całkowite: przykład: int i = SOMEVALUE; Switch(i) { Przypadek 1: //Pewne przerwanie instrukcji; Przypadek 2: //Niektóre przerwanie instrukcji; Przypadek 3: //Niektóre przerwanie instrukcji; .... .... .... Sprawa 10000000: //Some Statement Break; Domyślnie: //Niektóre przerwanie instrukcji; } Według mojej wiedzy stan Switch będzie sprawdzał się w określonej kolejności. Jeśli rzeczywista wartość zmiennej "i" wynosi 9999999, to musi sprawdzić przypadek 9999999 razy, ale jeśli sprawdzimy to za pomocą algorytmów podobnych do wyszukiwania binarnego, jego wydajność zostanie poprawiona. Czy mam rację ?? Jeśli tak, to dlaczego nie dodamy tej funkcjonalności do naszego języka programowania? Dlaczego więc nie utworzymy "Niestandardowej instrukcji warunkowej" podobnej do "Instrukcji OrderedIntegerSwitch" , w której wartość przekazana wewnątrz tego przełącznika powinna być liczbą całkowitą.


title: Czy dobrym pomysłem jest używanie właściwości width i height z tagiem < td >?

text: Jestem nowy w HTML i pracuję nad własnym projektem i muszę używać znaczników <table> i <fieldset> w moich plikach html. Muszę ustawić właściwości width i height dla tabel, takie jak <td width="100" height="200"> </td> <!-- coś takiego --> Ale obawiam się tych powodów, ponieważ jako Monitor zmienia się rozmiar wraz z komputerami, niektóre mają duże ekrany, a niektóre mają małe ekrany, takie jak notebooki. Wymiary tabeli wydają się małe dla komputerów z dużym ekranem i duże dla komputerów z małym ekranem. Jak nimi zarządzać. Jak dopasować go do wszystkich typów rozmiarów ekranu. Chodzi mi o to, że kiedy przechodzi do prawej części ekranu, przeskakuje do następnej linii, jeśli użyję właściwości width do tagu <td>? a także używanie takiego dopełnienia to zły pomysł? < span style="padding-left:100"> </span> Wygląda dokładnie tak, jak chcę w mojej przeglądarce. Czy wygląda to tak samo na wszystkich typach rozmiarów monitorów? czy to się zmienia? Czy jest jakiś standardowy sposób, aby to zrobić? Uwielbiam twoje odpowiedzi, ale odpowiedz też na te oryginalne pytanie, czy ma to znaczenie dla rozmiarów monitora, używając właściwości szerokości i wysokości w tagu < td > ?


title: Jaka jest najważniejsza, użyteczna lub pouczająca rzecz, której nauczyłeś się w ciągu ostatnich 12 miesięcy?

text: Wiele osób w społeczności programistów mówi o ciągłym doskonaleniu, świadomej praktyce i tak dalej – ale kiedy mówią o swoich obecnych praktykach, to prawie tak, jakby „wyrosły w pełni z lędźwi Zeusa”, ponieważ nie słyszysz o tym, jak ich opinie zmieniały się z czasem lub czego się ostatnio nauczyli. Od czasu do czasu chodzę na rozmowę, czytam książkę, rozmawiam z kimś, a oni otwierają się trochę bardziej i stwierdzam, że wiele się uczę z tych spostrzeżeń. A więc, gdybyś musiał wybrać **jeden** rzecz z ostatnich 12 miesięcy, o której się dowiedziałeś, co by to było?


title: Struktura repozytorium git z hakiem po odbiorze

text: Planuję użyć git/gitolite, aby zapewnić zarządzany dostęp do odczytu/zapisu około 30 programistom i kierownikom projektów do współdzielonej sieci SAN o następującej strukturze plików: base/ clientA/ dirA/ xxx-config.xml-app1 xxx-config. xml-app2 app1/ conf/develop/app1.tgz app2/ app3/ ... clientB ... Mogę użyć gitolite do skonfigurowania dostępu R / RW dla różnych grup programistów. Pliki, które programiści muszą odczytać/zmodyfikować, to xxx-config.xml-appX oraz pliki w folderach conf/ i deploy/. Co więcej, za każdym razem, gdy coś w conf/ lub deploy/ zostanie zmodyfikowane (poprzez "git push"?), potrzebuję skryptu przechwytującego git, aby odtworzyć plik appX.tgz zawierający całą nową zawartość folderu appX. Zakładam, że każdy programista może wykonać „klon git” na swoim komputerze lokalnym i wykonywać okresowe „pobieranie git”, aby odświeżyć lub „git push” za każdym razem, gdy wprowadzają zmiany. Wymóg „git hook” sprawia, że zastanawiam się, czy powinienem mieć jedno repozytorium git dla każdego folderu klienta: /base/clients/clientA, .../clientB itd., czy też jedno repozytorium dla każdego folderu clientX/appX. Poniższe informacje pochodzą z przykładów gitolite: repo clientA RW+ = @clientA-grp option hook.post-receive = deploy Jeśli istnieje jedno repozytorium dla każdego folderu klienta, w jaki sposób skrypt "deploy" wiedziałby, który plik appX.tgz musi być odtworzone? A może po prostu odtworzy je wszystkie na oślep? Druga opcja wyraźnie się nie skaluje.


title: Jak odpowiedzieć na pytanie „Czy ktoś w ogóle korzysta z tej funkcji?” pytania

text: Mój zespół będzie regularnie wprowadzał zmiany w kodzie, które psują test jednostkowy lub integracyjny dla funkcji ukrytej głęboko w ciemnych zakamarkach naszej aplikacji. Gdy test się psuje, często pojawia się pytanie „Kto w ogóle korzysta z tej funkcji!?”. Zazwyczaj odblokowujemy kod i sprawiamy, że test przechodzi pomyślnie, ponieważ jako programiści nie możemy określić, czy dana funkcja jest nadal używana i nadal potrzebna. Jak mój zespół i ja możemy skutecznie zająć się niejasnymi lub pozornie dziwnymi funkcjami? Myślę, że chcemy wiedzieć, czy korzysta z nich jakiś klient, a jeśli nie, możemy usunąć tę funkcję. Przy kilkuset użytkownikach i charakterze naszej aplikacji trudno byłoby umieścić w naszej aplikacji funkcję rejestrowania lub raportowania, aby telefonowała do domu, gdy używana jest „funkcja”. Myślę, że to sprawia, że jest to proces zarządzania, a nie proces techniczny.


title: Znalezienie najlepszej praktyki dotyczącej narzędzia do symulacji gry

text: Uczę się teraz Java i myślę o tym narzędziu jako o moim projekcie ćwiczeniowym. Gra to „League of Legends”, jeśli ktoś o tym wie. W rzeczywistości nie symuluję gry, tak jak w symulowaniu rozgrywki, po prostu próbuję stworzyć narzędzie, które może porównywać różnych bohaterów na podstawie ich własnych umiejętności oraz przedmioty kupione w grze. Podstawy gry to: * Każdy gracz ma mistrza w pięcioosobowej drużynie grającej przeciwko innej drużynie. * Każdy mistrz ma inny zestaw umiejętności (zwykle 4), których używa do zadawania obrażeń wrogim bohaterom. * Każdy bohater staje się silniejszy, kupując różne przedmioty, zwiększając atak, który zadaje lub zmniejszając otrzymywane obrażenia. To, co chcę zrobić, to stworzyć narzędzie do użycia poza grą, które umożliwi graczom wypróbowanie różnych konfiguracji dla swoich bohaterów i porównanie ich z innymi bohaterami, z którymi zwykle walczą. Celem jest umożliwienie graczom głębszego zrozumienia różnych kombinacji przedmiotów (kompilacji), które mogą być używane podczas gier, zamiast wypróbowywania ich w prawdziwych grach, co może być w jakiś sposób bardzo czasochłonne. To, na czym utknąłem, to najlepsza praktyka, którą powinienem zastosować, aby było to możliwe przy użyciu Javy, nie wiem, które klasy powinny dziedziczyć po których, powinienem utworzyć specyfikacje mistrzów i przedmiotów w kodzie lub wyekstrahować z innych plików, szczególnie że mówię o setkach przedmiotów i bohaterów, których można użyć w tym narzędziu. Uczę się Javy samodzielnie i nie mam w tym zbyt wiele praktyki, więc naprawdę doceniłbym wszelkie ogólne wytyczne dotyczące tego, i przepraszam, jeśli moje pytanie nie pasuje tutaj, starałem się przestrzegać zasad. Angielski nie jest moim językiem ojczystym, więc bardzo przepraszam, gdybym nie mówił wystarczająco jasno, z przyjemnością wyjaśnię wszystko, co nie jest zrozumiałe.


title: Czy istnieje wyraźny lider wśród języków opartych na JVM?

text: Jaki jest obecny status tych projektów i czy któryś z nich (lub dwa) okazał się wyraźnym liderem? Aby zademonstrować moje motywy zadawania tego pytania, cofnij się o kilka lat wstecz. Prototype i jQuery walczyły o przetrwanie z innymi graczami, takimi jak MooTools. Przewińmy do dzisiaj i panuje ogólna zgoda co do tego, że jQuery jest najlepszą biblioteką JavaScript ogólnego przeznaczenia. Czy coś podobnego wydarzyło się w ciągu ostatnich kilku lat z tymi językami opartymi na JVM? Czy niektóre języki popadły w ruinę i zostały porzucone? Z tego, co przeczytałem, wydaje się, że Scala jest z pewnością dobrze przygotowana, aby stać się faworytem, ale z drugiej strony prawie wszystko, co przeczytałem, ma kilka lat. * * * Zrobiłem trochę więcej badań - wpadłem na pomysł, aby sprawdzić liczbę wyszukiwań na przestrzeni lat za pomocą Trendów Google. Wydaje się, że Jython i JRuby mają stosunkowo niewielkie zainteresowanie, podczas gdy głośność Groovy'ego maleje, a głośność Scali jest stała (w najgorszym przypadku) lub nieznacznie wzrasta (w najlepszym przypadku). Czy to trafna ocena? * * * I tak, mam na myśli języki inne niż Java w JVM, takie jak Jython, JRuby, Groovy, Scala, Clojure itp.


title: Czy dobrą praktyką jest tworzenie listy definicji dla wszystkich symboli i słów w języku programowania?

text: Po dojściu do tego punktu w Learning Python The Hard Way, zastanawiam się, czy dobrą praktyką jest utworzenie listy symboli i zdefiniowanie ich działania, jak zaznaczono pogrubioną czcionką poniżej, dla każdego języka programowania. Wydaje się to rozsądne i może być bardzo przydatne podczas przeskakiwania między językami programowania? Czy to jest coś, co robią programiści, czy jest to tylko strata wysiłku? > Ćwiczenie 22: Co wiesz do tej pory? W tym > ćwiczeniu ani w następnym nie będzie żadnego kodu, więc nie ma też WYSS ani Extra Credit. W rzeczywistości to ćwiczenie jest jak jeden gigantyczny dodatkowy kredyt. Poproszę, abyś zrobił > formę przeglądu tego, czego się do tej pory nauczyłeś. > > **Najpierw wróć do każdego ćwiczenia, które wykonałeś do tej pory i zapisz > każde słowo i symbol (inna nazwa „znaku”), którego użyłeś. > Upewnij się, że lista symboli jest kompletna.** > > **Obok każdego słowa lub symbolu wpisz jego nazwę i działanie. Jeśli nie możesz > znaleźć nazwy symbolu w tej książce, poszukaj jej w Internecie. Jeśli > nie wiesz, co robi słowo lub symbol, przeczytaj o tym ponownie i spróbuj > użyć go w jakimś kodzie.** > > Możesz natknąć się na kilka rzeczy, których po prostu nie możesz dowiedzieć się lub poznać, więc po prostu zachowaj > te na liście i bądź gotowy do ich wyszukania, gdy je znajdziesz. > > Gdy już masz swoją listę, poświęć kilka dni na przepisanie listy i dwukrotne > sprawdzenie, czy jest poprawna. To może być nudne, ale przebij się i naprawdę > przybij to. > > Po zapamiętaniu listy i tego, co one robią, należy ją > rozwinąć, wypisując tabele symboli, ich nazwy i to, co robią z pamięci. Kiedy trafisz w niektóre, których nie możesz przywołać z pamięci, wróć i zapamiętaj je ponownie.


title: Jak wychodzenie na czas jest postrzegane w firmach software'owych?

text: Jakie są konsekwencje wychodzenia z pracy na czas w firmach programistycznych? Jak profesjonalnie sobie z tym poradzić? [Dodatek redakcyjny] Pytanie dotyczy pracy w standardowych godzinach i nie wliczania dodatkowych godzin bez wyraźnego pytania. Czy praca w nadgodzinach jest normą lub oczekiwanym podejściem do pracy w firmach programistycznych i/lub na stanowisku programisty? Jak ktoś będzie postrzegany przez kolegów i rówieśników, jeśli pracuje się tylko w standardowych godzinach określonych przez lokalne prawo lub umowę?


title: Jak udokumentować wysokopoziomową strukturę programu Java?

text: **Tło:** Wraz ze współpracownikami piszemy artykuł do czasopisma akademickiego. W trakcie naszych badań napisaliśmy program symulacyjny w Javie. Chcemy, aby program symulacyjny był swobodnie dostępny dla innych. Zdecydowaliśmy się na hosting kodu w repozytorium GitHub. Aby ułatwić innym korzystanie, chcemy napisać dobrą dokumentację dla naszego programu, w tym: * Javadocs dla każdej klasy i metody * Jak używać kodu * Opisanie wysokopoziomowej struktury kodu Mój wysokopoziomowy pytanie brzmi: **Czy możesz podać dobry przykład słów i diagramów, których można użyć do opisania wysokopoziomowej struktury programu?** Obejmuje to pytania podrzędne: 1. Jak pokazać, jakie klasy są zawarte w jakich pakietach? 2. Jak pokazujemy, jakie pakiety zależą od innych pakietów? 3. Jak pokazujemy, jak obiekty/klasy w programie współpracują ze sobą? 4. Próbowaliśmy wykorzystać zasady projektowania opartego na domenie w projektowaniu mojego kodu. Jak pokazać zgodność między obiektami w domenie a konkretnymi plikami kodu źródłowego kodującymi te obiekty? (Zobacz mój opis projektu we "wszechobecnym języku" poniżej.) # Co zrobiłem do tej pory ## Język wszechobecny Umieściliśmy opis kodu w "języku wszechobecnym" w pliku `ubiquitous-język.md`, treść poniżej. Celem tego projektu jest zbadanie, jak dobrze polityka uzupełniania działa w prostym łańcuchu dostaw z jednym obiektem, w różnych modelach czasu realizacji, opóźnień raportów i modeli popytu. W każdym okresie mają miejsce następujące zdarzenia: 1. Jeśli **przesyłka** ma dotrzeć do **zakładu** w bieżącym okresie, wówczas poziom zapasów zakładu zwiększa się o X jednostek. 2. Jeżeli **harmonogram** wskazuje, że bieżący okres jest okresem sprawozdawczym, wówczas **obiekt** składa **raport** do **dostawcy**. **Dostawca** może otrzymać **raport** natychmiast lub z kilkutygodniowym opóźnieniem, zgodnie z **harmonogramem**. 3. Jeśli **dostawca** otrzymał **raport** , to na podstawie **polityki uzupełniania** obliczy ilość uzupełnień na X jednostek. **Wysyłka** X jednostek produktu zostanie zaplanowana po upływie l okresów. 4. Klienci przyjeżdżają do **obiektu** i żądają X sztuk produktu. Wszelkie niezaspokojone żądania przepadają. ## Struktura kodu źródłowego Umieściliśmy niekompletny "wysoki poziom" opisu kodu w pliku `structure.md`, zawartość poniżej. ### Struktura poziomu pakietu Na najwyższym poziomie kod źródłowy jest zorganizowany w trzy pakiety * `com.gly.sfs` W tym pakiecie znajduje się główna klasa z metodą `main`. * `com.gly.sfs.model` Klasy modelu domeny znajdują się w tym pakiecie. * `com.gly.sfs.util` Klasy pomocnicze znajdują się w tym pakiecie.


title: Który wybrać: atrybut XML czy podwęzeł?

text: Chcemy wyeksportować niektóre dane z naszej bazy danych jako XML. Na przykład „Osoba” może mieć „wiek”, „imię” i inne właściwości. Mamy dwie możliwości zdefiniowania formatu XML. Wybór nr 1: <Osoby> <Osoba> <Wiek>16</Wiek> <Imię>Richard</Imię> </Osoba> <Osoba> <Wiek>34</Wiek> <Imię>Eric</Imię> < /Person> ... </Persons> Wybór nr 2: <Persons> <Person Age="16" Name="Richard"/> <Person Age="34" Name="Eric"/> ... </ Osoby> Więc jaka jest różnica między definicją podwęzła lub atrybutu? A jaka jest korzyść z każdego wyboru?


title: Kiedy stosować narzędzia, a kiedy programowanie na zamówienie?

text: Aby nauczyć się iniekcji zależności w bieżącym projekcie pobocznym, piszę własny kontener iniekcji zależności. Ale to skłoniło mnie do zastanowienia się, w którym momencie warto skorzystać z produktu innej firmy w porównaniu z „zwijaniem własnego”? Jakie pytania zadałbyś, aby to rozgryźć?


title: Utrzymywanie konwencji stylu kodu dla dużych projektów

text: Od jakiegoś czasu utrzymuję skrypt ad-hoc, aby sprawdzić, czy styl kodu jest zgodny z wytycznymi naszego projektu. Jestem świadomy AStyle/Uncrustify i używałem ich, ale są one najlepsze do jednorazowego czyszczenia w stylu kodu, ale niepraktyczne jest uruchamianie całego kodu przez jakiś automatyczny proces po każdym zatwierdzeniu. Aby wyjaśnić sprawę nieco bardziej, tak – mamy dokumentację w stylu kodu, ale programiści nie zawsze podążają za tym dokładnie i nie jest naprawdę wspaniale dawać im osobistą pocztę za każdym razem, gdy wprowadzą jakąś drobną zmianę, która jest sprzeczna z pewną konwencją. Więc przyjąłem podejście, aby poradzić sobie z tym, jak ostrzeżenia kompilatora, zgłaszać niespójności, ale pozostawiłem to programiście do rozwiązania (niektórzy z was mogą być zaznajomieni z kontrolerem stylu pep8 w Pythonie). Raz na jakiś czas robimy porządki w stylu. Ogólnie jestem bardzo zadowolony z wyniku (w przeciwieństwie do większości narzędzi do sprawdzania stylu), uzyskujesz dużą elastyczność - dzięki czemu możesz wybrać, gdzie być surowym, a gdzie być spokojnym o konwencje (unikanie zbyt wielu fałszywych alarmów jest ważne także). Obecnie używam Pythona i Pygments do parsowania kodu źródłowego C (trochę C++ również, ale głównie C), a następnie własnego skryptu, aby sprawdzić, czy stokenizowane wyniki spełniają nasze konwencje. Działa to całkiem dobrze, nie potrzebuję pełnego AST, który można uzyskać na przykład za pomocą GCC lub Clang, wystarczy wiedzieć, czy tekst jest komentarzem, ciągiem znaków, interpunkcją, preprocesorem ... itd. (co można uzyskać ze składni podświetlanie lub tokenizer źródłowy). Ale skończyło się na tym, że musiałem napisać kilka funkcji narzędziowych dla źródła: * wyodrębnić treść bloku między nawiasami. * znajdź pasujące nawiasy. * identyfikacja odlewów. * sprawdzanie spacji wokół znaków interpunkcyjnych. ... nic naprawdę zaawansowanego. Dokładne konwencje prawdopodobnie nie są tak ważne, ale na przykład oto kilka sprawdzeń: * Umieszczenie nawiasów klamrowych dla sprawdzania instrukcji 'if' podzielonych na wiele wierszy. * Umieszczenie `break` w instrukcji `switch`. * Spacje wokół operatorów, nawiasów klamrowych, wywołań funkcji, po przecinkach. * Wcięcie dla wielowierszowych instrukcji if. * Spójność wcięć. W tym momencie byłbym zainteresowany odejściem od własnych funkcji użytkowych, ale nadal mam skrypt, który sprawdza styl kodu, jeśli jest coś innego, dobrze utrzymanego, rozwiązującego podobne problemy. Byłbym zaskoczony, gdyby nie było innych osób wykonujących podobne projekty, aby w ten sposób utrzymać spójny styl źródłowy, więc jestem zainteresowany poznaniem dostępnych alternatyw. # Pytanie: Biorąc pod uwagę opisany przeze mnie przepływ pracy, czy ktoś może przytoczyć swoje doświadczenia przy użyciu podobnego przepływu pracy, czy są projekty, które już to robią, jestem zainteresowany precedensem.


title: Czy dobrą praktyką jest tworzenie wygodnych metod delegowania?

text: Załóżmy, że mam taki projekt: class Corpus: def cos1(self): pass def cos2(self): pass def serialize_to_stream(self, stream): _CorpusJsonSerializer().serialize(self, stream) class _CorpusJsonSerializer: def serialize(self, korpus, strumień): . . . . . . Myślę, że z różnych powodów proces serializacji powinien być w osobnej klasie. To sprawia, że metoda `serialize_to_stream` w `Corpus` jest zbędna. Jednak chciałbym go tam mieć, ponieważ myślę, że ułatwia to użytkownikom Korpusu, ponieważ nie muszą nic wiedzieć o innej klasie `CorpusJsonSerializer`. Czy uważasz, że to rozsądne? Czy też powinienem po prostu ujawnić `CorpusJsonSerializer` i pozwolić użytkownikowi wykonać pracę?


title: SOA w .NET 4.5 z MSMQ Durability

text: Przeprowadziłem pewne badanie dotyczące ASP.NET Web API. Podobało mi się używanie szablonu REST WCF do tworzenia nowych usług sieci Web zgodnych z REST, a interfejs API sieci Web wydaje się być czystszą iteracją w tym zakresie. Jednak podoba mi się elastyczność WCF w zezwalaniu na http, TCP, MSMQ. Ten aspekt wydaje się ułatwiać architekturę rozproszoną i skalowalną. Czy słusznie mogę stwierdzić, że WCF nadal będzie moim najlepszym wyborem, jeśli chodzi o kolejkowanie trwałych komunikatów typu „uruchom i zapomnij”?


title: Jaką metodologię zastosować przy planowaniu/opracowaniu projektu konwersji języka?

text: Staram się pomóc mojemu przyjacielowi tworząc część jego trwającego projektu. To, co zamierzam zrobić, to utworzyć parser Java, aby rozbić kod Java na operatory, parametry itp., aby zbudować reprezentację XML. Następnie chcę utworzyć generator kodu, aby przekonwertować przeanalizowany kod java na XML zgodny z utworzonym przeze mnie schematem. Na koniec chcę użyć arkusza stylów XML do przekształcenia XML na inny typ języka programowania. Zasadniczo chciałem tylko porady, jakiej metodologii/modelu powinienem użyć do planowania i rozwijania tego projektu. Czy na przykład jest jakaś korzyść z używania Agile itp.?


title: Jak mogę zatrudnić współpracowników, którzy nie są programistami, korzystając z oprogramowania na zamówienie, a nie z Dynamics CRM + Sharepoint?

text: Współpracuję z firmą, która projektuje i buduje jednorazowe maszyny. „Bajkowali” z hostowanymi Dynamics CRM i Sharepoint (na różnych serwerach!), próbując scentralizować swoje dane i pomóc współpracownikom efektywniej współpracować w ramach projektów. Nie wykorzystali żadnego systemu do swojego potencjału. Teraz przyglądamy się działowi inżynieryjnemu, który już używa pewnego rodzaju oprogramowania do kontroli wersji dla różnych plików CAD (Autodesk Vault), jednak coraz bardziej konieczne staje się wdrożenie bardziej ogólnego systemu kontroli wersji plików, ponieważ używa on znacznie więcej plików niż może być zarządzane w Vault (czasem tylko zdjęciami lub skanami dokumentów papierowych), stąd dlaczego przyglądali się za pomocą Sharepoint. Jednak... jako "programista" całej grupy widzę kilka scenariuszy, które nie pasują do podejścia Dynamics + Sharepoint; proste raporty oparte na zapytaniach krzyżowych, eksportowanie pewnych metryk do arkusza kalkulacyjnego, definiowanie hierarchii projektów i relacji wiele-wiele, i jako taki naciskałem na własny pakiet oprogramowania „ECM” / „ERP” (być może w .NET lub php). Niektórzy koledzy wydają się przywiązywać większą wartość do oprogramowania MS (może dlatego, że ma logo!), ale nie widzą, że to tylko framework, a nie rozwiązanie. Czy ktoś może podać dobry przykład tego, kiedy niestandardowe oprogramowanie byłoby rzeczywiście lepsze niż używanie Dynamics + Sharepoint i jak mam to odnieść do personelu nietechnicznego?


title: Czy mogę od razu rozpocząć naukę C#?

text: Mam tytuł licencjata z informatyki 4 lata temu i czuję, że zapomniałem wszystkiego, czego się nauczyłem. Wciąż znam podstawy, takie jak procesor, płyta główna, pamięć RAM, oprogramowanie, sprzęt itp., ale zapomniałem, jak dokładnie działają. Ogólnie wiem, czym jest język programowania i pracowałem z Javą, kiedy byłem na Uni. Szczerze mówiąc, w tym czasie próbowałem tylko rozwiązać zadania i teraz odkryłem, że interesuję się programowaniem i wybrałem C#, ponieważ mogę go używać do aplikacji internetowych i desktopowych. Teraz chcę się nauczyć C#. Czy są do tego jakieś przesłanki? Chodzi mi o to, czy muszę wracać do wszystkich materiałów, które studiowałem na moim licencjacie? Czy mogę rozpocząć naukę od razu?


title: Narzędzie do przeglądu kodu SVN

text: Chciałbym dokonać przeglądu kodu w repozytorium SVN używanym przez nasz zespół. Na razie korzystałem z Eclipse: pokaż log na bagażniku, kliknij wersję i "Porównaj", aby zobaczyć zmiany. diff świetnie się prezentuje, ale nawigacja nie jest praktyczna IMO. Szukam narzędzia, które mogłoby umożliwić przeglądanie kodu z "różnicami", ale z **łatwą nawigacją w zmianach**. Na przykład, możliwość **filtrowania/wykluczania zatwierdzeń** na podstawie ich nazw/wzorów, pokazywania zatwierdzeń użytkownika, **pokazywania zmian od ostatniego tagu** , może oglądania zatwierdzeń na wrażliwych plikach itp. Zaćmienie wtyczka byłaby najlepsza, ponieważ nadal mógłbym korzystać z funkcjonalności takich jak Ctrl+klik na metody/klasy. Ale każda sugestia jest mile widziana.


title: Formatowanie kodu jest złą rzeczą podczas korzystania z VCS?

text: Prawie zawsze formatuję swój kod przed zatwierdzeniem, aby upewnić się, że jest zrobione poprawnie. Większość mojego zespołu tak naprawdę nie przejmuje się i nie zawsze poprawnie formatuje swój kod (drobne rzeczy, które nie wpływają na kod, ale wpływają na czytelność podczas próby jego utrzymania). Niedawno zainstalowałem elektronarzędzia VS z opcją „Formatuj przy zapisie” i dokonałem zmiany w pliku, który nie był wcześniej sformatowany. Wiceprezes ds. rozwoju właśnie przyszedł do mnie i zganił mnie za formatowanie, ponieważ w narzędziu do scalania widać, że zmienił prawie cały plik, zamiast tylko jednej lub dwóch linijek (więc nie może dokładnie zobaczyć, co dokładnie zmodyfikowałem) i kazał mi wyłączyć formatowanie przy zapisie w przyszłości. Chociaż rozumiem tę obawę, czasami trudno mi posortować kod, który jest niesformatowany, a IMO powinien być zawsze poprawnie sformatowany. Zauważ, że nie zmieniam formatu tylko dla kaprysu, ale kiedy piszę kod, użyję elektronarzędzia lub nacisnę klawisz, aby sformatować tekst, aby był łatwiejszy do odczytania, a w SVN pojawia się to jako modyfikacja. Pytam więc, czy zawsze formatowanie kodu jest rzeczywiście złą rzeczą? Czy jego obawy są ważniejsze niż upewnienie się, że kod jest czytelny?


title: Czy istnieją rzeczywiste przypadki dla C++ bez wyjątków?

text: W Kiedy używać C nad C++ i C++ nad C? istnieje oświadczenie wrt. do rozmiaru kodu / wyjątki C++: Jerry odpowiada (między innymi): > (...) zwykle trudniej jest stworzyć naprawdę małe pliki wykonywalne za pomocą > C++. W przypadku naprawdę małych systemów i tak rzadko piszesz dużo kodu, > i dodatkowy (...), na który zapytałem, dlaczego tak jest, na co Jerry odpowiedział: > najważniejsze jest to, że C++ zawiera obsługę wyjątków, co (przynajmniej > zwykle) dodaje pewne minimum do rozmiaru pliku wykonywalnego. Większość kompilatorów pozwoli > wyłączyć obsługę wyjątków, ale gdy to zrobisz, rezultatem nie będzie już C++ >. (...) w co naprawdę nie wątpię na poziomie technicznym realnego świata. * * * Dlatego jestem zainteresowany (czysto z ciekawości), aby usłyszeć z **przykładów ze świata rzeczywistego, w których projekt wybrał C++ jako język, a następnie wybrał wyłączenie wyjątków.** (Nie tylko „nie używaj” wyjątków w kodu, ale wyłącz je w kompilatorze, aby nie można było rzucać ani przechwytywać wyjątków.) Dlaczego projekt zdecydował się to zrobić (nadal używa C++, a nie C, ale bez wyjątków) - jakie są/były (techniczne) powody? * * * Dodatek: Dla tych, którzy chcą rozwinąć swoje odpowiedzi, byłoby miło szczegółowo wyjaśnić, jak obsługiwane są konsekwencje braku wyjątków: * Kolekcje STL (`wektor`, ...) nie działają poprawnie (niepowodzenie alokacji nie może być zgłaszane) * `nowy` nie może rzucać * Konstruktorzy nie mogą zawieść


title: Solo .NET Programista przechodzący do zespołu

text: Od 8 lat jestem samodzielnym programistą .NET dla małego startupu. Stworzyłem całkiem przyzwoite oprogramowanie i zawsze starałem się doskonalić i stosować się do najlepszych praktyk, w tym kontroli źródeł (SVN/TFS). Współpracowałem bardzo blisko z zespołem inżynierów innych dyscyplin, ale gdy sprowadzało się do oprogramowania, byłem jedynym programistą. Uwielbiam rzemiosło programowania i uwielbiam uczyć się nowych rzeczy, aby doskonalić swoje narzędzia. Za 2 tygodnie rozpocznę nową pracę w zespole 20 programistów .NET. Moja pozycja będzie na średnim poziomie i będę pracowała pod okiem kilku programistów z niewiarygodnie imponującym doświadczeniem. Ponownie, zespołowy aspekt rozwoju będzie dla mnie nowością, więc szukam ogólnych wskazówek dotyczących „nowego faceta”, które pomogą mi być tak skutecznym i łatwym w kontaktach, jak to tylko możliwe od samego początku. Wszystko jest możliwe, w tym porady na wysokim poziomie i drobne codzienne sprawy dotyczące komunikacji.


title: Pojedyncza tożsamość dla komputerów stacjonarnych i internetowych

text: Tworzę system, który ma zarówno aplikację desktopową WPF, jak i aplikację Asp.net MVC. Potrzebuję wspólnego składnika tożsamości użytkownika, aby użytkownik mógł zalogować się do jednego z tych samych poświadczeń. Czy ASP.NET Identity jest odpowiednie dla tego zadania? Czy ktoś używał ASP.NET Identity z aplikacją WPF? Czy są jakieś alternatywy?


title: Szukasz statystyk dotyczących testów automatycznych, ciągłej integracji i wykorzystania refaktoryzacji

text: Czy istnieją wiarygodne źródła informacji na temat wdrażania zwinnych technik, takich jak automatyczne testowanie, ciągła integracja i refaktoryzacja? Spośród tych, którzy korzystają z testów jednostkowych, ilu z nich podąża najpierw za testami lub programowaniem opartym na testach. Próbuję określić, jak rozpowszechnione są te praktyki.


title: Czy obawy dotyczące prywatności uniemożliwiają nam dostęp do danych użytkownika opartych na lokalizacji?

text: Za każdym razem, gdy mój zespół zaczyna badać możliwe scenariusze z danymi o lokalizacji urządzenia mobilnego, danymi o lokalizacji będącymi częścią danych użytkownika, a nawet danymi o lokalizacji, które można pobrać lub wywnioskować z adresu IP lub plików cookie przeglądarki, zatrzymujemy się w naszym śledzi przez ryzyko naruszenia prywatności użytkownika. To frustrujące, ponieważ praca z danymi lokalizacji tworzy zupełnie nowe obszary, które zapewniają doskonałe wrażenia użytkownika. Zapoznałem się z ustawą o prywatności urządzeń mobilnych, powiązanymi opiniami internetowymi, takimi jak artykuł ars technica, oraz niedawną ustawą o ochronie prywatności użytkowników mobilnych wydaną przez Electronic Frontier Foundation, ale tak naprawdę nie ma autorytatywnej (a nawet de facto) standard i opinie różnią się. Czy jest to tak proste, jak uzyskanie zgody użytkownika na wykorzystanie danych dotyczących lokalizacji, a następnie zabezpieczenie danych? Chciałbym wiedzieć, jak inni podchodzą do tego problemu, a nawet go pomijają. Czy uzyskujesz zgodę użytkownika przed wykorzystaniem danych o lokalizacji? Czy po prostu jeździsz na razie i czekasz, aby zobaczyć, czy zostanie uchwalone prawo krajowe?


title: Czy agregaty DDD to naprawdę dobry pomysł w aplikacji internetowej?

text: Zanurzam się w Domain Driven Design i niektóre koncepcje, z którymi się spotykam, mają pozornie dużo sensu, ale kiedy myślę o nich więcej, muszę się zastanowić, czy to naprawdę dobry pomysł. Na przykład sensowne jest pojęcie agregatów. Tworzysz małe domeny własności, dzięki czemu nie musisz zajmować się całym modelem domeny. Jednak gdy myślę o tym w kontekście aplikacji internetowej, często trafiamy do bazy danych, aby wycofać małe podzbiory danych. Na przykład strona może zawierać tylko liczbę zamówień z linkami, które należy kliknąć, aby otworzyć zamówienie i zobaczyć jego identyfikator zamówienia. Jeśli dobrze rozumiem Aggregates, zwykle użyłbym wzorca repozytorium, aby zwrócić OrderAggregate, który zawierałby elementy `GetAll`, `GetByID`, `Delete` i `Save`. Ok, to brzmi dobrze. Ale... Jeśli wywołam GetAll, aby wyświetlić wszystkie moje zamówienia, wydaje mi się, że ten wzorzec wymagałby zwrócenia całej listy zagregowanych informacji, kompletnych zamówień, linii zamówień itp... Kiedy potrzebuję tylko małej podzbiór tych informacji (tylko informacje nagłówkowe). Czy czegoś mi brakuje? A może jest jakiś poziom optymalizacji, którego byś tutaj użył? Nie wyobrażam sobie, by ktokolwiek opowiadał się za zwracaniem całych agregatów informacji, gdy ich nie potrzebujesz. Oczywiście, można by stworzyć metody w twoim repozytorium, takie jak `GetOrderHeaders`, ale to wydaje się niweczyć cel używania wzorca takiego jak repozytorium. Czy ktoś może mi to wyjaśnić? **EDYTUJ:** Po wielu dalszych badaniach myślę, że rozłączeniem jest to, że czysty wzorzec Repozytorium różni się od tego, co większość ludzi myśli o Repozytorium. Fowler definiuje repozytorium jako magazyn danych, który używa semantyki kolekcji i jest ogólnie przechowywany w pamięci. Oznacza to utworzenie grafu całego obiektu. Evans modyfikuje Repozytorium, aby zawierało Aggregate Roots, a zatem repozytorium jest amputowane, aby obsługiwać tylko obiekty w Aggregate. Większość ludzi wydaje się myśleć o repozytoriach jako gloryfikowanych obiektach dostępu do danych, w których po prostu tworzysz metody, aby uzyskać dowolne dane. Wydaje się, że nie jest to zamiarem opisanym we Wzorcach architektury aplikacji korporacyjnych Fowlera. Jeszcze inni myślą o repozytorium jako o prostej abstrakcji używanej głównie w celu ułatwienia testowania i wyszydzania lub oddzielenia trwałości od reszty systemu. Myślę, że odpowiedź brzmi, że jest to o wiele bardziej złożona koncepcja, niż początkowo sądziłem.


title: Jaka jest właściwa pozycja dłoni dla klawiszy ruchu w Vimie?

text: Niedawno zacząłem używać Vima i pracuję nad zastąpieniem Notepad++ jako mojego celu. Jednak napotykam problem, w którym ciągle uderzam w u zamiast i, ponieważ moja prawa ręka jest na HJKL zamiast na zwykłym JKL;. Tak więc użytkownicy Vima: Czy jest preferowane pozycjonowanie prawej ręki dla edytora, czy powinienem po prostu przyzwyczaić się do poruszania ręką w przód iw tył w trybie normalnym i wstawiania?


title: Utrzymywanie listy węzłów o trudnych wymaganiach

text: To jest pytanie dotyczące projektowania zbioru uporządkowanych węzłów, które mają pewne wymagania, które staram się spełnić. W obszarze problemowym, którym się zajmuję, mamy trasy będące uporządkowaną kolekcją węzłów. Trasa będzie miała od 1000 do 25000 węzłów. Sam węzeł jest złożonym obiektem. Muszę być w stanie utrwalić węzły, najlepiej w relacyjnej bazie danych (ponieważ szersza aplikacja jest obecnie dostarczana przy użyciu architektury, która używa relacyjnej bazy danych do trwałości). Mam dwa oddzielne wymagania, które utrudniają modelowanie danych. 1. Muszę być w stanie wstawiać węzły (lub wskaźniki do węzłów) na środku listy i reorganizować listę w locie. 2. Muszę być w stanie pobrać listę we właściwej kolejności sekwencyjnej, z wydajnym indeksem i możliwością losowego dostępu. Myślę, że jedynym sposobem, w jaki mogę spełnić pierwszy wymóg, jest modelowanie danych jako połączonej listy, w której każdy węzeł wskazuje następny węzeł na liście, co pozwoliłoby na edycję i reorganizację listy w locie. Myślę, że jedynym sposobem, w jaki mogę spełnić drugie wymaganie, jest sekwencyjne uporządkowanie listy, tak aby każdy węzeł miał odniesienie do swojej pozycji na liście i uporządkowanie/dostęp do listy według pozycji. Czy istnieje jakaś inna metoda, której mógłbym użyć, która może spełnić te dwa wymagania, czy też utknąłem w tworzeniu hybrydy, która wykorzystuje obie metody w różnym czasie w zależności od kontekstu operacyjnego i która utrzymuje zsynchronizowane dwa typy odwołań?


title: Jakie są różne sposoby wykonywania autoryzacji w aplikacji sieci Web, inne niż autoryzacja oparta na rolach?

text: Najbardziej powszechnym podejściem stosowanym do autoryzacji, które znam, jest autoryzacja oparta na rolach. Zamiast bezpośrednio przechowywać prawa dostępu względem identyfikatorów użytkowników, tworzysz role i przechowujesz prawa dostępu względem nich. Następnie przypisz użytkownikom role. Chociaż uważam, że metoda oparta na rolach jest dość elastyczna i łatwa w utrzymaniu, nadal interesuje mnie, czy istnieją lepsze metody przechowywania danych autoryzacyjnych. Używam Spring Security do zabezpieczania aplikacji internetowych JSF. Wraz z rozwiązaniami dla Spring Security doceniłbym również rozwiązania ogólne (nie specyficzne dla konkretnego frameworka bezpieczeństwa).


title: Wykorzystanie „Języków wieloparadygmatycznych” w zastosowaniach komercyjnych

text: Obecnie uczę się dwóch języków F-Sharp i Scala. Moim zdaniem te dwa języki są dość zrozumiałe. Niemniej jednak wydaje się, że Scala i F-Sharp są do siebie podobne, to to, że obaj próbują zaoferować konglomerat paradygmatów programowania (OO, funkcjonalny), aby rozwiązywać zadania w świecie rzeczywistym i nadać im zastosowanie jako języki ogólnego przeznaczenia . Chociaż oba języki wydają się przyciągać najwięcej uwagi w środowisku akademickim, niewiele mówi się o ich wykorzystaniu w komercyjnych projektach oprogramowania. Biorąc pod uwagę różne filozofie platformy stojące za tymi dwoma językami, które – w twojej subiektywnej opinii – bardziej obiecujące, aby w niedalekiej przyszłości stać się powszechnie używanym w celach komercyjnych?


title: Jakie są zalety/wady używania C nad montażem?

text: Obecnie studiuję inżynierię w telekomunikacji i elektronice i przeszliśmy z asemblera do C w programowaniu mikroprocesorowym. Mam wątpliwości, czy to dobry pomysł. Jakie są zalety i wady C w porównaniu do montażu? Zalety/wady jakie widzę to: **Zalety:** * Mogę powiedzieć, że składnia C jest dużo łatwiejsza do nauczenia niż składnia Assemblera. * C jest łatwiejszy w użyciu do tworzenia bardziej złożonych programów. * Nauka C jest w jakiś sposób bardziej produktywna niż nauka asemblera, ponieważ jest więcej rzeczy rozwijających się wokół C niż asemblera. **Wady:** * Assembler jest językiem programowania niższego poziomu niż C, co czyni go dobrym do programowania bezpośrednio na sprzęcie. * Jest o wiele bardziej elastyczny, nawiązując do pracy z pamięcią, przerwaniami, mikrorejestrami itp.


title: Gdzie mam umieścić moją klasę aktualizacji i obsłużyć żądanie/odpowiedź z żądania internetowego HTTP?

text: Nie wiem, jak uporządkować mój kod. W tej chwili po prostu zrzuciłem wszystko na MainPage do testów. Ale jaki jest właściwy sposób obsługi pobierania danych z usługi sieciowej REST w systemie Windows Phone 8? Mam wiele stron, które muszą wykorzystać zwracane dane. /// <summary> /// Informacje o stanie dla naszego wywołania asynchronicznego BeginGetResponse /// </summary> public class UpdateState { public HttpWebRequest AsyncRequest { get; ustawić; } public HttpWebResponse AsyncResponse { get; ustawić; } } public część klasy MainPage : PhoneApplicationPage { // Konstruktor public MainPage() { InitializeComponent(); // Przykładowy kod do lokalizacji paska aplikacji //BuildLocalizedApplicationBar(); } private async void test() { var handler = new HttpClientHandler(); if (handler.SupportsAutomaticDecompression) { handler.AutomaticDecompression = DecompressionMethods.GZip | Metody dekompresji.Deflate; } // utwórz URI UriBuilder fullUri = new UriBuilder("http://test/GetData?"); fullUri.Query = "format=xml&param=test&dateFrom=20071225&dateTo=20080101"; var httpClient = new HttpClient(obsługa); var str = czekaj httpClient.GetStringAsync(fullUri.Uri); test ciągu = ""; } private void Button_Click(object sender, RoutedEventArgs e) { test(); // utwórz URI UriBuilder fullUri = new UriBuilder("http://test/GetData?"); fullUri.Query = "format=xml&param=test&dateFrom=20140124&dateTo=201425"; // zainicjuj nowe żądanie WebRequest HttpWebRequest = (HttpWebRequest)WebRequest.Create(fullUri.Uri); // skonfiguruj obiekt stanu dla żądania asynchronicznego UpdateState state = new UpdateState(); state.AsyncRequest = żądanie; // uruchom żądanie asynchroniczne request.BeginGetResponse(new AsyncCallback(HandleResponse), state); } /// <summary> /// Obsługa informacji zwróconych z żądania asynchronicznego /// </summary> /// <param name="asyncResult"></param> private void HandleResponse(IAsyncResult asyncResult) { // pobierz informacje o stanie UpdateState forecastState = (UpdateState)asyncResult.AsyncState; HttpWebRequest forecastRequest = (HttpWebRequest)forecastState.AsyncRequest; // zakończenie żądania asynchronicznego forecastState.AsyncResponse = (HttpWebResponse)forecastRequest.EndGetResponse(asyncResult); Strumień strumienia Wynik; string nowy kredyt = ""; string newCityName = ""; int nowaWysokość = 0; ciąg XMLresult = ciąg.Pusty; try { // pobierz strumień zawierający odpowiedź z ciągu asynchronicznego wywołania type = forecastState.AsyncResponse.ContentType; streamResult = forecastState.AsyncResponse.GetResponseStream(); XMLresult = getXMLData(streamResult); // załaduj XML XElement xmlData = XElement.Parse(XMLresult); ciąg t = ""; } catch (FormatException) { // wystąpił jakiś błąd podczas przetwarzania odpowiedzi z sieci // dodatkowa obsługa błędów normalnie zostałaby tutaj dodana return; } }


title: Etymologia „rzucić wyjątek”

text: Dlaczego używamy wyrażenia „zrzuć wyjątek”, a nie czegoś w rodzaju „generuj”? Gdzie narodził się ten termin iw jakim języku?


title: Czy w przypadku akcji ASP.NET MVC należy używać usług sieci Web?

text: W formularzach sieci Web ASP.NET, jeśli chcesz używać jQuery i bezpośrednio wywoływać metodę, należy zaimplementować usługę sieci Web lub użyć metod stron. Możesz także użyć Generic Handlers (pliki .ashx). Jednak w ASP.NET MVC akcję kontrolera (metodę z natury) można wywołać bezpośrednio z jQuery. Jakie usługi sieciowe mają do zaoferowania w świecie ASP.NET MVC? Innymi słowy, wydaje się, że mogę spełnić moje wymagania za pomocą czystych adresów URL, kontrolerów i akcji MVC. Czy powinienem zawracać sobie głowę korzystaniem z usług sieci Web?


title: Którą metodologię projektowania zarządzania wersjami należy zastosować w węzłach systemu zależnego?

text: To jest moje pierwsze pytanie, więc proszę o zaznaczenie, czy moje pytanie jest zbyt niejasne i niezrozumiałe. Moje pytanie jest bardziej związane z projektowaniem wysokiego poziomu. Mamy system (w szczególności ATCA Chassis) skonfigurowany w topologii gwiazdy, mający **Master Node (MN)** i inne **podrzędne węzły (SN)**. Wszystkie węzły są połączone przez Ethernet i powinny działać w systemie operacyjnym Linux z innymi zastrzeżonymi aplikacjami. Muszę zbudować projekt ramowy odzyskiwania, aby każda jednostka oprogramowania, niezależnie od tego, czy jest to Linux, Ramdisk czy aplikacja, mogła zostać przywrócona do poprzednich dobrych wersji, jeśli stanie się coś złego. Dlatego myślę o utrzymaniu macierzy wersji stanu nad MN, gdzie każdy stan (1,2....n) reprezentuje dobre wersje jądra, ramdysku i aplikacji dla każdego SN. Może się zdarzyć, że jedna wersja SN może zależeć od innej wersji SN. Zobacz poniższy diagram:- ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/dh1pv.jpg) Mam więc dylemat, czy użyć metodologii zarządzania pakietami używanej przez dystrybucje Debiana (takie jak Ubuntu) czy metodyka repozytorium GIT; w celu przywrócenia poprzednich dobrych wersji na jednym SN lub na wszystkich zależnych SN. Metoda ta powinna być również łatwiejsza do ulepszania SN wraz z MN. Niektóre z funkcji, które staram się osiągnąć:- 1) Uaktualnienie nawet jednego oprogramowania jest możliwe bez przeszkadzania innym. 2) Sprawdzenie zależności musi zostać wykonane przed zastosowaniem przywrócenia lub uaktualnienia każdego z SN 3) W przypadku niepowodzenia zależności należy podać monit użytkownika. ). 4) Pliki binarne powinny być odpowiednio dystrybuowane na SN, aby proces odzyskiwania był szybszy; raczej za każdym razem ściągam od MN. 5) Wydaj łatki od dewelopera dla poprawek błędów, ulepszenia funkcji można zastosować w uruchomionym systemie. 6) Każdą wersję można łatwo śledzić i rozróżniać. Dziękuję


title: Dlaczego „42” jest preferowaną liczbą, gdy wskazujemy coś losowego?

text: Widziałem to na SO wiele razy. Ilekroć pytanie jest niejasne i pytanie wymaga jakiejś magicznej odpowiedzi, ktoś zostawia komentarz mówiący, że odpowiedź to 42. Nawet książka, którą teraz czytam, używa „42” jako liczby, kiedy tylko chce zademonstrować podstawową koncepcję za pomocą liczby całkowitej . Czy kryje się za tym jakaś historia, czy to tylko zbieg okoliczności?


title: Jaka jest pierwsza rzecz, którą piszesz, próbując nowego języka?

text: Myślę, że każdy ma swój własny program lub zestaw funkcji poza „Hello World!”, których używa, próbując nowego języka. Mój to gra w zgadywanie: myślę o liczbie 1-10, zgadnij, co to jest! Zgadnij: 3 Nie, za nisko! Zgadnij: 7 Nie, za wysoko! Zgadnij: 5 Tak, wygrywasz! Grać ponownie (T/N)? N Co _ty_ piszesz?


title: Kiedy programowanie w parach działa dla Ciebie? Kiedy należy tego unikać?

text: Zamiast niewolniczego programowania w parach przez cały czas, używamy programowania w parach selektywnie w naszym zespole. Myślę, że działa to najlepiej w następujących okolicznościach: * Wzmacnianie zupełnie nowych członków zespołu w projekcie (zamiast pozwalać im na samodzielne przedzieranie się przez dokumentację lub kod). * Współpraca młodszych i starszych osób (pomaga pokazać niektóre umiejętności i sztuczki bardziej doświadczonych programistów, a także pozwala starym psom czasami nauczyć się nowych sztuczek). * Kiedy ktoś próbuje wyśledzić defekt, często pomaga sparować ze świeżymi oczami. Kiedy łączysz program i dlaczego? Kiedy unikasz programowania w parach? Czemu?


title: Jakiego elementu składni najbardziej nienawidzisz w języku programowania, którego często używasz?

text: Bez względu na to, jak bardzo kochasz język programowania, zawsze jest w nim kilka szczegółów, które nie są tak ładne, jak mogłyby być. W tym pytaniu chciałbym szczególnie skupić się na **elementach składni.** W języku programowania, którego często używasz (być może Twoim ulubionym języku programowania, a może tym, którego jesteś zmuszony używać w pracy), który element składni uważasz, że jest to najbardziej nieczytelne, niejasne, niewygodne lub nieprzyjemne?


title: Czy dostępne elementy klasy wewnętrznej powinny być również wewnętrzne?

text: Projektuję zestaw API dla niektórych aplikacji, nad którymi pracuję. Chcę, aby styl kodu był spójny we wszystkich pisanych przeze mnie klasach, ale odkryłem, że jest kilka niespójności, które wprowadzam i nie wiem, jaki jest najlepszy sposób ich rozwiązania. Mój przykład jest specyficzny dla C#, ale dotyczy to dowolnego języka z podobnymi mechanizmami. Jest kilka klas, których potrzebuję do celów implementacyjnych, których niekoniecznie chcę udostępniać w API, więc w razie potrzeby robię je "wewnętrznymi". Generalnie to, co zrobiłbym, to zaprojektowanie klasy tak, jak zwykle (np. w razie potrzeby, uczynienie członków `public`/`protected`/`private`) i zmianę poziomu widoczności samej klasy na `internal`. Mogę więc mieć kilka klas, które wyglądają tak: interfejs wewnętrzny IMyItem { ItemSet AddTo(ItemSet set); } klasa wewnętrzna _SmallItem : IMyItem { private readonly /* parametry */; public _SmallItem(/* małe parametry pozycji */) { /* ... */ } public ItemSet AddTo(ItemSet set) { /* ... */ } } wewnętrzna klasa abstrakcyjna _CompositeItem: IMyItem { private readonly /* parametry * /; public _CompositeItem(/* złożone parametry pozycji */) { /* ... */ } public abstrakcyjny obiekt UsefulInformation { get; } protected void HelperMethod(/* parameters */) { /* ... */ } } internal class _BigItem : _CompositeItem { private readonly /* parameters */; public _BigItem(/* parametry dużego elementu */) { /* ... */ } public override object UsefulInformation { get { /* ... */ } } public ItemSet AddTo(ItemSet set) { /* ... * / } } W innej wygenerowanej klasie (część parsera/skanera) istnieje struktura zawierająca pola dla wszystkich możliwych wartości, które może reprezentować. Wygenerowana klasa też jest „wewnętrzna”, ale mam kontrolę nad widocznością członków i zdecydowałem, że będą one również „wewnętrzne”. wewnętrzna częściowa struktura ValueType { string wewnętrzny String; wewnętrzny zestaw przedmiotów zestaw przedmiotów; wewnętrzny IMyItem MyItem; } internal class TokenValue { internal static int EQ(ItemSetScanner scanner) { /* ... */ } internal static int NAZWA(ItemSetScanner skaner, wartość ciągu) { /* ... */ } internal static int WARTOŚĆ(ItemSetScanner skaner, wartość ciągu) { /* ... */ } //... } Wydaje mi się to dziwne, ponieważ pierwszy zestaw klas, niekoniecznie musiałem upubliczniać niektóre elementy, bardzo dobrze mogli mieć został uczyniony „wewnętrznym”. Elementy „internal” typu „internal” i tak mogą być dostępne tylko wewnętrznie, więc po co je „publicznymi”? Po prostu nie podoba mi się pomysł, że sposób, w jaki piszę moje klasy, _musi_ się drastycznie zmienić (tj. zmienić wszystkie zastosowania `public` na `internal`) tylko dlatego, że klasa jest `internal`. Jakieś przemyślenia na temat tego, co powinienem tutaj zrobić? Wydaje mi się sensowne, że mógłbym chcieć zadeklarować niektórych członków klasy jako „publiczne”, „wewnętrzne”. Ale jest dla mnie mniej jasne, kiedy klasa jest zadeklarowana jako „wewnętrzna”.


title: Czy jest legalne wydanie projektu wersji GPL we FreeBSD?

text: Nie mogłem odróżnić licencji FreeBSD od licencji GPL. Czy ktoś może mi powiedzieć, pod jakim względem te dwie licencje są różne. Czy legalne jest używanie jakiegoś źródła opartego na licencji GPL i wydawanie nowego produktu na licencji FreeBSD? W szczególności mam następującą scenę: Chciałbym prześledzić część modułu implementacji jakiejś implementacji na mój użytek. Implementacja jest standardową implementacją algorytmu. Więc w zasadzie biorę odniesienie do wdrożenia na swój własny sposób. Nie używam dosłownej kopii, niektóre moduły pasują do oryginału. Ten, do którego się odwołuję, znajduje się na licencji FreeGPL V3. Nowy produkt, który wydam na licencji FreeBSD. Czy jest to legalne, czy powinienem wydać swój produkt na licencji FreeGPL? [EDYTUJ] Co więcej, w moim przypadku implementuję jakiś standardowy algorytm. Powiedzmy, że lista połączona ze strukturą danych. Myślę, że ktokolwiek to zaimplementuje, będzie miał taką samą strukturę i podobny rodzaj funkcji do wyszukiwania, usuwania i wstawiania. Nawet operacje będą widoczne. Widziałem trochę kodu w Internecie i dostałem wpływ kodu mojej implementacji, który był tak nieunikniony. W takim razie jak programista może twierdzić, że dany kod jest jego własnym oryginalnym kodem?


title: Jakich języków używają profesjonalni projektanci aplikacji mobilnych?

text: Ostatnio programowałem w języku Java dla aplikacji na Androida (chociaż moje pytanie nie dotyczy tylko Androida) i zastanawiałem się, czy to, co robię, jest o wiele mniej skomplikowane, ale generalnie takie samo, jak to, co zrobiłby profesjonalny projektant aplikacji mobilnych . Założyłem, że projektant aplikacji pracujący, powiedzmy dla BBC, użyje drogiego pakietu oprogramowania i może innego języka. Więc moje pytanie brzmi **jakiego języka by używali?** Może używaliby takiego, który działałby zarówno na Androida, jak i iOS?


title: Jaką matematykę powinienem przejrzeć i opanować przed zapisaniem się na program CS (student po czterdziestce, 20 lat dev exp, bez dyplomu)

text: Jestem po czterdziestce i tej jesieni planuję zapisać się na uniwersytet, aby zdobyć od dawna odkładany dyplom CS. Pracuję jako programista od prawie 20 lat, ale dalszy rozwój na tym etapie mojej kariery jest dla mnie trudny bez dyplomu. Poza tym zawsze chciałem go zdobyć, mam głód nauki, a po ukończeniu studiów przed przejściem na emeryturę mam jeszcze 20 lat. Zacząłem w gimnazjum poza liceum, ale ukończyłem tylko około 16 godzin, więc w zasadzie zaczynam od zera. Jestem podekscytowany, ale pełen obaw. W liceum byłam bardzo dobra z matematyki - brałam Trig/Pre-calc itp. i dobrze sobie radziłam. Uzyskałem wysoki wynik z matematyki w ACT/SATs. Jednak 20 lat tworzenia aplikacji opartych na bazach danych nie wymagało żadnej wyższej matematyki i wiem, że jestem dość zardzewiały. **Jakie konkretne tematy/dziedziny matematyki muszę przejrzeć i opanować w ciągu następnych 6 miesięcy, aby dać mi szansę na walkę w Calc I (i nie tylko)?** Twoja pomoc jest bardzo wdzięczna. Dziękuję za Twój czas.


title: Jaki jest optymalny minimalny czas pracy nad zadaniami dla pojedynczego projektu?

text: W miarę jak jestem coraz bardziej zorganizowany i mam więcej projektów, zaczynam się zastanawiać, jak najlepiej zarządzać czasem między nimi. Zwłaszcza w odniesieniu do tego, jak podaję szacunki PHB. Jeśli więc projekt jest podzielony na małe zadania, powiedzmy 2-3 godziny każde, to praca nad jednym zadaniem dziennie jest tak samo efektywna, jak w przypadku spędzania 6 godzin dziennie i wykonywania dużej części 3 zadań. Zdaję sobie sprawę, że w pewnym stopniu zależy to od projektu, ale myślę też, że ogólnie rzecz biorąc, lepiej byłoby wspólnie pracować nad komponentami, aby wszystko pozostało świeże w pamięci. To powiedziawszy, oznacza to odsunięcie innych projektów na tydzień lub dwa, aby poświęcić na te zadania 6 godzin dziennie. Po prostu staram się to przemyśleć i pomyślałem, że zdobędę jakiś wkład.


title: Co wykazały badania dotyczące skuteczności komentarzy?

text: Kłóciłem się z przyjacielem o konieczność komentarzy i skuteczność różnych stylów komentarzy. Spór zakończył się dość szybko, ponieważ nie mogliśmy znaleźć żadnych badań – ani esejów – które wspierałyby którekolwiek z twierdzeń. Czy przeprowadzono jakieś poważne badania dotyczące skuteczności różnych stylów komentowania? Jeśli tak, co to pokazało? Interesują mnie głównie: * Długość (myślę, że komentarze dłuższe niż tweet nigdy nie są czytane) * Typ (zdecydowanie preferuję komentarze, które są rzeczywistymi przykładami kodu, wyjaśniającymi, jak wywołać metodę) * Lokalizacja (jako osobna linia? na końcu linii?)


title: Czy programowanie funkcjonalne ignoruje korzyści płynące z „O kryteriach, które należy stosować w rozkładaniu systemów na moduły” (ukrywanie danych)?

text: Jest klasyczny artykuł zatytułowany On the Criteria To Be Used in Decomposing Systems into Modules, który właśnie przeczytałem po raz pierwszy. Ma to dla mnie sens i jest prawdopodobnie jednym z tych artykułów, na których opierało się OOP. Wniosek: > Próbowaliśmy pokazać na tych przykładach, że prawie zawsze > niepoprawne jest rozpoczęcie dekompozycji systemu na moduły > na podstawie schematu blokowego. ... Każdy moduł jest wtedy zaprojektowany, aby ukryć taką decyzję > przed innymi. W mojej opinii niewykształconej i niedoświadczonej, programowanie funkcjonalne przyjmuje dokładnie odwrotne rady tego artykułu. Rozumiem, że programowanie funkcjonalne sprawia, że przepływ danych jest idiomatyczny. Dane są przekazywane z funkcji do funkcji, a każda funkcja jest dokładnie świadoma danych i „zmienia je” po drodze. I wydaje mi się, że widziałem przemówienie Richa Hickeya, w którym mówi o tym, że ukrywanie danych jest przereklamowane, niepotrzebne czy coś takiego, ale nie pamiętam na pewno. 1. Najpierw chcę wiedzieć, czy moja ocena jest prawidłowa. Czy paradygmat FP i ten artykuł są filozoficznie sprzeczne? 2. Zakładając, że się nie zgadzają, w jaki sposób FP „rekompensuje” brak ukrywania danych? Być może poświęcają ukrywanie danych, ale zyskują X, Y i Z. Chciałbym poznać powody, dla których X, Y i Z są uważane za bardziej korzystne niż ukrywanie danych. 3. Albo, zakładając, że się nie zgadzają, być może FP uważa, że ukrywanie danych jest złe. Jeśli tak, dlaczego uważa, że ukrywanie danych jest złe? 4. Zakładając, że się zgadzają, chciałbym wiedzieć, na czym polega implementacja ukrywania danych w FP. To oczywiste, aby zobaczyć to w OOP. Możesz mieć pole `private`, do którego nikt spoza klasy nie ma dostępu. Nie ma dla mnie oczywistej analogii w FP. 5. Czuję, że są inne pytania, które powinienem zadać, ale nie wiem, czy powinienem zadawać. Nie wahaj się też na nie odpowiedzieć. # Aktualizacja Znalazłem tę przemowę Neala Forda, która zawiera bardzo istotny slajd. Umieszczę zrzut ekranu tutaj: ![tutaj podaj opis obrazu](http://i.stack.imgur.com/esjl0.png)


title: Dlaczego tak wielu programistów absolutnie nienawidzi warstw prewalencji obiektów?

text: Rozpowszechnienie to prosta technika dostarczania właściwości ACID do modelu obiektów w pamięci na podstawie serializacji binarnej i rejestrowania z wyprzedzeniem. Działa to tak: * Zacznij od migawki. Serializuj model obiektowy i zapisz go do pliku. * Utwórz plik dziennika. Dla każdego wywołania w modelu obiektów serializuj wywołanie i jego argumenty. * Gdy dziennik staje się zbyt duży, zamykasz lub jest to wygodne, wykonaj punkt kontrolny: napisz nową migawkę i skróć dziennik. * Aby cofnąć lub odzyskać dane po awarii lub utracie zasilania, załaduj ostatnią migawkę i ponownie wykonaj wszystkie połączenia zapisane w dzienniku. Środki ostrożności potrzebne do tego, aby to zadziałało: * Nie pozwól, aby zmienne odniesienia do obiektów uniknęły lub dostały się do warstwy rozpowszechnienia. Potrzebujesz jakiegoś schematu proxy lub OID, tak jakbyś robił RPC. (Jest to tak powszechny błąd nowicjusza, że został nazwany „problemem chrztu”.) * Cała logika osiągalna z wywołania musi być całkowicie deterministyczna i nie może wykonywać wywołań we/wy lub systemu operacyjnego, które mają znaczenie dla logiki biznesowej. Zapisywanie w dzienniku diagnostycznym jest prawdopodobnie w porządku, ale pobieranie czasu systemowego lub uruchamianie delegata asynchronicznego zazwyczaj nie jest. Dzieje się tak, aby dziennik odtwarzał się identycznie, nawet jeśli został przywrócony na innym komputerze lub w innym czasie. (Większość kodów rozpowszechnienia zapewnia alternatywne wywołanie czasu w celu uzyskania znacznika czasu transakcji.) * Współbieżność programu zapisującego wprowadza niejednoznaczność w interpretacji dziennika, więc jest zabroniona. Czy to dlatego, że ... * ludzie nabrali do nich złego smaku po próbie użycia go w projekcie, który nie był do tego dobrze dopasowany*? * Zdecydowane orędownictwo Klausa Wuestefelda zniechęciło ludzi? * ludzie, którzy lubią imperatywny model programowania, nie lubią oddzielać operacji we/wy od obliczeń, woląc zamiast tego przeplatać obliczenia z wywołaniami we/wy i wątkami? * warstwy rozpowszechnienia są tak koncepcyjnie proste i tak ściśle związane z charakterystyką struktury, w której przebywają, że są zwykle rozwijane na potrzeby projektu, co czyni je zbyt obcymi/niestandardowymi/ryzykownymi? * po prostu zbyt trudno jest zachować jasność, czego musisz uważać, aby tego nie robić? * głowy nowicjuszy po prostu wydają się eksplodować, gdy mają do czynienia z czymś, co nie jest tym samym rodzajem dwuwarstwowej aplikacji opartej na bazie danych, którą nauczyli się pisać w szkole? ;) * * * *Cały zestaw danych mieści się w pamięci RAM, nie potrzebujesz współbieżności zapisu i nie musisz wykonywać zapytań ad hoc, raportowania ani eksportowania do hurtowni danych. Z przeprosinami dla SQLite, rozpowszechnienie jest ulepszeniem plików zapisu, a nie zamiennikiem dla Oracle.


title: Jaki jest najlepszy sposób śledzenia mediany?

text: Przeczytałem pytanie w jednej książce: Liczby są generowane losowo i przechowywane w (rozwijanej) tablicy. Jak śledziłbyś medianę? Istnieją dwie struktury danych, które mogą rozwiązać ten problem. Jedno to zrównoważone drzewo binarne, drugie to dwa stosy, które śledzą największą i najmniejszą połowę elementów. Myślę, że te dwa rozwiązania mają taki sam czas działania jak O(n lg n), ale nie jestem pewien swojego osądu. Twoim zdaniem, jaki jest najlepszy sposób na śledzenie mediany? —————————————————————————————kontynuuj W tym pytaniu，Myślę, że stosy to najlepszy sposób na śledzenie mediany. Istnieją dwie sterty, duża sterta i mała sterta, które nie muszą być sekwencyjne. Najpierw obliczamy średnią wartość elementów w tablicy. Jeśli element jest mniejszy niż wartość średnia, umieszczamy liczbę na małym stosie. Wręcz przeciwnie, kładziemy num na dużą stertę. Jeśli liczba dużej sterty jest równa liczbie małej sterty, mediana jest największa w małej stercie i najmniejsza w dużej stercie. Jeśli dwie sterty mają różne rozmiary, po prostu zdejmujemy element główny ze sterty o większym rozmiarze i wpychamy go do korzenia sterty o mniejszym rozmiarze. W przypadku dużej sterty element root jest najmniejszy, a dla małej sterty element root jest największym. W ten sposób, jeśli dwie sterty mają ten sam rozmiar lub różnicę cyfrową, medium znajduje się w korzeniu. Myślę, że to rozwiązanie ma czas działania jako O(m*n), m oznacza czasy, w których dostosowujemy sterty niewyważenia. Czy to najlepszy sposób na śledzenie mediany?


title: W jakich warunkach sensowne jest dzielenie kodu na wiele plików lub ich scalanie?

text: Właśnie skończyłem łączyć siedem skryptów w jeden, ale pomyślałem, że naprawdę nie mam formalnej logiki do dzielenia skryptów na strony lub dlaczego miałbym je scalić. Propozycje?


title: Jak zaimplementować tasowanie ważone

text: Niedawno napisałem kod, który uważałem za bardzo nieefektywny, ale ponieważ zawierał tylko kilka wartości, zaakceptowałem go. Jednak nadal interesuje mnie lepszy algorytm dla następujących elementów: 1. Lista X obiektów, każdemu z nich przypisana jest „waga” 2. Podsumuj wagi 3. Wygeneruj losową liczbę od 0 do sumy 4 Iteruj przez obiekty, odejmując ich wagę od sumy, aż suma nie będzie dodatnia 5. Usuń obiekt z listy, a następnie dodaj go na koniec nowej listy Pozycje 2, 4 i 5 wszystkie biorą `n ` czas, a więc jest to algorytm `O(n^2)`. Czy można to poprawić? Jako przykład tasowania obciążonego, element ma większą szansę na to, że znajdzie się na froncie z większą wagą. Przykład (wygeneruję losowe liczby, aby było prawdziwe): 6 obiektów o wagach 6,5,4,3,2,1; Suma to 21 Wybrałem 19: `19-6-5-4-3-2 = -1`, więc 2 idzie na pierwszą pozycję, wagi wynoszą teraz 6,5,4,3,1; Suma to 19 Wybrałem 16: `16-6-5-4-3 = -2`, więc 3 idzie na drugą pozycję, wagi wynoszą teraz 6,5,4,1; Suma to 16 Wybrałem 3: `3-6 = -3`, więc 6 jest na trzeciej pozycji, wagi wynoszą teraz 5,4,1; Suma to 10 Wybrałem 8: `8-5-4 = -1`, więc 4 jest na czwartej pozycji, wagi wynoszą teraz 5,1; Suma to 6 Wybrałem 5: „5-5=0”, więc 5 jest na piątej pozycji, wagi wynoszą teraz 1; Suma to 1 Wybrałem 1: `1-1=0`, więc 1 idzie na ostatnią pozycję, nie mam już ciężarów, kończę


title: Jaka jest najlepsza strategia owijania?

text: Planuję zintegrować zewnętrzne narzędzie (w moim konkretnym przypadku ffmpeg, ale może to być cokolwiek, w rzeczywistości tak długie, jak jego zadania są długotrwałe). To narzędzie ma wiele parametrów wiersza poleceń. Na razie zrobiłem z nim proste rzeczy, które już wymagają ode mnie sporo pisania na zajęciach, aby osadzić wszystkie informacje, które może mi zwrócić. Teraz mam do czynienia z jeszcze bardziej złożonym zadaniem, polegającym na przesłaniu mu zestawu parametrów _i_, aby poradzić sobie z możliwymi błędami. Więc jaki jest najlepszy sposób na to? 1. Utwórz klasy zawierające wszystkie możliwe opcje 2. Polegaj na odwrotnym odpowiedniku commons-cli / CliBuilder / OptionParser 3. Napisz wszystkie opcje bezpośrednio z danych wejściowych użytkownika 4. Moce Obiwana Kenobiego (lub cokolwiek, o czym nawet nie wiem) Proszę zauważyć Robię to w niecodziennym języku (dla mnie nie pytaj co to jest, bo wygląda to na desperacki i sterylny związek między CoffeeScript i lua), w konsekwencji nie może być ram do robienia tego, co ja chcesz w języku, którego używam.


title: Czy „Zatrudnianie tylko najlepszych” to naprawdę praktyczna rada dotycząca normalnego programowania aplikacji komputerowych?

text: W tle tworzymy aplikacje inżynierskie na komputery stacjonarne, z interfejsem użytkownika podobnym do AutoCAD, czymś podobnym do etabs. Jedną rzeczą, która naprawdę mnie denerwuje, jest to, czy istnieje potrzeba zatrudniania najlepszych programistów? Na początek mamy duże trudności w rekrutacji; większość życiorysów, które widzimy, to albo proste aplikacje CRUD, albo dostosowywanie SharePoint, które, jak sądzę, nie wymaga dużo hardkorowego programowania. Nawet ci, których wzywamy na rozmowę kwalifikacyjną, większość nie może wykonać sekwencji Fibonacciego i prostego wyszukiwania binarnego, a my jesteśmy na tyle uprzejmi, że udzielamy wskazówek i **wyraźnie określamy problemy**, aby kandydaci nie musieli szukać słownik, aby sprawdzić, co oznacza „sekwencja Fibonacciego”. To dało mi do myślenia: tak, potrzebujemy pewnego poziomu umiejętności programowania podczas tworzenia geometrii obliczeniowej / programowania liniowego i potrzebujemy pewnego poziomu umiejętności programowania podczas projektowania architektury oprogramowania / lub decydowania, którego wzorca oprogramowania użyć, ale poza tym , duża część naszego kodu to tylko kod hydrauliczny (chyba), który może zrobić ktoś, kto zna się na programowaniu. Biorąc pod uwagę, że teraz naprawdę potrzebujemy talentów programistycznych i biorąc pod uwagę, że zatrudnianie supergwiazd programistów jest bardzo trudne, chcę obniżyć swój standard i zatrudniać tylko takich sobie, w bezpośredniej sprzeczności z tym, co głosi Joel. Co myślisz? Edycja: Nie musisz przepisywać całej biblioteki geometrii obliczeniowej/programowania liniowego; wszystko, co musisz zrobić, jeśli chodzi o moją aplikację, to wiedzieć, jak rzucić bieżące problemy na odpowiednie terminy programowania geometrycznego/liniowego i wiedzieć, kiedy/jak korzystać z istniejących bibliotek. Więc to nie jest takie trudne, jak się wydaje.


Jak rozdać po jednym wirtualnym tokenie każdej osobie na tym świecie i upewnić się, że nikt nie otrzyma więcej niż jednego? Innymi słowy, jak uniemożliwić użytkownikowi tworzenie więcej niż jednego konta użytkownika w witrynie? Jak nazywa się ten problem? Czy jest jakaś konkretna nazwa tego problemu? Jakie są rozwiązania? Dziękuję.


title: Wsparcie między bibliotekami i między programami środowiskowymi

text: Często mówi się o kompatybilności międzyplatformowej, ale czy jest możliwe napisanie takiego "uniwersalnego kodu", który działałby zarówno w przeglądarce, na desktopie, na opengl, na webgl, jak i na canvas-object html5? Zastanawiam się nad napisaniem kompilatora c-to-javascript, który umożliwiłby uruchamianie aplikacji desktopowych w przeglądarce. To narzędzie przeanalizuje kod c/c++ i wygeneruje kod javascript oraz jakoś zastąpi wszystkie wywołania opengl wywołaniami webgl. Coś podobnego do Emscripten, ale bez kodu przypominającego asembler (funkcje i instrukcje byłyby konwertowane jeden na jeden). Oczywiście będzie pewne poważne ograniczenie takiego kodu c++. Nie będzie wspierał szablonów, dynamicznego polimorfizmu itp. Również wszystkie biblioteki musiałyby być mniej lub bardziej zastąpione implementacjami javascript, więc na przykład std-namespace będzie musiało mieć odpowiednik javascript. Czy uważasz, że jest to warte zachodu? A może powinniśmy po prostu zoptymalizować lepsze pobieranie i uruchamianie aplikacji na komputery stacjonarne i z wyjątkiem użytkowników, którzy klikają „pobierz” w naszej witrynie? Google Earth wydaje się być dość popularny, mimo że ma obowiązkowy etap instalacji.


title: Jak wybrać sposób przechowywania danych dla danych generowanych przez użytkownika?

text: W programie, który piszę, mam 3 różne sposoby przechowywania danych generowanych przez użytkownika: (a) Pliki XML dla każdego obiektu (.Net Serialization) (b) Baza danych SQL (MSSQL) (c) Ogromna przerażająca plama danych w 1 pliku (Jestem przeciwko temu) Nie ma absolutnie żadnej teoretycznej różnicy w wydajności lub rozmiarze pliku w tym (hipotetycznym) scenariuszu, ale który byłby najlepszy? Czy przesada SQL (biorąc pod uwagę, że w bazie danych będzie do 2 milionów pozycji), czy najlepsza opcja? Gdzie jest rysowana linia między BLOB, XML i SQL? Indeks łączyłby się z nazwą pliku (identyfikator GUID) lub identyfikatorem elementu SQL (identyfikator GUID), więc nie ma różnicy w funkcjonalności wyszukiwania. XML jest przechowywany w wielu plikach, a rozmiar pliku nie ma większego znaczenia, więc nie musisz analizować całej rzeczy, aby uzyskać dostęp do określonego elementu (po prostu otwórz strumień plików do {GUID}.xml) **Edytuj:* * Dodaję więcej informacji, aby było bardziej jasne, o co proszę. Pracuję nad programem dla klienta z branży perfumeryjnej. We wszystkich przypadkach indeks wyszukiwania będzie osobny (kod innej osoby, którego nie odważę się dotknąć) i zostanie zaindeksowany w pamięci. W tym przypadku nie jest potrzebny losowy dostęp do danych, ponieważ ludzie pobieraliby pełne informacje dla pojedynczego elementu. Mówiąc o wiele jaśniej: jeśli nie potrzebujesz dostępu do losowych danych w bazie danych, a XML jest łatwiejszy, czy możesz użyć tego zamiast pliku SQL? **Edytuj II:** Tak czy inaczej, zostanie zainstalowany na dużym serwerze, więc nie martwię się, że klient ma dostęp do MSSQL lub nie ma wystarczającej ilości miejsca na dodatkowe ~1KB na wpis (jeśli nie używa SQL). **Edytuj III:** wykonuję tylko pojedyncze zaznaczanie wszystkich zapytań (np. SELECT * FROM (DB) WHERE ID = (GUID)) lub (Xml.deserialize((GUID).xml))


title: Dynamiczny adres URL git dla kompilacji Jenkins

text: Wewnętrznie korzystamy z GitHub Enterprise i Jenkins. Jeśli naciskam na główne repozytorium, jest ono automatycznie kompilowane bez, a Commit jest oznaczony jako poprawny (tak jak robi to Travis). Jednak chcę mieć możliwość rozwidlenia repozytorium i uruchomienia kompilacji Jenkins. Czy można powiedzieć, że Jenkins prowadzi również widełki projektu podczas otwierania PR na głównym repozytorium?


title: Wykonuj kod co godzinę

text: Muszę stworzyć serwis internetowy, który uruchamia się co godzinę. Będzie używany do przeglądania danych w bazie danych i dodawania alertów do tabeli w tej samej bazie danych, jeśli zostaną spełnione/nie spełnione określone warunki. Obecnie posiadamy: Mamy urządzenia końcowe, które używają Pythona do raportowania do wirtualnego serwera Amazon Web Services (AWS). Serwer AWS pobiera te informacje i przechowuje je w bazie danych MySQL. Serwer AWS to Linux z systemem Django i Apache. Muszę mieć możliwość uruchomienia co godzinę kodu Pythona, który weryfikuje dane przechowywane przez urządzenia końcowe. Jeśli pewne warunki nie zostaną spełnione, rekord zostanie dodany do tabeli `alerts` w bazie danych. Pierwotnie zakontraktowaliśmy utworzenie powyższej konfiguracji. Jestem nowy w Pythonie, Django i Apache. Jednak dokonałem już kilku zmian w kodzie Pythona, który wysyła i odbiera dane z urządzeń końcowych. Jestem programistą, który włamuje się do programowania webowego. Czy ktoś ma jakieś zalecenia, jak mogę to zrobić?


title: Co jest łatwiejsze w utrzymaniu -- przypisanie boolowskie przez if/else czy wyrażenie boolowskie?

text: Który byłby uważany za łatwiejszy w utrzymaniu? jeśli (a == b) c = prawda; w przeciwnym razie c = fałsz; lub c = (a == b); Próbowałem szukać w Code Complete, ale nie mogę znaleźć odpowiedzi. Myślę, że pierwszy jest bardziej czytelny (można go dosłownie przeczytać na głos), co również czyni go łatwiejszym w utrzymaniu. Drugi z pewnością ma więcej sensu i redukuje kod, ale nie jestem pewien, czy jest tak łatwy w utrzymaniu dla programistów C# (spodziewałbym się, że ten idiom będzie bardziej widoczny na przykład w Pythonie).


title: Czy posiadanie poufnych danych w skrypcie PHP jest bezpieczne?

text: Słyszałem, że PHP jest dość bezpieczne, ponieważ Apache nie pozwala na pobieranie surowego PHP. Czy to jednak wiarygodne? Na przykład, jeśli chcesz coś zabezpieczyć hasłem, ale nie chcesz tworzyć bazy danych, czy coś takiego jak `$pass = "123454321";` byłoby bezpieczne? Podsumowując, czy można bezpiecznie założyć, że nikt nie ma dostępu do rzeczywistego pliku .php?


title: Wzorzec projektowy JavaScript z fabryką jQuery Widget

text: Używam struktury widżetu jQuery do tworzenia niektórych elementów graficznych na stronie sieci Web i mam konceptualne pytanie dotyczące ogólnej struktury kodu. Mam 3 klasy A, B i C, które wszystkie dziedziczą po tym samym rodzicu (pABC). Wszystkie są różne, ale mają podobną funkcjonalność. Mam też do prototypowania klas(X,Y). Klasy te zapewniają funkcjonalność, którą należy połączyć z A, B, C, aby uzyskać Ax, Ay, Bx, By, Cx, Cy. Chcę to zrobić z jak najmniejszym powielaniem, aby jeśli zmienię coś w prototypie X, zostanie to automatycznie zmienione we wszystkich Ax, Ay, Bx, By, Cx i Cy. Moim zamiarem jest zrobienie czegoś takiego jak $.widget("Ax", $.A, $.extend(true, {}, X, {... Określony kod dla Ax... })); $.widget("Bx", $.B, $.extend(true, {}, X, { ... Określony kod dla Bx ... })); $.widget("Cx", $.C, $.extend(true, {}, X, { ... Określony kod dla Cx ... })); $.widget("Ay", $.A, $.extend(true, {}, Y, { ... Określony kod dla Ay ... })); $.widget("By", $.B, $.extend(true, {}, Y, { ... Określony kod dla By ... })); $.widget("Cy", $.C, $.extend(true, {}, Y, { ... Określony kod dla Cy ... })); Czy istnieje skuteczniejszy sposób rozwiązania tego problemu? Problem polega na tym, że mam klasy A, B, C, które zostaną połączone z x, y, aby otrzymać Ax, Ay, Bx, By, Cx, Cy.


title: Dlaczego naukowe języki programowania są takie dziwne?

text: Wydaje mi się, że języki programowania przeznaczone do użytku w nauce i inżynierii są konsekwentnie _dziwne_ w porównaniu z językami ogólnego przeznaczenia. Kilka przykładów z mojej głowy: * W Matlab, każda funkcja musi być umieszczona w osobnym pliku * W R, <\- jest operatorem przypisania, w przeciwieństwie do = w prawie każdym innym języku * Matlab, R, Julia a inne wszystkie mają indeks 1 * Matlab używa % do komentarzy, a nie standardowego # lub // Oczywiście wszystkie te języki mają kilka cech projektowych, które _właściwie_ ułatwiają korzystanie z nich w zastosowaniach naukowych, takich jak bardziej naturalna notacja macierzowa. Mimo to wszyscy w niewytłumaczalny sposób dokonują tych wszystkich dziwacznych wyborów, które niczego nie ułatwiają i można by ich łatwo uniknąć, gdyby projektanci języków wybrali właśnie to, co robi 99% innych języków. Czy powód jest zablokowany przez dostawcę? Brak kontaktu z szerszą społecznością programistów? Coś innego? Przeczytałem ten wątek i nie uznałem wyjaśnień za zadowalające. To, że R zostało zaprojektowane jako język naukowy, nie oznacza, że _musiało_ całkowicie ignorować konwencje i używać <\- zamiast =.


title: Klauzula użycia Exists w SQL

text: Właśnie skończyłem wykład na Stanford na temat `SQL` (prof. Jennifer Widom). Wprowadziłem jednak zamieszanie związane ze stosowaniem klauzuli „EXISTS”. Myślałem, że jest to po prostu warunek i wyrażenie, więc jeśli jest prawdziwe, powyższe zapytanie będzie kontynuowane (podobnie jak logiczne `AND`). Mając więc małą wątpliwość co do tego pytania: > Pasażer = {pid, pname, Wiek} > Rezerwacja = {pid, klasa, numer} i tabele są wypełniane danymi i wykonywane jest zapytanie: SELECT pid FROM Rezerwacja WHERE class = ' AC' AND EXISTS (SELECT * FROM Pasażer WHERE wiek > 65 AND Pasażer.pid = Reservation.pid) Rzeczą, która mnie niepokoi, jest to, że pomyślałem, że użycie `EXISTS` jest po prostu tym, że powyższe główne zapytanie zostanie wykonane, jeśli podzapytanie coś zwraca. Ponieważ podzapytanie coś zwracało, oczekiwałem, że zapytanie zwróci wszystkie PID, gdzie `class = 'AC'`. Nie sądziłem, że jest wykonywany krotka po krotka. Jak więc usunąć to zamieszanie?


title: Czy języki statyczne i dynamiczne mogą być postrzegane jako różne narzędzia dla różnych rodzajów pracy?

text: Tak, zadano podobne pytania, ale zawsze po to, by dowiedzieć się, „który jest lepszy”. Pytam, ponieważ wyrosłem jako programista głównie w JavaScript i tak naprawdę nie mam dużego doświadczenia w pisaniu w statycznie typowanych językach. Mimo to zdecydowanie widzę wartość w nauce C do obsługi wymagających operacji na niższych poziomach kodu (co zakładam, że ma wiele wspólnego ze statycznym vs dynamicznym na poziomie kompilatora), ale to, nad czym staram się owijać w głowę jest to, czy istnieją określone konteksty projektu (może pewne typy dynamicznych operacji intensywnie korzystających z danych?) obejmujące rzeczy inne niż wydajność, gdzie o wiele bardziej sensowne jest korzystanie z Javy lub C# w porównaniu z czymś takim jak Python.


title: Czy inżynierowie oprogramowania powinni również działać jako wsparcie techniczne?

text: Czy inżynier oprogramowania powinien również pełnić rolę wsparcia technicznego? Oznacza to, że firma powinna pozwolić swoim inżynierom nosić zarówno czapkę inżyniera oprogramowania, jak i czapkę wsparcia technicznego. Wydaje się, że uniemożliwiłoby to pisanie oprogramowania, gdyby dużo czasu inżyniera zajęło wsparcie techniczne.


Tworzę aplikację internetową. Testowałem go na mobilnej przeglądarce i zauważyłem, że pseudoklasa `:active` tak naprawdę nie działa. Jak symulować kliknięcia w przeglądarce mobilnej? Szczególnie interesuje mnie Android i iPhone. Używam sprite'ów css. Natknąłem się na „ontouchstart”, ale nie wiem, jak tego użyć. Czy ktoś może mi w tym pomóc?


title: Dlaczego sklepy .NET wydają się preferować raporty Crystal Report od raportów RDLC?

text: Obecnie korzystam z raportów RDLC. Jednak podczas rozmowy kwalifikacyjnej do pracy w .NET często pytają „Czy pracowałeś z Crystal Reports?”. Dlaczego lubią Crystal Reports, skoro program Visual Studio ma już zintegrowane raporty RDLC?


title: Czy nieaktualne komentarze to miejski mit?

text: Ciągle widzę ludzi, którzy twierdzą, że „komentarze stają się nieaktualne”. Chodzi o to, że przez całą swoją karierę widziałem może dwa lub trzy nieaktualne komentarze. Nieaktualne informacje w osobnych dokumentach zdarzają się cały czas, ale z mojego doświadczenia wynika, że nieaktualne komentarze w samym kodzie są niezwykle rzadkie. Czy właśnie miałem szczęście, z kim pracuję? Czy niektóre branże są bardziej podatne na ten problem niż inne? Czy masz _konkretne_ przykłady ostatnich nieaktualnych komentarzy, które widziałeś? A może nieaktualne komentarze są bardziej problemem teoretycznym niż rzeczywistym?


title: Gdzie przeprowadzić uwierzytelnianie na serwerze REST API?

text: Pracuję nad zestawem REST API, który musi być zabezpieczony, aby wykonywane były tylko uwierzytelnione wywołania. Będzie wiele aplikacji internetowych do obsługi tych interfejsów API. Czy istnieje najlepsze podejście do tego, gdzie powinno nastąpić uwierzytelnianie? Myślałem o dwóch możliwych miejscach. 1. Poproś każdą aplikację internetową o przeprowadzenie uwierzytelniania przy użyciu udostępnionej usługi uwierzytelniania. Wydaje się, że jest to zgodne z narzędziami takimi jak Spring Security, które są konfigurowane na poziomie aplikacji internetowej. 2. Chroń każdą aplikację internetową za pomocą „bramy” dla bezpieczeństwa. W tym podejściu aplikacja internetowa nigdy nie odbiera nieuwierzytelnionych połączeń. To wydaje się być podejściem do uwierzytelniania serwera HTTP Apache. Przy takim podejściu, czy użyłbyś Apache lub nginx do ochrony, czy czegoś innego pomiędzy Apache/nginx a Twoją aplikacją internetową? Jako dodatkowe odniesienie, uwierzytelnianie jest podobne do usług takich jak AWS, które mają nie tajny identyfikator połączony ze wspólnym tajnym kluczem. Rozważam również użycie HMAC. Ponadto piszemy usługi sieciowe w Javie przy użyciu Springa. **Aktualizacja:** Aby wyjaśnić, każde żądanie musi zostać uwierzytelnione identyfikatorem i tajnym kluczem. Jest to podobne do działania żądań AWS REST.


title: Backlog produktowy – kiedy szacowane są godziny pracy?

text: Zastanawiam się, czy przy tworzeniu backlogu produktowego zadania mają oszacowane godziny. Aby potwierdzić, mogę tu mówić o backlogu produktu, a nie o backlogu sprintu, o jakim wiem, że ma.


title: Zakupy w aplikacji na iOS z dynamiczną zawartością

text: Chcę zbudować aplikację, która będzie obsługiwać zakupy w aplikacji. Krótko mówiąc, użytkownik pobierze aplikację (z kilkoma podstawowymi funkcjami) i będzie miał możliwość pobrania dodatkowych warstw (zawartość dostawy) z dodatkowymi informacjami (np. przepisem). Chcę, aby zawartość tej warstwy (przepisu) była dynamiczna i można ją było pobrać (za pośrednictwem usług internetowych) z serwera. Martwi mnie, w jaki sposób zabezpieczę, aby usługi internetowe były dostępne tylko dla użytkowników, którzy zapłacili za dodatkową warstwę (za pomocą zakupów w aplikacji)? Czy tę funkcjonalność można wdrożyć w Google Play?


title: Jak przekonać klienta, że backend jego aplikacji wymaga przepisania?

text: Od 3 lat wspieram aplikację LOB winforms dla klienta. Aplikacja zbudowana jest w prostej, monolitycznej architekturze i korzysta z platformy .NET 2.0. Aplikacja jest podstawową częścią ich działalności, a jej trwałość jest najważniejsza. Musi ewoluować wraz z ewoluującymi procesami biznesowymi, a także wdrażać ulepszoną funkcjonalność itp. To skłania mnie do przekonania, że ta aplikacja wymaga pewnego rodzaju remontu na zapleczu. Problem polega na tym, że back-end jest „niewidoczny”… tj. użytkownik nigdy tego nie widzi. Jest to jakość systemu, który się zmienia (stabilność, łatwość konserwacji, niezawodność, długowieczność), a nie jakiś wymóg funkcjonalny, który będzie łatwo zauważony… tj. zwrot z inwestycji nie jest oczywisty. Istnieje również wiele nowych funkcji, które można dodać do front-endu (doświadczenie użytkownika). Zastanawiam się nad strategią zmiany back-endu w czasie...tj. dokonując zmiany lub dodając funkcję do front-endu, zmień te komponenty w back-endzie, na które ma to wpływ, w końcu dostaniesz się do wszystkiego. Jak przekonać klienta, że musimy odbudować back-end?


title: Korzystanie z obiektów biznesowych w modelach widoku

text: W przypadku korzystania z obiektów biznesowych wielokrotnego użytku, co jest uważane za najlepsze praktyki podczas tworzenia modeli widoku? Używamy obiektu, który nazywamy `Builder` do budowania naszych modeli widoku. Jeden konstruktor dla każdej logicznej jednostki widoków (zamówienia, użytkownicy itp.), przy czym każda jednostka może zawierać wiele różnych modeli widoków (zamówienia zawierają podsumowanie, wiersze zamówienia itp.). Konstruktor może przeciągnąć dane przez jeden lub więcej standardowych obiektów biznesowych w celu zbudowania modelu widoku. Co jest uważane za lepszą praktykę, jeśli chodzi o używanie obiektów/modeli biznesowych w modelach widoku? **Podejście 1** Zezwolić na użycie obiektów biznesowych w modelu widoku? //Obiekt biznesowy w jakiejś bibliotece public class Order { public int OrderNum; public int NumOrderLines; //... } //Konstruktor zamówień w witrynie public class OrderBuilder { public OrderSummary BuildSummaryForOrder(int OrderNum) { Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum); //Jakakolwiek obsługa wyjątków, dodatkowa logika lub cokolwiek OrderSummary obModel = new OrderSummary(); obModel.Zamówienie = obZamówienie; zwróć obModel; } } //Wyświetl model public class OrderSummary { public Some.Business.Logic.Order Order; //Inne metody dla dodatkowej logiki na podstawie kolejności //i innych właściwości } **Podejście 2** Z obiektów biznesowych pobieramy tylko niezbędne dane //Obiekt biznesowy w jakiejś bibliotece public class Order { public int OrderNum; public int NumOrderLines; //... } //Konstruktor zamówień w witrynie public class OrderBuilder { public OrderSummary BuildSummaryForOrder(int OrderNum) { Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum); //Obsługa wyjątków, dodatkowa logika lub cokolwiek OrderSummary obModel = new OrderSummary() { OrderNum = obOrder.OrderNum, NumOrderLnes = obOrder.NumOrderLines, } return obModel; } } //Wyświetl model public class OrderSummary { public int OrderNum; public int NumOrderLines //Inne metody dla dodatkowej logiki opartej na kolejności //i innych właściwościach } Widzę zalety i wady obu, ale zastanawiam się, czy jest akceptowane podejście? W podejściu 1 nie ma duplikacji kodu wokół modeli, ale tworzy to zależność od logiki biznesowej. W podejściu 2 bierzesz tylko dane potrzebne do widoku, ale duplikujesz kod wokół modeli.


title: Strategia pisania programu logicznego

text: Do tej pory trudno mi było nauczyć się programowania logicznego, a moja prośba o zewnętrzne zasoby na tej stronie spotkała się z pewną krytyką, więc być może to pytanie lepiej odpowiada zarówno moim potrzebom, jak i wymaganiom tej społeczności: Czy istnieje krok po kroku krokowe podejście do pisania problemu w Prologu lub pokrewnych językach logicznych? Na przykład początkowo uważałem, że funkcje rekurencyjne są dla mnie trudne do stworzenia, chociaż mogłem mniej więcej zrozumieć te, które czytałem, dopóki nie nauczyłem się następującego podejścia (przedstawionego z grubsza i tylko jako przykład!): 1. Opisz przypadek bazowy, czyli najmniejsza forma problemu. 2. Zastanów się, jak łączyć wyniki przypadków rekurencyjnych, tj. dodawać liczby, elementy przeciw itd. Widząc, że istnieje tutaj kilka wspólnych wzorców, ogromnie pomogło! 3. Zastanów się, jak rozbić wyniki większego przypadku rekurencyjnego, tj. cdr down list, odejmowanie itp. Ponownie, kluczem było zobaczenie ograniczonej liczby typowych wzorców! Tak więc jasny opis powiązanego procesu rozwiązywania problemu logicznego może być bardzo przydatny.


title: Cukier składniowy dla starych języków

text: Po raz pierwszy dowiedziałem się o istnieniu języków cukru składniowego, takich jak CoffeeScript i SASS, pracując w Railsach. To dało mi do myślenia... dlaczego nie mamy dobrze znanego (jeśli w ogóle) cukru składniowego dla języków takich jak C, C++ i Java? Wyobraź sobie język, który czyta się jak Python lub Ruby, który można wstępnie przetworzyć do C, a następnie skompilować, aby wygenerować naprawdę szybki kod, który również wygląda pięknie. Na przykład zamiast: #include <stdio.h> int divide(int a, int b) { if(b != 0) return a / b; zwróć 0; } int main() { int a, b; scanf("%d", &a); scanf("%d", &b); printf("%d", dziel(a, b)); zwróć 0; } Dlaczego nie masz: include stdio.h fn divide(int a, int b): a/b if b != 0 ret 0 fn main: int a, b scanf '%d', a scanf '%d', b print '%d', dziel(a,b) ret 0 I czy ten preproces sprowadza się do tego samego kodu C powyżej? Po co trzymać się implementacji językowych, które są albo szybkie _lub_ łatwe do odczytania, skoro można mieć oba?


title: Jak uniknąć duplikowania kodu związanego z encjami współdzielonymi we wzorcu repozytorium?

text: Buduję repozytorium dla dużego schematu CRM, który ma dużą liczbę relacji między podmiotami. Do niektórych podmiotów odwołują się prawie wszystkie podmioty, m.in. Osoba i firma. Gdzie mam zagregowany korzeń taki jak Zamówienie, który dotyczy Nagłówka Zamówienia, Wierszy Zamówienia itp. W przypadku, gdy Zamówienie pochodzi od nowego Klienta, muszę wstawić jednocześnie rekord Firma i Osoba... do tej pory tak dobrze. Trudność polega na tym, że jest to sytuacja z bardzo wieloma **innymi** zbiorczymi korzeniami. Nie chcę mieć prywatnej metody `insertPerson(IPerson)` w każdej implementacji repozytorium. Mam repozytorium klientów, które ma już publiczną metodę `InsertCustomer(ICustomer)`, która utrzymuje rekord firmy i osoby. Ale moja lektura wskazuje, że repozytoria nie powinny być od siebie zależne. Jeśli jest to przypadek, w którym repozytoria mogą być od siebie zależne, jaki jest najlepszy sposób na to? Czy powinienem wstrzyknąć repozytorium klientów do konstruktora repozytorium zamówień, przekazać je jako parametr metodom, które tego potrzebują, czy też nigdy nie popełniać tego zła i powielać identyczny kod we wszystkich repozytoriach, na wypadek gdyby te repozytoria musiały specjalizować ten kod pod kątem ich specyficznego konteksty?