title: Jaki jest Twoim zdaniem najlepszy sposób na poszerzenie wiedzy współpracowników?

text: Nasz zespół niedawno połączył się z kilkoma mniejszymi zespołami, a ponieważ mieliśmy pewne kierunki i standardy w naszym rozwoju, zdecydowano, że najlepiej będzie przeszkolić ich w wybranych przez nas językach i metodologiach. Niektórym członkom potrzeba lat, aby osiągnąć akceptowalny poziom kompetencji, i zauważyłem, że wydaje się, że istnieje założenie, iż programista z mniejszą wiedzą wymaga prawie 50% czasu osób bardziej kompetentnych. Kiedy zacząłem się rozwijać kilka lat temu, nie miałem mentora, miałem projekt przed sobą, dobrą książkę, a później miałem internet, co w rezultacie utorowało mi przez lata moje podejście do nauki. Potrafię przyswoić sobie język lub metodologię i bardzo szybko się uczyć. Jedyny czas, w którym potrzebuję porady od kolegów, to prace projektowe, przeglądy kodu i dyskusje o standardach. Personel, który ma ten czas przydzielony mentorom, wydaje się być ograniczony i mocno uważam, że jeśli chodzi o technologię, nie powinieneś potrzebować dużej interakcji międzyludzkiej, jeśli polegasz na kimś, kto **_przeprowadzi cię przez_** technologie, których obawiam się że będą tylko o tym pamiętać i dlatego będą ograniczeni w uczeniu się. Więc moje pytanie brzmi, jak radzisz sobie ze szkoleniem personelu? Moim sposobem zawsze było **nie znalezienie rozwiązania**, ale **odkrycie, jak je osiągnąć**. Nie do końca rozumiem całe **_spędzanie czasu na śledzeniu innego dewelopera_** , może to tylko ja, ale musi być do tego standardowe podejście. Proszę o jakiś wkład.


title: Zdobycie wstępnej znajomości teorii mnogości z wstępną znajomością elektroniki w celu parsowania i oceny treści wiadomości HL7

text: To pytanie zadaje się w celu oceny, czy próba wykorzystania rzeczy, które zdobyłem na studiach, była dobrym pomysłem, a nawet możliwa do obrony. W zeszłym roku napisałem "twórcę formuł", aby dowiedzieć się, co zrobić z polami lub jak wypełnić pola danymi HL7. Fakt, że są to dane HL7, jest prawie nieistotny, poza faktem, że nie zawsze wiadomo, czy pole HL7 będzie istnieć, czy też się powtórzy. Dlatego pomyślałem, że jeśli potrzebuję uzyskać listę tych pól, mogę zwrócić sobie ich zestaw. Jeśli w ogóle ich nie znajdę, mogę dodać do zestawu niezdefiniowaną, rozmytą wartość. Następnie mogę ocenić pewne rzeczy na planie (tzn. czy wszystkie istnieją, czy więcej niż 6 pasuje do jakiegoś wyrażenia regularnego, czy rosnąco od największego do najmniejszego). Wszystko działa OK, z wyjątkiem tego, co zrobić z 'All Of' i pustym zestawem. Aby program był łatwy w użyciu, czy „wszystkie z []” powinny zwracać prawdę czy fałsz? Próbowałem przedstawić przypadek, że „W teorii mnogości operator egzystencjalny yadda yadda głuche uszy”. Chciałbym uzyskać odpowiedź na pierwsze pytanie, ponieważ może to wymagać powrotu do deski kreślarskiej, ale przesunę się do przodu do kilku miesięcy temu, ponieważ nigdy nie mieliśmy pustego zestawu. Jeśli napotkaliśmy 0 pól w wiadomości HL7, po prostu wstawimy undefined w zestawie. Sposób, w jaki chciałem użyć undefined był swego rodzaju katalizatorem „nie mam pojęcia”. Tak więc Prawda lub Niezdefiniowana = Niezdefiniowana, Fałsz i Niezdefiniowana = Niezdefiniowana i Niezdefiniowana = Niezdefiniowana. Postawiłem sobie za punkt, aby być bardzo konsekwentnym w moim programowaniu z tym, ale wszystko, co dotknęło program, można było złagodzić, ustawiając „Nie niezdefiniowane” = Prawda. Powiedziałem dwóm facetom, którzy faktycznie używają mojego programu, aby „zawsze tworzył swoje formuły tak, aby oczekiwały prawdziwego przypadku”, ponieważ tak robi to Don Knuth. Podsumowując, mój program działa. Problem polega na tym, że moje przestrzeganie zasad, wyraźnie poza dziedziną problemu, jest obciążone, że jeśli zwolnię, sprawię, że program będzie działał lepiej i będzie działał bez konieczności sprawdzania kodu źródłowego. Moje pytanie brzmi, czy abstrakcje powinny pasować do domeny? Czy mogę słusznie argumentować pielęgniarkom, szefom i (bardziej wojskowym) programistom, że „cały pusty worek jest prawdą” lub „przeciwieństwo nieznanego jest wciąż nieznane”?


title: Wypalenie zawodowe... Problemy z projektami... Teraz wstrzymują moją pensję... Co mam zrobić dalej?

text: Pracuję w startupie od 9 miesięcy. Z wyjątkiem pierwszych 3 miesięcy byłem nieszczęśliwy. Zaczęło się, kiedy dołączyłem do organizacji. Nie dołączyłem jako świeżo upieczony. Moim pierwszym zadaniem było stworzenie repliki aplikacji mobilnej rozwijanej przez starszego programistę. Programowanie mobilne było dla mnie nowością, ale radziłem sobie z wdziękiem i aplikacja zyskała akceptację klientów. W tym czasie ten starszy programista został zwolniony, a ja byłem jedynym programistą w zespole. Wkrótce kazano mi przejść na nową platformę mobilną, aby pomóc tamtejszemu zespołowi, który miał problemy z pierwszym wydaniem aplikacji. Pomogłem im i byli w stanie z wdziękiem wysłać pierwsze wydanie. Dzięki moim wysiłkom zwróciłem uwagę kierownictwa, a gdy mgła obaw (tymczasowo) opadła, kazali mi przeprowadzić badania na temat kluczowego elementu tej aplikacji. Badania zajęły mi dwa miesiące, a w międzyczasie zespół zepsuł aplikację. Powiedziano mi, że mam zająć się głównym rozwojem i porzucić badania do dalszych instrukcji. Te „dalsze instrukcje” nigdy nie nadchodziły. Kiedy objąłem dowodzenie, byliśmy dwuosobową drużyną. Oboje byliśmy nowicjuszami w technologii i walczyliśmy. W ciągu miesiąca mój kolega z zespołu opuścił firmę i zostałem sam. Podczas gdy mój proces uczenia się trwał, klient zgłosił kilka poważnych problemów projektowych. W fazie rozwoju zajęło mi 10 dni na rozwiązanie tych problemów i kolejny miesiąc na ich rozwiązanie. W tym czasie samodzielnie wykonywałem 4 zadania (tj. rozwój, projektowanie, badania i kontrolę jakości). „Byłem słaby w projektowaniu i kontroli jakości” i za to byłem mocno krytykowany zarówno przez klienta, jak i kierownictwo. Pogodzenie się z wypaleniem zajęło mi tydzień; a stabilizacja projektu zajęła mi trzy miesiące. W ciągu tych 3 miesięcy nie otrzymałem żadnego urlopu, przez 5 tygodni byłem wzywany w każdy weekend i zmuszany do pracy co najmniej 12 godzin dziennie. Kiedyś próbowałem się temu sprzeciwić i moja pensja została wstrzymana przez 10 dni bez żadnego wyjaśnienia. Obecnie status jest taki: * Spośród trzech wersji tej aplikacji (w tym mojej) każdy zespół ma co najmniej jedną funkcję, która jest nie do zaakceptowania. * Cały projekt jest opóźniony o 3 miesiące. * Dwa tygodnie temu nasz lider projektu po raz pierwszy przyznał, że jego wstępne szacunki dotyczące pracy były błędne. * Chciał więc, abyśmy oszacowali pozostały czas. * Powiedział nam, że przekona klienta do zaakceptowania nowych terminów. * W ciągu trzech dni nasze szacunki zostały trzykrotnie odrzucone przez samego lidera projektu i nie były omawiane z klientem. * Byliśmy spóźnieni o trzy dni od naszego harmonogramu wydania (i tydzień spóźnieni od harmonogramu zgłoszonego klientowi). * Mimo to szacunki projektu nie zostały zaakceptowane przez klienta i istnieje 5 drobnych błędów w tej aplikacji. Następnie przenieśli mnie z tej aplikacji do innej aplikacji, która została porzucona przez programistę jakieś 7 miesięcy temu. Klient chciał, aby jego wersja beta została szybko dostarczona, a wszystkie problemy zostały rozwiązane. Było 12 spraw, a wśród nich 10 spraw zostało rozwiązanych. Wysłałem klientowi „testową wersję beta” i w większości ją zaakceptował. Ale pojawiły się pewne problemy i klient zmusił mnie do rozwiązania pozostałych dwóch problemów za wszelką cenę w wyznaczonym terminie. Jako jedyny programista, lider projektu poprosił mnie o opinię na temat tych dwóch błędów. Oba zadania były niemożliwe. Jeden nie był obsługiwany przez API, a drugi nie mógł zostać ukończony w podanym czasie, nawet jeśli ktoś pracował 24 godziny na dobę. Nie był jednak przekonany i poprosił mnie o uzupełnienie tych dwóch błędów w podanym czasie, zmuszając mnie do pracy w weekend. Znowu nawet zamroził moją pensję i tym razem jestem w kryzysie finansowym. > **Co powinienem zrobić w tej sytuacji?** Jestem skłonny odejść, ale pytanie brzmi – czy powinienem odejść **natychmiast**? Jeśli to zrobię, narazi to ich na niebezpieczeństwo i uświadomi, że coś jest nie tak po ich stronie. Nie martwię się o relacje z nimi, ale martwię się o kolejnego dewelopera, który zajmie moje miejsce (jeśli go znajdą). Jedynym problemem jest to, że przez miesiąc muszę trochę cierpieć ekonomicznie. LUB Czy mam czekać na wypłatę? Nie wierzę, że jutro moja pensja zostanie zaksięgowana, a nie mam dość siły psychicznej, by stawić im czoła i nadal być spokojnym i zdolnym do pracy. Ale jeśli będę postępować w ten sposób, jest przynajmniej trochę bardziej prawdopodobne, że będę miał trochę pieniędzy i będę mógł utrzymać siebie i moją rodzinę. A może masz na myśli inną opcję? Dzięki za cierpliwe przeczytanie mojego pytania.


title: Projektowanie dwukierunkowego interfejsu API RESTful SSL

text: Zaczynam opracowywać API WCF, które powinno obsługiwać niektórych konkretnych klientów. Nie wiemy, które urządzenia będą korzystać z API, więc pomyślałem, że korzystanie z RESTful API będzie najbardziej elastycznym wyborem. Wszystkie urządzenia korzystające z API będą uwierzytelniane za pomocą certyfikatu SSL (certyfikat po stronie klienta), a nasze API również będzie miało certyfikat (więc jest to 2 Way SSL) Czytałem to pytanie przez SO i widziałem odpowiedzi dotyczące uwierzytelniania używając Basic-HTTP lub OAuth, ale myślałem, że w moim przypadku nie są one potrzebne, mogę już zaufać klientowi, ponieważ posiada certyfikat po stronie klienta. Czy ten projekt jest w porządku? Czy coś mi brakuje? Może jest lepszy sposób na zrobienie tego?


title: Jak radzić sobie z creepem IDE Addon?

text: Jestem pewien, że nie jestem sam w tym wydaniu, więc chciałem zobaczyć, co robią inni, aby poradzić sobie z tym problemem. Ilekroć muszę ponownie zainstalować swoje IDE, jedną z pierwszych rzeczy, które robię, jest szukanie dodatków. Zaczyna się po prostu chwytać wszystko, co planuję przede wszystkim robić, ale kończy się na tym, że dostaję wszystko, co wygląda interesująco lub może być przydatne w przyszłości. "Ale to dodatkowa funkcjonalność _za darmo!_" W końcu po prostu kończę w środowisku deweloperskim z dużą ilością nadęcia. Zdarza się to również z czasem, więc ponownie instalujesz tylko po to, aby rozpocząć cykl od nowa... Czy istnieje dobry sposób na poradzenie sobie z tym?


title: Czy programista WWW powinien rozumieć protokół TCP/IP i sposób zarządzania żądaniami przez routery?

text: Miałem dzisiaj rozmowę kwalifikacyjną na stanowisko programisty w ważnej witrynie. Zadawali mnóstwo pytań związanych z językiem programowania, na które bez problemu udało mi się odpowiedzieć, ale potem zaczęli zadawać pytania o to, w jaki sposób żądania TCP/IP były wykonywane, gdy wysyłałem żądanie na moim komputerze do serwera WWW. Otrzymałem te treści jako student, ale nie pamiętam ich dobrze, ponieważ zajmuję się głównie tworzeniem stron internetowych, moje pytanie brzmi: czy jako programista, głównie pracujący nad aplikacjami internetowymi, muszę mieć **rozległy* * znajomość TCP/IP i tego, jak routery zarządzają żądaniami, czy dla mnie to tylko wiedza z czarnej skrzynki?


title: Jak przeprowadzić test jednostkowy z dużą ilością IO

text: Piszę oprogramowanie wbudowane w Linuksa, które ściśle integruje się ze sprzętem. Moje moduły to: -Wejście wideo CMOS ze sterownikiem jądra (v4l2) -Sprzętowe kodery h264/mpeg4 (instrumenty texas) -Przechwytywanie/odtwarzanie dźwięku (alsa) -Network IO Chciałbym mieć automatyczne testowanie tych funkcji, takich jak jako testowanie integracyjne. Nie jestem pewien, jak mogę zautomatyzować ten proces, ponieważ większość funkcji najwyższego poziomu, z którymi mam do czynienia, jest związana z IO. Jasne, łatwo jest testować funkcje indywidualnie, ale sprawdzanie całego procesu oznacza uzależnienie od mnóstwa zewnętrznych zależności dostępnych tylko w czasie wykonywania.


title: problem z obliczaniem złożoności Big O

