title: Stosowanie DDD do prostej aplikacji ze zmianą konfiguracji

text: Używam lekkiego PHP Fat-Free Framework jako podstawy do utworzenia prostej aplikacji opartej na MVC z filozofią DDD dla warstwy modelu. Zdaję sobie sprawę, że DDD jest najbardziej odpowiednim rozwiązaniem dla przedsiębiorstw i że stosowanie DDD do prostych, w większości opartych na danych aplikacji jest trochę przesadą, ale są pewne koncepcje w DDD, które uważam za atrakcyjne (takie jak wzorzec Repozytorium, logika biznesowa w Encje itp.), które chcę zastosować w mojej aplikacji. Fat-Free Faramework posiada klasę Base reprezentującą aplikację (Singleton), a instancja Base zawiera wiele przydatnych metod narzędziowych oraz rejestr zmiennych globalnego frameworka (hive), który służy m.in. do danych konfiguracyjnych . Kiedy piszę swoją aplikację, używam wielu narzędzi klasy Base wewnątrz klas w warstwie Model i jestem trochę zdezorientowany, jak odwoływać się do instancji Base w tych klasach. Czy po prostu wywołuję Base:instance() wewnątrz klas modelu, czy wstrzykuję go przez konstruktor jako zależność? Wstrzykiwanie zależności wydaje się właściwym sposobem na zrobienie tego, ale ponieważ większość aplikacji będzie od niego zależeć, całe odwołanie przechodzące przez konstruktor wydaje się niepotrzebne. Jak przekazać przykładowe dane konfiguracyjne bazy danych do klas trwałości danych, które są przechowywane w ulu? Czy powinien być przekazywany przez kontrolery podczas tworzenia instancji repozytoriów, czy wywoływany bezpośrednio z repozytorium (lub Data Mappera)? Szukam sposobu, który nie odbije się na mnie, więc szukam wszelkich wskazówek lub porad na ten temat. Druga część mojego problemu polega na tym, że próbuję napisać moją aplikację tak, aby każda Entity i powiązana z nią logika biznesowa były konfigurowalne z klasy Entity. To pomysł inspirowany Sails.js, który wciąż testuję, ale na przykład mam metodę getProperties(), która zwraca tablicę zdefiniowanych przez użytkownika danych konfiguracyjnych dla każdej właściwości Entity, np.: 'title' => array( 'type' => 'text', 'minLength' => 30, ... ) lub dla asocjacji: 'children' => array( 'entity' => 'ChildClass', 'relation' => 'oneToMany' ) Może to wyglądać nieco kontrowersyjnie, ale przetestowałem funkcjonalność logiki biznesowej i jak dotąd działa dla mnie OK, a kod klienta komunikuje się z encjami za pomocą zwykłych metod pobierania/ustawiania/innych. Ideą takiej konfiguracji jest umożliwienie automatycznego generowania interfejsu szkieletowego/administracyjnego dla każdego podmiotu oraz konfigurowanie mapowania i repozytoriów danych w oparciu o metodę getProperties() powiązanego podmiotu. To, co mnie teraz denerwuje, to to, że jeśli chcę mieć _jedno_ miejsce, w którym znajdują się te dane konfiguracyjne, musiałbym umieścić w Entity jakąś logikę niezwiązaną z domeną biznesową, taką jak wyjątkowa nazwa tabeli bazy danych, czy pole wymaga wzbogacenia - edytor tekstu, czy nie, czy pole wyboru jest domyślnie zaznaczone, określone pole używane jako tożsamość wydruku Entity w interfejsie administratora itp. Zdaję sobie sprawę, że problem, który mam, jest kompromisem między czystym modelem a jednomiejscowym pomysł konfiguracji i że prawdopodobnie będę musiał zanieczyszczać Entity, przechowując takie dane spoza domeny biznesowej w Entites, ale pomyślałem, że może ktoś tutaj może mieć pomysł, jak podejść do tego w inny lub lepszy sposób? Dziękuje za przeczytanie.


title: Dlaczego Java korzysta z tak wielu pośredników?

text: Na przykład, aby odczytać dane ze strony internetowej, robimy: HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); jest = httpEntity.getContent(); Metoda, która wykonuje żądanie HTTP, zwraca odpowiedź, następnie zamieniamy odpowiedź w encję, następnie zamieniamy encję w strumień wejściowy, następnie musisz użyć jeszcze dwóch obiektów, czytnika bufora i konstruktora ciągów, aby włączyć to jest w ciąg. Po prostu wydaje się, że jest to dużo powtarzalnego kodu. Dlaczego HttpResponse nie może mieć metody, która zwraca InputStream lub jeszcze lepiej String? PS Niekoniecznie mówię, że Java jest zła, chcę dowiedzieć się, jaki jest tego powód, jeśli w ogóle.


title: Jakie są rozwiązania problemu rozproszonej kolejki?

text: Próbuję dowiedzieć się więcej o różnych sposobach rozwiązania problemu kolejki rozproszonej. Chciałabym więc wiedzieć, jakie produkty, usługi, wdrożenia i prace badawcze są już dostępne. Wdrożenie stanie przed wieloma wyzwaniami i będzie zmuszone do kompromisów: * Czy ma mocne czy luźne uporządkowanie? * Czy ma idempotentny wkład? * Czy możemy mieć więcej kolejek niż mieści się na jednej maszynie? * Czy możemy mieć więcej danych w kolejce niż mieści się na jednej maszynie? * Ile komputerów może ulec awarii, zanim potencjalnie utracimy dane? * Czy toleruje net-split? * Czy może automatycznie uzgadniać dane po naprawieniu podziału sieci? * Czy może zagwarantować dostawę, gdy klienci mogą się zawiesić? * Czy może zagwarantować, że ta sama wiadomość nie zostanie dostarczona więcej niż raz? * Czy węzeł może ulec awarii w dowolnym momencie, wrócić i nie wysyłać śmieci? * Czy można dodawać węzły do działającego klastra lub usuwać je z niego bez przestojów? * Czy można uaktualnić węzły w działającym klastrze bez przestojów? * Czy może działać bez problemów na heterogenicznych serwerach? * Czy można „przykleić” kolejki do grupy serwerów? (przykład: „te kolejki są dozwolone tylko w europejskim centrum danych”) * Czy można zapewnić umieszczenie replik danych w co najmniej dwóch centrach danych, jeśli są dostępne? Nie mam złudzeń, że jakakolwiek implementacja będzie w stanie na to wszystko odpowiedzieć „tak”. Interesuje mnie jedynie słuchanie o różnych wdrożeniach; jak działają, jakie kompromisy dokonali i być może dlaczego zdecydowali się na swój konkretny zestaw kompromisów. Również jeśli są jakieś wyzwania, które mogłem przeoczyć na powyższej liście.


title: Wykonywanie oddzielnych zespołów dla różnych typów testów dla tego samego komponentu?

text: Kilku członków powiedziało mi tutaj, że rozdzielenie moich testów jednostkowych na różne zestawy dla różnych komponentów jest najlepszym sposobem na uporządkowanie testów jednostkowych. Teraz mam kilka pytań dotyczących tego pomysłu. 1. Jakie są tego zalety? Organizacja i izolacja błędów? 2. Załóżmy, że mam komponent o nazwie „kalkulator” i tworzę zespół do testów jednostkowych na „kalkulatorze”. Czy na potrzeby testów integracyjnych, które chcę uruchomić na „kalkulatorze”, utworzyłbym osobny zestaw? A może definicja testu integracyjnego jest testem obejmującym wiele komponentów, takich jak „kalkulator” i cokolwiek innego, co wymagałoby oddzielnego zestawu do testowania ich obu razem? W takim przypadku, czy miałbym jeden zespół, który wykonałby wszystkie testy integracyjne dla każdej kombinacji komponentów?


title: Jaki jest właściwy sposób wyjścia z programu w C?

text: Istnieje wiele sposobów wyjścia z programu w C. Niektóre z nich zwracają zero lub kod błędu, używając funkcji wyjścia z EXIT_SUCCESS, EXIT_FAILURE, exit(0), exit(1) lub innego kodu błędu, przerwać i prawdopodobnie kilka innych I nie mogę teraz myśleć. Moje pytanie brzmi, która opcja jest najlepsza i dlaczego. Pytam tutaj, ponieważ za każdym razem, gdy zadawałem to pytanie bardziej doświadczonym programistom, kończyło się to świętą wojną.


title: MSFT opublikowało PDF "ASP.NET Developer Guidance"... Czego w Twojej opinii brakuje?

text: Firma Microsoft stworzyła tę mapę dokumentacji ASP.NET, która agreguje mnóstwo świetnych linków w jednym pliku PDF. http://blogs.msdn.com/b/jmeier/archive/2010/10/26/asp-net-developer-guidance-map.aspx?CommentPosted=true Chciałbym usłyszeć, co inni mają do powiedzenia na ten temat doc i jeśli uważają, że należy dodać inne zasoby. Być może MSFT przeczyta ten wątek i uwzględni również Twoje wskazówki w tym wszechstronnym przewodniku edukacyjnym ASP.NET.


title: Czy wyselekcjonowanie po prostu przenosi zmiany do bieżącego drzewa roboczego jako zmiany niezatwierdzone?

text: Mój zespół używa Mercurial do kontroli wersji. Nasza procedura kontroli rozwoju/wersji to: 1. wszystkie zatwierdzają się w tej samej gałęzi 2. pobierają zmiany i zmieniają bazę naszych zatwierdzeń lokalnie przed odesłaniem z powrotem do hostowanego repozytorium. Dzięki temu wszyscy są zsynchronizowani. A najnowszy kod (nawet niedokończony) jest następnie pobierany z końcówki tej gałęzi i umieszczany w naszym środowisku testowym. Otrzymałem zadanie stworzenia procesu zarządzania, w którym możemy dokładniej wyodrębnić „ukończone funkcje” do środowiska testowego. Zalecałem, abyśmy rozpoczęli proces `rozgałęzienia->pociągnij-żądanie->scalanie->zamknij rozgałęzienie`, ale powiedziano mi, że `rozgałęzienie` nie jest opcją i że dyrektor projektu wolałby również mieć możliwość aby _ręcznie wybierać zatwierdzenia reprezentujące ukończone funkcje/poprawki błędów_ i uwzględniać tylko te zatwierdzenia we wdrożeniu do testowania. Nie jestem pewien, jaka terminologia oprócz `cherry-pick` w GIT/HG miałaby reprezentować ten proces, a czy byłoby to wskazane, ponieważ zatwierdzenia nie miałyby już odpowiedniej historii zmian, ponieważ rozumiem, że `cherry-pick ` po prostu ściąga zmiany do bieżącego drzewa roboczego jako zmiany niezatwierdzone _poprawne_?


title: Czy jako programista powinienem znać języki programowania niskiego i wysokiego poziomu?

text: Skontaktowano się ze mną, aby wykonać kilka prac związanych ze zdalnym sterowaniem wyświetlaczami LED przez TCP/IP, ale moje doświadczenie i przygotowanie dotyczy głównie języka programowania wysokiego poziomu. Powiedziałem to osobie, która kontaktowała się ze mną w sprawie pracy, a on powiedział mi, że: > „jeśli nazywasz siebie programistą, to powinieneś znać wszystkie te rzeczy” Czy programista naprawdę powinien znać szczegóły programowania niskopoziomowego? Czy mogę potraktować to jako koncepcję czarnej skrzynki, jako wiedzę teoretyczną, ale niekoniecznie robienie tego lub wdrażanie rozwiązań językowych niskiego poziomu, mając na uwadze, że programowanie niskopoziomowe nie jest moją specjalizacją?


title: Jak zaprojektować skryptowalny emulator komunikacji?

text: Wymagania: Potrzebujemy narzędzia, które symuluje urządzenie sprzętowe komunikujące się przez RS232 lub TCP/IP, abyśmy mogli przetestować naszą główną aplikację, która będzie komunikować się z urządzeniem. Bieżący przepływ: * Użytkownik ładuje skrypt * Przetwarza skrypt na polecenia * Użytkownik uruchamia skrypt * Wykonuje polecenia Skrypt / polecenia (uproszczone do dyskusji): * Połącz RS232 => RS232ConnectCommand * Połącz TCP/IP => TcpIpConnectCommand * Wyślij dane => SendCommand * Odbierz data => ReceiveCommand * Disconnect => DisconnectCommand Wszystkie polecenia implementują interfejs ICommand. Program uruchamiający polecenia po prostu wykonuje sekwencję implementacji ICommand sekwencyjnie, dlatego ICommand musi mieć ekspozycję Execute, pseudokod: * void Execute (kontekst ICommunicator) Metoda Execute przyjmuje argument kontekstu, który umożliwia implementacjom poleceń wykonanie tego, co muszą zrobić. Na przykład SendCommand wywoła context.Send itd. **Problem** RS232ConnectCommand i TcpIpConnectCommand musi utworzyć wystąpienie kontekstu, który będzie używany przez kolejne polecenia. Jak sobie z tym radzisz elegancko? **Rozwiązanie 1:** Zmień metodę ICommand Execute na: * ICommunicator Execute (kontekst ICommunicator) Chociaż to działa, wydaje się, że jest to zapach kodu. Wszystkie polecenia muszą teraz zwracać kontekst, który dla wszystkich poleceń z wyjątkiem tych połączeń będzie tym samym kontekstem, który jest przekazywany. **Rozwiązanie 2:** Utwórz ICommunicatorWrapper (ICommunicationBroker?), który podąża za wzorcem dekoratora i ozdabia ICommunicator. Wprowadza nową ekspozycję: * void SetCommunicator(ICommunicator communicator) I ICommand zmieniono, aby używać wrappera: * void Execute(ICommunicationWrapper context) Wydaje się, że jest to czystsze rozwiązanie. **Pytanie** Czy to dobry projekt? Czy jestem na dobrej drodze?


title: Gdzie znaleźć wsparcie techniczne Hg/Git?