text: mam tę funkcję, na której muszę obliczyć złożoność czasową za pomocą **Big O** notacji: public void print(ArrayList<String>operations, ArrayList<LinkedHashSet<String>> setOfStrings) { int numberOfStrings = 0; int liczbaLiterów = 0; Ciąg do wydruku = operacje.get(1); for (Iterator<LinkedHashSet<String>> iteratorSets = setOfStrings.iterator(); iteratorSets.hasNext();) { LinkedHashSet<String> subSet = iteratorSets.next(); if (subSet.contains(toPrint)) { for (Iterator<String> iterator = subSet.iterator(); iterator.hasNext();) { numberOfLetters = numberOfLetters + iterator.next().length(); } liczbaStringów = subSet.size(); przerwanie; } } } metoda wykonuje tę operację: Na przykład, jeśli mam jako operację `print foo`, muszę wykonać te kroki, przede wszystkim muszę znaleźć, gdzie jest `foo`: * Wewnątrz `setOfStrings` mogę mam taką sytuację: pozycja 1 : [samochód, drzewo, hotel] ... pozycja n : [cytryna, kawa, herbata, ziemniak, foo] * Gdy znajdę ciąg `foo`, muszę zapisać liczbę ciągów w środku tę pozycję i liczbę liter każdego ciągu, więc w tym przypadku zapiszę: 5(liczba ciągów) 23(suma liczby liter) kilka uwag: 1. Dla `arrayList` z `operacji` otrzymuj zawsze konkretną pozycję, więc nie powtarzam. Jest to zawsze `O(1)`. 2. Dla `ArrayList<LinkedHashSet<String>>` , muszę iterować, więc złożoność w najgorszym przypadku to O(n) 3. operacja `if (subSet.contains(toPrint))` będzie O(1), ponieważ hashSet zmapował wszystkie znajdujące się w nim obiekty. 4. iteracja wewnątrz hashsetu wykonana za pomocą `for (Iterator<LinkedHashSet<String>> iteratorSets = setOfStrings.iterator(); iteratorSets.hasNext();)` , będzie to O(m), ponieważ muszę iterować wewnątrz cały hashset sumujący litery każdego słowa **_więc podsumowując, myślę, że złożoność czasowa tego algorytmu to `(O(n)*O(m))`_** czy wszystkie te rozważania są poprawne? Dziękuję.


title: Inteligentne wskaźniki wewnątrz klasy vs normalne wskaźniki z destruktorem

text: Odnośnie wskaźników, które są członkami klas. Czy powinny one być typu inteligentnych wskaźników, czy wystarczy po prostu poradzić sobie z nimi w destruktorze klasy, w której są zawarte?


title: Kontrola wersji i wdrażanie w dużej witrynie e-commerce

text: Obecnie jestem Front End Dev dla dużego sklepu e-commerce i chcę przełączyć całą witrynę na system kontroli wersji (Git) i usługę wdrażania (Beanstalk). Mam jednak problemy ze zrozumieniem kilku rzeczy. Po pierwsze, moje jedyne doświadczenie z kontrolą wersji to moja osobista witryna Wordpress, gdzie wszystko było proste. Miałem lokalną kopię strony na wzmacniaczach i była tam strona na żywo. Wprowadzałbym zmiany lokalnie, a następnie, gdy był szczęśliwy, wypchnąłbym go do bitbucket, który z kolei został wdrożony do działającej witryny za pośrednictwem FTPloy. Prosty. Teraz mamy dwa serwery, deweloperski i live. W tej chwili po prostu edytujemy pliki na dev przez FTP i po wylogowaniu przesyłamy je na serwer live. Jeśli miałbym zaimplementować kontrolę wersji, jak wydajnie programować na serwerze deweloperskim? Bez możliwości posiadania lokalnej wersji strony, każda drobna zmiana (np. prosta właściwość css) musiałaby zostać przekazana na serwer deweloperski, aby zobaczyć wyniki, nie? Z pewnością nie tak to się robi, byłoby to zbyt kłopotliwe, zwłaszcza gdyby pracowało się nad tym godzinami. lokalne środowisko. Co w tym przypadku nie jest możliwe. Myślę, że brakuje mi czegoś fundamentalnego, jeśli mam być szczery, nie jestem całkowicie rozeznany, jak to działa. Jeśli potrzebujesz więcej szczegółów, daj mi znać. Twoje zdrowie.


title: Prosty tracker problemów dla 1-2 programistów

text: Obecnie pracuję głównie sam nad projektem (w Javie). Jestem głównie sam, ponieważ mam doradcę, który daje mi instrukcje na wysokim poziomie, co robić i rzadko wnosi jakikolwiek wkład w kod. Od czasu do czasu będzie jednak kodować w kilku testach akceptacyjnych. Nigdy wcześniej nie korzystałem z narzędzia do śledzenia problemów i myślałem o rozpoczęciu korzystania z niego teraz, ponieważ chciałbym mieć miejsce, w którym mogę rejestrować ewentualne błędy, które znajdę i śledzić je w sposób scentralizowany. Czy byłoby możliwe zintegrowanie trackera problemów z Eclipse, jeszcze lepiej. Oto ograniczenia: 1. To NIE jest projekt open-source. Nasz kod nie może być nikomu udostępniany! 2. jesteśmy i będziemy używać Subversion; 3. mamy własny serwer Subversion i będziemy nadal używać tego samego serwera Subversion; 4. musi być wolny; 5. musi zezwalać na co najmniej 2 użytkowników. Jaka jest twoja rada, co wybrać? Szukam najprostszego dostępnego rozwiązania.


title: Jak zsynchronizować konfigurację Findbugs między serwerem kompilacji/Mavenem a kilkoma programistami?

text: Oto typowy scenariusz dla deweloperów, którzy chcą zintegrować analizę statyczną ze swoim przepływem pracy. Jakieś sugestie, jak sprawić, by to działało przy minimalnym bólu? Sytuacja jest podobna do omówionej tutaj: http://enterprise-it-solutions.blogspot.dk/2011/02/maven-configure-checkstyle-pmd-eclipse.html System dev korzysta ze scentralizowanego serwera kompilacji opartego na Maven i Hudsona. Programiści używają Eclipse i Javy oraz używają standardowego narzędzia (git, svn lub baazar) do kontroli źródeł Programiści potrzebują lokalnej wersji narzędzia do analizy statycznej, aby uniknąć konieczności radzenia sobie z tuzinem problemów z jakością naraz, gdy chcą sprawdzić w zmianie. Serwer kompilacji (Maven + Hudson) ma konfigurację Findbugs, która definiuje „Obecny standard jakości”. Dla każdego programisty powinna istnieć również standardowa konfiguracja Findbugs, która jest co najmniej tak restrykcyjna jak konfiguracja po stronie serwera, a być może nawet identyczna z nią. Programista powinien mieć możliwość zmiany swojej lokalnej konfiguracji, bo - nie oszukujmy się - i tak zrobi to przynajmniej raz, ale przywrócenie standardu powinno być stosunkowo łatwe. Zmiany powinny płynąć tylko z serwera do deweloperów, a nie w drugą stronę.


title: Czy mogę używać tej biblioteki PGP na licencji GPL wewnętrznie w mojej firmie?

text: Ta biblioteka PGP została wykupiona przez Network Associates, a następnie Symantec Corporation. Kod źródłowy jest dostępny i jest objęty licencją GPL (podlinkowano go stąd). Mają licencję na kod źródłowy tutaj: > http://www.pgp.com/developers/sourcecode/sourcecode_license.html Mimo że ten kod jest objęty licencją GPL, czy ograniczają mi możliwość korzystania z niego w celach biznesowych. tj. nie dokonuję żadnych modyfikacji kodu, nie łączę kodu z żadną inną aplikacją komercyjną lub w inny sposób biznesową. Chcę po prostu uruchomić linię poleceń i aplikacje komputerowe w ramach normalnych codziennych czynności mojej firmy (podpisywanie i szyfrowanie wiadomości e-mail). Czy to jest dopuszczalne? **Aktualizacja:** Po uważnym ponownym przeczytaniu tej strony: > http://www.pgp.com/developers/sourcecode/index.html Właśnie zauważyłem, że sama biblioteka _nie_ jest_ na licencji GPL: > * *Zmiany w kodzie GPL** > Chociaż samo oprogramowanie PGP® nie podlega Licencji GNU General Public > (GPL), PGP Corporation wykorzystuje pewien kod objęty GPL. Jednak pytanie i odpowiedzi, gdyby biblioteka była w pełni GPL. Pomógł.


title: Jak tworzyć animowane GIFy z przykładami programowania?

text: Widziałem to kilka razy na GitHub. Odwiedzasz repozytorium i są tam animowane gify pokazujące, jak korzystać z projektu open source za pośrednictwem konsoli lub IDE. Te gify pokazują tekst podczas pisania. Wyraźnie odbywa się zrzut ekranu, ale zastanawiałem się, jak powstają? Oto przykładowe repozytorium: https://github.com/YuriyZanichkovskyy/ReReflection Oto przykładowy GIF: ![wprowadź tutaj opis obrazu](http://i.stack.imgur.com/Ck4GP.gif) > Jeśli to jest złym miejscem na to pytanie. Proszę wskaż mi właściwy > kierunek.


title: Jak dołączyć licencję na CSS na licencji MIT?

text: Mam projekt na licencji GPL. Zawiera jednak fragment kodu z animate.css, który korzysta z licencji MIT. Jak dołączyć odpowiednie informacje licencyjne dla tego CSS? Umieściłem ten kawałek css (może 25 lub więcej wierszy) w moim głównym arkuszu stylów, więc wolałbym nie mieć dużego stempla, takiego jak to, co jest na tej stronie, jeśli mogę tego uniknąć.


title: Czy istnieje sposób na użycie Pythona do zastąpienia Flasha w animacji przeglądarki, grach, cokolwiek?

text: Czy istnieje sposób na użycie Pythona do zastąpienia Flasha w animacji przeglądarki, grach, aplikacjach internetowych, cokolwiek? Całkiem proste IMHO. Czy ktoś wie, jak to zrobić?


title: Konwencje nazewnictwa kluczy plików językowych

text: Jaka jest Twoja strategia dotycząca konwencji nazewnictwa kluczy w plikach językowych używanych do lokalizacji? Mamy zespół, który zamierza przekonwertować projekt na wiele języków i chciałby mieć kilka wskazówek do naśladowania. Na przykład zazwyczaj pliki kończą się serią par klucz/wartość, przy czym klucz jest symbolem zastępczym w szablonie dla wartości specyficznej dla języka. „Nazwa użytkownika”: „Nazwa użytkownika”, „Wprowadź nazwę użytkownika”: „Wprowadź tutaj swoją nazwę użytkownika”


title: „Komentarze to zapach kodu”

text: Mój współpracownik uważa, że _dowolne_ użycie komentarzy w kodzie (tj. nie metody w stylu javadoc lub komentarzy klas) jest zapachem kodu. Co myślisz?


title: Zmuszasz ludzi do czytania i rozumienia kodu zamiast używania komentarzy, podsumowań funkcji i debugerów?

text: Jestem młodym programistą (ukończyłem informatykę, ale jeszcze niecały rok w branży) i niedawno dostałem pracę nad kodem C dla przyzwoitej wielkości serwisu internetowego. Patrząc na kod, jedyne miejsca, w których widziałem komentarze, to kiedy ludzie ukrywali swój stary kod. Nazwy funkcji i zmiennych są przez większość czasu podobnie pouczające - `futex_up(&ws->g->conv_lock[conv->id%SPIN]);`. Konfrontując się ze starszym programistą i wyjaśniając, że dodawanie komentarzy i znaczących nazw sprawi, że kod będzie łatwiejszy w utrzymaniu i czytelny w przyszłości, otrzymałem następującą odpowiedź: > Generalnie nienawidzę komentarzy. W większości przypadków, tak jak w przypadku, o którym wspomniałeś > ze zwracaną wartością, ludzie używają komentarzy, aby obejść czytanie kodu. > Komentarze nie mówią nic poza tym, co według niego kod robi > w momencie, gdy wstawiał komentarz (co często jest przed jego ostatnią > edycją). Jeśli umieścisz komentarze, ludzie nie będą czytać kodu tak często. Wtedy błędy > nie dają się złapać, a ludzie nie rozumieją dziwactw, wąskich gardeł itp. > systemu. Pod warunkiem, że komentarze są faktycznie aktualizowane za pomocą kodu > zmian, co jest oczywiście całkowicie niegwarantowane. >> Chcę zmusić ludzi do przeczytania kodu. Nienawidzę debuggerów z podobnego > powodu. Są zbyt wygodne i pozwalają przejść przez brudny kod > z zegarkami i breakpointami i znaleźć tzw. problem, gdy prawdziwym problemem było to, że w kodzie są błędy, ponieważ kod nie został > wystarczająco uproszczony. Gdybyśmy nie mieli debuggera, odmówilibyśmy przeczytania > brzydkiego kodu i powiedzielibyśmy, muszę to posprzątać, abym mógł zobaczyć, co on robi. Zanim skończysz sprzątać, w połowie przypadków błąd po prostu znika. Chociaż to, co napisał, jest sprzeczne z wieloma, których nauczyłem się na uniwersytecie, ma to jakiś sens. Ponieważ jednak doświadczenie na studiach czasami nie sprawdza się w prawdziwym życiu, chciałbym uzyskać opinię osób bardziej sprawdzonych w kodzie. Czy podejście polegające na unikaniu komentowania kodu, aby ludzie faktycznie przeczytali kod i zrozumieli, co się dzieje, ma sens w środowisku kodowania średniej wielkości (takim, które może być rozsądnie przeczytane w całości przez każdą pracującą nad nim osobę w ciągu miesiąca lub dwóch) , czy jest to recepta na długofalową katastrofę? Jakie są zalety i wady tego podejścia?


title: Poradnik dla początkujących dotyczący pisania komentarzy?

text: Czy istnieje ostateczny przewodnik po pisaniu komentarzy do kodu, skierowany do początkujących programistów? Najlepiej byłoby, gdyby obejmowała, kiedy komentarze powinny (i nie powinny) być używane i jakie komentarze powinny zawierać. Ta odpowiedź: > Nie komentuj CO robisz, ale DLACZEGO to robisz. > > O O TO dba czysty, czytelny i prosty kod z odpowiednim > wyborem nazw zmiennych, które go wspierają. Komentarze pokazują wyższy poziom > struktury kodu, która nie może być (lub jest trudna) pokazać przez sam kod. zbliża się, ale jest trochę zwięzły dla niedoświadczonych programistów (rozwinięcie tego z kilkoma przykładami i narożnymi przypadkami byłoby doskonałe, myślę). **Aktualizacja** : oprócz odpowiedzi tutaj, myślę, że ta odpowiedź na inne pytanie jest bardzo istotna.


title: Dlaczego powinieneś dokumentować kod?

text: > **Możliwy duplikat:** > „Komentarze to zapach kodu” Jestem absolwentem programu komputerowego w firmie ubezpieczeniowej, która używa starego systemu przechowywania rekordów w języku/plikach płaskich, przypominającego język COBOL. Kod jest całkowicie nieudokumentowany, zarówno komentarze do kodu, jak i ogólny projekt systemu, i nie ma pomocy w sieci (nieużywany poza branżą). Obecni programiści pracowali nad systemem od 10 do 30 lat i stanowczo twierdzą, że dokumentacja jest zbędna, ponieważ wystarczy przeczytać kod, aby dowiedzieć się, co się dzieje i że nie można ufać komentarzom. Dlaczego taki system powinien być dokumentowany?


title: Czy komentarze powinny mówić DLACZEGO program robi to, co robi? (opinia na temat dictum wynalazcy Forth)

text: Często prowokacyjny Chuck Moore (wynalazca języka Forth) udzielił następującej rady[1]: > Używaj komentarzy oszczędnie! (Założę się, że to mile widziane.) Pamiętasz program, który przeglądałeś - ten ze wszystkimi komentarzami? Jak pomocne były wszystkie te > komentarze? Jak szybko przestałeś je czytać? Programy są samodokumentujące, > nawet asemblerowe, z niewielką pomocą mnemotechniki. Nie jest > dobrze mówić: > > `LA B . Załaduj A z B` > > W rzeczywistości jest to pozytywny wynik źle: jeśli zobaczę takie komentarze, przestanę je > czytać - i przegapię te pomocne. To, co powinien powiedzieć komentarz, to to, co robi program. I tak muszę dowiedzieć się, jak to robi z instrukcji >. Taki komentarz jest mile widziany: > > `WYSZUKIWANIE KOMENTARZY USZKODZONYCH PRZESYŁEK` Czy komentarze powinny mówić _dlaczego_ program robi to, co robi? * * * Oprócz poniższych odpowiedzi, te dwa posty _Programistów_ dostarczają dodatkowych informacji: 1. _Przewodnik dla początkujących dotyczący pisania komentarzy?_ 2. Odpowiedź na pytanie _Dlaczego firma miałaby stworzyć atmosferę, która zniechęca do komentowania kodu?_ ### Referencje 1 \. _Programowanie języka zorientowanego na problem_, koniec rozdziału 2.4. Charles H. Moore. Napisane ok. czerwca 1970 r.


title: Czy naprawdę można coś zyskać dzięki złożonemu projektowi?

text: Od jakiegoś czasu pracuję dla firmy konsultingowej z klientami różnej wielkości i widziałem aplikacje internetowe o różnym stopniu złożoności, od bardzo prostych: MVC * Warstwa usługowa * EF * DB do naprawdę złożonych: * MVC * UoW * DI / IoC * Repozytorium * Serwis * Testy interfejsu użytkownika * Testy jednostkowe * Testy integracyjne Ale na obu końcach spektrum wymagania jakościowe są mniej więcej takie same. W prostych projektach nowi programiści / konsultanci mogą wskoczyć, wprowadzać zmiany i natychmiast wnosić swój wkład, bez konieczności przedzierania się przez 6 warstw abstrakcji, aby zrozumieć, co się dzieje, lub ryzykowania niezrozumienia jakiejś złożonej abstrakcji i obniżania kosztów. We wszystkich przypadkach nigdy nie było potrzeby, aby kod był wymienialny lub wielokrotnego użytku - a testy nigdy nie były faktycznie utrzymywane po pierwszej iteracji, ponieważ zmieniły się wymagania, było to zbyt czasochłonne, terminy, presja biznesowa itp. Więc jeśli - w końcu - * testowanie i interfejsy nie są używane * szybki rozwój (czytaj: oszczędność kosztów) jest priorytetem * wymagania projektu będą się bardzo zmieniać podczas rozwoju ... czy nie byłoby błędem polecanie superprostego architektury, nawet w celu rozwiązania złożonego problemu dla klienta korporacyjnego? Czy to złożoność definiuje rozwiązania dla przedsiębiorstw, czy może to niezawodność, # jednoczesnych użytkowników, łatwość utrzymania, czy też wszystkie powyższe? Wiem, że to bardzo niejasne pytanie i jakakolwiek odpowiedź nie pasowałaby do wszystkich przypadków, ale jestem zainteresowany kontaktem z deweloperami / konsultantami, którzy są w branży od jakiegoś czasu i pracowali z różnymi stopniami złożoności , aby dowiedzieć się, czy fajne, ale drogie abstrakcje są warte całkowitego kosztu, przynajmniej podczas opracowywania projektu.


title: Trzymanie się zadania a zmienianie go

text: Kiedy masz do wykonania kilka zadań programistycznych na raz, czy wolisz przechodzić przez nie pojedynczo, czy też zmieniać je, być może w oparciu o podzadania lub na czas? Czemu? Dla siebie uważam, że: Plusy za trzymanie się: * Jeśli stracę koncentrację lub tok myślenia, powrót do tego zajmuje trochę czasu. Jeśli wykonam jedno zadanie, prawdopodobnie zrobię więcej. * Skreślanie rzeczy z listy rzeczy do zrobienia jest przyjemne i dobrze wygląda dla mojego pracodawcy. Plusy za zróżnicowanie: * Czasami moja najbardziej produktywna praca jest w pierwszej godzinie lub tak, że pracuję nad zadaniem. Jeśli się zmieniam, dostaję kilka pierwszych godzin dziennie. * Utknięcie w zadaniu, gdy nie robisz żadnych postępów, nie jest zbyt zabawne. Poświęcenie czasu często pozwala na bardziej zrelaksowane wymyślenie rozwiązań. Co robisz? Czy istnieją określone ramy czasowe między różnymi zadaniami, które działają najlepiej?


title: Lepsze programowanie przez lepsze programowanie?

text: Nie przekonuje mnie pomysł, że deweloperzy albo się z nim rodzą, albo nie. Gdzie są dowody empiryczne na poparcie tego typu twierdzeń? Czy programista może przejść z, powiedzmy, 50. do 90. percentyla? Jednak większość programistów nie znajduje się w 99, a nawet 90. percentylu (z definicji), a zatem wciąż ma miejsce na poprawę umiejętności programowania, wraz z ważnymi umiejętnościami. Wiara we wrodzony talent również „brakuje twardych dowodów na poparcie tego”. Jak więc pogodzić te pozornie sprzeczne stwierdzenia? Myślę, że lekcją dla programistów, którzy chcą być na bieżąco z grą i stać się ekspertami, jest ciągłe ćwiczenie umysłu poprzez wytężoną naukę. Czytam wiele książek technicznych, ale wiele z nich nie czyni mnie lepszym jako programista.


title: Czy kiedykolwiek zorganizowałeś "Wojnę Kodów"?

text: Klasyka zarządzania IT, PeopleWare, sugeruje zorganizowane „Wojny o kod” jako sposób na podniesienie morale. Czy ktoś kiedykolwiek zastosował to w praktyce? Jak to zrobiłeś?


title: Zarządzanie konsultantami p/t, takimi jak współtwórcy Open Source?

text: Właśnie założyłem kierownictwo techniczne projektu, który miał problem z wykonawcami pracującymi w niepełnym wymiarze godzin (może 2-5 godzin tygodniowo): * przesyłanie kodu, który wyłącza aplikację produkcyjną, * pull requesty, których nie można automatycznie scalić, * pisanie błędnie nazwanych testów, które w rzeczywistości nie testują tego, co twierdzą, oraz * niepisanie testów dla nowo przesłanych funkcji. Dużym problemem jest to, że zleceniobiorcy pracujący w niepełnym wymiarze godzin nie są w biurze, aby natychmiast reagować w przypadku problemów z ich kodem. Poza tym jestem jedynym pełnoetatowym programistą w aplikacji i nie możemy sobie pozwolić na spędzanie czasu na sprawdzaniu i debugowaniu kodu innych osób. Moim pomysłem jest przyjęcie z nimi otwartego stylu pracy. Czy duży, ważny projekt (jak Linux, Ruby, Rails itp.) zaakceptowałby proponowane zmiany? Dowiadujemy się, jakie mają kryteria, a następnie je egzekwujemy. Odpuszczamy każdego kontrahenta, który nie przestrzega zasad. Czy to jest sposób na radzenie sobie z relacjami? EDYTOWANE: Aby podkreślić charakter wykonawców w niepełnym wymiarze godzin. Mniej niż 10 godzin tygodniowo, zwykle 2-5.


title: Czy prawidłowo kolejkujemy i serializujemy?

text: Przetwarzamy wiadomości za pośrednictwem różnych usług (jedna wiadomość dotknie prawdopodobnie 9 usług przed zakończeniem, z których każda wykonuje określoną funkcję związaną z IO). Obecnie mamy kombinację najgorszego przypadku (serializacja kontraktu danych XML) i najlepszego przypadku (MSMQ w pamięci) dla wydajności. Charakter wiadomości oznacza, że nasze serializowane dane kończą się około 12-15 kilobajtów i przetwarzamy około 4 milionów wiadomości tygodniowo. Trwałe wiadomości w MSMQ były dla nas zbyt wolne, a wraz ze wzrostem ilości danych odczuwamy presję ze strony plików mapowanych w pamięci MSMQ. _Serwer wykorzystuje 16 GB pamięci i rośnie tylko na potrzeby kolejkowania._ Wydajność spada również, gdy użycie pamięci jest wysokie, ponieważ maszyna zaczyna się wymieniać. Już wykonujemy zachowanie samooczyszczania usługi MSMQ. Czuję, że jest część, którą robimy źle. Próbowałem użyć RavenDB do utrwalenia wiadomości i po prostu kolejkowania identyfikatora, ale wydajność była bardzo niska (w najlepszym razie 1000 wiadomości na minutę). Nie jestem pewien, czy to wynik używania wersji rozwojowej, czy co, ale zdecydowanie potrzebujemy większej przepustowości[1]. Koncepcja działała bardzo dobrze w teorii, ale wydajność nie spełniała zadania. Wzorzec użycia ma jedną usługę działającą jako router, która wykonuje wszystkie odczyty. Inne usługi dołączą informacje na podstawie podpięcia innej firmy i przekażą je z powrotem do routera. Większość obiektów jest dotykana 9-12 razy, chociaż około 10% jest zmuszonych do zapętlenia się w tym systemie przez chwilę, dopóki osoby trzecie nie zareagują odpowiednio. Usługi w tej chwili to uwzględniają i mają odpowiednie zachowania podczas snu, ponieważ z tego powodu wykorzystujemy pole priorytetu wiadomości. **Więc moje pytanie, jaki jest idealny stos do przesyłania wiadomości między maszynami dyskretnymi, ale pracującymi w sieci LAN w środowisku C#/Windows?** Normalnie zacząłbym od BinaryFormatter zamiast serializacji XML, ale to królicza dziura jeśli lepszym sposobem jest przeniesienie serializacji do magazynu dokumentów. Stąd moje pytanie. [1]: Charakter naszej działalności oznacza, że im szybciej przetwarzamy wiadomości, tym więcej zarabiamy. Udowodniliśmy empirycznie, że przetwarzanie wiadomości w dalszej części tygodnia zmniejsza prawdopodobieństwo, że zarobimy te pieniądze. Chociaż wydajność „1000 na minutę” brzmi bardzo szybko, naprawdę potrzebujemy tej liczby powyżej 10 tys./minutę. To, że podaję liczby w wiadomościach co tydzień, nie oznacza, że mamy cały tydzień na przetworzenie tych wiadomości. =============== edytuj: ## Dodatkowe informacje Na podstawie komentarzy dodam kilka wyjaśnień: * Nie jestem pewien, czy serializacja jest naszym wąskim gardłem. Przeprowadziłem test porównawczy aplikacji i chociaż serializacja pojawia się na wykresie cieplnym, odpowiada ona tylko za 2,5-3% wykorzystania procesora przez usługę. * Martwi mnie przede wszystkim trwałość naszych wiadomości i potencjalne nadużycie MSMQ. Używamy nietransakcyjnych, nietrwałych wiadomości, dzięki czemu możemy utrzymać wydajność kolejkowania, a ja naprawdę chciałbym mieć przynajmniej trwałe wiadomości, aby przetrwały ponowne uruchomienie. * Dodanie większej ilości pamięci RAM jest tymczasowym środkiem zaradczym. Maszyna przeszła już z 4 GB -> 16 GB pamięci RAM i coraz trudniej jest ją zdjąć, aby kontynuować dodawanie kolejnych. * Ze względu na gwiaździsty wzorzec routingu aplikacji, przez połowę czasu, gdy obiekt jest usuwany, a następnie umieszczany w kolejce, w ogóle się nie zmienia. To ponownie nadaje się (IMO) do przechowywania go w jakimś magazynie klucz-wartość w innym miejscu i po prostu przekazywania identyfikatorów wiadomości. * Wzorzec routingu w gwiazdę jest integralną częścią aplikacji i nie ulegnie zmianie. Nie możemy oszczędzić aplikacji, ponieważ każdy element po drodze działa asynchronicznie (w sposób odpytywania) i chcemy scentralizować zachowanie ponawiania prób w jednym miejscu. * Logika aplikacji jest napisana w języku C#, obiekty są niezmiennymi obiektami POCO, docelowym środowiskiem wdrażania jest Windows Server 2012, a my możemy uruchamiać dodatkowe maszyny, jeśli dany fragment oprogramowania jest obsługiwany tylko w systemie Linux. * Moim celem jest utrzymanie bieżącej przepustowości przy jednoczesnym zmniejszeniu zużycia pamięci i zwiększeniu odporności na awarie przy minimalnych nakładach kapitałowych.


title: Definiowanie klas w JavaScript, które istnieją w twoim zapleczu