text: Chciałbym się dowiedzieć, kto zapewnia wsparcie techniczne (komercyjne) dla dwóch głównych dzisiejszych DVCS: Git i Mercurial. To jest miejsce, w którym od jakiegoś czasu używają Subversion, a teraz odnawiają licencje na oprogramowanie. Mimo, że zachowają również Subversion, chcieliby uzasadnić początek DVCS jako system alternatywny. Większość ludzi popiera Mercurial, ponieważ wydaje się to prostsze; głównie inżynierowie i lekarze, którzy nie są zbyt zainteresowani sprawdzaniem repozytoriów Git pod kątem korupcji i lepszych funkcji Git, ale wierzę, że każdy z nich może przejść. System musi mieć cenę (może wynosić zero; nie ma problemu) i jakieś oficjalne wsparcie techniczne. Jest to sprawa _pro forma_, ale musi być określona. _**Więc pytam: czy wiesz, gdzie można się udać do komercyjnego wsparcia technicznego Git lub Mercurial?_** Fora techniczne i tym podobne nie wchodzą w rachubę. Musi działać na zasadzie: * _Mam problem._ * _Zadaję pytanie ze szczegółami._ * _Otrzymuję odpowiedź w określonym czasie. Może to być „nie możemy tego zrobić”. ale musi to być oficjalna odpowiedź i udzielona w umówionym czasie._ Jestem pewien, że większość z Was już rozumie, o co pytam, a jeśli nie – napisz komentarz lub coś podobnego. Ponadto, jeśli myślisz o jakichkolwiek powodach, które mogą zadecydować o uzasadnieniu wprowadzenia Git/Hg z technicznego i administracyjnego punktu widzenia, możesz je również zapisać.


title: Opcje programistyczne dla iPhone'a dla programisty C [from-my-cold-dead-hands]

text: Proszę wybaczyć humor zawarty w tytule, ale z pewnością mnie przekonuje. Dobrze znam kod C, mogę go pisać we śnie i po przeczytaniu kilku samouczków na temat rozwoju iPhone'a i Objective-C, zaczynam czuć, że wolałbym unikać Obj-C za wszelką cenę. Nie chodzi o to, że jest nie do nauczenia lub „trudne”. Po prostu tego nie lubię i po przeczytaniu wielu zalet i wad Objective-C w porównaniu z prostym C, stwierdziłem, że jeśli muszę napisać aplikację na iPhone'a, chcę napisać jej tyle, co C jak to możliwe. Mając to na uwadze, jaka jest minimalna ilość Objective-C, o której muszę wiedzieć lub potencjalnie napisać, aby móc stworzyć aplikację na iPhone'a? Jeśli nie mogę napisać aplikacji w 100% w C, to czy istnieje dobre odniesienie, które omawia pisanie aplikacji na iPhone'a w C i omawia tylko minimalną ilość logiki Objective-C, którą należy napisać, aby aplikacja została skompilowana i uruchomiona ? Ponadto, czy jest jakiś dobry powód, dla którego powinienem uczyć się Objective-C, jeśli nie muszę go używać do projektu C? W szczególności, czy zdarzają się sytuacje, w których Objective-C może zapewnić bardziej optymalne rozwiązanie problemu w zakresie kodowania ze względu na sposób, w jaki kompilator kompiluje i łączy kod? Może i jestem zwolennikiem C, ale co ważniejsze, chcę mieć pewność, że moja aplikacja działa tak płynnie i optymalnie, jak to tylko możliwe. **Zastrzeżenie** Jestem na wczesnym etapie uczenia się projektu, nad którym być może będę musiał popracować w najbliższej przyszłości. Jeśli ten proces dojdzie do skutku, dostanę Maca, a także licencję programisty, więc jestem całkowicie w ignorancji. Co gorsza, _jeśli_ ten projekt zostanie uznany za wykonalny, wtedy dostanę niezbędny sprzęt do opracowania dla iPhone'a. Na razie staram się dowiedzieć jak najwięcej informacji i zbadać moje opcje. Będę wdzięczny za wszelkie (konstruktywne) przemyślenia, wskazówki i sugestie.


title: Podczas dekompozycji dużej funkcji, jak mogę uniknąć złożoności dodatkowych podfunkcji?

text: Powiedzmy, że mam dużą funkcję, taką jak następująca: function do_lots_of_stuff(){ { //subpart 1 ... } ... { //subpart N ... } } powszechnym wzorcem jest rozłożenie jej na podfunkcje funkcja do_lots_of_stuff() { subpart_1(...) subpart_2(...) ... subpart_N(...) } Zwykle uważam, że dekompozycja ma dwie główne zalety: 1. Rozłożona funkcja staje się znacznie mniejsza. Może to pomóc ludziom przeczytać go bez zagubienia się w szczegółach. 2. Parametry muszą być jawnie przekazywane do podstawowych podfunkcji, zamiast być niejawnie dostępnymi, po prostu będąc w zasięgu. Może to pomóc w czytelności i modułowości w niektórych sytuacjach. Jednak uważam, że dekompozycja ma również pewne wady: 1. Nie ma gwarancji, że podfunkcje „należą” do do_lots_of_stuff, więc nic nie powstrzyma kogoś przed przypadkowym wywołaniem ich z niewłaściwego miejsca. 2. Złożoność modułu rośnie kwadratowo wraz z liczbą funkcji, które do niego dodajemy. (Istnieje więcej możliwych sposobów, aby rzeczy się wywoływały) **Dlatego:** Czy istnieją przydatne konwencje lub style kodowania, które pomagają mi zrównoważyć wady i zalety dekompozycji funkcji, czy też powinienem użyć edytora z funkcją składania kodu i wywołać go dzień? * * * EDIT: Ten problem dotyczy również kodu funkcjonalnego (choć w mniej naglący sposób). Na przykład w układzie funkcjonalnym podczęści zwracają wartości, które są połączone na końcu, a problem rozkładu polegający na tym, że wiele podfunkcji może ze sobą korzystać, nadal występuje. Nie zawsze możemy założyć, że problematyczna dziedzina będzie mogła być modelowana na kilku małych prostych typach z zaledwie kilkoma wysoce ortogonalnymi funkcjami. Zawsze będą skomplikowane algorytmy lub długie listy reguł biznesowych, z którymi nadal chcemy poprawnie sobie radzić. function do_lots_of_stuff(){ p1 = subpart_1() p2 = subpart_2() pN = subpart_N() return assembleStuff(p1, p2, ..., pN) }


title: Szukasz przykładu zarządzania/wdrażania projektu oprogramowania

text: Moja firma rozważa przyjęcie gotowych produktów ALM, aby wspomóc nasz cykl rozwoju; obecnie używamy własnych, autorskich rozwiązań do zarządzania gromadzeniem wymagań, dokumentacją specyfikacji, testowaniem itp. Jednym z problemów, jaki mam, jest zrozumienie, jak przenosić kod między etapami rozwoju. Mamy coś, co nazywamy potoku, który składa się z poszczególnych przystanków: [Źródło] -> [Kontrola jakości] -> [Produkcja] Na pierwszym przystanku programista opracowuje rozwiązanie żądanej zmiany i wykonuje indywidualne testy. Po zakończeniu tego procesu (i przeprowadzeniu wzajemnej oceny), nasz system ALM fizycznie przenosi zaatakowane programy ze środowiska wykonawczego [Source] do środowiska wykonawczego [QC]. Ten ruch kodu jest wyzwalany przez zaawansowanie stanu żądania zmiany w celu dopasowania do etapu potoku. Od kilku dni przeszukuję Internet, próbując znaleźć sposób realizacji procesu w innym miejscu — przeczytałem trochę o kompilacjach, automatycznych testach, różnych produktach ALM itp., ale nigdzie nie ma żadnego z tych informacji o tym, jak kompilacje współdziałają z początkowymi prośby o zmianę, jakie są wyzwalacze, jak zarządza się zależnościami, jak uwzględniane są różne formy testowania (np. testowanie jednostkowe, testowanie integracyjne, testowanie regresyjne) itp. Czy ktoś może wskazać mi jakiekolwiek zasoby opisujące konkretne przepływy pracy lub spróbować wyjaśnić ( ogólnie) w jaki sposób można/powinna być śledzona i przenoszona zmiana przez cały cykl rozwoju? Byłbym bardzo wdzięczny. Uwaga: uporządkowałem pytanie, aby miejmy nadzieję, że łatwiej je zrozumieć. Znalazłem też inne pytanie (którego teraz nie mogę znaleźć), które odnosiło się do tej książki, co brzmi, jakby to było dokładnie to, czego szukam - choć nie jestem pewien, czy chcę za to wyłożyć pieniądze. Dodatkowe szczegóły zgodnie z sugestią @GlenH7: Nasze produkty są zbudowane przy użyciu zastrzeżonego języka i zestawu narzędzi do tłumaczenia - ostatecznie środowisko uruchomieniowe jest podobne do architektury witryny internetowej, ponieważ mamy kilka plików "kodu" znajdujących się na serwerze , do którego nasza aplikacja kliencka uzyskuje dostęp na żądanie (podobnie jak żądanie GET), a następnie interpretuje, aby zapewnić użytkownikom wygodę. Sprzedajemy zintegrowany produkt, który składa się z zestawu modułów (z których większość jest opcjonalna), każdy moduł posiada zespół ~4 programistów i 2 testerów QC zajmujących się rozwojem/utrzymaniem błędów. Na linię produktów przypada około 30 modułów (i 3 linie produktów) — niektóre zespoły utrzymują wiele linii produktów dla danego modułu. W sumie mamy 700 pracowników zajmujących się rozwojem i ~200 programistów. Z pewnością przyjęcie jakichkolwiek nowych procesów lub systemów będzie wymagało wykupienia itp., ale moim zadaniem jest po prostu zrozumienie, w jaki sposób kod będzie zarządzany, abyśmy mogli inteligentnie mówić o rzeczach. Moim pierwszym zadaniem było nauczenie się, jak zaadaptować kontrolę wersji do naszego procesu (jeszcze nie używamy formalnej kontroli wersji w przypadku większości naszych linii produktów, polegamy na tym, zamiast przechowywać wiele kopii całego kodu). Dość ściśle stosujemy metodę kaskadową (która jest do bani, ale firma produkuje oprogramowanie od 1969 roku, więc prawdopodobnie było to wtedy naturalne i do tej pory nie było potrzeby niczego zmieniać). Niektórzy ludzie są zaintrygowani różnymi ofertami zwinnych metodologii, ale jak zauważył @Chad poniżej, prawdopodobnie będziemy musieli podjąć kolejne kroki w celu osiągnięcia takich celów końcowych (chociaż jeśli zastosujemy system ALM, może to być czasem, aby wymusić na wszystkich zupełnie nowy sposób robienia rzeczy). Teraz dla konkretnego przykładu naszego obecnego procesu, powiedzmy, że mamy produkt o nazwie HIS, który ma moduły MIS i ITS (nie jest ważne, co to są/mogą być – pomyśl o nich jako o zbiorze plików) – w naszym obecnym procesie, jeśli ktoś zażąda zmiany w ITS, koder zmodyfikuje niektóre pliki (efektywnie) na serwerze deweloperskim. Gdy zmiana będzie wymagała przetestowania, przejście statusu żądania zmiany z „potrzebne do opracowania” na „wymagane qc” spowoduje, że nasze narzędzia skopiują pliki, których dotyczy problem, z serwera deweloperskiego na serwer kontroli jakości. Teraz, gdy testerzy QC zalogują się do środowiska testowego QC, będą mogli zobaczyć efekt wprowadzonych zmian. Po zatwierdzeniu zmiany, zmieniając status żądania na „gotowe do produkcji”, nasze narzędzia ponownie kopiują pliki kodu do następnego etapu. Po podpisaniu tam, ostateczna kopia jest wykonywana do miejsca przechowywania używanego do dostaw do klientów. Dostarczamy nasze wersje według numeru głównego wydania (np. 6.0), po którym następuje oznaczenie wersji usługi (np. 5) i numer „pakietu priorytetowego” (np. 1) — klienci odbierają paczki priorytetowe, np. 6.0.5.1. Jak wspomniano powyżej, po prostu przesyłamy kod z miejsca na miejsce na wielu serwerach, więc otrzymujemy folder projektu dla każdego głównego wydania i wydania usługi w całym potoku i kończymy z ostatecznym miejscem spoczynku dla każdego z pakietów, np.: dev6.0 qc6.0 production6.0 dev6.0.5 qc6.0.5 production6.0.5 ship6.0.5.1 Myślałem, że pod kontrolą wersji możemy zasymulować taki schemat jak: rozgałęzienia magistrali --6.0.5 tagi -- 6.0.5.1 ale wydaje się, że obejmuje to tylko połowę lokalizacji, tj. gdzie znajdują się źródła qc i produkcyjne? Czy utworzyłbym osobny bagażnik dla każdej większej i mniejszej wersji produktu? A może polegałbym na czymś poza kontrolą wersji (np. systemie ALM) w celu śledzenia wersji interesujących dla testów przeprowadzonych podczas kontroli jakości i zatrzymania produkcji? Nadal potrzebowalibyśmy środowiska uruchomieniowego dla każdego, ale można je „zbudować” na żądanie, ponieważ dostępne są poprawki błędów i funkcje – co wzmacnia ideę, że nie muszę przechowywać żadnej specjalnej „kopii” tych etapów w kontrola wersji (są po prostu odniesieniami do historii wersji pnia lub gałęzi). Kolejna rzecz, która mnie zapętliła, bo kolega jest dość nieugięty, że nie należy niczego utrwalać w gałęziach, czyli foldery gałęzi powinny być efemeryczne i używane tylko przy dużych zmianach, których nie da się zatwierdzić bezpośrednio do trunka (z oczekiwanie, że gałąź zostanie ostatecznie scalona z pniem). W jego schemacie mniejsze wydania wymagałyby oddzielnego najwyższego poziomu z własnym zestawem głównych gałęzi, gałęzi i tagów, np.: gałęzie główne produktu6.0 -- tagi silly_new_feature -- 6.0.5 gałęzie główne produktu6.0.5 --crazy_bug_fix tags --6.0.5.1 (przepraszam za opóźnienie w dodaniu tych szczegółów - zostałem odciągnięty na spotkania przez cały dzień)


title: Jak daleko wstecz używasz kontroli wersji iz jakiego powodu?

text: Zazwyczaj, gdy pracuję nad projektem, cofam się tylko o kilka dni lub ostatnią poważną zmianę, kiedy postanawiam zrobić coś drastycznego. Czasami zauważam, że zepsułem test lub funkcję i przeoczyłem ją przez kilka tygodni, więc mogę cofnąć się o miesiąc lub dwa i sprawdzić, czy funkcja lub test jest zepsuta i prześledzić tydzień, w którym je zepsułem. Następnie sprawdź, jaka zmiana to spowodowała. Na długoterminowym projekcie na przestrzeni roku. Czy faktycznie cofasz się o ponad 6 miesięcy, a jeśli tak, to dlaczego?


title: Wzorzec projektowy dla zautomatyzowanego mechanicznego stanowiska testowego

text: **Tło** Mam stanowisko testowe z wieloma urządzeniami komunikacyjnymi/akwizycji danych, które są używane jako test końcowy produktu. Ze względu na wiele różnych czujników używanych na stanowisku i konieczność uruchamiania procedury testowej w czasie zbliżonym do rzeczywistego, trudno jest mi tak skonstruować program, aby był bardziej przyjazny do późniejszej modyfikacji. Na przykład urządzenie do akwizycji danych USB firmy National Instruments służy do sterowania wyjściem analogowym (obciążenie) i monitorowania wejścia analogowego (prądu), waga cyfrowa z interfejsem danych szeregowych mierzy położenie, manometr z innym interfejsem danych szeregowych , a produkt jest połączony przez zastrzeżoną bibliotekę DLL, która obsługuje własną komunikację szeregową. **Trudna część** Aspekt programu „w czasie rzeczywistym” jest moim największym punktem wyjścia. Na przykład muszę określić, jak długo produkt musi przejść z pozycji 0 do pozycji 10 000 do dziesiątej części sekundy. Podczas podróży muszę zwiększyć moc wyjściową NI DAQ, gdy osiągnie pozycję 6000 i zmniejszyć ją, gdy osiągnie pozycję 8000. Ten rodzaj kontroli wygląda na łatwy w przeglądaniu dokumentów LabVIEW firmy NI, ale na razie utknąłem z C#. Cała komunikacja zewnętrzna odbywa się przez odpytywanie, co powoduje wiele irytujących pętli. Połączyłem luźny model Producenta Konsumenta, w którym wątki Producenta zapętlają się poprzez odczytywanie czujników i ustawiają wyjścia. Wątek konsumenta wykonuje funkcje zawierające pętle czasowe, które odpytują producenta o bieżące dane i wykonują polecenia ruchu zgodnie z wymaganiami. Wątek interfejsu użytkownika odpytuje oba wątki pod kątem aktualizacji niektórych wskaźników wskazujących bieżący postęp testu. **Nie wiesz, od czego zacząć** Czy istnieje bardziej odpowiedni wzór dla tego typu aplikacji? Czy są jakieś dobre zasoby do pisania pętli sterowania w oprogramowaniu (innym niż LabVIEW), które łączą się z zewnętrznymi czujnikami i tak dalej?


title: Wprowadzanie nowej architektury podczas konserwacji starszych systemów

text: Otrzymałem zadanie dodania kilku nowych funkcji do starszego projektu ASP.NET MVC2. Baza kodu jest katastrofą i chcę napisać te nowe funkcje z myślą o implementacji, a nie tylko wrzucać te nowe funkcje do bałaganu. Chciałbym przedstawić takie rzeczy, jak wstrzykiwanie zależności i wzorzec orkiestratora; tylko do kodu, który zamierzam napisać. Nie mam czasu na refaktoryzację całego systemu. Czy można nie być spójnym z resztą kodu i dodawać nowe funkcje zgodnie z różnymi zasadami projektowania? Czy nie powinienem wprowadzać nowych wzorców i po prostu zaimplementować funkcje? Wydaje mi się, że dla następnej osoby może być mylące, aby zobaczyć części systemu za pomocą projektu, którego nie przestrzegają inne części.


title: Jakie są argumenty przemawiające za/przeciwko generowaniu kodu?

text: Jestem w sytuacji, w której mamy trochę kruchy kod, który konstruuje zapytania podobne do SQL poprzez łączenie tekstu z parametrami dla danych wejściowych. Źródło danych, które przeszukuje, jest szybkie i skalowalne, ale nie obsługuje narzędzi. Z biegiem czasu do źródła danych zostały dodane encje i właściwości, które wymagają zmiany lub przestarzałe inne, więc zapytania wymagają zmiany. Widzę, że to się powtórzy za kilka miesięcy i znowu. W celu ograniczenia błędów wprowadzanych do zapytań tekstowych zaproponowałem wpisanie zapytań do osobnego np. .SQL, a następnie uruchomienie jakiegoś narzędzia do generowania kodu, które mogłoby pobrać schemat ze źródła danych i wygenerować opakowanie kodu wokół zapytania podobnego do SQL, które było łatwe do ponownego wygenerowania w dowolnym momencie i dałoby błędy kompilacji dla każdego wyjścia -of-daty kod klienta. Pomysł ten spotkał się z pewnym sceptycyzmem i oporem, nawet gdy sam oferowałem finansowanie rozwoju. Jakie są powody, by tego nie robić? i dla równowagi, powody, aby iść dalej i to zrobić? (Widziałem już ten post z kilkoma odpowiedziami, ale nie jest to wyczerpujące)


title: Nazwa procesu ewolucji prototypu

text: Szukam powszechnie używanej nazwy dla procesu tworzenia obiektu potomnego z obiektu nadrzędnego, albo poprzez techniki klonowania i modyfikowania, albo poprzez prototypowe mechanizmy dziedziczenia dostępne w języku takim jak JavaScript. W _JavaScript: The Good Parts_ Douglas Crockford używa w tej procedurze nazwy metody _beget_. To wydaje się trochę zbyt graficzne jak na mój gust i nie widziałem, żeby było używane gdzie indziej. ECMAScript 5 i niektóre frameworki używają po prostu nazwy metody _create_. NP. _Uważaj, kiedy_ **———** _prototyp X, aby nie zastąpić tego atrybutu._ Moje pomysły _ewoluują_ , co wydaje się trochę pretensjonalne, i _dostosowują się_ , co wydaje się niejasne. _Wyprowadzanie_ może działać, ale może też być mylące, ponieważ jest powszechnie używane przy omawianiu dziedziczenia klasycznego. Termin _rozszerzanie_ może mieć zastosowanie, ale wydaje się sugerować, że oryginalny obiekt jest modyfikowany, co nie ma miejsca w tym przypadku. Wygląda na to, że Underscore.js udostępnia to m.in. `_(o).chain().clone().extend(o2)`. Czy istnieje zwięzły i powszechnie używany termin na określenie tej procedury?


title: Dlaczego struny są tak wolne?

text: Od czasu moich pierwszych zajęć z programowania w liceum słyszałem, że operacje na ciągach są wolniejsze – tj. bardziej kosztowne – niż mityczna „operacja przeciętna”. Dlaczego sprawia, że są tak powolne? (To pytanie pozostawiono celowo szerokie.)


title: Scala: Od koncepcji do pracy

text: Druga próba postawienia pytania bardziej zwięźle. Chcę powiedzieć, że jestem fanem Scali, a przynajmniej chcę być. Zrezygnowałem z nauki jednego z tych języków funkcjonalnych [Scala, Haskell, Erlang]. Bawiłem się nimi wszystkimi, z daleka spędziłem najwięcej czasu próbując zrozumieć Scala. Szczerze mówiąc, korzystałem z samouczków dla Haskella i Erlanga bardziej jako narzędzia do lepszego zrozumienia Scali. Wierzę, że w pewnym stopniu rozumiem podstawy. Ale powód, dla którego pomyślałem, że chcę iść ze Scala, okazuje się być najbardziej frustrujący... Gadatliwość większości bibliotek Java jest... umm tak, SNMP4j sprawia, że chcę wyrwać sobie włosy. Więc zaczynamy, czy ktoś zna witrynę lub samouczek podobny do „Napisz schemat w 48 godzin”. Coś, co naprawdę pokazuje, jak przechodzisz od koncepcji do projektu roboczego, w tym interpretowanie bibliotek innych firm. A może Scala jest po prostu lepszą Javą? Oznacza to, że najlepiej nauczyć się Javy przed przystąpieniem do Scali. * * * Nie chciałem wnioskować, że Scala nie jest językiem samym w sobie. Wręcz przeciwnie, uważam, że to bardzo dobry język; jednak rachunek sprzedaży dla Scali _IS_, że jest lepszy w Javie niż w Javie. Więc naprawdę staram się odpowiedzieć sobie, jak opłacalne jest uczenie się Scali, podczas gdy tak naprawdę nie interesuje mnie zbyt wiele nauki języka Java. Chcę korzystać z bibliotek, ponieważ zdaniem niektórych jest to największa zaleta korzystania ze Scali. Jeśli niektóre z tych implementacji bibliotecznych są tak „złożone”, że wymagają, a nie tylko najlepiej korzystać z dobrej znajomości idiomów programowania Java, to chciałbym wiedzieć, że podchodzę do tego problemu ze złego kierunku. Zdaję sobie sprawę, że jest kilka dobrych przykładów bibliotek, które zostały „skalfowane” lub co ty.


title: Czy dobrym pomysłem jest dynamiczne pozycjonowanie i ustawianie kontrolek w formularzu, czy ustawianie ich statycznie?

text: Pracowałem głównie z narzędziami do budowania interfejsów, takimi jak Interface Builder xCode i środowisko Visual Studio do umieszczania formularzy i pozycjonowania ich na ekranach. Ale stwierdzam, że w moim najnowszym projekcie umieszczanie kontrolek na formularzu za pomocą interfejsu graficznego nie zadziała. Ma to więcej wspólnego z liczbą niestandardowych kontrolek, które muszę utworzyć, których nie widzę wcześniej. Kiedy po raz pierwszy się tym zająłem, zacząłem ustawiać wszystkie moje kontrolki względem ostatnio utworzonych. Robienie tego miało swoje plusy i minusy. Z jednej strony dało mi to możliwość ustawienia jednej liczby (na przykład marginesu), a kiedy zmieniłem margines, wszystkie kontrolki są odpowiednio dopasowane do siebie (takie jak skrócenie kontrolek pośrodku przy zachowaniu kontrolek obok marginesu ten sam). Ale to zaczęło stawać się pajęczą siecią kodu, o której wiedziałem, że nie zajdzie daleko, zanim stanie się niebezpieczna. Zmień jedną liczbę i wszystko zmienia rozmiary, ale usuń jedną kontrolkę, a stworzyłeś o wiele więcej błędów i problemów z rozmiarami dla wszystkich innych kontrolek. Stało się to bardziej chirurgią niż małymi zmianami w sterowaniu i układzie. Czy istnieje dobry lub preferowany sposób określenia, kiedy należy używać pozycjonowania względnego lub bezwzględnego w formularzach?


title: Czy posiadanie lepiej płatnej pracy technicznej oznacza, że nie możesz już kodować?

text: Pracuję w dużej firmie, w której pracownicy techniczni należą z grubsza do jednej z tych kategorii: 1. **Programista** w zespole scrumowym, który tworzy jeden produkt i może współpracuje z innymi zespołami, które są z nim blisko związane. 2. **Architekt**, który jest bardziej konsultantem w wielu zespołach (5-6) i próbuje rozpoznać podobieństwa między działaniami zespołowymi, które można by wyabstrahować do bibliotek (architekci nie piszą jednak kodu biblioteki). Architekt ten uczestniczy również w wielu spotkaniach z zarządem i próbuje wyznaczać kierunek techniczny. W mojej firmie rola architekta to miejsce, w którym większość osób zajmujących się techniką przechodzi na kolejny krok w swojej karierze. Moje pytania brzmią: Czy większość firm działa w taki sposób, że najlepiej opłacani pracownicy techniczni są daleko od pisania kodu? Czy to naturalna tendencja w karierze dewelopera? Czy programista może mieć to wszystko (kod ORAZ ustawić kierunek?)


title: Jak mogę przetestować metody dostępu do bazy danych w Javie?

text: Chcę napisać test dla metody, która uzyskuje dostęp do bazy danych, takiej jak następujące. public class MojaKlasa{ public String getAddress(Int id){ String query = "Wybierz * z adresu gdzie id="+id; //niektóre dodatkowe instrukcje resultSet = statement.executeQuery(); zwróć wynik.getString(ADRES); } } Jak mogę przetestować tę metodę? Używam Javy.


title: Jakie problemy mogą wystąpić, jeśli plik XML nie jest poparty schematem?

text: Czym jest schemat XML w prostych słowach? Jaki będzie problem, jeśli XML nie ma zdefiniowanego schematu? Przykład może być bardzo pomocny.


title: Gdzie narysować linię między przodem a tyłem?

text: Niedawno otrzymałem kontrakt na opracowanie inteligentnego motywu dla automatycznej usługi odbierania telefonów SOHO. Zespół, który zbudował backend, nie pozwolił mi na dostęp do żadnego zaplecza ani nie powiedział mi nic o tym, ich konfiguracji smarty, wtyczek smarty, API interfejsu bazy danych, konfiguracji serwera, nic. Nie mogłem też mieć dostępu do serwera ani domeny beta, w zasadzie zero współpracy. Więc skonfigurowałem lokalny serwer ze Smarty i zbudowałem szablon w oparciu o to, co, jak przypuszczałem, będzie ich najlepszą praktyką, komentowałem mój kod jak szalony, napisałem wszystkie potrzebne pliki javascript, css i szablony. Następnie wysłałem je spakowane do zespołu backendowego i miałem nadzieję, że będzie jak najlepiej. Ponieważ połowa zespołu projektowego nie współpracuje ani nawet nie komunikuje się, obawiam się, że mogą odpowiedzieć, że wszystko jest nie tak i mogą odmówić wdrożenia nowego interfejsu. Jestem ciekaw, czy inni spotykają się z tego typu sytuacją i co mogłeś zrobić, aby się chronić.


title: Wyślij stdout lub stderr do nowego wątku

text: W przypadku problemów z wydajnością chcę, aby rejestrowanie zostało wysłane do nowego wątku. Podczas gdy program główny może działać, nowy wątek może zapisać błąd lub inne komunikaty w pliku bez wpływu na program główny. Jak mogę wysłać wszystkie standardowe wyjścia do nowego wątku? Praca do wykonania: * utwórz nowy wątek, ok * otwórz plik, ok * utwórz potok wewnątrz wątku, ok * wyślij stdout do nowego wątku za pomocą freopen czy dup? Za każdym razem, gdy bufor się zapełni lub co 5 sekund, plik dziennika otrzymuje nowe dane. Ponieważ jest to program MPI, nie mogę rozwidlić całego programu. To musi być wątek Posix.


title: Jakie są obowiązki Managera i Warstw Tao?

text: W kilku projektach używaliśmy następujących warstw: 1. Akcja (ma 1 lub więcej menedżerów) 2. Menedżer (ma 1 lub więcej Dao) 3. Dao Ale przez większość czasu menedżer dzwoni tylko do dao. Używamy klasy manager do przygotowania daty do wysłania do bazy lub do przygotowania danych do wysłania do akcji (czy to dobra praktyka?). 1. Jakie są obowiązki Managera i klas Tao? 2. Czy musimy mieć menedżera dla każdego dao, czy możemy po prostu korzystać z dao bezpośrednio? 3. Jak radzić sobie w sytuacjach, w których muszę skorzystać z funkcjonalności zaimplementowanej w kilku Managerach? PS: Wiem, że nie ma złotego młotka, więc ograniczę się do typów aplikacji, które wykonujemy, ogólnie aplikacji internetowych dla banków. Dziękuję Ci


title: Najlepsza metoda asynchronicznej inicjalizacji modelu widoku we wzorcu MVVM (WPF)

text: Pracuję nad aplikacją biznesową (C#, WPF, EF, MVVM). Muszę załadować kilka elementów z bazy danych, stworzyć dla nich modele widoków i umieścić je w oknie. Czy istnieje sposób na utworzenie modelu widoku w innym wątku lub zrobienie czegoś podobnego, aby przyspieszyć interfejs użytkownika? 1. Przybliżony średni czas potrzebny na pobranie wszystkich elementów z bazy danych = 1s 2. Przybliżony średni czas potrzebny do utworzenia instancji wszystkich modeli widoku = 3s Wykonuję pierwszą część poprzez zdarzenie Loaded każdego elementu. ale druga część to wąskie gardło. każdy wgląd byłby doceniony.


title: Jaka jest najlepsza praktyka refaktoryzacji metody statycznej, aby była bardziej testowalna?

text: Załóżmy, że masz statyczną metodę, która wygląda mniej więcej tak: public static bool Foo() { var bar = new Bar(); //zrób kilka rzeczy tutaj } Ta metoda w obecnej formie może być prawdziwym problemem dla testów jednostkowych. Jaka jest najlepsza praktyka refaktoryzacji tego, aby można było ją przetestować, bez przekształcania jej w metodę instancji lub zmiany sygnatury metody?


title: Kiedy tworzyć kontrolki użytkownika w ASP.NET

text: Dziedziczę stary kod. Starszy kod zawiera wiele formularzy internetowych, a każdy formularz internetowy nie ma wiele funkcji poza hostowaniem kontrolki użytkownika. Moje pytanie brzmi - * Czy powinniśmy utworzyć kontrolkę użytkownika, nawet jeśli ta kontrolka nie jest używana w żadnym innym formularzu sieci Web? * Czy są jakieś twarde korzyści z tworzenia kontroli użytkownika nad formularzami internetowymi? PS — formularze sieci Web to pliki aspx, a formanty użytkownika to pliki ascx.


title: Dlaczego przy pingu musimy wykonywać kopiowanie tablicy zamiast przekazywać tablicę źródłową, którą wysłał do nas klient?

text: Tak więc googlowałem na temat tego, co puszcza serce OpenSSL i jakoś widzę, że jest to spowodowane rozszerzeniem bicia serca, które wymaga od klienta pingowania serwera, aby pokazać jego żywotność, a wszystko sprowadza się do tej funkcji memcpy w C, która ma kopiować z tablica źródłowa do tablicy docelowej o rozmiarze określonym przez użytkownika. Jeśli rozmiar był kłamstwem (co oznacza, że źródło zawiera mniej bajtów niż deklaruje rozmiar), to memcpy przechwyci arbitralną pamięć i przydzieli ją do miejsca docelowego, a w tym przypadku odeśle z powrotem do klienta… Odniesienie: Anatomia Heartbleed OpenSSL: Just cztery bajty wyzwalają horror bug > `payload` jest kontrolowany przez atakującego i jest dość duży (64 KB). Jeśli > aktualna wiadomość `HeartbeatMessage` wysłana przez atakującego ma tylko ładunek >, powiedzmy, jednego bajta, a jej payload_length jest kłamstwem, to powyższa `memcpy()` > zostanie przeczytana poza końcem odebranego `HeartbeatMessage` i zacznij > czytać z pamięci procesu ofiary... Jeśli moje zrozumienie powyżej jest poprawne, to mam tutaj pytanie, może naiwne, dlaczego musimy tutaj kopiować tablicę (tutaj tablicę char)? Czy nie możemy po prostu przekazać tablicy znaków źródłowych, którą wysłał do nas klient? tj. Jeśli wyślesz mi function(char[] array) Wtedy musiałbym tylko odesłać tę samą tablicę send(array)


title: Czy zespoły zwinne powinny codziennie dostarczać nowe funkcje?

text: Moja firma jest w trakcie przejścia od rozwoju w stylu wodospadu do Agile/Scrum. Powiedziano nam między innymi, że oczekujemy, że pod koniec każdego dnia będziemy mieć **nowe** działające, **testowalne** funkcje (przez kontrolę jakości). Większość naszych programistów traci około 2 godzin dziennie na spotkania i inne koszty związane z biznesem. Oznacza to, że w dowolnym 6-godzinnym (w najlepszym razie) okresie musimy zaprojektować, napisać, przetestować, zbudować i wdrożyć (z uwagami do wydania) wystarczającą ilość kodu, aby stworzyć kompletną funkcję, z którą można się bawić. Rozumiem, że informacje o kompilacji/wdrożeniu/wydaniu można zautomatyzować przy odpowiedniej konfiguracji CI, ale jeszcze do tego nie dotarliśmy. Mamy również duży kontyngent offshore piszący nasz kod po stronie serwera, a 12-godzinna różnica czasu sprawia, że jest to jeszcze trudniejsze. Próbujemy podzielić historie na wąskie, głębokie, pionowe plasterki, aby jak najszybciej ukończyć funkcje od początku do końca, ale przez większość dni czuję się raczej szalony i często przyłapuję ludzi, którzy robią głupie, kruche skróty, aby zapewnić kontrolę jakości. Ten problem pogłębia się po kilku dniach sprintu, kiedy nieuniknione defekty zaczynają się pojawiać i muszą zmieścić się w tym samym 6-godzinnym oknie. Czy to normalne tempo dla zespołów Agile? Nawet jeśli uda nam się wdrożyć konfigurację CI, nie widzę, jak będziemy w stanie utrzymać to tempo i nadal tworzyć wysokiej jakości oprogramowanie. **Edytuj:** Tutaj znajdziesz kilka dobrych odpowiedzi. Uświadomiłem sobie, że tak naprawdę pytam, czy zespoły Agile powinny codziennie dostarczać **nowe funkcje**. Odpowiednio zaktualizowałem tytuł.


title: Uczę się, jako fizyk, jak zostać lepszym programistą

text: Zawsze lubiłem fizykę i zawsze lubiłem kodowanie, więc kiedy dostałem na uniwersytecie ofertę pracy doktorskiej zajmującej się fizyką numeryczną (szczegóły nie są istotne, to głównie programowanie równoległe dla klastra) - pomysł dla mnie. Jednak, jak większość fizyków, jestem samoukiem. Nie mam szerokiej wiedzy na temat kodowania w sposób obiektowy, ani nazwy konkretnego algorytmu, który optymalizuje wyszukiwanie w jakimś drzewie kD. Ponieważ cała moja dotychczasowa praca była bardziej zainteresowana _fizyką_ i wynikami naukowymi, niewątpliwie mam pewne złe nawyki - tym bardziej, że moje kodowanie jest moje własne, a nie praca zespołowa. Najczęściej używam C, ponieważ jest bardzo proste i „dostajesz to, co piszesz” – nie ma potrzeby stosowania wymyślnych abstrakcji. Jednak ostatnio przerzuciłem się na C++, ponieważ chciałbym dowiedzieć się więcej o mocy, jaką daje abstrakcja i jest to całkiem podobne do C (przynajmniej pod względem składni). Jak nauczyć się kodować w dobry, abstrakcyjny sposób, jak absolwent informatyki? Wiem, że mój kod jest wydajny, ale chcę, aby był również _elegancki_ i czytelny. Pamiętaj, że nie mam czasu na przeczytanie kilku 1000-stronicowych tomów o programowaniu abstrakcyjnym. Muszę poświęcić czas na rzeczywiste badania związane z fizyką (mój przełożony śmiałby się ze mnie, gdyby wiedział, że spędzam czas na myśleniu o tym, jak programować elegancko). Jak ocenić, czy moja praca jest również dobra z perspektywy programisty?


title: Programowanie i testowanie sprzętu na Androida — które telefony i testy? Jakie są najlepsze opcje/oferty?

text: Jestem całkiem nowy w programowaniu Androida. Spędziłem kilka tygodni, robiąc tutoriale i rozwijając proste aplikacje. Teraz skupiam się na wszystkich aspektach testów. Zrobiłem już testy Junita, więc pomyślałem, że będzie OK, ale teraz trochę martwię się o wymagane pokrycie testowe. Po pierwsze, jak przetestować sprzęt na tak wielu różnych urządzeniach? Myślałem, że po prostu kupię, ale teraz nie jestem taki pewien. Jest tak wiele telefonów i są tak różne! brak funkcji sprzętowej, różne rozdzielczości, różne wersje lib itp. Czy macie statystyki dotyczące tego, który telefon sprzedaje się najlepiej w danym kraju? Abyśmy mogli po prostu kupić 2,3 najbardziej reprezentatywne telefony? Czy są jakieś oferty dla programistów, w których kupujesz 3 telefony + 1 umowę za rozsądną cenę (jestem w Wielkiej Brytanii btw). Ponadto, wracając do testów emulatorów, czy istnieje sposób na przekształcenie słynnego telefonu w odpowiedni AVD? Czy dostępna jest jakaś fajna darmowa infrastruktura testowa, która ułatwia testowanie multi-AVD, multi-konfiguracji i wielu projektów? Teraz znam większość programów, takich jak adb, android, emulator itp. Nadal prawdopodobnie będę musiał napisać kilka skryptów Pythona, które je wszystkie zintegrują. własna strategia testowania Androida byłaby bardzo mile widziana! Z góry dziękuję Mikael


title: W jaki sposób strona internetowa powinna sprawdzać adres pocztowy użytkownika?

text: To jest dla witryny, która polega na wysyłce przedmiotów za pośrednictwem UPS lub FedEx. Wiem, że istnieje oprogramowanie, które to robi (http://en.wikipedia.org/wiki/Coding_Accuracy_Support_System), ale jeśli próbujesz zbudować własne rozwiązanie dla prostej strony internetowej.


title: Rola analityka biznesowego w procesie rozwoju

text: Pracuję jako analityk biznesowy i obecnie nadzoruję wiele prac rozwojowych nad projektem wewnętrznym. Odpowiadam za wymagania, specyfikacje i ogólne testy. Ściśle współpracuję z deweloperami (onshore i offshore). Zespół offshore opracowuje wszystkie raporty. Wersja 1.0 miała 9-miesięczny cykl rozwojowy, a ja miałem około 4-5 miesięcy na przetestowanie wszystkich raportów. To było zwykłe tam iz powrotem, aby poprawnie wdrożyć. Wersja 2.0 miała znacznie krótszy cykl rozwoju (3 miesiące). Pierwszą wersję raportów otrzymałem około 3 tygodnie temu i zauważyłem w niej wiele wad. Wiele wymagań było błędnych, a wydajność zapytań była przerażająca przy 5x - 6x dłuższa niż powinna. Główny programista onshore był nieobecny i nie nadzorował zespołu ds. rozwoju offshore podczas generowania raportów. Kierownictwo wiedziało o problemach z wydajnością i powiedziałem im również, że staram się znaleźć sposób na poprawę wydajności; nie wyrażali zgody na wysyłanie zapytań testowych, ale nie przejmowali się również faktem, że to robię. Spojrzałem na SQL w raportach i udało mi się znacznie poprawić wydajność (o współczynnik 6x), co jest akceptowalne dla tej wersji. Wysłałem zaktualizowane zapytania jako wytyczne do zespołu offshore i powiedziałem im, że powinni przyjrzeć się robieniu X zamiast Y, aby poprawić wydajność, a także naprawić niektóre specyficzne problemy logiczne. Porozmawiałem o tym z moimi menedżerami, ponieważ wydaje mi się, że to nie w porządku, że tworzyłem zapytania SQL, ale biorąc pod uwagę nasz czas, nie widziałem innej drogi. Udało nam się dość szybko rozwiązać problem, z czego jestem zadowolony. Obecna sytuacja: menedżerowie onshore nie są zbyt zadowoleni, że zespół offshore nie koduje pod kątem wydajności. Wiem, że jest kilka rzeczy, które mogłem zrobić lepiej podczas tego procesu i w żaden sposób nie uważam się za programistę. **Moje pytanie brzmi, czy jeśli zespół offshore, który pracuje poza zasobami projektu na lądzie, nie dostarczy akceptowalnego wydania, czy należy uporządkować swoją pracę, aby dotrzymać terminu? Jakie problemy może to spowodować w przyszłości?** Aktualizacja: Jak dotąd kierownictwo jest niezadowolone z zespołu offshore, ale w żaden sposób nie „upominało” mnie, więc nie jestem pewien w ich oczach, czy to, co zrobiłem, było źle, ale myślę, że ich głównym źródłem frustracji było to, że zespół offshore nie był w stanie znaleźć rozwiązania, a ja byłem, zwłaszcza że tego rodzaju problemy z wydajnością pojawiały się w przeszłości. Nie bronię swoich działań, ale chcę nadać kontekst, aby obraz był trochę wyraźniejszy. Przyjąłem odpowiedź, która najbardziej krytykuje moje działania. Zgadzam się, że nie jest to coś, co powinien zrobić ktoś na moim stanowisku.


title: Czym różni się kompilacja projektu msdeployment od zwykłego projektu aplikacji sieci Web?

text: W naszym środowisku CI budujemy wszystkie projekty cs, a następnie budujemy projekty wdrożeniowe. Projekty wdrożeniowe wykonują dodatkowy etap kompilacji plików aspx i ascx i często wychwytują błędy, które normalnie zostałyby przechwycone w czasie wykonywania. 1) Czy istnieje nazwa tego kroku lub procesu? 2) Czy mogę go uzyskać w zwykłych kompilacjach projektu? 3) Gdzie mogę dowiedzieć się o różnych krokach budowania specjalnie dla msbuild? Czytając pełne logi Chciałbym lepiej zrozumieć, co się właściwie dzieje. Dziękuję Ci.


title: Deklarowanie zmiennych w Pythonie i PHP

text: Pytanie brzmi, jak poradzić sobie z brakiem deklaracji zmiennych w Pythonie, PHP i tym podobnych. W większości języków istnieje sposób na poinformowanie kompilatora, czy wprowadzam nową zmienną, czy odnoszę się do już istniejącej: `my` w Perlu (`use strict`) lub `\newcommand` vs. `\revewcommand` w LaTeX-ie. Zapobiega to dwóm głównym źródłom błędów i bólu głowy: (1) przypadkowemu użyciu tej samej nazwy zmiennej do dwóch różnych celów, takich jak (PHP) $v = $kwadrat * $wysokość; <...wiele kodu...> foreach ($opcje jako $k => $v) echo "Dla klucza $k wartość wynosi $v\n"; <...dużo kodu...> echo "Głośność wynosi $v"; lub dużo paskudniejszy (PHP) $a = [1, 2, 3]; foreach ($a jako $k => &$v) $v++; foreach ($a jako $k => $v) echo "$k => $v\n"; (czy widzisz tu błąd? wypróbuj!); oraz (2) zapobiegaj literówkom (PHP): $option = 1; $liczbaelementów = 1; if ($opcja) { $liczbafelenents = 2; } echo $liczbaelementów; (czy widzisz tu błąd? PHP uruchomi się po cichu). Używając czegoś takiego jak `my` (Perl) użyj strict; moja $opcja = 1; moja $liczbaelementów = 1; if ($opcja) { $liczbafelenents = 2; } powiedz $liczbaelementów; (Perl natychmiast zgłosi błąd) to niewielki wysiłek i OGROMNE korzyści zarówno w czasie debugowania, jak i (co ważniejsze) w stratach (potencjalnie ogromnych) spowodowanych nieprawidłowymi programami. Jednak niektóre języki, w szczególności Python, PHP i JavaScript, nie zapewniają żadnej ochrony przed tego typu błędami. Moje pytanie brzmi, jak skutecznie sobie z tym poradzić? Jedynym sposobem, jaki mogę przewidzieć, jest utworzenie dwóch funkcji (PHP): function a ($x) { if (isset ($x)) die(); w przeciwnym razie zwróć &$x; } i funkcja ($x) { if (isset ($x)) return &$x; inaczej umrzeć(); } i używaj ich zawsze: a($liczbaelementów) = 1; the($liczbaprzyczyn)++; powiedz the($liczbaelementów); ale oczywiście jest to niezwykle uciążliwe. Jakiś lepszy sposób na skuteczną ochronę przed takimi błędami? Nie, „użyj innego języka”, „bądź ostrożny i nie popełniaj błędów” i „podziel swój kod na małe funkcje” nie są dobrymi odpowiedziami (te ostatnie mogą chronić przed błędami typu 1, ale nie typu 2).


title: Jak zrównoważyć szybkość sprintów z konserwatywnym harmonogramem wdrożenia klienta?

text: Wolałbym mieć sprinty trwające 3-4 tygodnie, ale klienci nie chcą wprowadzać nowych funkcji/funkcji co 3-4 tygodnie. Obecni klienci są konserwatywni i po osiągnięciu minimalnego progu dla funkcji i możliwości, lubią pozostać w stabilnej wersji przez znacznie dłużej niż 4 tygodnie. Nawet 3-miesięczny cykl byłby dla nich pchający. Z drugiej strony nowi klienci mają więcej próśb o funkcje i chętnie podążają za sprintami. Ale ta gotowość znika po spotkaniu z ich barem. Jak zrównoważyć potrzebę szybkich sprintów z konserwatywnym poglądem klienta na zmianę aplikacji? Szczególnie interesują mnie scenariusze SaaS.


title: Przepływ OAuth2 — czy serwer sprawdza poprawność z serwerem Auth?

text: Dużo czytałem na temat OAuth2, próbując to sobie wyobrazić, ale wciąż jestem zdezorientowany. Rozumiem, że klient dokonuje autoryzacji u dostawcy OAuth (na przykład Google) i umożliwia serwerowi zasobów dostęp do danych profilu użytkownika. Następnie klient może wysłać token dostępu do serwera zasobów i otrzymać z powrotem zasób. Ale to, czego nie omówiono w żadnej dokumentacji, to to, co się dzieje, gdy aplikacja kliencka prosi serwer zasobów o zasób i przekazuje mu token dostępu. Wszystko, co do tej pory przeczytałem, stwierdza, że serwer zasobów odpowiada po prostu żądanym zasobem. Ale wydaje się to ogromną dziurą, z pewnością serwer zasobów musi w jakiś sposób zweryfikować token dostępu, w przeciwnym razie mógłbym po prostu sfałszować każde stare żądanie i przekazać stary, stoken, fałszywy lub losowo wygenerowany token, a on po prostu go zaakceptuje. Czy ktoś może wskazać mi proste wyjaśnienie OAuth2, ponieważ do tej pory te, które przeczytałem, wydają się niekompletne. Dziękuję


title: Czy lepiej umieścić wydarzenie na najwyższym obiekcie, czy bliżej miejsca, w którym jest ono lokalne?

text: Weźmy na przykład następujący podstawowy kod strukturalny: class Player { public QuestLog QuestLog { get; ustawić; } } Rozważmy, że "QuestLog" ma możliwość odpalania niektórych zdarzeń, gdy coś jest do niego dodawane lub usuwane. Normalnie zapisałbym się bezpośrednio do QuestLog, na przykład wykonując coś takiego: player.QuestLog.AcceptedQuest += SomeHandler Jednak chcę przekazać w jakimś dodatkowym kontekście (obiekt gracza). Widziałem kilka opcji. 1. Tworzenie funkcji obsługi lambda, która może rozwiązać dodatkowy parametr do funkcji obsługi. To działa, ale ma pewne dziwactwa, których nie lubię. Obecnie używam tego podejścia. 2. Mogę powiązać QuestLog z graczem, przekazując odniesienie do gracza, do którego należy, i zgodnie z nim uruchamiać zdarzenia. Czuje się jak niepotrzebne sprzęganie. 3. Ujawnij zdarzenie w samym obiekcie Player, a także w QuestLog i „bubuj” zdarzenie w miejscu, w którym dostępny jest kontekst, umożliwiając w ten sposób subskrypcje bezpośrednio na odtwarzaczu. Pamiętaj, że gracz może mieć kilka kolekcji i kilka wydarzeń, więc przeniesienie ich wszystkich w górę może spowodować, że na jednej klasie odbędzie się kilkadziesiąt wydarzeń. Jak to się zwykle robi?


title: Dlaczego C++ dominuje w konkursach i konkursach programistycznych?

text: Rozumiem, że C++ jest bardzo szybkim językiem, ale czy C nie jest tak samo szybki lub szybszy w niektórych przypadkach? Wtedy możesz powiedzieć, że C++ ma OOP, ale ilość OOP, której potrzebujesz do większości łamigłówek programistycznych, nie jest aż tak duża i moim zdaniem C poradzi sobie z tym. **Oto dlaczego o to pytam** : Bardzo interesują mnie konkursy i konkursy programistyczne i jestem przyzwyczajony do kodowania w C na nich. Zauważyłem jednak, że zdecydowana większość ludzi używa C++ (np. używało go 17 z 25 finalistów w Google Code Jam 2011, podczas gdy nikt nie używał C), więc zastanawiam się, czy jestem w niekorzystnej sytuacji korzystając z C. Poza z Object Orientation, co sprawia, że C++ jest bardziej odpowiednim językiem do zawodów programistycznych? Jakich cech języka powinienem się nauczyć i używać, aby lepiej radzić sobie na zawodach? W tle uważam się za dość biegłego w C, ale dopiero zaczynam uczyć się C++.


title: Znaczenie i rola Node.js w tworzeniu stron internetowych

text: Czytałem, że Node.js jest środowiskiem javascript po stronie serwera. To dało mi do głowy kilka myśli i majsterkowiczów. Czy możemy stworzyć kompletną aplikację internetową opartą na danych, wykorzystującą tylko JavaScript (wraz z node.js), HTML5 i CSS? Czy nadal musimy używać jakiegoś języka skryptowego po stronie serwera (np. C#, PHP)? Jeśli nadal potrzebujemy używać innych języków skryptowych, do czego jest wart lub przydatny node.js? **UWAGA:** _Przepraszam za moją wiedzę o node.js._


title: Problem z kodem C. Raspberry PI, HD44780 LCD

text: Pisałem program do połączenia Raspberry Pi z HD44780 LCD. Kod, który napisałem, nie wydaje się inicjować wyświetlacza, z arkusza danych, o ile wiem, że robię właściwy proces. Wiem, że kod nie jest świetny, ale skupiam się tylko na tym, aby działał, a następnie na sprzątaniu i tak dalej. Ma to pomóc mi w nauce C. Używam biblioteki bcm2835 od mikem. Kod wygląda następująco: #include <stdio.h> #include <bcm2835.h> #define RS RPI_GPIO_P1_26 //GPIO 7 #define En RPI_GPIO_P1_24 //GPIO 8 #define D4 RPI_GPIO_P1_11 //GPIO 17 #define D5 RPI1_GPIO GPIO 18     #define D6 RPI_GPIO_P1_13 //GPIO 27     #define D7 RPI_GPIO_P1_15 //GPIO 22          #define FUNC_4b_2L_5X8 0x28     #define DISP_ON_CURS_ON_BLINK_OFF 0x0E     #define INC_ON_SHIFT_OFF 0x06     #define CNTRL_LINES_LOW 0xFFF8     #define CURS_LEFT 0x10     #define CURS_RIGHT 0x14     #define CLR_DISP 0x01     #define SHIFT_LEFT 0x18 #define SHIFT_RIGHT 0x1C #define ROW_0_START 0x80 #define ROW_1_START 0xC0 #define RETURN_HOME 0x2 void lcd_gpio_low(void) { bcm2835_gpio_write(RS, LOW); bcm2835_gpio_write(En, LOW); bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, LOW); } void assign_bits(uint8_t dane) {przełącznik(dane) {przypadek 0: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 1: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 2: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 3: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 4: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 5: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 6: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 7: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, LOW); przerwanie; przypadek 8: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 9: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 10: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 11: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, LOW); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 12: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 13: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, NISKI); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 14: bcm2835_gpio_write(D4, LOW); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, WYSOKA); przerwanie; przypadek 15: bcm2835_gpio_write(D4, WYSOKI); bcm2835_gpio_write(D5, WYSOKA); bcm2835_gpio_write(D6, WYSOKA); bcm2835_gpio_write(D7, WYSOKA); przerwanie; } } void pulse_enable_line(void) { bcm2835_gpio_write(En, HIGH); bcm2835_delayMicroseconds(1); bcm2835_gpio_write(En, LOW); bcm2835_delayMicroseconds(1); } void send_nyble(uint8_t dane) { assign_bits(dane); bcm2835_delayMicroseconds(10); pulse_enable_line(); } void send_byte(uint8_t dane) { send_nyble(dane >> 4); bcm2835_delayMicroseconds(10); send_nyble(dane i 0x0F); bcm2835_delayMicroseconds(10); } void write_inst(uint8_t data) { lcd_gpio_low(); bcm2835_delayMicroseconds(1); wyślij_bajt(dane); bcm2835_delayMicroseconds(10); } void clear_disp(void) { // Wyczyść wyświetlacz write_inst(CLR_DISP); bcm2835_delayMicroseconds(40); } void write_data(uint8_t data) { bcm2835_gpio_write(RS, HIGH); wyślij_bajt(dane); bcm2835_delay(5); bcm2835_gpio_write(RS, NISKI); } // Wyświetla znak, podaj znak void disp_char(char *text) { // Ustaw wszystkie wyjścia na 0 lcd_gpio_low(); // Ustaw RS na 1 bcm2835_gpio_write(RS, HIGH); bcm2835_delayMicroseconds(1); // Ustawia przekazaną wartość send_byte(*text); bcm2835_delayMicroseconds(40); // Ustaw wszystkie wyjścia na 0 lcd_gpio_low(); bcm2835_delayMicroseconds(40); } void lcd_init(void) { //Ustaw linie jako wyjścia bcm2835_gpio_fsel(RS, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel (En, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(D4, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(D5, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(D6, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel(D7, BCM2835_GPIO_FSEL_OUTP); lcd_gpio_low(); bcm2835_delay(42); // wyślij dane zestawu funkcji jako 8 bitów, 2 linie i 5x8 write_inst(FUNC_4b_2L_5X8); bcm2835_delay(5); // wyślij dane zestawu funkcji jako 8 bitów, 2 linie i 5x8 write_inst(FUNC_4b_2L_5X8); bcm2835_delayMicroseconds(110); // wyślij dane zestawu funkcji jako 8 bitów, 2 linie i 5x8 write_inst(FUNC_4b_2L_5X8); bcm2835_delayMicroseconds(40); // wyślij dane zestawu funkcji jako 8 bitów, 2 linie i 5x8 write_inst(FUNC_4b_2L_5X8); bcm2835_delayMicroseconds(40); // Wyślij kontrolkę wyświetlania. Disp on, kursor na i miganie write_inst(DISP_ON_CURS_ON_BLINK_OFF); bcm2835_delayMicroseconds(40); // Ustawiono tryb wysyłania wpisu. Przyrost włączony, przesunięcie wyłączony write_inst(INC_ON_SHIFT_OFF); bcm2835_delayMicroseconds(40); // Wyczyść wyświetlanie clear_disp(); } int main() { //bcm2835_set_debug(1); jeśli (!bcm2835_init()) zwraca 1; lcd_init(); zapisz_dane (0x48); printf("%d",'F'); bcm2835_delay(10000); zwróć 0; }


title: Wolno, jeśli używasz odsyłaczy do obiektów

text: W OOP wydaje się, że jeśli obiekt odwołuje się do innego obiektu w swojej właściwości, ostatecznie, jeśli takie obiekty są często używane, oprogramowanie na końcu będzie z tego powodu powolne. Czy to prawda? Jeśli tak, czy możemy celowo tego nie robić, wykonując zadania?


title: Kiedy płacić za kompilatory C++

text: Ostatnio zacząłem się zastanawiać, kiedy deweloperzy powinni płacić za kompilatory. Kompilatory są dostępne za darmo na większości platform lub można łatwo uzyskać bezpłatną wersję. Przykład: OS X - GCC i Clang/LLVM są dostarczane z narzędziami programistycznymi. Tutaj nie ma ograniczeń co do tego, jak i co możesz z nimi zrobić. Linux - GCC i na pewno więcej. Nie znam aktualnego stanu kompilatorów linuksowych. Tutaj nie ma ograniczeń co do tego, jak i co możesz z nimi zrobić. Windows - MinGW i Microsoft oferują darmową wersję Visual Studio. Bez ograniczeń z MinGW, ale myślę, że z darmowym Visual Studio są poważne ograniczenia. Jednak, jako przykład, Intel produkuje kompilatory C/C++. Są drogie w cenie. Myślę, że z punktu widzenia edukacji można dostać wersję OS X za 49 dolarów, a Windows/Linux za 129 dolarów. Oferują wtedy również kompletny produkt „Studio”. Oczywiście przy zastosowaniu cen edukacyjnych narzucane są ograniczenia. Ale zastanawiam się, kiedy należy naprawdę rozważyć płacenie za kompilatory. Jednym z przykładów, jaki mogę sobie wyobrazić, jest gra wideo. Jeśli używasz kompilatora, który działa na głównych platformach, nie będzie więcej narzędzi do przełączania dla platformy. Wygląda na to, że zmiana platform byłaby łatwa, gdyby narzędzia były takie same. Czy ktoś może rzucić nieco światła na płacenie za kompilatory, takie jak kompilatory Intela, i prawdziwe korzyści międzyplatformowe, jakie można uzyskać z ich używania? Czy kod staje się mniej przenośny, nawet jeśli bardzo się starasz nie stosować technik specyficznych dla platformy?


title: Jakie są ogólne najlepsze praktyki dotyczące tworzenia wtyczek/rozszerzeń?

text: Muszę skorelować wymagania dotyczące wtyczki/rozszerzenia aplikacji z najlepszymi praktykami programistycznymi. Pomyślałem, że mogą istnieć porady dotyczące najlepszych praktyk, które dotyczą dostępnych wtyczek i rozszerzeń, ale nie mogę znaleźć żadnej literatury. Oczywiście najlepsze praktyki są często zdroworozsądkowe, ale moje zadanie polega na zastosowaniu frameworka do opisu wyborów projektowych. Jeśli znane są jakiekolwiek zasoby specyficzne dla wtyczek/rozszerzeń, byłoby świetnie. W przeciwnym razie chciałbym przynajmniej znaleźć szanowaną, agnostyczną listę zasad tworzenia oprogramowania.


title: Globalny kontekst żądania - antywzorc?

text: Rozmawiałem dzisiaj z moim kolegą o frameworkach internetowych Pythona i naszych wrażeniach na ich temat. Powiedziałem mu, że uważam, że Flask mający globalne żądanie brzydko pachnie i jest anty-wzorcem. Dokumentacja mówi o kontekście żądania: > W przeciwieństwie do tego, podczas obsługi żądania istnieje kilka innych reguł: > > * gdy żądanie jest aktywne, lokalne obiekty kontekstu (flask.request i > inne) wskazują na bieżące żądanie. > * dowolny kod może w każdej chwili uzyskać dostęp do tych obiektów. > Myślę, że rozumiem ideę stojącą za tą decyzją projektową -- uproszczenie aplikacji. To tylko kompromis, tak jak w przypadku Thread Locals: > Tak, zwykle nie jest to taki dobry pomysł, aby używać wątków locals. Powodują problemy dla serwerów, które nie są oparte na koncepcji wątków i utrudniają utrzymanie dużych aplikacji. Jednak Flask nie jest przeznaczony > do dużych aplikacji lub serwerów asynchronicznych. Flask chce, aby pisanie tradycyjnej aplikacji internetowej było > szybkie i łatwe. Czy łatanie obiektu globalnego informacjami o bieżącym żądaniu jest anty-wzorcem? Uważam, że tak jest, ponieważ jest to z punktu widzenia statycznego analizatora kodu stan globalny, choć tak nie jest. A ja jako programista nie zrozumiem jak to działa bez uważnego przeczytania dokumentacji. A to ma wpływ na testy. Czy nie jest dobrą praktyką przekazywanie prośby jako argumentu do poglądów? Myślę, że jest bardziej czytelny, wyraźny i łatwiejszy do debugowania. I unika globalnego stanu.


title: Pisanie przypadków testowych akceptacji

text: Integrujemy proces testowania z naszym procesem SCRUM. Moją nową rolą jest pisanie testów akceptacyjnych naszych aplikacji internetowych w celu ich późniejszej automatyzacji. Dużo czytałem o tym, jak należy pisać przypadki testowe, ale żadna nie dała mi praktycznych porad dotyczących pisania przypadków testowych dla złożonych aplikacji internetowych, a zamiast tego rzuciła sprzeczne zasady, które trudno było mi zastosować: * **Przypadki testowe powinny być krótkie: ** Weźmy przykład z CMS. Krótkie przypadki testowe są łatwe w utrzymaniu i identyfikacji wejść i wyjść. A co jeśli chcę przetestować długą serię operacji (np. dodanie dokumentu, wysłanie powiadomienia do innego użytkownika, odpowiedzi innego użytkownika, zmiana stanu dokumentu, otrzymanie powiadomienia). Wydaje mi się raczej, że przypadki testowe powinny reprezentować kompletne scenariusze. Widzę jednak, w jaki sposób stworzy to jawnie złożone dokumenty testowe. * **Testy powinny identyfikować dane wejściowe i wyjściowe:** : Co zrobić, jeśli mam długi formularz z wieloma oddziałującymi polami o różnych zachowaniach. Czy piszę jeden test na wszystko, czy jeden na każdy? * **Przypadki testowe powinny być niezależne:** Ale jak mogę to zastosować, jeśli testowanie operacji przesyłania wymaga pomyślnej operacji łączenia? A jak to się ma do pisania przypadków testowych? Czy powinienem napisać test dla każdej operacji, ale każdy test deklaruje swoje zależności, czy powinienem przepisać cały scenariusz dla każdego testu? * **Przypadki testowe powinny być lekko udokumentowane:** Ta zasada jest specyficzna dla projektów Agile. Czy masz więc jakieś rady, jak wdrożyć tę zasadę? Chociaż myślałem, że pisanie testów akceptacyjnych będzie proste, byłem przytłoczony każdą decyzją, którą musiałem podjąć (FYI: jestem programistą, a nie profesjonalnym testerem). Więc moje główne pytanie brzmi: jakie kroki lub porady masz, aby napisać możliwe do utrzymania przypadki testów akceptacyjnych dla złożonych aplikacji. Dziękuję Ci. **Edytuj** : Aby wyjaśnić moje pytanie: zdaję sobie sprawę, że testy akceptacyjne powinny zaczynać się od wymagań i traktować całą aplikację jako czarną skrzynkę. Moje pytanie dotyczy praktycznych kroków do napisania dokumentu testowego, zidentyfikowania przypadków testowych, radzenia sobie z zależnościami między testami... dla złożonych aplikacji webowych


title: Ciągła integracja nigdy nie powoduje błędów w kompilacji

text: Pracuję z różnymi serwisami Java EE, które korzystają z opracowanych przez nas wewnętrznych bibliotek. W przypadku każdej witryny aktualizujemy do nowych wersji naszych wewnętrznych bibliotek tylko w razie potrzeby, a przed zatwierdzeniem upewniamy się, że witryna kompiluje się prawidłowo. Oznacza to, że gdy TeamCity kompiluje jedną z naszych witryn, witryna kompiluje się dobrze, ale później, gdy witryna zostanie zaktualizowana do najnowszej wersji bibliotek wewnętrznych, może wystąpić błąd kompilacji. Czy istnieje dobry sposób na poradzenie sobie z tym? Nie używamy jeszcze Mavena; czy korzystanie z Maven oznaczałoby, że nasze strony internetowe mogłyby automatycznie korzystać z najnowszych wersji wewnętrznych bibliotek? Dziękuję. **Wyjaśnienie:** Czasami spotykamy się z tym: 1. Projekt A zależy od biblioteki i obecnie używa biblioteki w wersji 1.0 2. Projekt B również zależy od tej biblioteki. Wprowadzam zmiany w bibliotece tak, że jest teraz w wersji 1.5. Projekt B używa teraz 1.5. 3. Projekt A i projekt B zostały dobrze zbudowane przez serwer CI (TeamCity) 4. Pracując ponownie nad projektem A, aktualizuję do wersji 1.5 i odkrywam, że 1.5 zawiera przełomowe zmiany. Czy istnieje sposób, aby serwer CI odkrył tego rodzaju przełomowe zmiany?


title: Jak dbać o aktualność bibliotek zewnętrznych?

text: Załóżmy, że mam projekt, który zależy od 10 bibliotek, aw bagażniku mojego projektu mogę używać dowolnych wersji tych bibliotek. Więc zaczynam od najnowszych wersji. Następnie każda z tych bibliotek otrzymuje aktualizację raz w miesiącu (średnio). Teraz, aby mój bagażnik był całkowicie aktualny, wymagałoby aktualizowania odniesienia do biblioteki co trzy dni. To oczywiście za dużo. Mimo że zazwyczaj wersja 1.2.3 zastępuje wersję 1.2.2, nigdy _nie wiesz_ bez testowania. Testy jednostkowe nie wystarczą; jeśli jest to silnik DB/plików, musisz upewnić się, że działa poprawnie z plikami, które zostały utworzone w starszych wersjach, a może na odwrót. Jeśli ma to coś wspólnego z GUI, musisz wszystko sprawdzić wizualnie. I tak dalej. Jak sobie z tym radzisz? Kilka możliwych podejść: * **Jeśli nie jest zepsuty, nie naprawiaj go**. Pozostań przy aktualnej wersji biblioteki tak długo, jak _ty_ nie zauważysz niczego złego, gdy jest używana w twojej aplikacji, bez względu na to, jak często dostawca biblioteki publikuje aktualizacje. Małe zmiany przyrostowe to po prostu marnotrawstwo. * **Często aktualizuj, aby nie wprowadzać zmian.** Ponieważ i tak będziesz musiał dokonać aktualizacji pewnego dnia, lepiej przeprowadzać aktualizacje często, aby wcześnie zauważyć wszelkie problemy, gdy są one łatwe do naprawienia, zamiast przeskakiwać w kilku wersjach i pozwalając na akumulację potencjalnych problemów. * **Coś pomiędzy.** Czy jest jakiś słodki punkt?


title: Czy można kiedykolwiek zatwierdzić niedziałający kod?

text: > Czy dobrym pomysłem jest wymaganie zatwierdzenia tylko działającego kodu? To zatwierdzenie nie musi pozostawiać repozytorium w stanie roboczym, ponieważ: * ... jesteśmy na wczesnym etapie projektowania, kod nie jest jeszcze stabilny. * ... jesteś jedynym programistą w projekcie. Wiesz, dlaczego rzeczy nie działają. Co więcej, nie przerywasz niczyjej pracy, popełniając zepsuty kod. * ... kod obecnie nie działa. Wprowadzimy w tym dużą zmianę. Zaangażujmy się, aby mieć punkt, do którego można wrócić, jeśli coś stanie się brzydkie. * ... łańcuch jest długi, nie ma problemu, jeśli w lokalnym oddziale istnieje uszkodzony kod. Tj. 1. pliki lokalne 2. obszar pomostowy 3. zatwierdzenia w gałęzi lokalnej 4. zatwierdzenia w zdalnej gałęzi funkcji osobistych 5. połącz ze zdalną gałęzią `develop` 6. połącz ze zdalną gałęzią `master` 7. połącz ze zdalną gałęzią `release` * ... angażuj się wcześnie, często. Tak więc w powyższym pytaniu większość odpowiedzi mówi, że zatwierdzenie niekompilowalnego kodu nie stanowi problemu w gałęziach lokalnych i funkcjonalnych. **Dlaczego?** Jaka jest wartość złamanego zatwierdzenia? * * * Dodano: Pojawiło się kilka wysoko ocenionych komentarzy, mówiących, że na lokalnej filii można robić, co się chce. Nie interesuje mnie jednak techniczna strona pytania. Raczej chciałabym poznać najlepsze praktyki – nawyki, które najbardziej produktywni mają ludzie, którzy przepracowali wiele lat w branży. * * * Jestem zdumiony ilością wspaniałych odpowiedzi! Doprowadzają mnie do wniosku, że nie jestem wystarczająco biegły w używaniu **gałęzi** do organizowania mojego kodu.


title: Używanie kluczy podstawowych Autoincrement jako kluczy obcych

text: Podczas tworzenia tabeli istnieje opcja, aby ustawić numeryczny klucz podstawowy jako autoinkrementację, gdzie jego wartość wzrasta po wstawieniu nowych danych. Ten numer podstawowy może służyć do ustawiania relacji tabeli, w której jest przypisany jako klucz obcy do tej tabeli. Więc moje pytanie, czy to dobra praktyka, abyśmy używali podstawowego liczbowego autoinkrementacji jako klucza obcego, czy też powinniśmy użyć kodu wygenerowanego programowo. **Np.** dla tabeli 'products' mamy pola 'id' (klucz podstawowy autoinkrementacji), 'productCode' (wygenerowany przez program unikalny kod pozycji. Właściwość pola również ustawiona na unique), 'Description'. i stworzymy relację z tabelą transakcji. Jakie pole należy użyć jako klucz obcy, 'autoid' czy kod produktu?


title: Czy blogowanie jest dobrą platformą, aby dostać się do freelancingu z zupełnie niezwiązanej pracy?

text: **Szybkie wprowadzenie** \- Pracuję w banku zajmującym się modelowaniem finansowym, gdzie muszę zrobić trochę programowania specyficznego dla domeny, ale poza tym to tylko statystyki i prezentacje. **Sytuacja** \- Oprogramowanie zawsze było moją pierwszą „miłością”, ale z różnych powodów nie podjąłem kariery w branży oprogramowania. Mam bardzo dobry dyplom z informatyki teoretycznej - więc rozumiem, co to znaczy, gdy mówi się o komiwojażerach, rachunku lambda czy P=NP (przykłady). Zamierzam zająć się programowaniem na pełny etat w ciągu najbliższych kilku lat. **Wybrana ścieżka** 1. Bądź w czymś naprawdę dobry - wybrałem "ekosystem" HTML5 składający się z HTML, Javascript i CSS. Przez lata programowałem w C, Haskell, Erlang, C++, Javascript, Common Lisp, Basic i Logo, ale nie byłem wystarczająco biegły w żadnym z nich. 2. Stań się ekspertem w społeczności przede wszystkim poprzez blogowanie i uczestnictwo w projektach/forach/wydarzeniach z tym związanych. Wtedy mogę spróbować założyć jakiś freelancingowy biznes lub przekonać startup do zatrudnienia mnie. **Pytania** \- Czy są jakieś dobrze znane przykłady osób, które podążały podobną ścieżką po przepracowaniu lat w zupełnie niezwiązanej dziedzinie (7, w moim przypadku)? Czy mam całkowicie urojenia, a dwa lata to za krótko?


title: Jakiej struktury internetowej należy używać w aplikacji internetowej typu front-end?

text: Co uważasz za dobry framework sieciowy klienta do użycia w aplikacji biznesowej interfejsu? jQuery? YUI!? Inne? Jakie wtyczki są przydatne? Aplikacja będzie używana głównie wewnętrznie, zastępując aplikację desktopową do wprowadzania danych i wielu zapytań/widoków.


title: dlaczego control + alt + delete nie może zostać przechwycone przez żadną aplikację

text: Bezpieczny klucz uwagi ma na celu uniemożliwienie fałszowania logowania, ponieważ jądro zawiesza każdy program, w tym te podszywające się pod proces logowania komputera, przed rozpoczęciem zaufanej operacji logowania. Dlaczego inne programy nie mogą symulować `control + alt + del`? Co się za tym kryje?


title: Jaki jest następny poziom abstrakcji?

text: Ponieważ języki programowania początkowo używały tylko wierszy kodu wykonywanych sekwencyjnie, ewoluowały one w kierunku włączania funkcji, które były jednym z pierwszych poziomów abstrakcji, a następnie stworzono klasy i obiekty, aby jeszcze bardziej je abstrahować; jaki jest następny poziom abstrakcji? Co jest jeszcze bardziej abstrakcyjne niż klasy, czy już istnieje?


title: Rozwijać bibliotekę open-source i zdobywać na nią darowizny?

text: Mam na myśli ładną bibliotekę open-source do napisania. Prawidłowy rozwój zajęłoby kilka miesięcy i musiałbym przestać wspierać się innymi projektami. Czy ktokolwiek mógłby podzielić się doświadczeniami i najbardziej znanymi sposobami, aby uzyskać jakieś wsparcie finansowe przez Internet podczas tworzenia darmowego kodu o otwartym kodzie źródłowym? Lub, mówiąc bardziej bezpośrednio: które systemy oprócz „PayPal” są używane przez programistów do pozyskiwania darowizn na kod open source? Podaj listę. Opcjonalnie posortuj listę tak, jakby była zaleceniem w porządku malejącym pozytywnych doświadczeń z każdego systemu. Opcjonalnie podziel się ciekawostką o swojej historii sukcesu, otrzymując tego rodzaju wsparcie finansowe. Opcjonalnie: podaj, ile pieniędzy można w ten sposób zarobić? (Słyszałem, że autor Vima mógłby w pewnym momencie utrzymać się z darowizn?)


title: Dlaczego widzę tak wiele możliwych do wystąpienia klas bez stanu?

text: Widzę wiele możliwych do wystąpienia klas w świecie C++ i Java, które nie mają żadnego stanu. Naprawdę nie rozumiem, dlaczego ludzie to robią, mogliby po prostu użyć przestrzeni nazw z wolnymi funkcjami w C++ lub klasy z prywatnym konstruktorem i tylko statycznymi metodami w Javie. Jedyną korzyścią, o jakiej mogę pomyśleć, jest to, że nie musisz zmieniać większości kodu, jeśli później zdecydujesz, że w pewnych sytuacjach chcesz zastosować inną implementację. Ale czy nie jest to przypadek przedwczesnego projektowania? Może zostać później przekształcona w klasę, kiedy/jeśli będzie to właściwe. Czy się mylę? Czy to nie jest OOP, jeśli nie umieszczam wszystkiego w obiektach (tj. klasach skonkretyzowanych)? Dlaczego w standardowych bibliotekach C++ i Java jest tak wiele przestrzeni nazw i klas narzędzi? **Aktualizacja:** Z pewnością widziałem wiele takich przykładów w moich poprzednich pracach, ale mam problemy ze znalezieniem przykładów open source, więc może nie jest to jednak tak powszechne. Mimo to zastanawiam się, dlaczego ludzie to robią i jak często to się dzieje.


title: Licencja LGPL w zastosowaniach komercyjnych

text: Szukałem, ale nie jestem w stanie uzyskać jasnej odpowiedzi na moje pytania, które rozumiem. Chcę użyć biblioteki Xuggler w mojej aplikacji, która jest na licencji GPL lub LGPL, w zależności od tego, czy sam ją skompiluję. Nie zamierzam edytować biblioteki Jeśli sam ją skompiluję i otrzymam w ten sposób wersję biblioteki LGPL, czy mogę jej użyć w komercyjnej aplikacji bez konieczności rozpowszechniania kodu źródłowego mojej aplikacji? Co więcej, czy muszę przyznać również mojej aplikacji licencję LGPL? Jakie inne problemy może mi dać korzystanie z tej biblioteki?


title: Jak często powinniśmy uruchamiać analizę SONAR?

text: Pomyślnie zainstalowałem Jenkinsa, a następnie Sonara, aby przejść z ciągłą integracją. Pierwsze raporty nie są aż tak dobre pod względem łamania zasad, komentarzy, duplikacji kodu... Nastawiłem Jenkinsa na zajęcia z javy, przeprowadzanie testów z coberturą, a następnie uruchamianie SONAR raz na noc w dni powszednie. Następnie poprosiłem programistów, aby poświęcili trochę czasu i wysiłku na naprawienie naruszeń zasad i spróbowali ponownie dokonać refaktoryzacji kodu przy użyciu danych SONAR. Wygląda jednak na to, że chcieliby widzieć swoje poprawki w SONAR niemal w momencie ich wprowadzenia. Mam więc różne możliwości: * Pozwól, aby SONAR uruchamiał się raz dziennie * Pozwól programistom na samodzielne uruchomienie zadania sonaru * Skróć czas Jenkinsa między kompilacjami (jak co 1h) Drugie rozwiązanie: Obawiam się liczby migawek, które pojawią się w historia SONAR i fakt, że spowoduje to, że "porównanie od ostatniej kompilacji" będzie o wiele mniej przydatne. Trzecie rozwiązanie : Trochę drugich rozwiązań problemów, dodając, że Jenkins będzie miał wiele buildów, większość z nich nieistotnych. Jakie masz doświadczenia związane z tymi problemami? Dziękuję


title: Co to jest Munger

text: Czytam kod źródłowy ObjectListView i istnieje klasa Munger. Co to jest Munger? Czy Munger ma na myśli coś ogólnego w żargonie programistycznym? Afaik, Munger w kodzie źródłowym otacza metody mapowania ciągu do właściwości obiektu za pomocą odbicia (C#). Dziękuję.


title: Dlaczego Git zrobił tyle szumu? ...podczas gdy inni nie?

text: W ostatnich latach wrzawa wokół Gita znacznie wzrosła. Wszyscy wiedzą o Git, nikt nie wie o alternatywach. Inne, jak Mercurial, wydają się być niezauważone. Oba zostały wydane w 2005 roku i zapewniają podobne funkcje. Co więcej, Mercurial jest ogólnie uważany za łatwiejszy w obsłudze, bardziej intuicyjny i przez długi czas miał lepszy interfejs użytkownika. Dlatego można założyć, że byłaby to popularna alternatywa, zwłaszcza dla nowych użytkowników rozproszonej kontroli wersji. Jednak dla większości ludzi wydaje się to nieznane, w przeciwieństwie do Gita, któremu udało się całkiem nieźle. Celem tego postu jest próba lepszego zrozumienia tego zjawiska. Jak to się dzieje, że Git dostaje całą część tortu? Czy jakoś wykorzystali lepszy marketing? Czy to dlatego, że jego społeczność jest bardziej...hem..."gadatliwa"? Czy to z powodu imienia „Linus”? Czy to z powodu jego geekowego wizerunku? Jakie jest Twoje zdanie?


title: Jak zabezpieczyć kod źródłowy aplikacji Django?

text: Stworzyłem aplikację Django dla firmy. Teraz mam zamiar wysłać go do mojego klienta. Po przeczytaniu artykułów i książek online zrozumiałem, że zabezpieczenie kodu źródłowego dowolnej aplikacji internetowej jest wyzwaniem. Czy jest coś, co mogę wymyślić, aby zabezpieczyć kod źródłowy moich aplikacji Django? To będzie moja ostatnia szansa na spróbowanie. Mój klient ma serwery działające w systemach Windows i Linux. Proszę pomóż. Wysiłki poczynione do tej pory: próbowałem różnych technik, takich jak mapowanie zmiennych w kodzie, projekty adresów URL, a nawet ochrona folderów na serwerze. Teraz ostatnią próbą jest utworzenie maszyny wirtualnej mojej aplikacji z nazwą użytkownika i hasłem jako prywatnymi. Ta maszyna wirtualna będzie utrzymywana przeze mnie. Takie podejście ma swoje plusy i minusy. Jakieś sugestie? Saas nie jest rozwiązaniem mojego problemu, ponieważ moja aplikacja powinna być wdrożona na serwerze klienta i obsługiwana przez intranet.


title: Zabezpieczanie kodu źródłowego PHP przed nielegalną kopią

text: mój szef IT pyta, jaki jest najlepszy sposób zabezpieczenia kodu źródłowego PHP przed nielegalną kopią kodu po wdrożeniu go do klientów. Czy istnieje kompilator PHP, który sprawi, że ostateczny kod będzie nieczytelny? Nawiasem mówiąc, pracuję dla firmy programistycznej używającej PHP.


Czy wzór singleton jest podatny na problemy z bezpieczeństwem gwintu? Jeśli tak, jakie są najlepsze metody ich obejścia?


title: Zmiana kariery: od programowania do obszaru bardziej zorientowanego na człowieka

text: Jestem programistą od około 9 lat, zaczynając od pracy w niepełnym wymiarze godzin podczas roku ukończenia studiów na uniwersytecie. Przez te lata pracowałem dla wielu firm, czasami zmieniając miejsca dwa lub trzy razy w roku. Mówią, że osiągnięcie poziomu „eksperta” zajmuje 10 lat i chociaż nie sądzę, że jestem ekspertem pod żadnym względem, a na pewno spotkałem wielu ludzi, którzy są bardziej kompetentni, mądrzejsi i bardziej skoncentrowani niż ja, myślę Mogę śmiało powiedzieć, że miałem sprawiedliwy udział w całej branży programistycznej i chciałbym przejść do czegoś innego. Nadal lubię programować, odkrywać nowe techniki i uczyć się nowych technologii, chociaż stało się to dość powtarzalne - już widzę wzorce w tym procesie. Fajnie było otwierać takie rzeczy, jak powiedzmy Python, node.js, HTML5 itp., ale po pewnym czasie straciło to na atrakcyjności. Psychologia i zachowanie zawsze były czymś, co mnie interesowało, zwłaszcza praktycznymi, możliwymi do zastosowania elementami. Ostatnio brałem udział w szkoleniu umiejętności komunikacyjnych i zdałem sobie sprawę, że brakuje mi wielu zabawnych rzeczy - tego, jak ludzie pracują i komunikują się, szczególnie w obszarze podświadomym, niewerbalnym. Obecnie zastanawiam się nad zmianą kariery - najlepiej przenieść się gdzieś, że moje umiejętności techniczne byłyby korzystne w jakiejś formie lub formie, a przynajmniej mogłyby służyć jako pomost podczas przechodzenia tam, wiesz, całe stopniowe, nieco- podejście bitowe w porównaniu z podejściem „pływaj lub utoń”. Chciałbym usłyszeć Twoje przemyślenia na ten temat i dowiedzieć się od Ciebie, jakie są możliwe przejścia.


title: Gdzie umieścić niestandardową weryfikację podczas korzystania z Entity Framework

text: Używam MVC3 i Enitty Framework 4 z podejściem Database first. Utworzył szablon kontekstu z własną walidacją dla pól na podstawie bazy danych. Moje pytanie brzmi, gdzie powinienem umieścić drugą walidację w oparciu o logikę biznesową. Czy powinienem umieścić go w pliku Context.tt, czy powinien on trafić do kontrolera, czy powinien iść w osobnym modelu?


title: Najlepszy sposób na zgłoszenie wyjątku i uniknięcie duplikacji kodu

text: Obecnie piszę kod i chcę się upewnić, że wszystkie parametry przekazywane do funkcji/metody są prawidłowe. Ponieważ piszę w PHP nie mam dostępu do wszystkich udogodnień innych języków, takich jak C, C++ lub Java, aby sprawdzić wartości i typy parametrów public function inscriptionExists($sectionId, $userId) // PHP vs. public boolean inscriptionExists (int sectionId, int userId) // Java Muszę więc polegać na wyjątkach, jeśli chcę mieć pewność, że moje parametry są liczbami całkowitymi. Ponieważ mam wiele miejsc, w których muszę sprawdzić poprawność parametrów, jaki byłby najlepszy sposób na utworzenie maszyny walidacji/wyjątków i uniknięcie duplikacji kodu? Myślałem o fabryce statycznej (ponieważ nie chcę przekazywać jej do wszystkich moich klas) z podpisem takim jak: publiczna fabryka funkcji statycznych ($value, $valueType, $exceptionType = 'InvalidArgumentException'); Który następnie wywoła odpowiedni podproces do walidacji na podstawie typu. Czy jestem na dobrej drodze, czy całkowicie zbaczam z drogi i zastanawiam się nad swoim problemem?


title: Co zrobić z członkiem zespołu, który cały czas grozi odejściem i ciężko się z nim pracuje?

text: Pracuję w małej grupie deweloperskiej z 3 programistami. Jesteśmy luźno zarządzani i nie mamy struktury zespołu. Nie ma wyznaczonego lidera zespołu, a menedżer jest dość wolny. Starszy programista jest w firmie od 4 lat, w tym czasie miał ogromną rękę w tworzeniu systemów i utrzymywaniu ich w działaniu. Nie jest zbyt dobrym programistą, ale jest świetnym koderem kowbojem i rozumie sieć w sposób, w jaki nigdy nie potrafiłem. Przyjął rolę „głównego programisty” i „architekta systemów”, ponieważ ma staż pracy i czuje, że jest lepszy w swojej pracy niż reszta z nas. Mój problem polega na tym, że cały czas grozi, że odejdzie. Wczoraj poinformował mnie, że za 6 tygodni przejdzie o kolejny poziom w programie nabywania uprawnień 401k i planuje odejść po tym. Kiedy zapytałem go dlaczego, powiedział, że to dlatego, że nasz menedżer (mężczyzna) i zespół (zespół będący mną) „demaskują” go. Czuje, że „zasługuje” na stanowisko kierownika ds. rozwoju na podstawie swojego stażu pracy. Nie lubi mnie, ponieważ ciągle naciskam na takie rzeczy, jak oprogramowanie do śledzenia błędów/problemów i dlatego, że jestem dobry w swojej pracy. Ostatnim razem, gdy zagroził, że odejdzie, potraktowałem go poważnie i zacząłem planować swoją pracę wokół jego odejścia. Potem zmienił zdanie i powiedział, że za pracę, którą wykonuję, odpowiada. Stracił panowanie nad mną i przez chwilę napięcie rosło. Oto kilka różnych sposobów, w jakie podszedłem do tej sytuacji: 1. Rób tylko to, o co prosi: To obniża napięcie, ale potem nic się nie dzieje i użytkownicy się denerwują. 2. Przejmij kontrolę i załatwiaj sprawy: to sprawia, że użytkownicy są szczęśliwi, ale potem się na mnie złości i wyłącza, nie chce ze mną rozmawiać ani pracować ze mną, aby zrobić rzeczy, o których tylko on wie. Nie da mi dostępu do systemów, do których muszę się dostać, żeby zrobić to sam. 3. Ściślej współpracuj z kierownictwem wyższego szczebla: nie ma szacunku dla kierownictwa wyższego szczebla i nie chcą, aby opuścił firmę, więc go rozpieszczają. Jedną z opcji, z którą jeszcze nie ruszyłem, jest opuszczenie firmy: nie byłem tam jeszcze rok i nie podoba mi się pomysł odejścia. Ogólnie rzecz biorąc, praca spełnia większość moich wymagań na stanowisku. Pomysły? Propozycje? Rozmowy? Opcje, których nie brałem pod uwagę? **Aktualizacja 11.05.2012:** W końcu zdecydowałem się odejść. To była dobra decyzja. Pomiędzy oryginalnym postem a teraz poprawił się, ale nadal nie był tym, co uważam za dobrego programistę, a tym bardziej dobrym materiałem do zarządzania. Szanuję go za jego wiedzę, ale cieszę się, że nie muszę już z nim pracować.


title: Jak właściwie zorganizować system plików mojej witryny?

text: Czytając trochę na temat Stack Overflow, znalazłem wiele informacji sugerujących, że prawidłowa organizacja systemu plików jest kluczowa dla dobrze napisanej aplikacji internetowej. Jednym z kluczowych dowodów są częste odniesienia do „oddzielenia obaw” w kwestiach związanych z utrzymywaniem porządku w programach. Teraz znalazłem trochę informacji na temat organizacji systemów plików (Filesystem Hierarchy Standard) z 2004 roku. Budzi to tylko dwie obawy: po pierwsze, standard jest nieco przestarzały, więc wierzę, że można zrobić lepiej, biorąc pod uwagę zmiany w technologii w ciągu ostatnie 8 lat; po drugie i najważniejsze, moja aplikacja jest bardzo mała w porównaniu z całą dystrybucją Linuksa. Uważam, że z tego powodu system plików powinien być zorganizowany zupełnie inaczej. Oto, na co teraz patrzę: /backup /databases /scripts /www /www/dev /www/dev/login.php /www/dev/router.php /www/dev/admin pages (pliki php) / www/dev/sites /www/dev/sites/content types (pliki php/html) /www/dev/sites/strony statyczne (pliki php/html) /www/dev/sites/modules /www/dev/sites/ modules/module-specific-media /www/dev/sites/includes /www/dev/sites/css /www/dev/sites/media /www/production /www/production/login.php /www/production/router. php /www/production/admin pages (pliki php) /www/production/sites /www/production/sites/content types (pliki php/html; nie katalog) /www/production/sites/strony statyczne (php/html pliki; nie katalog) /www/production/sites/modules /www/production/sites/modules/module-specific-media /www/production/sites/include s /www/production/sites/css/www/production/sites/media


title: Jak kontrola jakości może zapobiegać defektom?

text: Również zgodnie z **Testowaniem oprogramowania przez Srinisvasan Desikan, Gopalaswamy Ramesh** lub podręcznikami ISTQB. Zapewnienie jakości to m.in. przegląd produktów, inspekcje, instruktaże, aby sprawdzić, czy przestrzegane są wszystkie standardy. To jest działanie prewencyjne. Nie widzę, jak to może być zapobiegawcze? * * * Referencje: > Zapobieganie defektom (Zapewnienie Jakości) **Testowanie Oprogramowania przez Srinisvasan Desikan, Gopalaswamy Ramesh** > Zapewnienie Jakości (QA) stara się pójść o krok dalej. Zamiast > koncentrować się na wykrywaniu i korygowaniu defektów post factum, od samego początku koncentruje się na > zapobieganiu defektom. Zarządzanie globalnymi projektami oprogramowania - strona 110 > Kontrola jakości zajmuje się zapobieganiem defektom w opracowywanym produkcie. Testowanie oprogramowania i zapewnianie jakości


title: Czy muszę wrócić i nauczyć się HTML 5 i CSS 3?

text: Pracowałem nad nauką jak najwięcej przed rozpoczęciem studiów, aby zmienić swoją karierę, i zauważyłem na stronie w3schools, że jest teraz html i html 5, css i css 3. Czy muszę wracać i uczyć się tych nowszych języki przed przejściem na PHP i MySQL?


title: Jak dokumentować role i obowiązki?

text: Jak podczas pracy nad dokumentem wymagań mogę uchwycić role i obowiązki w systemie? Np. „Jestem menedżerem i będę używał systemu tylko do generowania raportów dotyczących xyz”. Szukałem przykładu online, ale nie mogłem go znaleźć.


title: Jak planować rozwój

text: Jestem samoukiem w wieku 17 lat, który zna Javę i C# najlepiej jak potrafię, uczę się ich od ponad roku, ale nigdy niczego nie kodowałem, więc nie mam żadnego doświadczenia. Ja i mój przyjaciel pracujemy razem nad programem, ja ja koduję serwer, a on koduje klienta, ale mój umysł jest pusty, nie mam pojęcia od czego zacząć, może poza zarysowaniem niektórych struktur klas, na przykład paczki pakietów, które będą przesyłane tam iz powrotem. Jak mam zacząć to ogarniać? Mój umysł staje się pusty, nie wiem co robić? Jestem teraz zdesperowany, ponieważ chcę dalej rozwijać to, ale nie mam pojęcia, od czego zacząć, wszelkie wskazówki będą mile widziane!


title: Przechwytywanie okna sposobem GDI, pytanie o SaveCaptureBitmap();

text: Chcę stworzyć program, który wykonuje zrzut ekranu okna pulpitu, w tym nakładające się okna, a następnie skanuje mapę bitową w poszukiwaniu określonych pikseli w określonych lokalizacjach w celu zidentyfikowania. Przeczytałem, jak to robisz z: http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen Void CaptureScreen() { int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); HWND hDesktopWnd = GetDesktopWindow(); HDC hDesktopDC = GetDC (hDesktopWnd); HDC hCaptureDC = UtwórzZgodnyDC(hDesktopDC); HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight); SelectObject(hCaptureDC,hCaptureBitmap); BitBlt(hCaptureDC,0,0,nSzerokośćekranu,nWysokośćekranu,hDesktopDC,0,0,SRCCOPY|CAPTUREBLT); Zapisz przechwyconą bitmapę (hCaptureBitmap); //Place holder - Umieść swój kod //tutaj, aby zapisać przechwycony obraz na dysku ReleaseDC(hDesktopWnd,hDesktopDC); UsuńDC(hCaptureDC); UsuńObiekt(hCaptureBitmap); } Nie rozumiem, co oznacza symbol zastępczy w SaveCaptureBitmap i nie wiem, co robi SaveCaptureBitmap, nie mogę znaleźć niczego, szukając go w msdn..


title: Potrzebujesz pomocy w identyfikacji algorytmu planowania ligi

text: Staram się stworzyć harmonogram ligi sportowej. Mam problem ze zidentyfikowaniem algorytmu, który pomoże mi sprawnie wypełnić każde miejsce. Przykładowe dane do zbudowania harmonogramu to: 1. 10 drużyn 2. Każda drużyna gra ze sobą 1 raz (wymagane łącznie 45 gier) 3. Każda drużyna gra nie więcej niż 1 raz dziennie 4. W moich testach używam 9 dni z 5 slotami dziennie. **Tabela Combo (zawiera 45 kombinacji)** ID Team1ID Team2ID bitAssigned **Tabela harmonogramu (zawiera 45 przedziałów czasowych)** scheduleID homeTeamID awayTeamID GameDate GameTime Obecnie moje istniejące procedury wypełniają około 90% slotów, pozostawiając 10% moich slotów puste do konfliktu harmonogramu opartego na powyższych regułach. Zapętlam moją tabelę harmonogramów w rosnącej kolejności daty/godziny. Moim pierwszym slotem może być sobota o 8 rano. Pytam o listę zespołów, które nie zostały jeszcze zaplanowane. Następnie tworzę szereg możliwych kombinacji tych zespołów. Następnie używam tej tablicy, aby wyciągnąć 1 losowy rekord z mojej tabeli kombinacji z kombinacji, które nie zostały jeszcze zaplanowane, i umieszczam te zespoły w harmonogramie. Następnie ustawiam tę kombinację jako używaną. Powtarzam tę pętlę w kółko i za każdym razem moja lista dostępnych drużyn staje się mniejsza, a moja tablica w rezultacie również jest mniejsza. Uważam, że niektóre dni mijają dobrze, a w inne moje ostatnie 2 pozostałe drużyny grały już w poprzednim tygodniu, więc nie są ponownie dodawane do harmonogramu. Jedyne, czego jeszcze nie próbowałem, to „zresetowanie” dni konfliktu i wypróbowanie ich ponownie, aby zobaczyć, czy uzyskam lepsze miejsca. Czy ktoś ma jakieś sugestie?


title: Konwersja aplikacji VB6 na… co?

text: Otrzymałem zadanie pozbycia się aplikacji VB6. Jest ciężki z formularzami wprowadzania danych, zakładkami, modalnymi oknami dialogowymi itp. Widzę moje opcje interfejsu użytkownika jako: 1. przepisz w stanie, w jakim jest w WinForm 2. przepisz w stanie, w jakim jest w WPF 3. całkowicie przeprojektuj interfejs użytkownika i napisz w WinRT XAML 4. przeprojektowanie jako aplikacji internetowej przy użyciu ASP.Net MVC 5. przeprojektowanie jako aplikacji internetowej przy użyciu Angular Wszystkie te elementy, z wyjątkiem WinForm, będą wymagały dużo nauki dla mnie i mojego zespołu, ale zakładam, że Wnforms jest martwy. Co robią inni i dlaczego?


title: Wskaźniki funkcji do instancji obiektu zwrócone przez wskaźnik funkcji

text: Jestem nowy w C++. Chcę utworzyć std::map z ciągami nazw metod get zmapowanych do odpowiednich metod get. Należy je zapętlić i przedstawić wartość uzyskaną przez metodę gettogether wraz z nazwą metody. Zapętlę kilka instancji typu A. Odkryłem, że boost/function jest bardzo przydatny do przechowywania metod get w A. Jednak A ma również instancję typu B z własnymi metodami get. Jak uzyskać dostęp do metody get w B? Oto mój obecny kod (Wiersz `mapping["B_Nine"] = &B::(&A::getB)::nine` jest błędny, ale jak dotąd najlepsze przypuszczenia)... #include <boost/function.hpp > #include <boost/bind.hpp> #include <boost/ref.hpp> #include <iostream> #include <mapa> #include <string> #include <funkcjonalne> class B { public: B(); ~B(); int dziewięć() {zwróć 9;} }; B::B() { } B::~B() { } klasa A { public: A(); ~A(); int jeden () {zwrot 1;} int dwa () {zwrot 2;} B getB() {zwrot b;} B b; }; A::A() {b = B(); } A::~A() { } typedef std::map<std::string,boost::function<int (A*)>> str_func_map; int main() { mapowanie str_func_map; mapowanie["Jeden"] = &A::jeden; mapowanie["Dwa"] = &A::dwa; mapping["B_Nine"] = &B::(&A::getB)::nine //Ta linia jest nieprawidłowa - jak należy // to zrobić poprawnie? A* a = nowy A(); for (str_func_map::iterator i = mapping.begin(); i != mapping.end(); i++) { std::cout<< i->first << std::endl; std::cout<< (i->druga)(a) << std::endl; } system("pauza"); }


title: Używanie tych samych skrótów klawiaturowych w każdym edytorze

text: Chcę skonfigurować każdy IDE/edytor, którego używam, aby miał dokładnie te same skróty klawiszowe. Domyślnie każde IDE/edytor ma nieco inny zestaw powiązań klawiszy - nawet proste "zamknij bieżącą kartę" jest przypisane do CTRL+W lub CTRL+F4. Czy istnieje już zestaw plików konfiguracyjnych (po jednym dla każdego IDE, edytora itp.) z tym samym skonfigurowanym powiązaniem klawiszy?