text: Czy nie wydaje się, że definiowanie modeli w kodzie zaplecza ORAZ na interfejsie użytkownika w przypadku rozbudowanej aplikacji internetowej nie jest stosunkowo dublujące? Przenoszę aplikację GUI, którą napisałem, aby mieć interfejs sieciowy, który jest wspaniały i ładny, ale takie rzeczy jak Spine, SproutCore, JavascriptMVC wymagają zdefiniowania modeli i widoków oraz zaimplementowania określonych kontrolerów. Ponieważ mam dobrze zdefiniowany wzorzec MVC w moim kodzie zaplecza (co sprawia, że jest to bardzo łatwe do przeniesienia; widoki w mojej aplikacji pobierały wpisy Pythona i zwracały wpisy Pythona do kontrolerów, które mogłyby łatwo współpracować z modelami; mogę po prostu przekonwertuj je na JSON tam iz powrotem, aby rozmawiać z interfejsem internetowym), dlaczego miałbym chcieć ponownie odtworzyć cały wzorzec w interfejsie? Jakie są dobre sposoby na obejście tego? Czy powinienem po prostu powiedzieć „pieprzyć to” i użyć czegoś takiego jak http://pyjs.org? Czy powinienem napisać trochę kodu, aby wyeksportować moje modele do JSON, a następnie napisać kod JavaScript, aby automatycznie skompilować modele na interfejsie użytkownika, aby nadal definiować je tylko raz? Jakie byłoby najlepsze podejście do tego?


title: Rozszerzalna architektura rejestrowania dla Androida?

text: Ostatecznym celem jest posiadanie różnorodnych zestawów danych, które można graficznie wykreślić względem siebie. Wszystkie dane powinny odpowiadać dacie, tak aby po wykreśleniu ze sobą ukazywały poprawną zależność w czasie. Kluczową cechą jest jednak możliwość dodania nowego parametru do dziennika w dowolnym momencie, który będzie następnie rejestrowany jednocześnie, a następnie będzie można go wykreślić z innymi zestawami danych (od momentu, gdy zaczął się później). W ramach podpunktu musi również być w stanie poradzić sobie z rzadkimi informacjami, które czasami są dostępne, a czasami nie. Przykład danych można zobaczyć poniżej. C to rzadkie dane, a D to pole danych dodane w połowie tabeli. ![Przykład danych](http://i.stack.imgur.com/1Q30u.jpg) Rozważałem SQLite, ale myśl o wszystkich zmianach kolumn z powodu dodanych przeze mnie i użytkowników kolumn nie spodobała się. Obecnie myślę o stworzeniu obiektu, który śledzi czas i zawiera listę pól danych różnych list danych, takich jak A, B, C i D, jak na obrazku. Myśląc, że aby dodać nowe pole danych, mógłbym po prostu dodać nową listę parametrów (np. D) do listy pól danych, która już zawiera A, B, C. Następnie mógłbym po prostu zserializować to do JSON, aby zachować trwałość i kiedy chcę coś narysować z rzadkimi danymi, mogę to interpolować. To jest moje obecne rozwiązanie, ale bardzo doceniłbym wszelkie opinie na temat lepszych praktyk lub wad w moim obecnym rozwiązaniu.


title: Czy jest to dobra praktyka dokumentacji kodu?

text: Pracuję nad 2 projektami `projA` i `projB` i oba projekty są projektami utrzymaniowymi. W przypadku „projA” jest 3 programistów, a w przypadku „projB” 2 programistów. W każdym przypadku wszyscy pracują nad osobnymi punktami. Ponieważ dokumentacja kodu jest bardzo ważna, czy możesz mi powiedzieć, która z nich jest lepsza? Przykłady: {Autor : lee -wersja 1.7 -data 30 grudnia -zapytany przez jakiegośGuy -opis: wygładzanie linii} procedura antiAlias(ta linia); początek //zrób antyaliasing... koniec; lub {*123} teston jednostkowy; .. .. procedura antiAlias(ta linia); początek //zrób antyaliasing... koniec; ..     ..           koniec. //koniec jednostki.. {*123} {Autor : lee -verion 1.7 -date 30 dec -zapytany przez jakiegośGuy -decription: aby wygładzić linię} `{*123}` reprezentuje punkt, który zrobiłem dla konkretna jednostka. Zatem następny punkt `{*124}` będzie na końcu jednostki. Odbywa się to (choć bardzo rzadko), ponieważ kod wygląda na czysty bez komentowanej części i wielu opisów na końcu.


title: Najlepsza praktyka przechowywania DateTime w oparciu o strefę czasową

text: Opracowanie aplikacji internetowej, która powinna umożliwiać Użytkownikowi zaplanowanie spotkania w oparciu o swoją Strefę Czasową. I przechowuję datę zaplanowaną przez użytkownika jako datę i godzinę serwera w polu bazy danych. Podczas wyświetlania informacji o harmonogramie pobrano wartość z bazy danych i przekonwertowano na strefę czasową użytkownika. przetwarzanie w bazie kodu Konwertuję DateTime na podstawie strefy czasowej użytkownika. Proszę zasugerować, czy jest to najlepsza praktyka, czy istnieje jakiś łatwy sposób?


title: Najlepsza praktyka — XML do programu Excel

text: Mam do przeczytania duży plik XML z dużą ilością informacji. Następnie wyodrębniam potrzebne informacje (~20 punktów (kolumn) / ~80 odpowiednich danych (wierszy, niektóre z podzbiorami danych) i zapisuję je w pliku Excel. Moje pytanie brzmi, jak poradzić sobie z wyodrębnianiem (nieużywanych danych) części , * czy powinienem skopiować cały plik i usunąć nieużywane części, a następnie napisać go do Excela * czy jest to dobre podejście do tworzenia obiektów dla każdej kolumny?* powinienem napisać cały xml do Excela i zacząć usuwać wiersze w Excelu Jakie byłoby wydajne i akceptowalne rozwiązanie?


title: Wydanie Aplikacji Mobilnej na wielu platformach w tym samym czasie czy?

text: Zawsze krążył mi ten pomysł, dopóki nie zmierzę się z tym problemem. Stworzyliśmy aplikację na Androida, jest gotowa, ale planujemy wydać tę samą aplikację na iOS i prawdopodobnie Windows Phone; Teraz, czy powinniśmy po prostu wydać aplikację na Androida i obiecać klientom, że wersja na iOS będzie wkrótce dostępna (utwórz przewidywanie przed wydaniem) czy opóźnić wydanie, aż wersja iOS będzie gotowa? To samo dotyczy wersji premium i darmowej, czy powinniśmy wydać darmową wersję i obiecać, że wkrótce pojawi się lepsza wersja premium, czy wypuścić je obie w tym samym czasie? EDYCJA: zgodnie z żądaniem aplikacja jest aplikacją społecznościową, sukces zależy od aktywności ludzi, a siła robocza jest taka sama, stworzyliśmy wersję na iOS, ale aby ją skompilować, czekamy, aż firma dostarczy nam lepsze komputery Mac ( będzie za tydzień dla większości)


title: Czy istnieją ograniczenia dotyczące nazw tabel i kolumn w DB2?

text: Pracuję z bazą danych DB2 i nie mogę nie zauważyć - te nazwy tabel i kolumn są naprawdę mylące! Zdaję sobie sprawę, że dobre nazwy są ważne w każdym aspekcie tworzenia oprogramowania i jest całkiem możliwe, że nieintuicyjne nazwy są unikalne dla mojego doświadczenia, ale ktoś powiedział mi, że DB2 nakłada poważne ograniczenia na nazwy tabel i kolumn. **Czy to prawda?** A może administratorzy DB2 tradycyjnie przestrzegali określonej konwencji nazewnictwa, która wydaje się obca weteranom SQL Server takim jak ja?


title: System śledzenia rekordów pacjenta

text: ## Kontekst W placówce medycznej personel może usunąć dokumentację pacjenta (folder plików) z pokoju. Pomieszczenie jest zamykane za pomocą standardowego zamka bębnowego (tzn. bez kart magnetycznych). Placówka medyczna nie dysponuje dużymi środkami finansowymi. Wszyscy pracownicy mają komputer w swoim biurze (niektóre komputery mają kilka lat). Wszyscy członkowie personelu, którzy mają uprawnienia do pobierania folderów plików, mają komputer i znaną lokalizację. ## Problem Znaczna ilość czasu jest poświęcana na fizyczne „śledzenie” lokalizacji zapisów pacjentów. Jest to nieefektywne dla osoby próbującej znaleźć pliki i przeszkadza innym pracownikom, którzy są pytani podczas wyszukiwania. Docelowo (być może za lata) zapisy zostaną zdigitalizowane. Jest to klasyczny problem z wyrejestrowywaniem książek z biblioteki. ## Architektura rozwiązania Oto, o czym myślę: 1. Usługa sieciowa, która śledzi foldery plików według ID. 2. Wydrukuj naklejki z kodem QR (lub kodem kreskowym) z identyfikatorem. 3. Oznacz wszystkie fizyczne foldery z danymi pacjenta. 4. Wyposaż wszystkie komputery w niedrogi skaner (np. kamery internetowe). 5. Zainstaluj oprogramowanie czytnika kodów QR (lub kodów kreskowych) na każdym komputerze. 6. Napisz oprogramowanie, które przekazuje zeskanowany dokument do oprogramowania czytnika kodów (np. naciśnij CTRL-F12). 7. Napisz usługę sieciową, która aktualizuje lokalizację folderu plików na podstawie adresu IP. Pozostała część to kolejna usługa sieciowa, która umożliwia osobie wyszukiwanie identyfikatora. Wynik wyszukiwania wskazuje ostatnie znane biuro, w którym skanowano folder. Proces śledzenia wygląda następująco: 1. Personel pobiera folder plików i jak zwykle wraca do biura. 2. Personel trzyma folder w skanerze, naciska klawisz skrótu. 3. System dźwiękowo (i/lub wizualnie) potwierdza nową lokalizację. ## Pytanie Jakie niedrogie rozwiązanie byś wprowadził, aby znacznie skrócić czas potrzebny na śledzenie dokumentacji pacjentów (i ograniczyć zakłócanie pracy innych pracowników)? Doceniane są pomysły na komponenty sprzętowe (np. niedrogie czytniki kodów kreskowych). Niedrogie czytniki kodów kreskowych wymagające rezydentnego oprogramowania sterownika, które zajmuje kilka megabajtów pamięci RAM, nie byłyby jednak wykonalne (ze względu na starszy sprzęt i ograniczenia budżetowe). System prawdopodobnie nie musi być doskonały, ale powinien znacznie skrócić czas potrzebny na zlokalizowanie fizycznego folderu plików przy minimalnym nakładzie pracy. Dziękuję Ci!


title: Co zrobić po przypadkowym skasowaniu wielu wpisów w bazie danych?

text: Dzisiaj w pracy zrobiłem aktualizację do produkcji. Aktualizacja polegała na zastąpieniu starych pozycji z dwóch tabel nowymi danymi. Oczywiście wcześniej wykonałem kopię zapasową tabel. Cóż, teraz 6 godzin po powrocie do domu pod prysznicem zdałem sobie sprawę, że istnieje odwołanie do klucza obcego w przypadku kaskadowego usuwania wielu tabel, a kiedy zastąpiłem starsze dane, usunięto również wiele innych danych -- nie jestem nawet pewien, czy wiem wszystko danych, które zostały usunięte... Chodzi o to, że jest około 270 tabel, a ja jestem w firmie od 3 miesięcy. Miałem dzisiaj zrobić tę aktualizację, a CTO nie było w pracy zdalnej. Próbowałem skontaktować się przez Skype i e-mail, ale go nie ma. Pomyślałem, że nie będę dzwonił do niego o tej porze dnia (tu późnym wieczorem). Co powinienem tutaj robić? Jest początek weekendu i źle się czuję zostawiając system w takim stanie na dwa dni... a zwłaszcza że coś schrzaniłem. Klient prowadzi miliardowy biznes i jest największym klientem firmy, więc była to poważna wada. Jeśli dostawca hostingu nie ma nocnych kopii zapasowych, prawdopodobnie zostanę zwolniony. Cholera, nienawidzę automatycznej magii, takiej jak FKs. :( Co byś zrobił na moim miejscu?


title: Jak radzisz sobie z luką w swoim CV po samofinansującym się urlopie naukowym?

text: Na Programmers.SE jest mnóstwo pytań o to, czy branie przedłużonego urlopu jest dobrym pomysłem i co robić w tym czasie, aby utrzymać poziom umiejętności: Czy wzięcie dwóch lat wolnego do szkoły w pokrewnej dziedzinie zniszczy mida poziom rozwoju kariery? Czy mogę wziąć rok wolnego bez szkody dla mojej kariery? Jeśli poświęcisz rok lub dwa lata od bycia programistą, czy naprawdę trudno jest do tego wrócić? Czy przerwa w karierze, żeby się czegoś nauczyć, to „zły pomysł” Byli naprawdę pomocni, ale wciąż mam pytanie o szczegóły logistyczne wzięcia samofinansującego się urlopu naukowego. Zbliżam się do końca roku wolnego od pracy jako programista (po 7 latach w terenie). Ten rok poświęciłem na odkrywanie zainteresowań, na które nigdy nie miałem czasu: pieczenie, szycie , fotografię i poznawanie nowych, ciekawych przyjaciół. W tym czasie pracowałem również nad projektami rozwoju zwierząt domowych w technologiach i dyscyplinach, których inaczej nigdy nie miałbym okazji zbadać. ponadto przeczytałem wszystkie te książki o programowaniu, których nigdy nie miałem czasu przeczytać i śledziłem nowości programistyczne i blogi. Wszystkie projekty rozwojowe miały na celu bycie częścią Micro ISV, ale tylko jeden z projektów dotarł do jakiegokolwiek etapu produkcyjnego. Ten projekt jest imponujący, ale niezbyt udany (jeszcze!) Mam dość aktywnego bloga programistycznego, który moim zdaniem odzwierciedla duże zaangażowanie w rozwój oprogramowania i pokazuje, że nie odłożyłem swoich umiejętności programistycznych na półkę przez rok . Moje pytanie brzmi: **Jak najlepiej przekazać te informacje potencjalnemu pracodawcy na poziomie CV/listu motywacyjnego?** Jestem przekonany, że mogę wyjaśnić ten urlop naukowy podczas rozmowy kwalifikacyjnej. Wiem jednak, że na poziomie CV menedżerowie ds. rekrutacji będą używać wszelkich możliwych pretekstów, aby wyrzucić moje CV (zakończyłem rekrutację i prawdopodobnie wyrzuciłbym własne CV, gdyby nie poradziło sobie z tym czasem zbyt dobrze, może to karma.) Więc wydaje mi się, że życiorys/list motywacyjny jest naprawdę trudną częścią w zdobyciu nowej pracy. Mam kilka pomysłów na to, co zrobić, ale nie jestem pewien, co większa społeczność uważa za akceptowalne. Oto podejścia, które rozważam: 1. Umieść w moim życiorysie specjalną sekcję na okres szabatowy, w którym przedstawiam osobiste projekty. Jeśli to zrobię, jaki jest dobry sposób na oznaczenie tego? 2. Utwórz osobistą nazwę firmy i umieść te projekty w sekcji dotyczącej doświadczenia zawodowego w moim CV w ramach tej firmy. Wydaje się, że jest to najbardziej przebojowy sposób, ale obawiam się, że na etapie wywiadu może to zostać odebrane jako podstęp. A jeśli to zrobię, jaki mam tytuł? 3. Zostaw moje CV bez zmian i wyjaśnij wszystko w liście motywacyjnym, z linkiem do mojego aktywnego bloga. 4. Prawdopodobnie jest coś, o czym nie myślę, jestem otwarty na wszelkie inne pomysły. Wiem, że zamieściłem kilka specjalnych informacji o płatkach śniegu na temat mojej osobistej sytuacji, ale wolałbym odpowiedzi w bardziej ogólnym przypadku. Dane osobowe są tutaj bardziej przykładem niż prośba o odpowiedź zaprojektowana specjalnie dla mnie.


title: Jak zebrać grupę programistów do projektu?

text: Niedawno zgłosiłem projekt, nad którym pracuję, małej firmie, o której wiem, że przypadkowo potrzebuje czegoś podobnego. Wydawali się podekscytowani tym, co mam i tym, co powiedziałem, że mogę zrobić, ale martwili się, że jako samotny (właściwie, mówili „nieuczciwy”) programista, mogę wstać i zostawić im niefunkcjonalny program. Zaproponowali mi zebranie kilku osób, napisanie solidnej propozycji i ponowne spotkanie. Obiecali przestrzeń biurową i dobry budżet, ponieważ jest to aplikacja, która znacznie zwiększyłaby dla nich produktywność. Problem polega na tym, że wciąż jestem całkiem nowy w tej dziedzinie, nie mam doświadczenia zawodowego i chociaż wiem, że mógłbym ukończyć ten projekt, nie wiem, jak znaleźć innych ludzi, aby się do niego zaangażować. Czy ktoś ma jakieś doświadczenie w takich sytuacjach? Jakieś pomysły, gdzie mógłbym zajrzeć? Poza tym firma i ja znajdujemy się na Manhattanie, jeśli to pomaga określić, gdzie szukać ludzi.


title: Strony internetowe do użytku wewnętrznego: czy istnieje przekonująca sprawa przeciwko SQLite?

text: Wiele frameworków internetowych, takich jak Flask czy Django, używa SQLite jako domyślnej bazy danych. SQLite jest atrakcyjny, ponieważ jest zawarty w Pythonie, a koszty administracyjne są dość niskie. Jednak większość publicznych witryn produkcyjnych o dużym natężeniu ruchu korzysta z cięższej bazy danych: mySQL, Oracle lub postgresql. _Pytania_ : Załóżmy: * Ruch w witrynie jest umiarkowany i nastąpi równoczesny dostęp do bazy danych w trybie odczytu/zapisu * Użyjemy SQLAlchemy z blokadami zapisu SQLite (chociaż ten komentarz trochę mnie denerwuje) * Baza danych będzie zawierać około 60 000 rekordów * Struktury danych nie wymagają zaawansowanych funkcji, które można znaleźć w bazach danych o większym natężeniu ruchu. Jeśli tak, jakie warunki spowodują, że SQLite będzie miał problemy ze współbieżnością? Szukam znanych konkretnych przyczyn źródłowych, zamiast ogólnego strachu / bezpodstawnego wskazywania palcem.


title: Rejestrowanie: dlaczego i co?

text: Nigdy nie pisałem programów, które w znaczący sposób wykorzystują logowanie. Najwięcej, co zrobiłem, to przechwytywanie śladów stosu, gdy zdarzają się wyjątki. Zastanawiałem się, ile logują inni ludzie? Czy to zależy od rodzaju aplikacji, którą piszesz? Czy dzienniki są dla Ciebie pomocne?


title: Pomysł na wspólny program nauczania i podręcznik fizyki i informatyki

text: Chcę napisać (i zacząć zarys) podręcznik fizyki, który zakłada, że jego czytelnik jest kompetentnym programistą komputerowym. Normalne podręczniki do fizyki uczą wzorów fizycznych i podają problemy, które rozwiązuje się za pomocą długopisu, papieru i kalkulatora. Chcę dostarczyć książkę, która kładzie nacisk na fizykę obliczeniową, jak komputery mogą modelować systemy fizyczne i stawia problemy tego rodzaju: napisać program, który może rozwiązać _zestaw_ problemów fizycznych. Biblioteki open source innych firm byłyby używane do obsługi większości obliczeń i chcę używać języka wysokiego poziomu, takiego jak Java lub C#. Poza tym, że praca nad tym sprawiałaby mi przyjemność, myślę, że wspólny program nauczania fizyki i informatyki _powinien_ być oferowany w szkołach i jest to część większego planu, aby tak się stało. Myślę, że studenci fizyki (tak jak ja) powinni uczyć się, jak używać i wykorzystywać komputery do rozwiązywania abstrakcyjnych problemów i zestawów problemów. Myślę, że języki programowania powinny być uważane za użyteczne medium do angażowania się w wiele obszarów dociekań. Czy warto realizować ten pomysł? Czy możliwe jest połączenie tych dwóch przedmiotów w formie programu studiów licencjackich? Czy są jakieś konkretne narzędzia, które powinienem wykorzystać lub pułapki, o których powinienem wiedzieć? Czy ktoś słyszał o kursach uniwersyteckich lub innych, które zakładają tę metodologię? Czy są jakieś książki/podręczniki, takie jak ta, którą opisuję (do fizyki lub innego przedmiotu)?


title: Obsługa plików „kopii zapasowych” za pomocą Git

text: Mam folder projektu, który zawiera wiele zduplikowanych plików, które mają nieco inne nazwy, aby utworzyć „kopie zapasowe”. Więc mam "plik1.txt" i "plik1 kopia zapasowa.txt". Czy istnieje preferowana metoda przechwytywania starej historii, gdy przenoszę folder do repozytorium git?


title: Czy wszystkie, żadna lub niektóre nadpisane metody powinny wywoływać Super?

text: Podczas projektowania klasy, jak zdecydować, kiedy _wszystkie_ nadpisane metody powinny wywoływać `super`, a kiedy _żadna_ z nadpisanych metod powinna wywoływać `super`? Czy jest to również uważane za złą praktykę, jeśli logika kodu wymaga kombinacji metod nadrzędnych i nienadzorowanych, takich jak poniższy przykład JavaScript? ChildClass = new Class.create(ParentClass, { /** * @Override */ initialize: function($super) { $super(); this.foo = 99; }, /** * @Override */ methodOne: function ($super) { $super(); this.foo++; }, /** * @Override */ methodTwo: function($super) { this.foo--; } }); Po zagłębieniu się w pakiety SDK dla iPhone'a i Androida zauważyłem, że `super` musi być wywołany w _każdej_ nadpisanej metodzie, w przeciwnym razie program ulegnie awarii, ponieważ coś nie zostanie zainicjowane. Podczas wyprowadzania z szablonu/delegata _żadna_ z metod nie jest zastępowana (oczywiście). Czym więc dokładnie są te cechy „je ne sais quoi”, które określają, czy _wszystkie_ , _brak_ lub _niektóre_ przesłonięte metody powinny wywoływać super?


title: Potwierdź równość w mstest, gdy typy mogą się różnić

text: Pracowałem nad infrastrukturą testów automatycznych MSTest, czyli testowaniem narzędzia, które łączy zestawy danych w tabele bazy danych SQL Server. Podstawowa struktura testu to: 1. Zdefiniowanie przychodzącego zbioru danych za pomocą typów anonimowych 2. Aplikowanie danych za pomocą narzędzia uzgadniania 3. Odczytanie rekordów z tabel wyjściowych 4. Porównanie wierszy wyników z danymi wejściowymi, kolumna po kolumnie Przykładowe dane wejściowe : public class InputData : List<dynamic> {} // Zainspirowane Massive etc InputData input = new InputData() { new { ExternalID = 1, PropertyName = "hello", Agent = "test" }, new { ExternalID = (Int64 )2, PropertyName = "fred", Agent = "test" } // Rozwiązuje problem z rzutowaniem }; Problem, z którym mam do czynienia, polega na tym, że typ wywnioskowany na moich anonimowych obiektach będzie Int32, ale odpowiadająca mu kolumna w mojej tabeli docelowej to bigint, a zatem rekord będzie miał wartość Int64. W rezultacie, gdy używam Assert.AreEqual w każdej kolumnie, nie powiedzie się na wszystkich polach int: Assert.AreEqual nie powiodło się. Oczekiwano: <1 (System.Int32)>. Rzeczywiste: <1 (System.Int64)> Widać, że rzuciłem int na mój drugi anonimowy obiekt, można to wykorzystać do rozwiązania problemu. Głównym celem tych testów jest uczynienie przykładowych danych tak cienkimi i łatwymi do odczytu/zapisu, jak to tylko możliwe, a ja wolałbym uniknąć wizualnego szumu wszystkich tych rzutów. Myślę o najlepszym sposobie radzenia sobie z twierdzeniami. Wygląda na to, że powinienem używać dedykowanych asercji opartych na typie. Myślę, że prawdziwe pytanie brzmi, jak agresywnie powinienem być w automatycznej konwersji między typami?


title: Jak zbudowane jest oprogramowanie do maszyn takich jak bankomaty czy telewizory?

text: Jako początkujący programista pracowałem tylko z programowaniem aplikacji komputerowych, ale odkąd zacząłem programować, bardzo często przychodziło mi do głowy pytanie i nie mogę na nie poprawnie odpowiedzieć. Maszyny nie działają samodzielnie, to robota programisty, mówi mu co i kiedy ma robić, ale moja ciekawość kryje się pod komputerami. W tym poście wezmę przykłady oprogramowania do bankomatów, ale pamiętaj, że istnieje wiele innych, takich jak wyświetlacz pralki, telewizor, telefon komórkowy. Jak dokładnie zbudowane jest oprogramowanie dla tego typu maszyn? Wyobrażam sobie, że nie może być tożsame z programowaniem komputerowym. Jakiego języka używają, aby takie rzeczy działały i jak to zrobić? Czy są programiści wyspecjalizowani w tego rodzaju programowaniu? Jak wygląda proces powstawania tych maszyn?


title: Nagradzanie programistów na podstawie ważności aplikacji

text: Czy słuszne jest, aby kierownictwo przywiązywało większą wagę lub nagradzało programistów, którzy pracowali nad strategiczną i ważną aplikacją, w porównaniu z kimś, kto pracował nad ogólną aplikacją? Obaj mogli włożyć te same wysiłki.


title: jak uniknąć koszmaru wersji?

text: Jestem odpowiedzialny za prace wdrożeniowe lub wdrożeniowe. Ze względu na niedojrzałość produktu mojej firmy, aktualizacja wersji odbywa się kilka dni. Za każdym razem, gdy pojawia się aktualizacja, musiałem powiadamiać klienta, że musiał wymienić starą wersję produktu. To, co robię, to rekonfiguracja wszystkich plików konfiguracyjnych dla różnych klientów, którzy mają jego specyficzne potrzeby. Na koniec wyślij im wiadomość e-mail z nową wersją produktów i powiedz im... Wykonywanie całej tej pracy jest nudne. Czy ktoś ma podobne doświadczenia? Wszelkie porady są mile widziane. Więcej kontekstu: otrzymuję zaktualizowaną wersję z repozytorium svn, to pliki konfiguracyjne są domyślne. I każdy klient potrzebuje serwerowych plików konfiguracyjnych różniących się od siebie, ale ich własne pliki konfiguracyjne zwykle pozostają niezmienione. Moją pracą jest eksportowanie produktów serwerowych z svn folder dla każdego klienta i skopiuj własne pliki konfiguracyjne.


title: Co zrobić z „syndromem następnego kawałka”?

text: Zainspirowane tym pytaniem: Co zrobić z „syndromem punktu zatrzymania”? Często znajduję się pół godziny przed zakończeniem pracy, ponieważ właśnie zakończyłem część mojej pracy i mam do czynienia z „następną częścią”, która zajmie mi więcej niż pół godziny. (To się dzieje właśnie teraz. Stąd moja wymiana stosów surfowania w godzinach pracy!) Co robisz? Rozpocznij nowy kawałek, wiedząc, że będziesz musiał zatrzymać się w środku? Odłożyć to na bok i kręcić kciukami, aż skończy się zegar?


title: Czy sklepy z aplikacjami mają wyłączność na Twoje aplikacje?

text: Załóżmy, że piszę aplikację mobilną i chcę ją sprzedawać na wszystkich trzech: 1. Apple Market Place 2. Android Market Place 3. Windows Market Place Czy któryś z tych marketów powie mi, że to niemożliwe, aby sprzedawać czy mam tylko przejść przez nie, a nie przez pozostałe? p.s Wiem, że Angry Birds sprzedaje się we wszystkich trzech. Ale jak to jest? Chodzi mi o to, czy na przykład książki nie mają umów na wyłączność ze swoimi dystrybutorami?


title: Kiedy nadszedł właściwy czas, aby wprowadzić projekt w fazę alfa/beta/publiczną?

text: Kiedy projekt powinien zostać udostępniony w wersji alfa, beta i publicznie? Czy dobrym pomysłem jest wydłużenie fazy alfa i beta, gdy jest to potrzebne? W późniejszej fazie (np. beta), czy mądrze jest wrócić do wczesnej fazy (np. alfa), jeśli to nie wyszło?


title: Programowanie w parach/współpraca w małej firmie

text: Pracuję w małej firmie deweloperskiej jako główny programista. Mamy dwóch innych programistów, a także mojego szefa, który jest programistą, ale tak naprawdę nie robi już wiele z samego kodowania. Problem, który staram się przezwyciężyć, jest wieloaspektowy. Wszyscy mamy tendencję do pracy nad własnymi projektami bez większej współpracy między nami. Właściwie to ja (jako najbardziej zaawansowany programista) proszę o opinię/pomoc innych bardziej niż oni, ponieważ cenię wkład zewnętrznego oka. Chcę wzmocnić naszą współpracę i wyraziłem to im. W dużej mierze dlatego, że chciałbym pokazać im kilka rzeczy o tym, jak stać się lepszymi programistami i postępować zgodnie z lepszymi praktykami. Ale biorąc pod uwagę typy osobowości naszych innych programistów, myślę, że wygodniej im pracować w pojedynkę. Czytałem o programowaniu w parach i czytałem (na niektórych forach), że nie działa to dobrze, gdy jeden programista jest bardziej zaawansowany niż inni (którymi jestem). A jednak uważam, że konieczne jest rozpoczęcie współpracy, aby nasza praca nie była tak rozbieżna. Moje pytanie brzmi, czy ktoś był kiedykolwiek w podobnej sytuacji i co dla niego zadziałało? Zdaję sobie sprawę, że nie jest to sytuacja uniwersalna, ale jestem gotów spróbować wielu podejść. Wszyscy pracujemy na wspólnym obszarze, deweloperzy nie mają indywidualnych biur/boksów.


title: Efektywne „przenoszenie” danych w górę przez stos komunikacyjny

text: Zaimplementowałem stos protokołów aplikacji, który przenosi przychodzący strumień danych w górę przez kilka warstw, jak następuje: 1. **kopiuje** segment TCP z bufora systemu operacyjnego do `my_buffer`. 2. po zidentyfikowaniu granicy rekordu dzieli rekord w `mój_bufor` na ciągi oddzielone tabulatorami, które są **kopiowane** do `deque<string> my_deque` (zamiast na wektor, ponieważ wtedy muszę natychmiast pobrać kilka pól z przodu) 3. **kopiuje** `my_deque` do `vector<string> my_records[n]` gdzie jest prezentowana bez dalszego kopiowania do aplikacji. Zastanawiam się, czy najlepiej trzymać się czystej architektury (warstw) i zapłacić cenę (cokolwiek to jest) kopiowania ładunku z warstwy na warstwę, czy też istnieją proste optymalizacje, których ludzie używają. Czy zwyczajowo używa się oddzielnych buforów dla oddzielnych warstw, czy jest to coś, co można łatwo zoptymalizować bez niebezpiecznego narażania niezależności warstw?


title: Łamanie „wszechobecnego języka” poprzez posiadanie kontenera IoC w modelu domeny?

text: Jestem trochę nowy w DDD i znoszę ze mną, jeśli moje zrozumienie wydaje się być dalekie. Moje pytanie dotyczy rozwiązania Udi dotyczącego zdarzeń domeny, w szczególności klasy `DomainEvents` (patrz kod poniżej) Fragment kodu Udi. Żyje modelem domeny jako klasa statyczna. public static class DomainEvents { [ThreadStatic] //tak, aby każdy wątek miał własne wywołania zwrotne private static List<Delegate> akcje; publiczny statyczny kontener IContainer { get; ustawić; } //jak poprzednio //Rejestruje wywołanie zwrotne dla danego zdarzenia domeny public static void Register<T>(Action<T> callback) gdzie T : IDomainEvent { if (actions == null) actions = new List<Delegate>() ; akcje.Dodaj(oddzwanianie); } //Czyści wywołania zwrotne przekazane do rejestru w bieżącym wątku public static void ClearCallbacks () { actions = null; } //Podnosi podane zdarzenie domeny public static void Raise<T>(T args) gdzie T : IDomainEvent { if (Container != null) foreach(var handler w Container.ResolveAll<Handles<T>>()). Uchwyt(argi); if (actions != null) foreach (var akcja w akcjach) if (akcja to Action<T>) ((Action<T>)action)(args); } } W oparciu o powyższy kod, aby `DomainEvents` były używane przez model domeny, oba muszą najpierw znajdować się w tym samym zestawie. Co sprawia, że część `DomainEvents` w modelu domeny jest poprawna? (Mogę się mylić) Więc moje pytanie brzmi: **Czy`DomainEvents` samo w sobie łamie zasadę _"wszechobecny język DDD"_**? Ponieważ jego implementacja nie dotyczy żadnej domeny. Moją inną troską jest to, że statyczny element członkowski `IContainer` tworzy zależność kontenera ioc w modelu domeny. Chociaż nie jestem do końca pewien, czy `IContainer` Udi jest interfejsem, czy rzeczywistym kontenerem IoC. Moje drugie pytanie brzmi: **Co to jest `IContainer` w klasie `DomainEvents`?** Jeśli jest to naprawdę kontener IoC, to nie łamie zasady _"DDD nie powinien mieć infrastruktury w domenie" _? Czy dobrze rozumiem, że kontener IoC jest uważany za infrastrukturę? (Proszę mnie poprawić, jeśli się mylę). **EDYTUJ:** Zbudowałem swoje projekty, w których model domeny jest wydzielony na własnym zestawie (nazywam to warstwą biznesową) bez żadnych odniesień do jakichkolwiek elementów infrastruktury. Zobacz architekturę cebuli. ![tutaj podaj opis obrazu](http://i.stack.imgur.com/xN3GJ.png) Teraz chcę włączyć wzorzec zdarzeń domeny. Ale robienie tego zmusza mnie do dodania komponentów infrastruktury do mojej warstwy biznesowej. Komponenty będące `DomainEvents` i frameworkiem IoC tylko po to, by zadowolić `IContainer`, oba nie mają żadnego związku z domeną. **Czy jednym z pomysłów DDD nie jest oddzielenie infrastruktury od domeny?** Teraz zagram w pragmatycznego programistę, chciałem tylko wiedzieć, czy generalnie jest to w porządku? czy są alternatywy? Co myślisz o tym podejściu? Czy brakuje mi tutaj czegoś podstawowego?


title: Krytykuj strukturę mojej platformy zakładów na wyścigi konne

text: Tworzę program (głównie dla zabawy), który wyświetla ceny na żywo dla rynków wyścigów konnych i ceny, które według kilku modeli powinny być. Bardzo interesuje mnie optymalny sposób ustrukturyzowania tego rodzaju danych. Potrzebuję `Słownik<int, (coś)>` do przechowywania `<raceId, data>` gdzie klucz (raceId) jest liczbą, którą wygenerowałem (aby usunąć stare wyścigi ze słownika po zakończeniu wyścigu). Wartości (dane) składają się z rzeczywistych cen każdej selekcji w wyścigu oraz cen 3 oddzielnych modeli, które odpowiadają każdej selekcji. Słownik będzie zawierał 20-60 wyścigów w zależności od czasu. Oto przykład danych dla każdego wyścigu: RzeczywistaCena ModelAcena ModelBCena ModelCcena 3,25 3,26 3,29 3,20 5,60 5,63 5,55 5,57 itd. Liczba rzędów wynosi zwykle około 40. Niektóre modele nie oferują cen za niektóre rzędy, ale na każdą rzeczywistą cenę przypada co najmniej 1 cena modelu. Dodatkowo dla każdego wyścigu przechowuję ciągi dla RaceCourse, StartTime, Location itp. Przechowuję również marketIds w postaci int, odpowiadają one kilku rzędom na raz (są one używane do stawiania rzeczywistych zakładów), są około 6 identyfikatorów rynkowych na wyścig. Używałem klasy do przechowywania wszystkich danych w nazwie RaceData, która składa się z pól dla ciągów (tj. RaceCourse, Location), ints (tj. WinMarketId, PlaceMarketId) i doubles (tj. HorseA_ActualPrice, HorseA_ModelAprice itp.). Więc mój słownik składa się z `<RaceId, RaceData>`. Ale zastanawiałem się, czy zamiast tego lepiej byłoby przechowywać dane w 3 słownikach. Dictionary<int, Dictionary<string, string>> <RaceId, <StringName, StringValue>> Przykład użycia: Użyj RaceId=102313 i StringName="RaceCourse", aby uzyskać Value="Flemington" Dictionary<int, Dictionary<string, int >> <RaceId, <MarketName, MarketId>> Przykład użycia: Użyj RaceId=131231 i MarketName="WinMarket", aby uzyskać MarketId=1321313 Dictionary<int, Dictionary<string, double>[]> Tablica słowników (jeden dla każdej kolumnie danych). <RaceId, <RowName, Price>> Przykład użycia: Użyj RaceId=12313 i RowName="HorseAWinPrice", aby uzyskać Price=3.25 Nie jestem do końca pewien, czy tablica słowników jest potrzebna dla ostatniego, ponieważ mógłbym po prostu zmień klucze, aby mieć kolumnę z przodu, tj. "ModelA_HorseBWinPrice" lub "Actual_HorseBWinPrice". Który jest lepszy? Szybkość jest głównym problemem, gdy mam ~60 ras i ~200 prymitywów na każdą. Muszę wykonać kilka podstawowych obliczeń, używając wartości w każdym rzędzie dla wszystkich wyścigów. Muszę również wyświetlić nazwę wyścigu/czas w polu listy, a dla wybranego elementu w polu listy wyświetlić wszystkie ceny w formularzu (w kilku polach listy). Warto zauważyć, że każdy listbox odpowiada marketId. Które rozwiązanie jest lepsze, czy możesz zaproponować lepsze, którego nie zaproponowałem?


title: Jaki może być powód, dla którego wieloplatformowy programista aplikacji serwerowych ma działać w wielu procesach?

text: Rozważamy rozwój aplikacji serwerowej - mocno obciążonej bałaganem ze strumieniami dużych zbiorów danych. Aplikacja będzie działać na jednym potężnym serwerze. Zostanie opracowana aplikacja serwerowa w formie aplikacji wieloplatformowej - działającej na systemach Windows, Mac OS X i Linux. A więc ten sam kod, wiele platform dla architektury autonomicznych serwerów. Zastanawiamy się, jakie są korzyści z dystrybucji aplikacji nie tylko w wątkach, ale także w procesach, dla programistów i użytkowników końcowych serwerów? Niektórzy mówili mi, że nawet mając 48 rdzeni, 4 wątki procesów byłyby współdzielone przez system operacyjny przez wszystkie rdzenie, czy to prawda?


title: Czy mogę zeskrobać stronę internetową do stylizacji czcionek?

text: Staram się przeszukiwać strony internetowe w poszukiwaniu wartościowego tekstu np. tytułu artykułu, nazwiska autora i innych wyróżniających się tekstów. Nie zawsze mogę zagwarantować, że ten rodzaj tekstu będzie miał znaczniki informacyjne, ale trzeba to zrobić jak najszybciej. Jako możliwy skrót myślę, że mógłbym po prostu spróbować wyciągnąć tekst z unikalną stylizacją. Tytuł jest zwykle większy niż tekst główny, a wiersz podrzędny jest zwykle mniejszy. Czy istnieje sposób na szybkie pobranie wszystkich stylów czcionek na stronie, a następnie uszeregowanie ich według rozmiaru i częstotliwości używania?


title: Czy używanie statycznego pisania jest rozwiązaniem do projektowania opartego na domenie i zmniejszania liczby błędów?

text: W naszym projekcie używamy PHP (języka typowanego dynamicznie). Jednak zauważyłem, że moi koledzy zadają pytania takie jak http://stackoverflow.com/questions/20438322/modeling-a-binary-relationship- between-two-types. Mam wrażenie, że mamy paranoję, że będziemy otrzymywać nieoczekiwane błędy (np. jeśli spojrzysz na to przykładowe pytanie, zobaczysz, że autor pyta, jak zapewnić, że „podobne” nie zostanie zainicjowane dla „ Person`). :-) Teraz to, co mówi mi, że nasze podejście jest złe, to liczba dużych witryn napisanych w językach dynamicznie typowanych: Google intensywnie używa Pythona, Facebook jest pisany w PHP, Twitter i GoodReads są pisane w Ruby. Więc czuję, że aplikacje internetowe — przynajmniej — zmierzają w kierunku języków z typami dynamicznymi. Jednak bez względu na to, jak staram się to pojąć, nie mogę. Czy ci faceci nie mają problemów ze zrozumieniem domeny? Czy nie mają problemów, które pojawiają się podczas używania języków z typami dynamicznymi (np. „Właściwość `cokolwiek` nie jest zdefiniowana w tym obiekcie.”)? Jeśli tak, jak sobie z nimi radzą, zachowując zwinność, jaką daje używanie dynamicznie typowanych języków?


title: ilość kodu w przeglądzie kodu

text: Z mojego doświadczenia wynika, że większość zespołów w firmie sprawdza kod członka zespołu niewielką ilością kodu, zawsze mniejszą niż setki linii. Czy właściwe jest przejrzenie dużej ilości kodu, na przykład modułu, gdy kod jest kompletny i gotowy do przeglądu raz na zawsze?


title: Bycie głupim, aby uzyskać lepszą produktywność?

text: Spędziłem dużo czasu czytając różne książki o "dobrym designie", "wzorcach projektowych" itp. Jestem wielkim fanem podejścia SOLID i za każdym razem, gdy potrzebuję napisać prosty kawałek kodu, myślę o przyszłość. Tak więc, jeśli implementacja nowej funkcji lub poprawki błędu wymaga po prostu dodania trzech linii kodu w następujący sposób: if(xxx) { doSomething(); } To nie znaczy, że zrobię to w ten sposób. Jeśli wydaje mi się, że ten fragment kodu prawdopodobnie powiększy się w najbliższej przyszłości, pomyślę o dodaniu abstrakcji, przeniesieniu tej funkcjonalności w inne miejsce i tak dalej. Celem, do którego dążę, jest utrzymanie średniej _złożoności_ takiej, jaka była przed moimi zmianami. Uważam, że z punktu widzenia kodu to całkiem dobry pomysł - mój kod nigdy nie jest wystarczająco długi i dość łatwo jest zrozumieć znaczenia dla różnych bytów, takich jak klasy, metody i relacje między klasami i obiektami. Problem polega na tym, że zajmuje to zbyt dużo czasu i często czuję, że byłoby lepiej, gdybym po prostu zaimplementował tę funkcję „tak jak jest”. Chodzi tylko o „trzy linijki kodu” kontra „nowy interfejs + dwie klasy do zaimplementowania tego interfejsu”. Z punktu widzenia produktu (gdy mówimy o _wyniku_) to, co robię, jest zupełnie bezsensowne. Wiem, że jeśli mamy pracować nad następną wersją, posiadanie dobrego kodu jest naprawdę świetne. Ale z drugiej strony czas poświęcony na uczynienie kodu „dobrym” mógł zostać poświęcony zaimplementowaniu kilku przydatnych funkcji. Często czuję się bardzo niezadowolony z moich wyników – dobry kod, który może wykonać tylko A, jest gorszy niż zły kod, który może wykonać A, B, C i D. Czy są jakieś książki, artykuły, blogi lub twoje pomysły, które mogą pomóc w rozwoju czyjeś podejście „być głupim”?


title: Używając std::sort et al. ze zdefiniowaną przez użytkownika procedurą porównywania

text: W ewaluatorze niestandardowego języka chciałbym zastąpić nasze własne procedury sortowania `std::sort` lub innymi procedurami, być może `tbb::parallel_sort`. Problem polega na tym, że pozwalamy użytkownikom języka na dostarczanie własnych podprogramów porównujących, aw implementacjach, które wypróbowałem, `std::sort` nie akceptuje podprogramów, które nie są ściśle uporządkowane. W szczególności szybko zaczyna szukać „elementów” poza zakresem iteratora, aby posortować. Zakładam, że gdybym umieścił warstwę pośrednią na wierzchu iteratorów, mógłbym tego uniknąć, korzystając z wirtualnych strażników, ale nie ma powodu, aby zakładać, że wywołania z tego powodu z pewnością kiedyś się zakończą. Tak więc, biorąc pod uwagę czarną skrzynkę `bool f(widget const &a, widget const &b)` i niekontrolowany przez użytkownika całkowity porządek `operator<(widget const &a, widget const &b)`, jaka byłaby minimalna liczba wywołań Musiałbym wykonać, aby uzyskać wywołanie sortujące, które kończy się i porządkuje zgodnie z `f`, jeśli w rzeczywistości jest to kolejność? Wygląda na to, że poniższe powinno działać, ale mam nadzieję, że uda mi się poradzić sobie z mniejszą liczbą wywołań `f` jakąś sprytną metodą, być może pamiętając poprzednie wywołania porównawcze: bool f_stabilized(widget const &a, widget const &b) { bool fab = f(a, b); bool fba = f(b, a); return (fab != fba) ? fab : (a < b); } Czy rozsądnie byłoby zacząć od wywołania po prostu `f` i dopiero po zobaczeniu n^2 wywołań listy o długości n, aby powrócić do takiej „ustabilizowanej” wersji? Zdaję sobie sprawę, że nie ma powodu zakładać, że wynik będzie prawidłowo uporządkowany i z takim opakowaniem musiałbym zacząć od początku.


title: Czy można mieć w aplikacji wiele klas abstrakcyjnych?

text: Początkowo chcieliśmy zaimplementować wzorzec strategii z różnymi implementacjami metod we wspólnym interfejsie. Zostaną one odebrane w czasie wykonywania na podstawie danych wprowadzonych przez użytkownika. Jak się okazało, mamy **Klasy abstrakcyjne implementujące 3 - 5 powszechnych metod** i **tylko jedna metoda została do innej implementacji**, czyli Strategii. _Aktualizacja: Przez wiele klas abstrakcyjnych rozumiem, że istnieje 6 różnych funkcji wysokiego poziomu, tj. 6 pakietów, a każdy ma swój interfejs + AbstractImpl + (seria Actual Impl)._ Czy to w jakiś sposób zły projekt? Wszelkie negatywne opinie pod względem późniejszej rozszerzalności - przygotowuję się do przeglądu kodu/projektu z seniorami.


title: Przenośny styl programowania

text: Jestem programistą Pythona, który woli programować w systemie Windows, ale nadal wdraża na serwerze Linux. Właśnie skończyłem pisać mały skrypt: coś, co pobiera pliki z witryny, generuje mapę witryny, gzip ją, pinguje wyszukiwarki i wysyła kod odpowiedzi e-mailem. Obecnie większość narzędzi GNU jest dostępna i skompilowana również dla Windowsa, a ja z pewnością używam Wget i Grep, kiedy tylko trzeba. Do tej pory zawsze próbowałem zaimplementować funkcjonalność, której potrzebowałem w Pythonie (zipowanie i otwieranie adresów URL wymaga bardzo niewielu linijek kodu), ale pomyślałem, że może mógłbym napisać bardziej odporny kod, jeśli nie wymyśliłem koła na nowo i po prostu oskryptował wszystko w stylu skryptu bash, w którym duża część funkcjonalności jest delegowana do zewnętrznego procesu, takiego jak poczta, wget, curl, itp. oraz innych narzędzi, które *nix jest ogólnie dostępny. Jakie jest twoje zdanie? Kiedy celujesz w *nix, czy sklejasz ze sobą narzędzia, czy masz tendencję do implementowania wszystkich funkcji w wybranym przez Ciebie języku skryptowym?


title: W jaki sposób można określić, czy pomysł na zmianę jest wykonalny, czy nie?

text: Niedawna dyskusja na temat tego, czy okna programów powinny nadal nazywać się ekranami, czy też powinniśmy poprawić terminologię, dała mi do myślenia... Niebezpieczne wiem! Ludzie jako całość są dość oporni na zmiany. Czujemy się komfortowo w naszych niszach i przyzwyczajamy się do tego, jak się rzeczy mają. Podczas gdy niektóre zmiany prowadzą do dobrych wyników i poprawiają nasze życie lub sposób, w jaki się robi, inne wyraźnie nie wystarczają lub są ogólnie złe i nawet nie warto próbować. Jakich wskazówek możemy użyć podczas programowania, aby określić, czy ulepszenie (czy to w stylu kodowania, terminologii, interfejsie użytkownika, użyciu języka itp.) jest rzeczywiście ulepszeniem, czy nie? Jestem pewien, że do pewnego stopnia nic nie zastąpi podejścia do wypróbowania, ale czy są jakieś testy lub poradniki, które można wykorzystać do wyeliminowania pewnych pomysłów, które ostatecznie okazałyby się bezwartościowe lub strata czasu na realizację? EDYCJA: Dla każdego, kto zastanawia się nad dyskusją, która wywołała to pytanie w moim umyśle, znajduje się tutaj: Czy Twoja organizacja nadal używa terminu „ekrany” do opisania interfejsu użytkownika?


title: Czy korzystanie z frameworka MVC po stronie serwera i frameworka MVC po stronie klienta jest naruszeniem zasady DRY?

text: W przypadku używania wzorca MVC dla kodu po stronie serwera (w moim przypadku django), definicja modelu jest definiowana raz w komponencie modelu. Podczas korzystania z biblioteki opartej na MVC po stronie klienta (w moim przypadku szkieletu) definicja modelu lub jakiś podzbiór jest **przedefiniowany**. Gdybym miał dokonać zmiany w definicji modelu po stronie serwera, powiedzmy, że dodałbym pole do modelu, musiałbym dokonać podobnej zmiany modelu w definicji modelu po stronie klienta, aby uwzględnić to nowe pole. Czy to naruszenie zasady DRY? Czy definicje modeli po stronie serwera powinny automatycznie generować definicje modeli oparte na javascript po stronie klienta, czy jest to dopuszczalne naruszenie zasady DRY?


title: Najlepsze praktyki w projektowaniu aplikacji społecznościowej?

text: Jakie są najlepsze praktyki, jeśli chodzi o projektowanie aplikacji społecznościowej na Androida (możliwy port iOS później w zależności od popularności)? To mój pierwszy raz, kiedy projektuję coś na taką skalę od podstaw i prawdopodobnie już popełniam błędy w fazie projektowania. Mam już na myśli: 1. Posiadanie backendu Postgresql do przechowywania danych klientów. Zamierzam skonfigurować jednego użytkownika „aplikacji” do obsługi wszystkich przychodzących żądań RESTful, co prowadzi do mojego następnego punktu. 2. Połącz bazę danych z aplikacją przez interfejs RESTful (nie sądzę, że platforma jest przesadnie ważne, ale patrzę na Go, Pumę/Sinatrę lub Flask, ponieważ chcę zminimalizować koszty ogólne i utrzymać wszystko tak wydajnie, jak to możliwe). 3. Uwierzytelnij użytkowników za pomocą dowolnej wtyczki uwierzytelniającej, która jest odpowiednia w interfejsie RESTful, a następnie... 4. Tuneluj cały ruch przez gniazdo SSL, które otworzę w aplikacji, która połączy się z interfejsem (jest to jeden z obszarów, w których nie mam dużej wiedzy / doświadczenia) 5. Załaduj dane dotyczące innych użytkowników i przechowuj je lokalnie w zaszyfrowanej bazie danych sqlite na urządzeniu z Androidem, którą utworzę w ramach procesu uruchamiania aplikacji. Obrazy będą jedynym dozwolonym typem mediów. Wyczyszczę bazę danych sqlite za każdym razem, gdy użytkownik zaloguje się do aplikacji lub gdy osiągnie określony rozmiar, tj. Ponad 3 mb. 6. Ustaw subskrypcję aplikacji na podstawie tak, aby wraz ze sprawdzaniem poświadczeń użytkownika za każdym razem, gdy się loguje, będę sprawdzał stan subskrypcji i odpowiednio włączał inne zachowanie. 7. Zajmij się problemami z połączeniami o dużym obciążeniu, umieszczając Pgbouncer na db. 8. Przechowuj obrazy użytkowników na moim serwerze jako zwykłe pliki obrazów, a po wybraniu odpowiednich użytkowników wyślę je do aplikacji przez gniazdo. 9. Uruchom cały serwer jako maszynę wirtualną, prawdopodobnie z maszyn CoreOS/Docker, co brzmi jak dobre dopasowanie z tego, co przeczytałem. Czy jest coś nie tak z jakąkolwiek częścią zamierzonego projektu? Czy jest coś niezbędnego, co przegapiłem?


title: Czy pomysły klientów dotyczące interfejsu użytkownika powinny zamienić się w historie użytkowników?

text: Staram się poznać metodologie Agile poprzez książkę Head First Software Development i po przeczytaniu o tym próbowałem zastosować koncepcję User Stories do ostatniego mini-projektu (zestaw nowych funkcji dodanych do istniejącej aplikacji) . Poza tym, że trudno mi nie myśleć kategoriami „zadań”, miałem też kłopoty z tym, że klient zadał nam rzeczy w sposób, który dla mnie obejmuje wdrożenie. Na przykład, zamiast pytać „chcemy, aby użytkownicy z ograniczeniami mieli teraz adres, tak jak zwykli użytkownicy”, a resztę zostawiać nam, powiedzieliby „chcemy, aby użytkownicy z ograniczeniami pojawiali się na tej samej liście, co zwykli użytkownicy i chcemy, aby byli aby mieć również adres i powinien być edytowalny na tym samym ekranie edycji adresu, co zwykli użytkownicy". Wydaje mi się, że Historie użytkowników mają wyrażać potrzebę biznesową, ale nie ich implementację techniczną ani implementację interfejsu użytkownika. To powiedziawszy, czy ma sens, że klient narzuca swoją wizję interfejsu użytkownika i czy jest to jego potrzeba biznesowa? Jak zamienić żądanie klienta w jedną lub więcej historii użytkownika? Czy powinienem powiedzieć „woah tam! Powiedz mi swoje ostateczne cele, a zobaczymy, jak możemy później dostosować interfejs użytkownika”? Czy powinienem tworzyć wiele historii, jedną dla głównej potrzeby biznesowej (ograniczeni użytkownicy mają adres) i dodatkowe dla żądań interfejsu użytkownika? Czy powinienem po prostu sprawić, by firma potrzebowała jednej historii i mieć inne problemy, takie jak szczegóły / testy akceptacyjne? Trzeba przyznać, że jestem dość mokry za uszami, jeśli chodzi o Agile i User Stories i mam problem z określeniem, ile w nie wchodzi i gdzie pójdzie reszta.


title: MVC: Kontroler często po prostu deleguje do modelu po powiadomieniu przez widok zdarzeń GUI. Czy to rozsądne?

text: Odkąd dowiedziałem się o MVC, używałem go do każdej stworzonej przeze mnie aplikacji (co prawdopodobnie nie jest najlepszym pomysłem, ale to nie jest temat tego pytania). Wszystkie małe, 1000 aplikacji LoC. Używam Java i Swing dla GUI. Zwykle dzieje się tak: Widok (klasa GUI) zgłasza do kontrolera każde wykonane zdarzenie GUI (najczęściej kliknięcie przycisku). Na przykład po naciśnięciu przycisku widok po prostu wywołuje `controller.someButtonPressed()` lub `controller.someOtherButtonPressed()`. Jedyną reakcją na dane wejściowe użytkownika jest raportowanie do kontrolera, nic więcej. Myślę, że to jest w porządku i jest właściwą implementacją MVC View. Część, co do której mam wątpliwości, jest następująca: W metodach kontrolera `someButtonPressed()` bardzo często po prostu deleguje do modelu. Na przykład: public void someButtonPressed(){ model.doTheAppropriateThing(); }      Nic więcej. Żadnego „podejmowania decyzji” ani faktycznej „interpretacji” tego, co relacjonowała opinia. Bardzo często tylko proste delegowanie do modelu. **Czy uważa się za rozsądne przy wdrażaniu struktur MVC, a konkretnie kontrolerów, aby kontroler często po prostu delegował bezpośrednio do modelu w reakcji na zdarzenia GUI?** Czy to sygnalizuje, że może robię coś źle?


title: Podsumowanie różnic między wersjami Javy?

text: Jakie są główne różnice między wersjami Java w zakresie tworzenia oprogramowania? Gdzie znaleźć podsumowanie najważniejszych zmian związanych z programowaniem? Informacje o wydaniu, takie jak http://www.oracle.com/technetwork/java/javase/releasenotes-136954.html, mogą być trudne do odczytania. Na przykład w Javie 1.5 pojawiła się nowa struktura kodu "dla każdego".


title: Dlaczego porównywanie wartości ciągów operatora == nie przeszło do Javy?

text: Każdy kompetentny programista Java wie, że do porównywania ciągu znaków należy użyć funkcji String.equals(), a nie ==, ponieważ == sprawdza równość referencji. Kiedy mam do czynienia z ciągami, przez większość czasu sprawdzam równość wartości, a nie równość referencji. Wydaje mi się, że byłoby bardziej intuicyjne, gdyby język zezwalał na porównywanie wartości ciągów za pomocą po prostu ==. Dla porównania operator == języka C# sprawdza równość wartości dla ciągów. A jeśli naprawdę potrzebujesz sprawdzić równość odwołań, możesz użyć String.ReferenceEquals. Inną ważną kwestią jest to, że ciągi są niezmienne, więc nie ma nic złego w tym, aby pozwolić na tę funkcję. Czy jest jakiś szczególny powód, dla którego nie jest to zaimplementowane w Javie?


title: Czy testowanie w różnych przeglądarkach powinno być wyraźnie wymienione w zakresie projektu?

text: Zajmuję się tworzeniem stron internetowych jako freelancer, a front-end dev nie jest moją najmocniejszą stroną. To pytanie przyszło mi do głowy w moim ostatnim projekcie ze stałą stawką. Obecnie używamy Jquery i Bootstrap, które zajmują się wieloma sprawami między przeglądarkami. Mimo to w różnych przeglądarkach jest wiele błędów. Wymaga narzędzi testowych i wielu innych rzeczy, o które trzeba się martwić. Czy należy wyraźnie zaznaczyć, że wynikowa witryna powinna zostać przetestowana pod kątem zgodności z różnymi przeglądarkami w umowie? Czy wchodzi domyślnie w zakresie projektu? Jak możemy oszacować godziny spędzone w zgodności z różnymi przeglądarkami? Edycja: kilka świetnych odpowiedzi tutaj. Ale jak postępować w sytuacji, gdy w momencie podpisywania umowy nie odbywały się żadne dyskusje w przeglądarce?


title: Jaki jest najlepszy sposób na sprawdzenie, czy właściwie radzimy sobie z awariami?

text: pracujemy nad obsługą błędów w aplikacji. Staramy się mieć dość dobre pokrycie testów automatycznych. Dużym problemem jest jednak to, że tak naprawdę nie wiemy, jak przetestować niektóre z naszych sposobów obsługi błędów. Na przykład, musimy sprawdzić, czy za każdym razem, gdy pojawi się niewykryty wyjątek, na nasz serwer wysyłana jest wiadomość z informacją o wyjątku. Dużym problemem jest to, że staramy się nigdy nie mieć niewyłapanego wyjątku (a zamiast tego mamy opisowe komunikaty o błędach). Jak więc przetestować coś, czego nigdy nie chcemy, aby się wydarzyło?


title: Czy MVVM w WPF jest nieaktualny?

text: Obecnie próbuję ominąć MVVM dla WPF - nie chodzi mi o to, aby ominąć tę koncepcję, ale wokół rzeczywistych nakrętek i śrub związanych z robieniem czegokolwiek, co jest bardziej na uboczu niż głupie CRUD. Zauważyłem, że wiele frameworków i większość/wszystkie posty na blogu są sprzed „wieków”. Czy to dlatego, że jest to teraz stary kapelusz, a blogerzy przenieśli się do Next Big Thing, czy po prostu dlatego, że powiedzieli wszystko, co mają do powiedzenia? Innymi słowy, czy czegoś tu brakuje?


title: Czy powinienem opatentować swoje oprogramowanie?

text: Idę na uniwersytet, gdzie studenci mogą układać swój plan semestralny na podstawie informacji o przedmiotach, które zamierzają studiować, czyli o godzinach zajęć, profesorach i pozostałym miejscu dla innych osób. Ręczne sporządzanie harmonogramów było bardzo trudnym/nudnym zadaniem. Napisałem całkiem fajny program w Pythonie, który automatyzuje ten proces. Wybierasz kody przedmiotu, który zamierzasz wziąć, i odfiltrowujesz profesorów, których nie chcesz. Następnie program wyświetla wszystkie możliwości, jakie istnieją, jeśli nie ma konfliktów czasowych. Ten program pomógł wielu studentom. Czas na wykonanie harmonogramu skrócony z 2 dni do mniej niż 30 sekund! Teraz zaczynają się problemy. Moja rodzina i wszyscy ludzie, którzy korzystali z programu, mówią mi, żebym opatentował program, zanim ktoś ukradnie pomysł (co może się zdarzyć w moim kraju). Ale sam to kwestionuję. Czy konieczne jest opatentowanie zgarniacza wstęgi zmieszanego z silnikiem wstecznym? Trudno było zrobić program, ponieważ nie wiedziałem wielu rzeczy, ale teraz, gdy skończyłem, czuję, że patentowanie czegoś takiego byłoby bardzo głupie/niedojrzałe. Ale z drugiej strony nie chcę, żeby ktoś inny przypisywał to sobie. Co myślisz?


title: Czy abstrakcje współbieżności emulują procesy UNIX?

text: OK, zastanawiałem się dzisiaj nad tym i przyszedłem prosić o _zupełnie subiektywne i stronnicze_ opinie na ten temat. Paradoksalnie, mimo to, nie uważam tego za pożywkę dla wojny z ogniem. Myślę, że jest miejsce na doskonale cywilizowaną rozmowę — to nie jest kwestia Vim kontra Emacs. Użyłem wielu abstrakcji współbieżności, w szczególności tych zbudowanych na wątkach. Jest wśród nich duży trend, niezależnie od tego, czy jest to przekazywanie wiadomości, domyślnie niezmienne, domyślnie lokalne wątku lub inne. Trend polega na tym, że wszyscy odwracają ideę wątków, czyniąc udostępnianie danych jawnym, a nie ukrytym. Oznacza to, że wszystkie dane nie są udostępniane, chyba że określono inaczej, co jest przeciwieństwem tradycyjnego wątkowania występującego w językach takich jak Java. (Wiem, że Java obsługuje własne abstrakcje współbieżności wyższego poziomu.) Na przykład jawnie przekazujesz komunikaty. Jawnie określasz, które zmienne są lokalne dla wątków. Wyraźnie określasz, które zmienne są zmienne. To tylko kilka przykładów znalezionych w niektórych językach. Myślałem, że ten prosty styl współbieżności to nowoczesna koncepcja. Myliłem się. Niedawno zacząłem bawić się zabawkami UNIX, takimi jak fork() i pipe(), i byłem zszokowany, gdy odkryłem, że łatwe, jawne mechanizmy współbieżności istnieją od początku UNIX. Jest coś dziwnego w zrozumieniu, że C + UNIX z lat 70. sprawia, że współbieżność jest _o wiele_ łatwiejsza niż wiele nowoczesnych, modnych mechanizmów nawlekania. Więc oto, nad czym się zastanawiam... czy te nowoczesne abstrakcje wątków po prostu próbują emulować procesy w stylu UNIX na wierzchu wątków, z całą ich jednoznacznością i nieudostępnianymi domyślnie cechami? Wiem, że niektóre mechanizmy, takie jak STM, oferują takie rzeczy jak transakcje w stylu DB, które są naprawdę nowoczesnym i innowacyjnym rozwiązaniem dla współbieżności, ale większość wydaje się po prostu nowymi sposobami robienia tego, co koderzy UNIX robili dawno temu. Powiem tylko, że nie jestem fanboyem UNIX-a, nie mam żadnej wyobraźni. Zdaję sobie sprawę, że procesy są znacznie wolniejsze niż wątki do zainicjowania na wielu platformach, ale mówię o tym od podstaw koncepcyjnych.


title: Jak modelować i badać odpowiedzialność przestrzenną lokalnych oddziałów firmy?

text: jakie są najlepsze praktyki modelowania i badania odpowiedzialności przestrzennej lokalnych oddziałów firmy? Moja firma ma wiele lokalnych oddziałów, które są ogólnie odpowiedzialne za jedno miasto. To najłatwiejszy przypadek. Istnieją jednak wyjątkowe przypadki. Oto lista wszystkich możliwych przypadków: * gałąź a odpowiada za miasto a (przypadek ogólny) * gałąź a odpowiada za miasto a, b i c * gałąź a odpowiada za dzielnice 1 i 2 miasta a, natomiast gałąź b to odpowiada za dzielnice 3, 4 i 5 miasta a * filia a odpowiada za miasto a i Foostreet dzielnicy 2, natomiast filia b odpowiada za dzielnicę 2 miasta a * filia a odpowiada za miasto a oraz za nieparzyste numery domów Foostreet dzielnicy 2, natomiast filia b odpowiada za dzielnicę 2 miasta a * filia a odpowiada za miasto a dla wszystkich klientów, których nazwisko zaczyna się od liter A-F, natomiast filia b posiada G-K, a filia c posiada .... * filia a odpowiada za miasto a w przypadku obsługi Foos, natomiast oddział b jest odpowiedzialny za miasto a w przypadku obsługi Bars Są to możliwe przypadki odpowiedzialności, które oczywiście mogą być również mieszane. Planowany system powinien dać odpowiedź na pytanie: „Który oddział odpowiada za miasto a (lub b czy c…)?”. Jeśli istnieją wyjątkowe przypadki, to pytanie musi być bardziej szczegółowe. Czy można podać podpowiedzi typu: "Miasto a ma więcej niż jeden oddział, proszę wybrać dzielnicę!" lub "O jaki przypadek pytasz? Oddział odpowiedzialny za obsługę Foos, Bars, ....?" Pytanie, które najprawdopodobniej zostanie zadane, brzmi: „Który oddział odpowiada za Foostreet 345 w 12345 Foocity?” Moje wymagania to Java Enterprise i baza danych mySQL. Możliwe jest użycie MongoDB lub Neo4j, jeśli to naprawdę ma sens. Mam już bazę danych z każdym miastem, dzielnicą, kodem pocztowym i ulicą, z którą dane mogłyby być "powiązane". Mam nadzieję, że to pytanie nie brzmi jak: „Proszę, wykonaj za mnie moją pracę.”, ale moje doświadczenie w modelowaniu domen przestrzennych jest prawie zerowe.


title: aktualizacja do nowszej wersji kompilatora

text: Miałem przestarzały kod, który został pierwotnie zbudowany dla dość starej wersji kompilatora. Mówimy o kodzie natywnym, a nie zarządzanym. Teraz jest przeniesiony do prawie najnowszej wersji kompilatora. Każdy błąd kompilacji został naprawiony i teraz produkt kompiluje się i działa poprawnie. Ale: * chociaż się kompiluje, a nawet działa... skąd mogę mieć pewność, że działa zgodnie z oczekiwaniami? * czy mogę być pewien, że podstawowe środowisko wykonawcze nie zmienia się w sposób wprowadzający nowe i nieoczekiwane błędy wykonawcze? * jakie są najlepsze praktyki podczas aktualizacji do nowszej wersji kompilatora?


title: W jakim formacie dane trafiają do sterowników druku systemu Windows?

text: Otrzymałem zadanie napisania sterownika drukarki. Nie mam z tym żadnego doświadczenia i badam to od kilku dni. Celem tego jest zasadniczo zapisanie danych przychodzących do sterownika do pliku, a następnie wykonanie dodatkowego ich przetwarzania. Jeśli dobrze rozumiem, mogę uruchomić inne procesy, aby wykonać większość pracy, ale będę potrzebować samego sterownika do wygenerowania początkowego pliku/danych. Nie rozumiem, w jakim stanie są dane, jeśli chodzi o sterownik z aplikacji. Czy jest to coś, co określa aplikacja, czy istnieje jakiś standard?


title: Czy lucene.net/solrnet to dobre rozwiązanie do przeszukiwania listy nazwisk z rozmytym dopasowaniem?

text: W tej chwili używamy wyszukiwania pełnotekstowego serwera sql, ale jest to zbyt mało elastyczne. Najważniejszą rzeczą, którą robimy, jest wyszukiwanie nazwisk osób z bazy danych na podstawie zapytania wyszukiwania. Wyszukiwanie musi być szybkie i niewyraźne. Wyszukiwanie pełnotekstowe SQL tak naprawdę nie obsługuje dopasowywania rozmytego, zwłaszcza w połączeniu z opcją tezaurusa. Dlatego potrzebuję lepszego rozwiązania. Moje badania sugerują, że lucene i solr są szeroko stosowanymi rozwiązaniami korporacyjnymi, ale moje poszukiwania sugerują, że są one bardziej przeznaczone do indeksowania takich rzeczy, jak dokumenty i strony internetowe lub coś, co określa się mianem „danych nieustrukturyzowanych”. Nasze dane są bardzo dobrze ustrukturyzowane, dlatego nie jestem pewien, czy nadają się do tego typu pracy, czy też powinienem badać inny produkt. Zgodnie z książką mam Solr 1.4 Enterprise Search Server, który obsługuje wszystkie powyższe, z wyjątkiem dopasowywania prefiksów, jednak stwierdza, że występują problemy z wydajnością wyszukiwania podciągów. Czy uważasz, że solr/lucene to dobra technologia do zbadania w celu rozwiązania mojego problemu? Jeśli nie, czy masz alternatywę? Wszelkie porady są mile widziane. Jestem programistą .NET, stąd raczej solrnet niż solr.


title: Jak ustrukturyzować wiele nakładających się rozwiązań / projektów w .Net?

text: Niedawno rozpocząłem pracę dla nowego klienta ze _starą przestarzałą_ bazą kodu, w której istnieje wiele rozwiązań .net, z których każde zazwyczaj obsługuje kilka projektów unikalnych dla tego rozwiązania, ale następnie "pożycza" / "łączy" (dodaj istniejący projekt) inne projekty który technicznie należy do innych rozwiązań (przynajmniej jeśli przejdziesz przez strukturę folderów w TFS) Nigdy nie widziałem konfiguracji tak splecionej, nie ma jasnej kolejności kompilacji, czasami projekt w rozwiązaniu Wystarczy odnieść się do bibliotek dll bezpośrednio z katalogu wyjściowego projekt hostowany w rozwiązaniu B, czasami projekt został właśnie dołączony bezpośrednio, nawet jeśli znajduje się DALEKO w strukturze folderów. Wygląda na to, że wszystko zostało zoptymalizowane pod kątem lenistwa programisty. Kiedy skonfrontowałem ich z tym, dlaczego nie mają serwera CI, odpowiedzieli, że trudno jest skonfigurować tak zorganizowany kod. (Konfiguruję to teraz i przeklinam tę organizację kodu) Rozwiązania są zorganizowane wokół artefaktów wdrażania (rzeczy, które muszą być wdrażane razem, są w tym samym rozwiązaniu), co _myślę_ jest mądrą decyzją, ale zawartość tych rozwiązań (projekty) są wszędzie. Czy istnieje konsensus co do najlepszych praktyk, które należy zastosować przy ponownym użyciu wspólnych bibliotek klas w wielu rozwiązaniach / artefaktach wdrażania, * Jak ustrukturyzować kod w VCS? * Jak ułatwić udostępnianie logiki biznesowej między oddzielnymi artefaktami wdrażania


title: Różnica między stanem a diagramem sekwencji

text: Zdaję sobie sprawę, że te dwa diagramy są bardzo podobne, z tą oczywistą różnicą, że jeden modeluje sekwencję pewnej funkcji, podczas gdy inny modeluje stan całej wykonywanej funkcji. Zidentyfikowane przeze mnie różnice są następujące – prawdopodobnie niepoprawne: 1. Wykres stanu jest bardziej logicznym widokiem dowolnej funkcjonalności, pokazującym szerszy wachlarz odchylających się ścieżek – jednak mówiąc to, diagramy sekwencji mają również możliwość dostarczenia alternatywnych ( alt) ścieżki, warunki, pętle itp. 2. Diagram sekwencji ma na celu jedną konkretną funkcję, np. wypłacanie pieniędzy z konta bankowego, podczas gdy wykres stanu może modelować cały system. Przykład wykresu stanu i przykład diagramu sekwencji