Nie wiem, czy to tylko ze mną, ale kiedy zaczynam refaktoryzację jakiegoś kodu, marnuję na to dużo czasu i to się nigdy nie kończy. Za każdym razem, gdy ponownie czytam kod, znajduję coś, co można poprawić, refaktoryzacja kodu jest jak mój mózg w nieskończoną pętlę, a warunek zakończenia jest osiągany losowo bez satysfakcji. Ile czasu powinienem poświęcić na refaktoryzację kodu?


title: Czy skończył się darmowy lunch?

text: W swoim słynnym artykule „The Free Lunch Is Over” z 2005 roku Herb Sutter przewidział Rewolucję Równoczesnego Programowania tak wielką jak Rewolucja Obiektowa. Czy ta rewolucja rzeczywiście miała miejsce w latach 2005 - 2013? * * * Kluczowe punkty w artykule: * Producenci procesorów zabrakło miejsca na większość swoich tradycyjnych podejść do zwiększania wydajności procesorów. Zamiast zwiększać częstotliwość taktowania, zwracają się ku architektom hiperwątkowym i wielordzeniowym. * Aplikacje będą coraz częściej musiały być współbieżne, jeśli chcą w pełni wykorzystać przyrost przepustowości procesora. * „Och, wydajność nie ma większego znaczenia, komputery po prostu stają się coraz szybsze” będzie błędne. * Efektywność i optymalizacja wydajności będą coraz ważniejsze, a nie mniej ważne. Te języki, które już nadają się do intensywnej optymalizacji, znajdą nowe życie; ci, którzy nie będą musieli znaleźć sposobów na konkurowanie i zwiększenie wydajności oraz możliwości optymalizacji. Spodziewaj się długoterminowego zwiększonego zapotrzebowania na języki i systemy zorientowane na wydajność. * Języki i systemy programowania będą w coraz większym stopniu zmuszone dobrze radzić sobie ze współbieżnością. Desperacko potrzebujemy modelu programowania wyższego poziomu dla współbieżności, niż oferują dzisiejsze języki.


title: Czy rozsądne jest oczekiwanie, że nowy absolwent będzie w stanie uruchomić własne oprogramowanie do blogowania?

text: Czy podejmując decyzję o zatrudnieniu nowego absolwenta, rozsądne jest oczekiwanie, że będzie on dysponował portfolio programistycznym, w którym wyprodukowali co najmniej coś o złożoności odpowiadającej oprogramowaniu blogowemu?


title: Ile kpin jest „w sam raz”?

text: Zatytułowałem pytanie żartobliwie, bo jestem pewien, że „to zależy”, ale mam kilka konkretnych pytań. Pracując w oprogramowaniu, które ma wiele głębokich warstw zależności, mój zespół przyzwyczaił się do dość szerokiego używania mockingu, aby oddzielić każdy moduł kodu od zależności pod nim. Dlatego byłem zaskoczony, że Roy Osherove zasugerował w tym filmie, że powinieneś używać kpin tylko w około 5% przypadków. Domyślam się, że siedzimy gdzieś pomiędzy 70-90%. Od czasu do czasu widziałem też inne podobne wskazówki. Powinienem zdefiniować to, co uważam za dwie kategorie „testów integracyjnych”, które są tak różne, że tak naprawdę powinno się im nadać różne nazwy: 1) Testy w procesie, które integrują wiele modułów kodu oraz 2) Testy poza procesem, które mówią do baz danych, systemów plików, usług sieciowych itp. Zajmuję się typem nr 1, testami, które integrują wiele modułów kodu w trakcie procesu. Wiele wskazówek społeczności, które przeczytałem, sugeruje, że powinieneś preferować dużą liczbę izolowanych, drobnoziarnistych testów jednostkowych i niewielką liczbę gruboziarnistych, kompleksowych testów integracyjnych, ponieważ testy jednostkowe dają dokładne informacje zwrotne na temat tego, gdzie dokładnie regresje mogły zostać stworzone, ale testy zgrubne, które są kłopotliwe w konfiguracji, w rzeczywistości weryfikują bardziej kompleksową funkcjonalność systemu. Biorąc to pod uwagę, wydaje się, że konieczne jest dość częste używanie prześmiewania w celu wyizolowania tych oddzielnych jednostek kodu. Biorąc pod uwagę model obiektu w następujący sposób: ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/SIvbe.png) ... Weź również pod uwagę, że głębokość zależności naszej aplikacji jest znacznie głębsza, niż mogłem w tym zmieścić obraz, tak aby było wiele warstw N między warstwą 2-4 a warstwą 5-13. Jeśli chcę przetestować prostą decyzję logiczną podjętą w jednostce nr 1 i jeśli każda zależność jest wstrzykiwana do modułu kodu, który od niego zależy, tak że, powiedzmy, 2, 3 i 4 są wstrzykiwane konstruktorem do modułu 1 w obraz, wolałbym wstrzykiwać mocki 2, 3 i 4 do 1. W przeciwnym razie musiałbym skonstruować konkretne wystąpienia 2, 3 i 4. Może to być trudniejsze niż tylko dodatkowe pisanie. Często 2, 3 i 4 będą miały wymagania konstruktora, które mogą być trudne do spełnienia i zgodnie z wykresem (i zgodnie z rzeczywistością naszego projektu), będę musiał skonstruować konkretne instancje od N do 13, aby spełnić konstruktory 2, 3 i 4. Ta sytuacja staje się trudniejsza, gdy potrzebuję 2, 3 lub 4, aby zachowywać się w określony sposób, abym mógł przetestować prostą logiczną decyzję z punktu 1. Być może będę musiał zrozumieć i „mentalnie przeanalizować” cały wykres/drzewo obiektu naraz, aby 2, 3 lub 4 zachowywały się w niezbędny sposób. Często wydaje się, że o wiele łatwiej jest zrobić myMockOfModule2.Setup(x=> x.GoLeftOrRight()).Returns(new Right()); aby przetestować, czy moduł 1 odpowiada zgodnie z oczekiwaniami, gdy moduł 2 każe mu iść w prawo. Gdybym miał przetestować razem konkretne przypadki 2 ... N ... 13, konfiguracje testowe byłyby bardzo duże i w większości zduplikowane. Błędy testów mogą nie wykonywać zbyt dobrej pracy w określaniu lokalizacji niepowodzeń regresji. Testy nie byłyby niezależne (kolejny link pomocniczy). To prawda, że często uzasadnione jest testowanie dolnej warstwy oparte na stanie, a nie na interakcji, ponieważ te moduły rzadko mają dalszą zależność. Wydaje się jednak, że kpiący z definicji jest prawie konieczny, aby wyizolować dowolne moduły powyżej najniższego. Biorąc to wszystko pod uwagę, czy ktoś może mi powiedzieć, czego może mi brakować? Czy nasz zespół nadużywa kpin? A może jest jakieś założenie w typowych wytycznych dotyczących testów jednostkowych, że warstwy zależności w większości aplikacji będą na tyle płytkie, że rzeczywiście rozsądne jest testowanie wszystkich zintegrowanych modułów kodu (co czyni nasz przypadek „wyjątkowym”)? A może inaczej, czy nasz zespół nie ogranicza odpowiednio naszych ograniczonych kontekstów?


title: Czy C++ nie nadaje się do OOP?

text: Czytałem gdzieś w jednej z odpowiedzi na pytanie tutaj (nie pamiętam które), że C++ nie nadaje się do programowania obiektowego. Niektórzy wspominali, że możesz skorzystać z jego funkcji lub czegoś podobnego, ale nie w sensie czysto OOP (tak naprawdę nie rozumiałem, co ta osoba miała na myśli). Czy jest w tym trochę prawdy; jeśli tak, dlaczego?


title: Implementacja indeksowania i wyszukiwania w PHP

text: Czy istnieje coś takiego? Jakiś czas temu zaprojektowałem dla moich użytkowników podstawową aplikację opartą na formularzach. Od naszych dostawców otrzymujemy dane o produkcji sprzętu w plikach XML: nazwa pliku składa się z jedenastu pól oddzielonych tyldami, przy czym każde pole ma swoje znaczenie. Chłopaki z R&D chcieli mieć możliwość przeszukiwania każdego pola nazw plików, więc użyłem regex() z przyzwoitymi wynikami. Problem polega na tym, że mamy teraz ponad 2,5 miliona plików. A moja aplikacja nie może już tego zhakować. Spojrzałem na Apache Lucene & Solr. Chociaż wydawało się to najlepszym rozwiązaniem mojego problemu, pola w nazwach plików nie są równorzędne z zawartością pliku. Wielkie nie-nie z Solr. Jaki jest najlepszy sposób na zaimplementowanie aplikacji PHP z funkcją indeksowania i wyszukiwania przy tak dużej liczbie plików? Czy muszę kupić Zend i używać Zend_Search? Czy to jedyny sposób? Dzięki za wkład.


title: Wybór odpowiedniego systemu kontroli wersji dla projektów .NET

text: Przygotowuję się do mojego pierwszego "większego" projektu .NET (ASP.NET MVC 3/4) na którym będę prowadzić kolejnych 2 programistów i właśnie teraz dobieram odpowiedni system kontroli wersji do zadania ( plus zamierzam używać go również do mojego przyszłego rozwoju). Mój problem polega na tym, że wcześniej nie korzystałem z żadnego systemu kontroli wersji, więc chciałbym, aby miał jak najszybszą krzywą uczenia się i intuicyjne łączenie. Do tej pory szybko spojrzałem na VisualSVN (podoba mi się w nim integracja z Visual Studio), ale wszędzie czytam, jak Git jest niesamowity i nie wiem, który wybrać (nie ograniczam się do tych dwóch).. Może zastanawiam się nad tym, ale Lubię, gdy wszystko idzie gładko :) Chciałbym usłyszeć opinie od osób, które korzystały z wielu systemów kontroli wersji (najlepiej w projektach VS) **jak myślisz mniej skomplikowany i skuteczny system kontroli wersji do takiego zastosowania ( projekty od jednego do pięciu osób)?**


title: Połączona lista 2D a wielowymiarowa tablica/wektor

text: Mam nadzieję, że programista jest właściwą wymianą stosów do tego, ponieważ jest to dość pytanie oparte na koncepcji. Pracuję nad strukturą danych w C++, która reprezentuje dane w przestrzeni 3D. Płaszczyzna x-y jest duża (powiedzmy 0-10 000), podczas gdy oś z ma bardzo mały zakres (0-10). Wszystkie dane znajdują się w punktach całkowitych (x,y,z). Jednak na współrzędnej (x,y,z) może znajdować się więcej niż jeden punkt danych. Wymyśliłem trzy sposoby podejścia do tego tematu i nie mam niezbędnego doświadczenia, aby wybierać między nimi. 1. Używając połączonej listy 2D wewnątrz wektorów (tablice dynamiczne) `wektor<wektor<strukturaA*>> Dane`, gdzie pierwszy element listy dla tego punktu (x,y) może być dostępny za pomocą `Dane[x][y]` . structureA zawiera swoją wartość z, jej rzeczywiste dane, a także wskaźnik do następnej struktury na liście (która może mieć inną współrzędną z lub nie, ale znajduje się w tej samej linii zdefiniowanej przez x i y). Dostęp do elementów znajdujących się w środku i na końcu tej listy jest powolny. 2. Używając trójwymiarowej tablicy/wektora: `wektor<wektor<wektor<strukturaB>>> Dane`. W tym przypadku pierwsze dwa wektory definiują współrzędne x i y (jak poprzednio), a trzeci wektor daje nam tablicę wszystkich elementów na tej linii zdefiniowanej przez x i y. Możemy szybko określić, ile elementów znajduje się w tej linii (odpytując trzeci wektor) i możemy iterować od tyłu i od przodu. `strukturaB` zawiera wartość z punktu i jego dane. Wydaje mi się to dość dobrym i bezpiecznym (jeśli chodzi o alokację pamięci) rozwiązaniem. 3. Używanie trójwymiarowej tablicy/wektora i połączonej listy. W tym przypadku dane mogą być dostępne w następujący sposób: `Dane[x][y][z]` i wskazywałyby na pierwszy element połączonej listy danych, które znajdują się w tej współrzędnej. Wskazana struktura nie zawierałaby tutaj swojej wartości z, ponieważ jest to już uwzględnione w jej adresie w tablicy. Jednak wiele punktów (x,y,z) nie ma danych, podczas gdy większość z tych, które mają dane, ma ponad 10 struktur danych. (Wszystkie linie określone przez konkretny (x,y) zawierają co najmniej jedną strukturę). Wydaje mi się to najgorszym rozwiązaniem, ponieważ w wielu przypadkach musiałbym iterować przez puste współrzędne z, zanim trafiłbym na połączoną listę, aby przejść przez nią. Nacisk w tym programie kładzie się na szybkość, mój zestaw danych jest mniejszy niż 100 MB na nowoczesnym komputerze, więc nawet nieefektywna metoda przechowywania ich w pamięci RAM jest w porządku. Opcja 2 wydaje mi się najlepsza, chociaż w przeszłości zwykle widywałem ludzi bardziej skłonnych do wyboru opcji 1. Jestem zainteresowany poznaniem twoich opinii na temat najlepszego sposobu radzenia sobie z tym wraz z twoim rozumowaniem. Wielkie dzięki. **Aktualizacja** Dzięki za odpowiedzi, wiele się nauczę z twoich komentarzy, ponieważ jestem programistą-hobbystą, który kilka lat temu uczestniczyłem tylko w jednym krótkim kursie z podstaw języka C. @MorphingDragon Tablica nie jest postrzępiona, wszystkie „plasterki” z mają ten sam zakres x i y. Wartości również nie wydają się wystarczająco rzadkie dla tablicy mieszającej (która IIRC znacznie spowalnia przy kolizji skrótów - co jest gwarantowane, ponieważ wiele elementów ma to samo (x,y,z)). Wymiary zbioru są znane przy wczytywaniu pliku (są zawarte w nagłówku pliku wraz z hashem md5 pliku w celu sprawdzenia błędów i kilkoma bitami związanymi z analizą). @J Trana / Florian F Zestaw danych jest wstępnie zbudowany i rzadko jest modyfikowany przez program - część danych może wymagać przeniesienia lub usunięcia. Do dostosowywania danych, w szczególności do dostosowywania ich wartości Z (lub ich usuwania), które są najczęstszymi operacjami. Połączona lista będzie szybsza, ponieważ te operacje są O(1) w przeciwieństwie do O(n) w wektorze. Uważam jednak, że te zmiany są na tyle rzadkie, że posiadanie O(n) dla zmian może być opłacalne, jeśli szybkość wyszukiwania jest nawet nieznacznie większa (ponieważ jest to częstsza operacja). W większości przypadków dostęp do danych będzie możliwy iteracyjnie, pobierając wycinek n*p z płaszczyzny x-y. Przykład pseudokodu: dla każdego y pomiędzy startY i (startY + p) dla każdego x pomiędzy startX i (startX + n) odczytaj wszystkie węzły w Data[x][y] //pobiera węzły dla każdego z na (x,y) line analyse(&nodes) //ewentualnie modyfikować węzły, być może po prostu obliczyć coś na podstawie ich wartości Dostęp do danych jest **zawsze** powiązany z linią (x,y), w której znajduje się element, ale nie zawsze potrzebujemy wszystkich węzły na tej linii (w zależności od ich z). Więc albo mamy strukturę, która nie wymaga od nas pobierania ich wszystkich (tylko tych, których chcemy) albo wykonujemy sortowanie drugorzędne. Dane w pliku reprezentują posortowaną listę rosnąco z dla każdego (x,y). Zajmę się również tymi innymi strukturami danych. Nigdy ich nie spotkałem, ponieważ przy bardzo małym szkoleniu moja metoda polega na używaniu wektorów STL lub list do wszystkiego. Tym razem chciałbym jednak poświęcić czas, aby zrobić to właściwie. Spędziłem sporo czasu myśląc o tym ostatniej nocy po opublikowaniu pytania i zobaczeniu pierwszych odpowiedzi. Zdałem sobie sprawę, że „jeśli wymagana jest jedna część danych z punktu (x,y,z), to wszystkie elementy z tego punktu są wymagane jednocześnie”. To skłoniło mnie do myślenia, że opcja 3, moja najmniej preferowana, kiedy zaczynałem wczoraj po południu, jest w rzeczywistości najlepszą z wymienionych przeze mnie opcji. Jeśli używam trójwymiarowej dynamicznej tablicy wskaźników do połączonej listy, nie tracę zbyt dużej szybkości ani przestrzeni sterty ustawiając wskaźnik na NULL, zamiast dołączać strukturę. Pozwala to również na pełny dostęp do dowolnego 3d, który chociaż nie jest obecnie _wymagany_, może zredukować niektóre operacje z O(n) do O(1). Po krótkim spojrzeniu na drzewa oktaw/r czuję się bezpiecznie, mówiąc, że mój zestaw danych nie jest wystarczająco złożony, aby wymagać tak ciężkiego rozwiązania inżynieryjnego. Jeśli o to chodzi, jestem prawie pewien, że każda z trzech przedstawionych przeze mnie opcji zadziała, nawet jeśli nie najszybsza, ale chciałbym nauczyć się dobrej i stosunkowo wydajnej metody, a nie polegać tylko na niesamowitej mocy nowoczesne komputery do brutalnego wymuszenia problemu, tak jak zwykle to robię. Dziękuję za dotychczasowe odpowiedzi i sugestie. :)


title: Schemat sprawdzania tylko jednej przestrzeni nazw w dokumencie XML

text: Chcę sprawdzić poprawność dokumentu XML względem jakiegoś schematu XML, ale zignoruj wszystkie elementy (i prawdopodobnie atrybuty), które nie należą do danej przestrzeni nazw. Czy istnieje taki język schematów XML?


title: Pomoc z wzorem fabryki abstrakcyjnej

text: Potrzebuję pomocy przy projektowaniu abstrakcyjnych wzorów fabrycznych. To pytanie jest kontynuacją: Pomoc w projektowaniu z równoległym procesem Jestem naprawdę zdezorientowany, gdzie powinienem inicjować wszystkie ustawienia dla każdego typu medium (np. RS232, TCP/IP itp.). Załączam rysunek przedstawiający, jak konfiguruję wzorzec: ![tu wstaw opis obrazu](http://i.stack.imgur.com/mDfjH.png) Jak pokazano, kiedy tworzone jest medium, każde medium nakłada Interfejs **ICreateMedium**. Przypuszczałbym, że metoda Create() tworzy również odpowiedni obiekt, taki jak SerialPort serialPort = new SerialPort("COM1", baud); jednak TCPIPMedium miałby problem z interfejsem, ponieważ nie musiałby inicjować obiektu portu szeregowego. Wiem, że robię tutaj coś bardzo złego. Po prostu nie mogę tego rozgryźć i utknąłem na jakiś czas. Co mnie również myliłem, pokazałem, że interfejs **IMedium** uzyska dostęp do obiektu komunikacyjnego po jego utworzeniu, aby mógł napisać odpowiedni pakiet byte[]. Wszelkie wskazówki byłyby bardzo mile widziane. Moim głównym celem jest, aby klasa **Communicator** wypluła pakiet bez zwracania uwagi na to, jaki rodzaj medium jest aktywny.


title: Które podejście byłoby lepsze w przypadku utrwalania tych nadających się do zastąpienia kluczy i wartości konfiguracji? Prosty magazyn klucz-wartość czy baza danych wykresów?

text: Tworzę system, w którym są klucze i wartości konfiguracyjne. Na przykład: config.key = 10 Jest przykładem klucza konfiguracyjnego i wartości. Te klucze mogą również mieć nadpisania na podstawie „wymiarów”. Na przykład, gdybyśmy chcieli zastosować `config.key` do aplikacji z wymiarem `foo`, nadpisanym kluczem byłoby zasadniczo: config.key.foo = 20 W przyszłości możemy mieć wiele wymiarów w dowolnej kolejności, więc to może być taka możliwość w przyszłości: config.key.foo.bar = 30 Bardziej konkretnym przykładem byłoby, gdybyśmy mieli klawisz/przełącznik o nazwie `display.pintrest.feed`, który ma wartość `boolean`. Tak więc domyślną wartością byłoby `false`, ale możesz mieć nadpisania takie jak: display.pintrest.feed = false display.pintrest.feed.femaleUser = true Tutaj `femaleUser` jest wymiarem (więc chcemy ustawić wartość ta konfiguracja jest „prawda” tylko dla kobiet). To jest w istocie to, co staram się zrobić. Moje pytanie dotyczy wytrwałości. Jaki byłby najlepszy sposób na utrwalenie tego rodzaju danych? Są to dane, które będą nieco częściej odpytywane, ale rzadziej zapisywane. Naiwnym rozwiązaniem byłoby użycie MySQL lub PostgreSQL i utworzenie takiej tabeli: +-------------------------------- --+-------+ | Klucz | Wartość | +-----------------------------------+-------+ | config.key | 10 | | config.key.foo | 20 | | display.pintrest.feed | prawda | | display.pintrest.feed.femaleUser | fałszywe | +-----------------------------------+-------+ Ale tracimy bezpieczeństwo typu „Wartości”, a także mają jeden punkt awarii. Mamy też dużą redundancję (podstawowa część klucza konfiguracyjnego jest za każdym razem powtarzana). Zastanawiałem się więc, czy nie przedstawić go jako wykresu, aby móc go zapisać w bazie danych wykresów. Myślałem o modelowaniu tego w ten sposób: ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/X8Evj.png) Czy to jest opłacalne, czy przesadzone? Nie mam nic przeciwko używaniu prostego magazynu klucz-wartość, ale powinien on być odporny na błędy i powinien dać się łączyć w klastry. Poza tym naprawdę zależy nam tylko na spójności ostatecznej (tj. Nie przejmuj się, że propagacja zmian we wszystkich węzłach zajmuje trochę czasu). Więc moje pytanie brzmi, jaki rodzaj magazynu danych powinien wspierać tego rodzaju dane? Czy wystarczy prosty magazyn klucz-wartość, czy powinienem skorzystać z bazy danych wykresów? Moim uzasadnieniem dla tego ostatniego jest po prostu złagodzenie nadmiarowości kluczy, ale nie wiem, czy jest to mocne uzasadnienie.


title: Czy mój diagram sekwencji jest poprawny?

text: UWAGA: Uczę się samodzielnie UML, więc nie mam nikogo, kto mógłby weryfikować moje diagramy i dlatego publikuję tutaj, więc proszę o wyrozumiałość. Jest to problem, który otrzymałem z jakiegoś pliku PDF dostępnego w Google, który zawierał po prostu następujący opis problemu: **Opis problemu** : biblioteka zawiera książki i czasopisma. Zadanie polega na opracowaniu komputerowego systemu wypożyczania książek. Aby wypożyczyć książkę, wypożyczający musi być członkiem biblioteki. Istnieje ograniczenie liczby książek, które może wypożyczyć każdy członek biblioteki. Biblioteka może posiadać kilka egzemplarzy danej książki. Istnieje możliwość rezerwacji książki. Niektóre książki są przeznaczone wyłącznie na pożyczki krótkoterminowe. Pozostałe książki można wypożyczyć na 3 tygodnie. Użytkownicy mogą przedłużyć pożyczki. Narysuj diagram przypadków użycia dla biblioteki. Narysowałem już diagram Przypadku Użycia i kazałem go sprawdzić członkowi społeczności. Tym razem narysowałem **diagramy sekwencji** za wypożyczenie książki i przedłużenie terminu zwrotu. Proszę dać mi znać, czy są poprawne. Narysowałem je za pomocą _Visual Paradigm_ i nie wiem, jak zachować kontrolę nad numerami sekwencyjnymi. Jeśli tak, daj mi znać :) **Diagramy** ![Pożyczanie](http://i.stack.imgur.com/WebPr.png) ![Przedłużanie daty](http://i.stack .imgur.com/6YWMt.png)


title: Wpf: Wzorzec projektowy oparty na zdarzeniach a wzorzec projektowy MVVM

text: Jestem początkującym programistą i od kilku miesięcy pracuję nad aplikacją WPF i mam trudności z zaimplementowaniem czegokolwiek w MVVM ze względu na ograniczenia czasowe, więc zakodowałem mój program jako jedyny sposób, aby wiedzieć, jak: z kodem za sobą, mocno sprzęgło i cała masa kodu do spaghetti. Mój program rozrósł się do ponad 20 000 linii niechlujnego (ale działającego) kodu, który jest w większości sterowany zdarzeniami. Aplikacja, którą tworzę, prawdopodobnie będzie używana i będzie rozwijana przez kolejne lata, ale będę jedyną osobą pracującą nad kodem. Jednak teraz, gdy mam czas na rozpoczęcie nauki MVVM, zastanawiam się, jak przydatne jest podążanie za wzorcem MVVM. Rozważam refaktoryzację mojego kodu do wzorca MVVM, ale wszystko wydaje się 100x trudne do zrobienia przy niewielkiej ilości dokumentacji. Używając kodu i ścisłego sprzężenia, mogę sprawić, że interfejs użytkownika będzie robił dokładnie to, czego chcę i wszystko wydaje się być kodowane o wiele szybciej za pomocą metod sterowanych zdarzeniami. Jak ważne jest przestrzeganie wzorca projektowego MVVM dla aplikacji WPF, szczególnie w dłuższej perspektywie? Czy uważasz, że to dobry pomysł, abym zainwestował swój czas w przeprojektowanie tej aplikacji i podążanie za wzorcem MVVM?


title: Nauka nowych rzeczy i wdrażanie nowych rzeczy w firmie

text: W mojej nowej firmie chciałem używać Doctrine DBAL do abstrakcji danych. Ale to nie działa z powodu PHP w wersji 5.2, którego używamy na naszym serwerze deweloperskim. Tutaj chodzi o kwestie praw autorskich. Nie masz dostępu do niczego. Ze względu na sztywność produktu nie mogę użyć niczego nowego! Co mogę z tym zrobić? Jak powinienem porozmawiać o tym z moim TL i kierownikiem projektu?


title: Tworzenie nowej bazy danych z Active Record

text: Proszę powiedz mi, czy to szaleństwo, ale zasadniczo stworzyłem niestandardowe zadanie rake i zanim to zrobi, wyświetla użytkownikowi komunikat ostrzegawczy: Ostrzeżenie, przed kontynuowaniem utwórz kopię zapasową bazy danych Na wypadek, gdyby coś poszło zło. Ale pomyślałem, że to byłoby niesamowite: Uwaga, przed kontynuowaniem utwórz kopię zapasową bazy danych. Czy chcesz go teraz utworzyć [T/N] i po naciśnięciu Y istniejąca baza danych zostanie zreplikowana. Nie chcę tworzyć, aby powielać tabele, chcę dosłownie stworzyć nową, nieskazitelną, izolowaną bazę danych, aby ich architektura była identyczna, na wypadek, gdyby coś poszło nie tak. Nie chcę jednak żadnych zależności, chcę używać tylko bibliotek zawartych w Railsach. Czy mogę podać prosty przykład, jak utworzyć pustą bazę danych za pomocą RoR, jeśli jest to możliwe? Mogę utworzyć nową bazę danych w następujący sposób: require 'sqlite3' db = SQLite3::Database.new( "test.db" ) Jednak będzie to działać tylko wtedy, gdy użytkownik używa sqlite3. Mogę wykryć, której bazy danych używają za pomocą database_type = ActiveRecord::Base.connection.adapter_name #=> sqlite3, a następnie użyć instrukcji case, aby wykonać nieco inne polecenia dla każdego typu bazy danych, ale wydaje się to nieco skomplikowane i niezbyt dynamiczny. (Każda baza danych będzie musiała zostać wcześniej wymyślona). Czy mogę to zrobić przez Active Record?


title: Dlaczego (f . l) jest niedozwolone i równe (zastosuj f l)?

text: W schemacie, gdy jest zdefiniowany (zdefiniuj f (lambda (a b c d) d)) (zdefiniuj l (lista 'a 'b 'c 'd)) Dlaczego nie wykonuje destrukturyzacji argumentów? Chodzi mi o to, że argumenty powinny najpierw ocenić, dlaczego destrukturyzacja nie jest tego częścią? (f . l) Jakie są powody, dla których to wyrażenie nie jest równoznaczne z podążaniem? (zastosuj f l) * Zredagowane, aby było jaśniejsze, zgodnie z sugestiami w komentarzach


title: Jak organizujesz wysoce spersonalizowane oprogramowanie?

text: Pracuję nad dużym projektem oprogramowania, który jest wysoce dostosowany do potrzeb różnych klientów na całym świecie. Oznacza to, że mamy może 80% kodu, który jest wspólny dla różnych klientów, ale także dużo kodu, który musi się zmieniać od jednego klienta do drugiego. W przeszłości tworzyliśmy nasze prace w oddzielnych repozytoriach (SVN), a kiedy rozpoczynał się nowy projekt (mamy niewielu, ale dużych klientów), tworzyliśmy kolejne repozytorium w oparciu o jakikolwiek poprzedni projekt, który ma najlepszą podstawę kodu dla naszych potrzeb. Działało to w przeszłości, ale napotkaliśmy kilka problemów: * **Błędy** naprawione w jednym repozytorium nie są naprawiane w innych repozytoriach. Może to być problem organizacyjny, ale trudno mi naprawić i załatać błąd w 5 różnych repozytoriach, pamiętając, że zespół utrzymujący to repozytorium może znajdować się w innej części świata, a my nie mamy ich środowiska testowego , nie znają swojego harmonogramu ani wymagań ("błąd" w jednym kraju może być "funkcją" w innym). * **Funkcje** i ulepszenia wprowadzone dla jednego projektu, które mogą być przydatne również w innym projekcie, są tracone lub jeśli są używane w innym projekcie, często powodują duże bóle głowy przy łączeniu ich z jednej bazy kodu do drugiej (ponieważ obie gałęzie mogły zostać opracowany samodzielnie przez rok). * **Refaktoryzacje i ulepszenia kodu** dokonane w jednej gałęzi rozwojowej albo giną, albo przynoszą więcej szkody niż pożytku, jeśli musisz scalić wszystkie te zmiany między gałęziami. Dyskutujemy teraz, jak rozwiązać te problemy i do tej pory wpadliśmy na następujące pomysły, jak to rozwiązać: 1. **Utrzymuj programowanie w osobnych gałęziach**, ale lepiej organizuj się, mając centralne repozytorium, w którym są scalane ogólne poprawki błędów a wszystkie projekty regularnie (np. codziennie) scalają zmiany z tego centralnego repozytorium we własne. Wymaga to ogromnej dyscypliny i dużego wysiłku przy łączeniu gałęzi. Więc nie jestem przekonany, że to zadziała i będziemy mogli utrzymać tę dyscyplinę, zwłaszcza gdy nadejdzie presja czasu. 2. **Porzuć oddzielne gałęzie programistyczne** i miej centralne repozytorium kodu, w którym żyje cały nasz kod i dostosowuj go dzięki modułom wtykowym i opcjom konfiguracyjnym. Używamy już kontenerów Dependency Injection do rozwiązywania zależności w naszym kodzie i postępujemy zgodnie z wzorcem MVVM w większości naszego kodu, aby wyraźnie oddzielić logikę biznesową od naszego interfejsu użytkownika. Drugie podejście wydaje się bardziej eleganckie, ale w tym podejściu mamy wiele nierozwiązanych problemów. Na przykład: jak radzić sobie ze zmianami/dodatkami w modelu/bazie danych. Używamy platformy .NET z Entity Framework, aby mieć silnie typizowane jednostki. Nie widzę, jak możemy obsługiwać właściwości, które są wymagane dla jednego klienta, ale bezużyteczne dla innego klienta, bez zaśmiecania naszego modelu danych. Zastanawiamy się nad rozwiązaniem tego problemu w bazie danych przy użyciu tabel satelitarnych (mających oddzielne tabele, w których nasze dodatkowe kolumny dla określonej jednostki żyją z mapowaniem 1:1 do oryginalnej jednostki), ale jest to tylko baza danych. Jak sobie z tym radzisz w kodzie? Nasz model danych znajduje się w centralnej bibliotece, której nie bylibyśmy w stanie rozszerzyć dla każdego klienta przy użyciu tego podejścia. Jestem pewien, że nie jesteśmy jedynym zespołem borykającym się z tym problemem i jestem w szoku, że znalazłem tak mało materiału na ten temat. **Więc moje pytania są następujące:** 1. Jakie masz doświadczenia z wysoce spersonalizowanym oprogramowaniem, jakie podejście wybrałeś i jak to działa dla Ciebie? 2. Jakie podejście polecasz i dlaczego? Czy istnieje lepsze podejście? 3. Czy są jakieś dobre książki lub artykuły na ten temat, które możesz polecić? 4. Czy masz konkretne zalecenia dotyczące naszego środowiska technicznego (.NET, Entity Framework, WPF, DI)? **Edytuj:** Dziękujemy za wszystkie sugestie. Większość pomysłów pasuje do tych, które już mieliśmy w naszym zespole, ale naprawdę pomocne jest zapoznanie się z ich doświadczeniem i wskazówkami, jak je lepiej wdrożyć. Nadal nie jestem pewien, w którą stronę pójdziemy i nie podejmuję decyzji (sam), ale przekażę to dalej w moim zespole i jestem pewien, że będzie to pomocne. W tej chwili tenor wydaje się być pojedynczym repozytorium wykorzystującym różne moduły specyficzne dla klienta. Nie jestem pewien, czy nasza architektura jest do tego odpowiednia ani ile musimy zainwestować, aby ją dopasować, więc niektóre rzeczy mogą przez jakiś czas żyć w osobnych repozytoriach, ale myślę, że to jedyne długoterminowe rozwiązanie, które będzie działać. Więc jeszcze raz dziękuję za wszystkie odpowiedzi!


title: Do czego przydaje się arkusz kalkulacyjny?

text: Od 15 lat pracuję w branży komputerowej na różnych stanowiskach (sysadmin, programista, badacz) i nigdy nie spotkałem kogoś, kto używałby programu Excel do czegoś bardziej zaawansowanego niż formatowanie tabel lub jako baza danych ad hoc, która mogłaby być utrzymywana w plik tekstowy. Musiałem ciężko przetwarzać dane i kreślić, a do tego użyłem kilku skryptów perla + gnuplot, zmęczyłem się tym i ostatecznie przeszedłem na R. Arkusz kalkulacyjny 2D po prostu nie wydawał się dobrze przystosowany do przeprowadzania analiz statystycznych na 5-wymiarowych zestawach danych (nie wspominając o tym, że tworzy _UGLY_ wykresy). Próbowałem użyć arkusza kalkulacyjnego do śledzenia czasu i dowiedziałem się, że lepiej obsługiwałaby mnie relacyjna baza danych, więc zrezygnowałem z używania programu Excel. Na przykład ważne jest, aby konsekwentnie nazywać zadania i musiałem znaleźć unikalne nazwy zadań w danej kolumnie w kilku arkuszach (miałem jeden grafik na każdy miesiąc). Jak zrobić takie "zapytanie" w programie, który zasadniczo ocenia niezależne komórki i ma niewielkie pojęcie o relacjach między nimi? Do czego więc _są_ przydatne arkusze kalkulacyjne? Dlaczego mają wbudowaną masę matematycznych rzeczy, skoro, AFAICT, ludzie używają ich głównie jako programów do formatowania tabel lub złych substytutów baz danych?


title: Skąd mam wiedzieć, czy mam dobrego profesora programowania?

text: Dzisiaj rozpocząłem drugi kurs programowania. Profesor wydawał się nieco inny niż pozostali - bawiliśmy się mówiąc takie rzeczy jak _"prawdopodobnie jest niezrozumianym geniuszem"_. Skrytykował innych (już nieistniejących) profesorów (z dobrych powodów). Wtedy przyszło mi do głowy zapytać go _"Skąd mam wiedzieć, czy **ty** jesteś dobrym profesorem?"_ ... ale postanowiłem zachować to na później... Teraz jednak takie pytanie bardzo się rozwinęło w moim umyśle. Jestem bardzo ciekawa - **jak mam wiedzieć, czy mój profesor programowania jest dobry**? Kilka spostrzeżeń: * Podobno bardzo niewielu uczniów kończy z nim kurs z zadowalającymi wynikami - ale możliwe, że to wina uczniów, a nie jego. * Z naszych krótkich pierwszych zajęć bardzo dobrze rozumiałem, co mówił (o wszystkim trochę mówił). Ale czuję, że może to być spowodowane tym, że byłem już wcześniej przygotowany i miałem dobre doświadczenie w programowaniu, a niekoniecznie fakt, że on jest dobry w wyrażaniu swoich pomysłów. * Ma skłonność do żartów. Jak większość profesorów, których spotkałem. Niestety jest najmniej zabawny.


title: Starszy Programista

text: Nie jestem pewien, czy to jest miejsce mojego pytania, czy nie. Pracuję w firmie programistycznej jako starszy inżynier oprogramowania, ale lider mojego zespołu kontroluje wszystko w cyklu rozwoju. Nie mogę wyrazić swojej opinii w niczym. Jestem po prostu zmuszany do zadań tylko bez dyskusji. Nie potrafię nawet zastosować żadnych wzorców projektowych ani wytycznych dotyczących interfejsu użytkownika. Czy teraz jest to w porządku na mojej pozycji zawodowej? Jakie są obowiązki starszego inżyniera?


title: Prawidłowa odpowiedź na żądanie HTTP w przypadku żądania zbyt dużej ilości danych

text: Tworzę interfejs API dla platformy wyświetlania reklam, który pozwoli Ci zażądać danych śledzenia w kampaniach reklamowych. Kampanie często przekraczają setki milionów żądań, co oznacza, że będzie wiele terabajtów danych. Dlatego musimy uniemożliwić konsumentom interfejsu API żądanie zbyt dużej ilości danych na raz (tak, że żądanie wygaśnie), ale nie jestem pewien, jaka jest najlepsza praktyka w tym zakresie. **Opcje, które już zidentyfikowałem to:** 1. dodaj dodatkowy parametr do żądania, który wskazuje, która sekcja danych jest pożądana 2. obcinaj dane i jakoś powiedz klientowi, że musi użyć bardziej szczegółowych filtrów 3. odpowiedz z kodem statusu HTTP 413 (ale wydaje się, że dotyczy to dużych treści żądań, a nie odpowiedzi) 4. przełączenie na strumieniowe API (takie jak strumieniowe API na Twitterze) **Ale moje pytanie brzmi, jaka jest standardowa praktyka / właściwa odpowiedź na to rodzaj sytuacji?** Uwaga: ataki DoS nie są dużym problemem, ponieważ nie będzie to publiczne API


title: Język wysokiego poziomu do asemblera

text: Jeśli język asemblerowy jest tylko czytelnym sposobem reprezentowania kodu maszynowego, to dlaczego HLL są konwertowane najpierw na asembler, a potem na kod maszynowy? Czy HLL nie powinny być bezpośrednio konwertowane na kod maszynowy?


title: Jak działa retargetowanie reklam?

text: Niedawno przeczytałem, że reklamy na Facebooku zmierzają w kierunku retargetingu i zainteresowałem się głębiej tematem. Zasadniczo retargeting to technika stosowana przez reklamodawców, która śledzi zamiar zakupu poprzez umieszczenie plików cookie w przeglądarce, a gdy odwiedzasz inną witrynę w sieci reklamowej, zobaczysz reklamę przedmiotu, który „chciałeś kupić”. W tym celu zarówno wydawca, jak i reklamodawca muszą ze sobą współpracować. Wydawca musi dodać kilka linijek kodu JavaScript, a wydawca musi mieć możliwość odczytania tych informacji w różnych witrynach. W większości przypadków javascript wstawia iframe z domeny adnetwork. Skrypt iframe ustawia pliki cookie zarówno dla domeny hosta, jak i domeny zdalnej sieci reklamowej. Jednak zasady Same Origin nie pozwalają ramkom iframe na odczytywanie/ustawianie treści z domeny nadrzędnej. Czy jest coś, czego tu brakuje? Czy ktoś może wyjaśnić, jak ta technika faktycznie działa?


title: Jak efektywnie dzielić się projektami z innymi programistami

text: Myślę o pracy z kilkoma innymi osobami nad projektem c++ lub java. Zwykle w przypadku małych projektów współpracujemy głównie poprzez przesyłanie plików z kodem źródłowym w tę i z powrotem, ale na większą skalę staje się zbyt łatwe, aby coś poszło nie tak. Czytałem o systemach kontroli wersji, takich jak git i wydaje się, że pasuje do moich potrzeb współpracy, ale problem polega na tym, że samouczki pokazują, że te narzędzia są używane za pośrednictwem wiersza poleceń, co prawdopodobnie może bardzo szybko stać się nużące. Mógłbym użyć integracji git zawartej w większości IDE, ale nie wiem, co zrobić w przypadku pracy w różnych IDE lub, co ważniejsze, na różnych systemach operacyjnych. Jak większość zespołów radzi sobie z takimi problemami? Jakich narzędzi używają? A jak radzą sobie z bibliotekami powiązanymi? Każda rada byłaby niezwykle pomocna!


title: Czy użycie frameworka PHP byłoby korzystne w moim kontekście?

text: Właśnie rozpocząłem pracę w małej firmie typu start-up, która głównie używa PHP do tworzenia aplikacji front-endowych. Przed dołączeniem nie miałem żadnego doświadczenia w PHP, co doprowadziło do tego, że moje aplikacje stały się dużymi kawałkami kodu spaghetti. Zasadniczo zacząłem od dodania kodu, aby zaimplementować początkową funkcję, a następnie kontynuowałem hakowanie kodu, aby zaimplementować kolejne funkcje – bez większego zastanowienia się nad ogólnym projektem. Same aplikacje generują XML do renderowania na małych urządzeniach mobilnych. Niedawno zacząłem szukać frameworków, z których mógłbym korzystać. Myślę, że zaletą byłoby to, że wydają się zmuszać programistów do modularyzacji swoich programów przy użyciu wzorców projektowych dobrych praktyk. To wydaje się świetne dla kogoś na moim stanowisku. Bardzo przydatne byłyby też dodatkowe funkcje, które zapewniają, na przykład: łączenie z bazami danych w taki sposób, aby uniemożliwić wstrzyknięcie SQL. Wadą, którą widzę, jest to, że będzie dla mnie dużo czasu, jeśli chodzi o nauczenie się samego frameworka (przy jednoczesnym radzeniu sobie z samym PHP). Obawiam się też, że będzie to przesada, biorąc pod uwagę skalę tworzonych przez nas aplikacji. Zwykle są to programy, które współpracują z dość prostą bazą danych zaplecza i generują około 5 różnych ekranów XML. Prawdopodobnie około 1 lub 2 tys. linijek kodu. Czas potrzebny na samo skonfigurowanie frameworków może nie być tego wart. Ostatnim problemem, jaki widzę, jest to, że deweloperzy w firmie – którzy muszą przejrzeć mój kod i nie znają frameworka PHP, którego mogę używać – będą mieli znacznie trudniejsze zrozumienie tego. Biorąc pod uwagę te zalety i wady, nadal nie jestem pewien, jaki będzie najlepszy sposób działania; więc każda rada będzie bardzo mile widziana.


title: Czy niektóre kody NOP są traktowane inaczej niż inne?

text: Ciekawe, powiedzmy, że mam: 00000000001 90 nop 00000000002 90 nop 00000000003 90 nop Czy to jest dokładnie takie samo jak to? 00000000001 0F1F00 nop dword [ds:rax] Jaki skutek miałby drugi przykład w przeciwieństwie do pierwszego?


title: Jak uniknąć sytuacji, w której javascript stanie się kodem spaghetti?

text: Zrobiłem sporo javascriptu na przestrzeni lat i używam bardziej zorientowanego obiektowo podejścia, w szczególności ze wzorcem modułu. Jakiego rodzaju podejścia używasz, aby uniknąć większej bazy kodu, aby stać się spaghetti. Czy jest jakieś „najlepsze podejście”?


title: Zalety Scrum dla samych programistów?

text: Scrum jako metodologia zarządzania projektami, w jaki sposób „sprzedałby” go deweloperom w zespole, który jest w miarę zadowolony ze swojej obecnej sytuacji? Wydaje mi się, że łatwo jest mi wyjaśnić naszemu Product Managerowi, w jaki sposób Scrum pozwoli mu otrzymywać regularne wersje, zmieniać wymagania i skłonić zespół do skupienia się najpierw na historiach o wysokim priorytecie. Z łatwością wyjaśniłem, co TDD lub Continuous Integration wnoszą do codziennego życia programisty. Ale jak można przekonać deweloperów do Scrum? Jak Scrum ułatwiłby im życie?


title: Szablon audytu / lista kontrolna kontroli stanu oprogramowania

text: Czy ktoś zna szablon/listę kontrolną, której można użyć do przeprowadzenia kontroli stanu oprogramowania. Mój zespół obsługuje wiele starszych aplikacji i poproszono nas o przedstawienie kadrze zarządzającej wyższego szczebla karty wyników na temat stanu aplikacji. Szablon byłby używany do: * Identyfikacji problemów z wydajnością lub stabilnością, które mogą powodować przerwy w produkcji, opóźnienia lub skutki finansowe. * Zidentyfikuj luki / braki w zabezpieczeniach danych, autoryzacji lub uwierzytelniania w aplikacji / usłudze. * Identyfikacja zgodności kopii zapasowej, odzyskiwania po awarii i ciągłości biznesowej aplikacji/usługi. * Zidentyfikuj zgodność aplikacji/usługi z architekturą referencyjną lub predefiniowanym zestawem standardów technicznych. * Zidentyfikuj bieżące i wymagane monitorowanie i alarmowanie aplikacji / usługi. * Zidentyfikuj poziom obsługi transakcji i możliwość uszkodzenia danych lub błędu aplikacji/usługi. * Zidentyfikuj problemy licencyjne aplikacji/usługi. * Określ minimalne wymagania sprzętowe aplikacji/usługi. * Zidentyfikuj technologię, wsparcie dostawcy i wsparcie społeczności dla aplikacji/usługi. * Podaj zalecenie dotyczące wszystkich ustaleń. Szybkie wyszukiwanie w Google nie wykazało niczego użytecznego poza tym szablonem do zakupu http://www.itchecklists.com/application_health_check_toc.html


title: Czy można zająć się komputerami kwantowymi jako hobby?

text: Chciałbym zacząć pracę z komputerami kwantowymi jako hobby. czy to możliwe? 1. Gdzie mogę kupić komputer kwantowy (osobisty), aby móc uruchamiać (moje) kwantowe programy komputerowe? 2. Jakie języki programowania obliczeń kwantowych są dostępne? Czy istnieje coś takiego jak kompilowalny język programowania obliczeń kwantowych? Wszelkie wskazówki do zasobów, tutoriale są bardzo mile widziane. Czytałem obliczenia kwantowe dla informatyków i jest to bardzo interesujące! Nie mogę się doczekać rozpoczęcia programowania.


title: Algorytmy C# dla operatora *

text: Czytałem Algorytmy i natknąłem się na algorytm mnożenia Karatsuby, a małe wiki-ing doprowadziły do algorytmów mnożenia Schonhage-Strassen i Furer. Zastanawiałem się, jakie algorytmy są używane w operatorze * w C#? Czy mnożąc parę liczb całkowitych lub podwajających się, używa kombinacji algorytmów z jakąś strategią opartą na wielkości liczb? Jak mogę znaleźć szczegóły implementacji C#?


title: Czy powinienem zmienić technologię?

text: Jestem programistą PHP. Mam roczne doświadczenie w PHP w firmie średniej wielkości. teraz po prostu zdaję sobie sprawę, że nie ma topowych MNC wykorzystujących tę technologię. Czy więc dla lepszej okazji powinienem zmienić technologie i nauczyć się nowych technologii? Właściwie to się martwię, bo nauczyłem się już Zend i Magento... Jeśli się zmienię, wszystko pójdzie na marne... Ale muszę też pomyśleć o swojej karierze. :( prosze sugerowac Dzieki! Richa


title: Jakie są warunki konwersji kodu na licencji BSD na inny język?

text: Jestem w trakcie pisania biblioteki w PHP, opartej na pakiecie Java z licencją BSD. Kod oczywiście nie będzie taki sam jak oryginalny, ale większość nazw klas/metod oraz dokumentacja wbudowana będzie taka sama. Czy wystarczy link do oryginalnej biblioteki Java w dokumentacji kodu? Czy mogę wtedy zwolnić swój kod z licencją MIT?


title: Jaka jest nazwa operacji, która może być stosowana wielokrotnie i nigdy nie zmieniać stanu poza początkową aplikacją?

text: Próbuję zapamiętać słowo, _myślę_, że jest ono związane z teorią obliczeniową lub teorią baz danych. Najbliższym synonimem jest „atomowy”, ale to nie do końca. Zasadniczo jest to rodzaj obliczeń, które powinny dać ten sam wynik, nawet gdy są uruchamiane wiele razy z rzędu, co oznacza, że nie powodują efektów ubocznych dla siebie. Konkretnie natknąłem się na to słowo w odpowiedzi na przepełnienie stosu na temat polecenia chmod (lub innej operacji związanej z uprawnieniami). Mam nadzieję, że to wystarczy. Szperanie w Wikipedii nie jest zbyt pomocne.


title: Wyszukiwanie tekstu - problem z dużymi danymi

text: Mam problem, na który liczyłem, że uda mi się uzyskać poradę! Jako dane wejściowe mam DUŻO tekstu (o wartości około 20 GB, nie MASYWNE, ale wystarczająco duże). To tylko wolny tekst, nieustrukturyzowany. Mam „listę kategorii”. Chcę przetworzyć tekst i powiązać elementy na liście kategorii oraz wyprowadzić kategorie dla każdego dopasowania, np. ## Tekst wejściowy Szybki brązowy lis przebiegł nad leniwym psem. ## Wyszukiwanie kategorii _Kolor_ Czerwony | Brązowy | Zielony _Prędkość_ Wolna | Szybkie | Leniwy | Szybko ## Oczekiwany kolor wyjściowy — Brązowy Szybkość — Szybko, leniwy Aby zwiększyć złożoność problemu, tekst źródłowy prawdopodobnie nie pasuje dokładnie do kategorii, np. będzie musiał tu być zastosowany algorytm rozmytego dopasowania. Aby rozwiązać ten problem, chcę użyć technologii „Big Data” (nie chodzi o to, czy NAPRAWDĘ POTRZEBUJE dużych danych – jest to cel drugorzędny). Moje myśli są takie, aby wykorzystać Hadoop Map/Reduce z Lucene, aby wykonać rozmyte dopasowanie. Co myślisz? Czy jestem daleko od bazy? Wielkie dzięki - doceniamy KAŻDĄ radę! Duncan


title: Architektura: czy robię wszystko dobrze?

text: Próbuję użyć łuku warstwowego '~ classic' przy użyciu .NET i Entity Framework. Zaczynamy od starszej bazy danych, która jest trochę kiepska: * Niespójne nazewnictwo * Niepotrzebne widoki (widok odwołujący się do innych widoków, widoki `wybierz *` itp.) * Kolumny zagregowane * Ziemniaki i marchewki w tej samej tabeli * itd. .. Skończyłem więc na całkowitym odizolowaniu mojej struktury bazy danych od mojego modelu domeny. W tym celu jednostki EF są ukryte w warstwie prezentacji. Celem jest umożliwienie łatwiejszej refaktoryzacji bazy danych przy jednoczesnym zmniejszeniu jej wpływu na aplikacje. ![Złożenia są rysowane jako komponenty](http://i.stack.imgur.com/5wjcD.png) Stoję teraz przed wieloma wyzwaniami i zaczynam zadawać sobie pytanie, czy robię wszystko dobrze. 1. Mój model domeny jest wysoce niestabilny, ewoluuje wraz z aplikacjami w miarę pojawiania się nowych potrzeb. Jego złożoność wciąż rośnie, a klasa, którą zawiera, zaczyna nabierać wielu właściwości. 2. Tworzenie strategii dołączania i ponowne rzutowanie do EF jest bardzo trudne (moje obiekty domeny nie mają żadnych właściwości relacji ładowania leniwego/chętnego): DomainInclude<Domain.Model.Bar>.Include("Customers").Include(" Customers.Friends") // To... IFooContext.Bars.Include(...).Include(...).Where(...) XPO lub `IQueryable` do filtrowania i stronicowania dużych zestawów danych) Zaczynam zadawać sobie pytanie, czy: * izolacja jednostek generowanych automatycznie EF jest niepotrzebnym kosztem. * Czy powinienem zezwolić frameworkom na trafienie `IQueryable`? Wolny stok do piekła? (naprawdę trudno jest wyizolować framework DevExpress, jakieś udane doświadczenie?) * Jak mogę obniżyć zmienność mojego modelu domeny? ## Precyzyjne **Izolacja EF i pola, które powinny lub nie powinny być uwzględniane w wywołaniach usługi** Oto jak izoluję jednostki EF. Warstwa prezentacji jest warstwą izolacji, ponieważ żadna prezentacja nie ma dostępu do klasy repozytoriów. // Wewnątrz klasy usług. W tym przykładzie Klient jest zdefiniowany w modelu usług // A osoba jest automatycznie generowana przez Entity Framework /// Pobierz klientów, którzy kupili element /// IEnumerable<Customer> GetCustomers(Item item){ var query = from person in _personRepository. GetItemBuyers(item.Id) select new Customer { Id = person.CustomerId , FirstName = person.FirstName , LastName = person.LastName , Sex = person.Sex == 'M' ? Płeć.Mężczyzna : Płeć.Kobieta}; zapytanie zwrotne; } Może to być czasochłonne, zwłaszcza gdy trzeba dołączyć (lub nie) niektóre właściwości relacji. Istnieje wiele rozwiązań umożliwiających włączenie: 1. GetCustomersWithOrders(pozycja elementu); 2. GetCustomers (pozycja elementu, IncludeStrategy<Customer> include); 3. GetCustomers(Item item, params string[] fieldsIncluded); 1. Obvioulsy spowoduje, że klasa usługi będzie zawierać tysiące GetCustomersWith...With... 2. Stworzy dużo dziedziczonej klasy IncludeStrategy. Nadal pracuję nad dynamicznym, płynnym podejściem `DomainInclude<Customer>.Include("Orders").Include("Friends")` 3. Będzie potrzebne utworzenie słownika mapowania "Orders" => "CustomerAccount.PayedOrders" **Frame uderzające w IQueryable** Repozytoria nie ujawniają IQueryable, celem jest ukrycie struktury encji. Datagrid Devexpress wymaga IQueryable, aby umożliwić stronicowanie/filtrowanie bez ładowania całej tabeli do pamięci. Znalezienie obejścia jest prawie niemożliwe, ponieważ będzie to naprawdę czasochłonne, a nowe wersje devexpress nie zapewniają przenośności tego obejścia. Moje pytanie brzmi: czy to wielka sprawa, aby umożliwić devexpress przechodzenie przez warstwy do klasy kontekstu EF. Czy powinienem zamiast tego porzucić Devexpress i użyć bardziej elastycznych datagridów (Sencha ExtJs, ...)


title: Co studiować w Grad School, jeśli chcę wiedzieć o językach programowania?

text: Słucham najnowszego podcastu w This Developer's Life, a wcześniej oglądałem tę rozmowę z wujkiem Bodem, Ostatni język programowania, a wraz z tym myślałem o powrocie do szkoły, więc w oparciu o fakt że bardzo lubię języki programowania, pomyślałem: dlaczego nie wrócić do szkoły na naukę języków programowania? Mam dyplom z systemów komputerowych (tak to się nazywa w Meksyku, jest to stopień, w którym zasadniczo dotykasz trochę matematyki, informatyki i inżynierii oprogramowania) i naprawdę nie mam pojęcia, co/gdzie iść, a zwłaszcza, jakie studia zrobić? Mam na myśli, czy powinienem studiować **lingwistykę**? czy powinienem iść i zdobyć stopień naukowy z **Informatyki**? Dzięki za odpowiedzi! ={D


title: Czy złą praktyką jest odejście z firmy tylko po to, by zacząć jako konsultant?

text: Jak mówi tytuł; czy złą praktyką jest odejście z firmy po kilku latach i rozpoczęcie pracy jako konsultant dla tego samego „klienta”? Miałem szczęście, że od samego początku trafiłem do firmy z branży naftowej, rozwijającej oprogramowanie dla stosunkowo nowej i nieużywanej technologii. Na długo zanim dostałem tę pracę, chciałem założyć własną firmę konsultingową. Czy to moralnie złe z mojej strony, że rzucę pracę po kilku latach tylko po to, by zatrudnić się jako „specjalista” lub konsultant ds. naszych systemów?


title: Czy programowanie funkcjonalne jest nadzbiorem zorientowanym obiektowo?

text: Im bardziej programuję funkcjonalnie, tym bardziej wydaje mi się, że dodaje to dodatkową warstwę abstrakcji, która wygląda tak, jak warstwa cebuli obejmuje wszystkie poprzednie warstwy. Nie wiem, czy to prawda, więc odchodząc od zasad OOP, z którymi pracowałem od lat, czy ktoś może wyjaśnić, w jaki sposób funkcjonalność przedstawia lub nie przedstawia dokładnie żadnej z nich: enkapsulacja, abstrakcja, dziedziczenie, polimorfizm Myślę, że możemy wszyscy mówią, tak, ma enkapsulację za pomocą krotek, czy też krotki liczą się technicznie jako fakt „programowania funkcjonalnego”, czy są tylko użytecznością języka? Wiem, że Haskell może spełnić wymagania dotyczące „interfejsów”, ale znowu nie jesteś pewien, czy jego metoda jest faktem funkcjonalnym? Domyślam się, że fakt, iż funktory mają podstawę matematyczną, można powiedzieć, że są one definitywnie zbudowane w oczekiwaniu na funkcjonał, może? Opisz szczegółowo, w jaki sposób Twoim zdaniem funkcjonalność spełnia lub nie spełnia 4 zasad OOP. Edycja: Rozumiem różnice między paradygmatem funkcjonalnym a paradygmatem obiektowym i zdaję sobie sprawę, że w dzisiejszych czasach istnieje wiele języków wieloparadygmatycznych, które mogą wykonywać obie te rzeczy. **Naprawdę szukam definicji tego, jak wprost fp (myśl purysta, jak haskell) może zrobić dowolną z 4 wymienionych rzeczy lub dlaczego nie może zrobić żadnej z nich. np. „Enkapsulacja może być wykonana z domknięciami”** (lub jeśli się mylę, proszę podać dlaczego).


title: Konkretne powody, dla których nadal używasz Subversion?

text: Chcę wybrać system kontroli wersji dla mojej firmy. Jak dotąd wiem, że mam Git, Subversion i Mercurial. Obecnie widzę, że Git jest najczęściej używany, więc zastanawiam się: czy byłby jakiś konkretny powód, aby nadal używać Subversion, czy powinienem przejść bezpośrednio do Git?


title: Pułapki związane z używaniem MySQL jako wyboru bazy danych?

text: Wiele razy czytałem w Internecie, że MySQL jest złą bazą danych. Miejsca, w których to czytałem, zawierają kilka wątków na Reddicie, ale nigdy nie zagłębiają się w _dlaczego_ to kiepski produkt. Czy jest jakaś prawda w tym twierdzeniu? Nigdy nie używałem go poza bardzo prostym scenariuszem CRUD, a był to projekt uniwersytecki podczas mojego drugiego roku. Jakie pułapki, **jeśli w ogóle**, występują przy wyborze MySQL jako bazy danych?


title: Zasada pojedynczej odpowiedzialności – czy nadużywam jej?

text: Dla odniesienia - http://en.wikipedia.org/wiki/Single_responsibility_principle Mam scenariusz testowy gdzie w jednym module aplikacji odpowiada za tworzenie wpisów księgowych. Istnieją trzy podstawowe zadania, które można wykonać - * Wyświetl istniejące wpisy księgi w formacie tabeli. * Utwórz nowy wpis księgi za pomocą przycisku Utwórz. * Kliknij wpis księgi w tabeli (wymieniony w pierwszym wskaźniku) i zobacz jego szczegóły na następnej stronie. Na tej stronie można anulować wpis do księgi. (Na każdej stronie jest jeszcze kilka operacji/walidacji, ale ze względu na zwięzłość ograniczę się do nich) Postanowiłem więc stworzyć trzy różne klasy - * LedgerLandingPage * CreateNewLedgerEntryPage * ViewLedgerEntryPage Te klasy oferują usługi, które można wykonać w tych strony i testy Selenium używają tych klas, aby doprowadzić aplikację do stanu, w którym mógłbym dokonać pewnych asercji. Kiedy przeglądałem to z jednym z moich kolegów, był oszołomiony i poprosił mnie o zrobienie jednej lekcji dla wszystkich. Chociaż nadal uważam, że mój projekt jest bardzo czysty, mam wątpliwości, czy nadużywam zasady pojedynczej odpowiedzialności


title: Czy istnieją algorytmy w świecie rzeczywistym, które znacznie przewyższają klasę poniżej?

text: Zeszłej nocy rozmawiałem z innym programistą, że nawet jeśli coś może być O(1), operacja, która jest O(n), może ją przewyższyć, jeśli w algorytmie O(1) występuje duża stała. On się nie zgodził, więc przyniosłem go tutaj. Czy istnieją przykłady algorytmów, które znacznie przewyższają te z klasy poniżej? Na przykład O(n) jest szybszy niż O(1) lub O(n2) jest szybszy niż O(n). Matematycznie można to zademonstrować dla funkcji z asymptotycznymi górnymi granicami, pomijając czynniki stałe, ale czy takie algorytmy istnieją w naturze? A gdzie znajdę ich przykłady? W jakich sytuacjach są używane?


title: Jaka jest różnica między poziomem umiejętności wśród programistów?

text: Jestem początkującym programistą i za 5-10 lat chciałbym zostać ekspertem. Uwielbiam programowanie, ponieważ jest to odrębny zestaw umiejętności, który możesz stale doskonalić. Ale potem pomyślałem, jak możesz ciągle się doskonalić? Czy w pewnym momencie nie wiesz po prostu, jak programować? Wyobrażam sobie, tak jak w większości rzeczy, w których można być świetnym, że na górze różnica w umiejętnościach jest prawdopodobnie minimalna. Więc co sprawia, że jest lepszym programistą? Czytelniejszy kod? Szybsze zrozumienie pojęć? Możliwość napisania posta na SO bez jego zamykania? (Czuję, że ten post jest skazany na zagładę, ale tak naprawdę jest to pytanie, nad którym się zastanawiałem.)


title: Licencja Open Source zapobiegająca odsprzedaży

text: Mam projekt open source, który jest dodatkiem do TFS (tj. jest przeznaczony dla programistów i osób korzystających z TFS). Obecnie korzysta z GPL. Ale przyszło mi do głowy, że GPL tak naprawdę nie reprezentuje tego, co próbuję zrobić z moją licencją. Chcę, aby mój kod był darmowy dla każdego, kto chce z niego korzystać. A jeśli go zmodyfikujesz i użyjesz, to też jest świetnie. Nie powinieneś otwierać swoich modyfikacji. Ale chciałbym zablokować komuś możliwość budowania mojego kodu i jego sprzedaży. Albo modyfikować i sprzedawać. (Każdy, kto chce to zrobić, powinien wynegocjować ze mną oddzielną licencję.) **Czy istnieje licencja typu open source, która uniemożliwia odsprzedaż, ale pozwala na pełne wykorzystanie bez sprzedaży osobie/firmie, która ją pobiera?**


title: Zasady programowania SOLID

text: Z biegiem czasu mogłem zrozumieć dwie części SOLID – „S” i „O”. „O” – nauczyłem się otwartej zamkniętej zasady za pomocą wzorca dziedziczenia i strategii. „S” – nauczyłem się zasady Single Responsibility podczas nauki ORM (logika trwałości jest zabrana z obiektów domeny). W podobny sposób, jakie są najlepsze regiony/zadania do nauki innych części SOLID („L”, „I” i „D”)? Bibliografia 1. msdn - Niebezpieczeństwa naruszenia zasad SOLID w C# 2. channel9 - Stosowanie S.O.L.I.D. Zasady w .NET/C# 3. Zasady OOPS (zasady SOLID)


title: Integrujesz funkcję żądania funkcji bezpośrednio z pisanym oprogramowaniem biznesowym?

text: Jakie są względne zalety czegoś takiego jak przycisk na niestandardowym bizware, który mówi „naciśnij mnie, aby poprosić o funkcję” lub „kliknij tutaj, jeśli coś nie działa poprawnie”. Problem, który próbuję rozwiązać, to ogólny brak formalności związanych z prośbami o nowe funkcje. A konkretnie szybkość, z jaką otrzymuję spacery od użytkowników końcowych. Przyjmowane pojedynczo może być korzystne, ale czasami może utrudnić produktywność na większą skalę. Czy ktoś coś takiego zrobił i czy był to generalny sukces, czy na przemian trochę strata czasu. Moje instynkty nie podpowiadają mi tutaj.


title: Jakie są wady implementacji singletona z enum w Javie?

text: Tradycyjnie singleton jest zwykle implementowany jako public class Foo1 { private static final Foo1 INSTANCE = new Foo1(); public static Foo1 getInstance(){ return INSTANCE; } private Foo1(){} public void doo(){ ... } } Dzięki enum w Javie możemy zaimplementować singleton jako public enum Foo2 { INSTANCE; public void doo(){ ... } } Choć druga wersja jest niesamowita, czy są jakieś wady? (Przemyśliłem to i odpowiem na własne pytanie; mam nadzieję, że masz lepsze odpowiedzi)


title: Czy ktoś ma dobry przykład/próbkę kodu spaghetti "goto"?

text: Dużo czytałem o tym, jak GoTo było uważane za szkodliwe i usuwane dla innych struktur kontrolnych, które były bardziej intuicyjne. Czy ktoś ma dobry przykład / próbkę kodu goto spaghetti? Najlepiej, aby przykładowy kod był trudny do naśladowania, ale naprawdę łatwy, gdy jest przepisany do bardziej konwencjonalnych struktur kontrolnych. Wiem, że mógłbym spróbować napisać ci własne, ale nigdy tak naprawdę nie używałem goto i nie sądzę, bym mógł to zrobić sprawiedliwie, ze względu na bóle głowy, do których może prowadzić jego nadużycie. Chcę to w celach dydaktycznych, aby nauczyć młodszych programistów, czego należy unikać. Głównie w celu zilustrowania, w jaki sposób OOP przenosi ten sam pomysł do następnej logicznej konsekwencji. EDYCJA: przez **dobry przykład** mam na myśli kod, który jest okropny w czytaniu i nadużywa go, a nie kod, który używa goto do rozsądnej optymalizacji


title: Dodawanie forum do istniejącej witryny

text: Mam witrynę z około 500 zarejestrowanymi użytkownikami, z których 300 to coś, co nazwałbyś "aktywnymi". Dane witryny są przechowywane w bazie danych MySQL. Chciałbym dodać forum myBB do strony, ale to pytanie dotyczy tak naprawdę każdego forum. To, czego bardzo chcę uniknąć, to wymaganie od moich użytkowników zarejestrowania się zarówno na stronie, jak i na forum, ponieważ moja baza użytkowników nie jest technicznie wykształcona, co wprawiłoby wielu z nich w zakłopotanie. Jednak oprogramowanie forum posiada własny system rejestracji, logowania, plików cookie i zarządzania hasłami, które naturalnie różnią się od mechaniki witryny. Przewiduję następujące możliwości: * Zainstaluj myBB w istniejącej bazie danych i dostosuj kod logowania, aby ujednolicić oba systemy. Prawdopodobnie oznaczałoby to zmianę kodu strony tak, aby korzystał z systemu myBB, ponieważ refaktoryzacja byłaby mniej bolesna i nie zaszkodziłaby przyszłym możliwościom aktualizacji myBB. * zainstaluj myBB w oddzielnej bazie danych i napisz pewnego rodzaju skrypt pomostowy, który automatycznie zarejestruje istniejących użytkowników witryny na forum, jeśli zdecydują się uczestniczyć. Sprawdź również nowe rejestracje na forum z listą nazw użytkowników witryny, aby uniemożliwić nowoprzybyłym przyjmowanie istniejących nazw. * uruchom je w pełni oddzielnie i zmuś użytkowników do ponownej rejestracji (najłatwiejsze dla MNIE, ale najmniej pożądane dla nich) Chciałbym sugerować sugerowany sposób działania od tych, którzy wcześniej szli tą ścieżką.


title: Dlaczego musimy umieścić N przed ciągami w Microsoft SQL Server?

text: Uczę się T-SQL. Z przykładów, które widziałem, aby wstawić tekst do komórki `varchar()`, mogę napisać tylko ciąg do wstawienia, ale w przypadku komórek `nvarchar()` każdy przykład poprzedza ciągi literą N. Próbowałem następujące zapytanie w tabeli, która ma wiersze `nvarchar()` i działa dobrze, więc prefiks N nie jest wymagany: wstaw do wartości [TableName] ('Hello', 'World') Dlaczego ciągi są poprzedzone N w każdym przykładzie, jaki widziałem? Jakie są zalety lub wady używania tego prefiksu?


title: Jak ustrukturyzować formularz zamówienia oparty na XML za pomocą ASP.NET?

text: Pierwsze pytanie tutaj; proszę pomóż mi, jeśli robię coś źle. Jestem grafikiem, który próbuje nauczyć się ASP.NET/C#. Moje tło po stronie serwera to PHP/WordPress i trochę ASP Classic, a kiedy robię kod, od początku nauki HTML prawie wszystko pisałem ręcznie. Tak więc, kiedy zacząłem uczyć się .NET, mój kod był bardzo ręczny i proceduralny. Teraz próbuję utworzyć naprawdę podstawowy formularz zamówienia, który pobiera z pliku XML w celu wypełnienia formularza; jest obraz, tytuł, cena i wybrane ilości. Gdybym tworzył ten formularz jako statyczny plik HTML, miałbym każde pole nazwane ręcznie, więc po ogłoszeniu zwrotnym mógłbym zapytać o każde pole, aby uzyskać wartości. Ale staram się to robić dynamicznie, abym mógł dodawać/usuwać elementy z formularza i nie musiał zmieniać kodu. Jeśli chodzi o wyświetlanie XML, stworzyłem własne, ładując `XmlDocument` i używając `XmlNodeList` i kilku pętli `foreach` do wyświetlania rzeczy. Następnie dowiedziałem się o `<asp:XmlDataSource>` i `<asp:Repeater>`, dzięki którym wyświetlanie XML stało się prostsze z dużym marginesem. Jednak naprawdę trudno mi było uzyskać dane, które zostały przesłane podczas ogłaszania zwrotnego (w SO sugerowano, że istnieją lepsze sposoby na uzyskanie danych niż zagnieżdżone elementy RepeaterItems). Do tej pory nauczyłem się, że możesz robić rzeczy na wiele różnych sposobów w .NET. dlatego pomyślałem, że dobrze byłoby zapytać o odpowiedzi dotyczące najlepszego sposobu użycia ASP.NET do wyświetlania dokumentu XML i dynamicznego przechwytywania przesłanych danych. Każda pomoc jest mile widziana! Używam Notepad ++ do kodu .NET 2.0.


title: Znajdź nowe współrzędne za pomocą punktu początkowego, odległości i kąta

text: Ok, powiedzmy, że mam współrzędną punktu. var współrzędna = { x: 10, y: 20 }; Teraz mam też odległość i kąt. var odległość = 20; var kąt = 72; Problem, który próbuję rozwiązać, polega na tym, że jeśli chcę przejechać 20 punktów w kierunku kąta od współrzędnych początkowych, jak mogę znaleźć nowe współrzędne? Wiem, że odpowiedź dotyczy takich rzeczy jak sinus/cosinus, ponieważ kiedyś wiedziałem, jak to zrobić, ale od tego czasu zapomniałem o formule. Czy ktoś może pomóc?


title: Jeśli Twój zespół przeprowadza przegląd kodu, w jakim stopniu sprawdzasz, czy wprowadzane są poprawki przeglądu?

text: W moim zespole przeprowadzamy przeglądy kodu (bez użycia narzędzi zewnętrznych). Recenzent tworzy listę elementów, do których programista powinien się odnieść lub rozważyć, a następnie zasadniczo pozostawia je mu (po omówieniu z nim odpowiednich punktów) bez kontynuowania ich późniejszych zmian. Sporadyczne kontrole wyrywkowe sugerują, że w większości przypadków uwzględniane są wszystkie uwagi. Jednak w wielu publikacjach na temat przeglądów kodu kładzie się duży nacisk na weryfikację, czy komentarze do przeglądu kodu są adresowane. Zastanawiam się, co ludzie sądzą na ten temat. Czy Twój zespół ma (lub miał) problemy z osobami, które nie odpowiadają na komentarze? Czy Twój zespół zachowuje się jak mój i nie wykonuje kroku weryfikacji? Jeśli Twój zespół wykona krok weryfikacyjny, jak często będzie to tylko ćwiczenie z pieczątką?


title: Dlaczego nie możemy wstawiać do plików bez dodatkowych zapisów? (Nie mam na myśli dołączania ani nadpisywania)

text: Jest to dla mnie problem niezależny od języka programowania. Mam plik z zawartością aaabddd Kiedy chcę wstawić `C` za `b` to **mój kod** musi przepisać `ddd` aby otrzymać aaabCddd Dlaczego nie mogę po prostu wstawić `C` w tej pozycji? Nie mogę tego zrobić w Javie, Pythonie, ... . Nie mogę tego zrobić w Linuksie, Windowsie, ... . Czy mam rację? Nie rozumiem, dlaczego nie można po prostu wstawić `C` bez dodatkowych zapisów. Czy ktoś mógłby wyjaśnić, dlaczego tak jest?


title: Programowanie za pomocą oprogramowania do rozpoznawania głosu

text: Kilka lat temu bardzo krótko korzystałem z Dragon Naturally Speaking i zastanawiałem się, czy byłoby to realne rozwiązanie do programowania? Myślałem bardziej, jeśli złamiesz rękę lub coś, co byłoby poważną przeszkodą w programowaniu. To samo pytanie na SO, ale nigdy nie udzielono odpowiedzi.


title: Czy DVCS zniechęcają do ciągłej integracji?

text: Załóżmy, że istnieje zespół dziesięciu programistów Agile. Każdego dnia każdy z nich wybiera zadanie z tablicy, wprowadza do niego kilka zmian, aż (pod koniec dnia) zakończy zadanie. Wszyscy programiści meldują się bezpośrednio w trunku (w stylu Google, każde zatwierdzenie jest kandydatem do wydania, przy użyciu przełączników funkcji itp.). Jeśli używali scentralizowanego CVS, takiego jak SVN, za każdym razem, gdy jeden z nich zatwierdzi, serwer kompilacji zintegruje i przetestuje ich zmiany w stosunku do pracy pozostałych dziewięciu programistów. Serwer kompilacji będzie działał nieprzerwanie przez cały dzień. Ale jeśli używali DCVS, takiego jak git, programista może poczekać, aż ukończy zadanie, zanim przekaże wszystkie swoje lokalne zatwierdzenia razem do centralnego repozytorium. Ich zmiany nie zostaną zintegrowane do końca dnia. W tym scenariuszu zespół SVN stale integruje się częściej i odkrywa problemy z integracją znacznie szybciej niż zespół git. Czy to oznacza, że DVCS są mniej odpowiednie dla zespołów pracujących w trybie ciągłym niż starsze scentralizowane narzędzia? Jak radzicie sobie z tym problemem odroczenia?


title: Projekt OOP - Ewentualne niewłaściwe podejście uniemożliwia zaimplementowanie go w kodzie

text: W ostatnim semestrze miałem wykłady na temat projektowania OOP, zrozumiałem większość tego, co powinienem, ale jest coś, czego nie mogę zrobić dobrze. Jestem prawie pewien, że tworzone przeze mnie modele są błędne, ponieważ nie można ich zaimplementować. Dużo pisałem, bo nie wiem, gdzie jest problem. To nie jest praca domowa, to próbka problemu z zeszłego roku. Przykład: Zaprojektuj coś podobnego do „Stackoverflow” dla klasy. Przypadek użycia: Zamieszczenie pytania Warunki wstępne: Istnieje uwierzytelniony uczeń warunki wstępne: Pytanie zostało nagrane i każdy, kto może je przeczytać, został powiadomiony. Scenariusz: 1. Uczeń mówi systemowi, że chce zadać pytanie i podaje tytuł 2. System prosi o treść pytania. 3. Student składa treść pytania. 4. System rejestruje to. 5. System zgłasza wszystkie użyte tagi pytań w klasie tego ucznia. 6. Uczeń przesyła wybrany tag pytania 7. System zapisuje wszystko i zgłasza użyte tagi 8. Uczeń mówi, czy chce, aby pytanie było publiczne 9. System rejestruje wszystko i powiadamia osoby, które powinien. Kroki 6, 7 mogą powtarzać, dopóki użytkownik nie powie nam, że skończył. Istnieją rozszerzenia, ale nie są konieczne, aby zademonstrować mój problem. Jak mam to zrobić: Diagram sekwencji systemu newQuestion(title) ------------------> OK <---------------- -- submitBody(bodytext) -------------------> _ | LOOP Istniejące tagi | <------------------- | | wybierzznacznik(znacznik) | -------------------> | _ selectVisibility(b) -------------------> OK <------------------ Model domeny będzie have: Student Class Instructor Question Tag StudentCatalog InstructorCatalog Relacje między sobą są proste (tak sądzę), dlatego tego nie szkicuję. Zauważyłem mój problem podczas tworzenia diagramu interakcji dla tego przypadku użycia. Zdecydowałem, że kontroler przypadków użycia będzie zmyśloną klasą „obsługi” QuestionHandler, więc pierwsze dwa diagramy interakcji, które uważam za coś takiego: newQuestion(title) - musi utworzyć pytanie z odpowiednim tytułem submitBody( bodytext) - musi ustawić, że bodytext zawiera tekst dla pytania, które tworzymy (i nie wiem, gdzie on jest!) **Prawdziwy problem:** Z tego wszystkiego wyobrażam sobie kod: klasa Metoda QuestionHandler postQuestion(tytuł) { nowe pytanie(tytuł); submitBody(treść treści); ... itd } I nie widzę, żeby to działało w ten sposób, mój problem skąd "submitBody(bodytext)" pobiera currentQuestion? Jak poradzić sobie z „kontekstem” każdego przypadku użycia, który w tym przypadku sprawiłbym, że byłby bałagan (tak mi się wydaje) i użyj wartości zwracanych, aby to zadziałało. Ale co, jeśli mam „kontekst” przypadku użycia, który wymaga ode mnie wielu zmian i przemieszczania się? Jestem całkowicie zagubiony, myślałem, że to samo się rozwiąże, ale okazuje się, że nie widzę, jak będzie to zaimplementowane w tym problemie.


title: Open source z chronionych praw

text: Mam pytanie dotyczące praw autorskich i oprogramowania open source. Zakładając, że chcę zbudować oprogramowanie. Podobne oprogramowanie zostało już stworzone, ale nie jest w ogóle darmowe i należy do firmy. Czy można zbudować od podstaw klon oprogramowania własnościowego typu open source? Czy jest to zabronione przez własność intelektualną? A co jeśli wykorzystam autorskie pomysły w oprogramowaniu open source?


title: Przypisanie odpowiedzialności za anulowanie Zamówienia

text: Podczas rozmowy z naszym Ekspertem Domenowym możemy przejść do tej funkcji: > Agent obsługi klienta może anulować Zamówienie zmniejszając jego ilość. Aby > anulować zamówienie, zmniejszamy jego ilość o określoną ilość, zmieniamy > jego status na częściowo anulowane lub całkowicie anulowane i rejestrujemy agenta CS >, który dokonał anulowania. Obecnie jesteśmy podzieleni na kilka rozwiązań (zakładając, że mamy `agentId`, `orderId` i `cancelledQty` z żądania): **Rozwiązanie 1:** CSAgent agent= (CSAgent) EmployeeRepository.getById(agentId); Order order= OrderRepository.getById(orderId); agent.cancel(zamówienie,anulowanailość); vs **Rozwiązanie 2:** CSAgent agent= (CSAgent) EmployeeRepository.getById(agentId); Order order= OrderRepository.getById(orderId); order.cancel (anulowana ilość, agent); **Rozwiązanie 1** naprawdę oddaje to, co przekazują wymagania i naprawdę dobrze się czyta; jednakże **rozwiązanie 2** wydaje się bardziej naturalne podczas kodowania implementacji metody cancel(), ponieważ będę głównie aktualizował pola w samej klasie `Order`, które mam nadzieję zachować jako `prywatne` bez publicznych ustawiających. Jedyne, czego potrzebuję od klasy `CSagnet`, to zrzut jej danych, który ma być przechowywany wraz z poleceniem `Order`. Jak więc określić najlepszy sposób działania z perspektywy DDD?


title: Wyjątek zaznaczony a niesprawdzony podczas walidacji dokumentów w tej usłudze

text: Posiadam usługę, która pozwala użytkownikom dodawać dynamiczną zawartość do repozytorium. Więc zasadniczo mam ogólną klasę Document, która zawiera listę właściwości dla tego konkretnego obiektu w zależności od typu dokumentu dodawanego przez użytkownika (np. dokument faktury ma właściwość numeru faktury, podczas gdy dokument wiki ma właściwość autora, i tak na). Usługa składa się z różnych warstw i w pewnym momencie mam klasę, która musi sprawdzić, czy dokument, który ma zostać dodany, jest zgodny z konfiguratorem reguł, oceniając, czy wszystkie wymagane właściwości są podane, czy wszystkie są odpowiedniego typu itp. .Jeśli którakolwiek z tych walidacji nie powiedzie się, chcę zgłosić niestandardowy wyjątek, który zawiera stan walidacji. Pytanie brzmi: * Czy mój wyjątek ValidationException powinien być zaznaczony czy odznaczony? Czytałem wiele najlepszych praktyk dotyczących decydowania o rodzaju użycia wyjątków. Myślałem o użyciu RuntimeException, ale w tym przypadku wyjątek nie jest spowodowany błędem w kodowaniu lub podobnymi rzeczami, ale tylko przez dane wejściowe użytkownika ... Z drugiej strony użycie sprawdzonego wyjątku oznaczałoby propagowanie składni "zrzuca" w całą powyższą warstwę aplikacji i prawdopodobnie w 90% metod usługi, dzięki czemu kod jest znacznie mniej czytelny i łatwy w utrzymaniu.


title: Skalowanie platformy Azure w ramach subskrypcji

text: Ostatnio dużo pracuję z maszynami wirtualnymi i widzę ogromne zalety tej platformy. Jak rozumiem, subskrypcje to bardzo dobry sposób na zarządzanie klientami. Na przykład mam oprogramowanie, które wymaga maszyny wirtualnej, bazy danych SQL i dwóch stron internetowych. Kiedy rejestruję nowego klienta, tworzę nową subskrypcję, za którą płacą i wdrażam w niej moje różne komponenty - otrzymują rachunek za hosting. Jednak wydaje mi się, że Azure nie skaluje się szczególnie dobrze, gdy mam stu lub tysiąc klientów. Rozumiem, że potrzebowałbym profilu publikowania dla każdego z nich i za każdym razem, gdy tworzymy wydanie, musiałbym wdrożyć 400 komponentów. Czy istnieje lepszy sposób zarządzania wieloma instancjami Twojego rozwiązania?


To jest coś, co niepokoi mnie już od jakiegoś czasu. Czy rzeczywiście warto testować jednostkowo klienta API? Załóżmy, że tworzysz małą klasę, aby oddzielić wywołania interfejsu API REST sklepu zoologicznego. Sklep zoologiczny jest bardzo prostym API i posiada podstawowy zestaw metod: * `listProducts()` * `getProductDetails(ProductID)` * `addProduct(...)` * `removeProduct(ProductID)` musielibyśmy albo stworzyć usługę próbną, albo wyśmiewać odpowiedzi. Ale to wydaje się przesadą; Rozumiem, że chcemy mieć pewność, że nasze metody nie przestaną działać z powodu błędów literówek/składni, ale ponieważ piszemy funkcje, które wywołują metody zdalne, a następnie tworzymy fałszywe odpowiedzi z tych metod zdalnych, wydaje się, że to strata wysiłku i że testujemy coś, co naprawdę nie może zawieść. Co gorsza, jeśli zmieni się metoda zdalna, nasze testy jednostkowe przejdą, podczas gdy użycie produkcyjne nie powiedzie się. Jestem prawie pewien, że czegoś przeoczyłem, albo mam niewłaściwy koniec kija, albo nie widzę drewna na drzewa. Czy ktoś może naprowadzić mnie na właściwy tor?


title: Po co używać plików binarnych do układania różnych wersji w DMS?

text: Używałem zarówno Liferay, jak i Alfresco, próbując wykorzystać je jako system zarządzania dokumentami w intranecie. Zauważyłem, co następuje: * Używają systemu plików i bazy danych do przechowywania plików * Używają identyfikatora GUID do nazwy pliku w systemie plików i ten identyfikator GUID jest używany jako identyfikator w bazie danych. * Plik o nazwie GUID jest plikiem binarnym * Plik binarny o nazwie GUID przechowuje wszystkie wersje danego pliku * Ścieżka do pliku w DMS nie jest zgodna ze ścieżką w systemie plików * Adres URL zawiera odniesienie do GUID, gdy wymagany jest określony plik. Chcę wiedzieć, dlaczego tak się dzieje i jaki byłby najlepszy sposób na zrobienie tego. Na przykład, jak utworzyć plik binarny (zip?) I jakie części zachowałbyś w pliku binarnym, a jakie części przechowywałbyś w bazie danych (metadane, ścieżka?). Zakładam pewne korzyści z robienia tego w ten sposób. Jako mający ten sam adres URL pliku, niezależnie od jego aktualnej ścieżki dokumentu. I posiadanie tylko jednego pliku, nawet jeśli z czasem zmienił nazwę.


title: Czy wydawanie oprogramowania w noc przed Świętami Bożego Narodzenia to zły pomysł?

text: Niedługo udostępnimy nową wersję naszego systemu. Zbliża się Boże Narodzenie. Pracuję w bardzo małej firmie. Wszyscy będą na urlopie lub sporadycznie będą dostępni w ciągu najbliższego tygodnia. Pokłóciłem się z moim szefem, że to bardzo ryzykowne i że powinniśmy zacząć żyć w nowym roku, kiedy wszyscy wrócą i kiedy będziemy mogli zapewnić pełne wsparcie. Jest niezachwiany – twierdzi, że musimy rozpocząć transmisję wcześniej – aby pozyskać nowych użytkowników i większe przychody, których potrzebujemy. Liczba nowych użytkowników będzie niewielka w ciągu najbliższego tygodnia. Przeprowadzono przyzwoitą ilość testów systemowych w systemie. Jednak z mojego doświadczenia wynika, że nowy system na żywo wymaga wiele uwagi i uwagi w ciągu pierwszych kilku dni. Jestem pesymistą czy realistą? Aktualizacja – styczeń: System nie został uruchomiony w okresie Bożego Narodzenia. Trwające testy systemu ujawniły różne problemy. Więc nie ma problemów z obsługą. Wciąż przygotowujemy się do wydania...


title: Odwrotna podtablica tablicy z O(1)

text: Mam pomysł, jak zaimplementować odwracanie podtablicy za pomocą O (1), nie uwzględniając prekalkulacji, takiej jak odczytywanie danych wejściowych. Będę miał wiele operacji odwrotnych i nie mogę użyć trywialnego rozwiązania O(N). **Edycja:** Aby było bardziej jasne, chcę zbudować strukturę danych za tablicą z warstwą dostępu, która wie o odwracaniu żądań i odwraca logikę indeksowania w razie potrzeby, gdy ktoś chce iterować po tablicy. **Edycja 2:** Struktura danych będzie używana tylko w iteracjach. Czytałem to i to, a nawet to pytania, ale one nie pomagają. Istnieją 3 przypadki, którymi należy się zająć: * Regularna operacja odwrotna * Odwrócenie tego, w tym odwrócony obszar * Przecięcie między odwrotnością a częścią innego odwróconego obszaru w tablicy Oto moja implementacja dla pierwszych dwóch części, będę potrzebować twojej pomocy z ostatnim. To jest klasa reguły: class Rule { public int beginIndex; waga publiczna; } Jest używany w mojej podstawowej strukturze danych Miasto: public class Miasto { Reguła reguły; prywatny statyczny AtomicInteger _counter = new AtomicInteger(-1); publiczny końcowy int id = _counter.incrementAndGet(); @Override public String toString() { return "" + id; } } To jest główna klasa: public class CitiesList implementuje Iterable<City>, Iterator<City> { private int position; prywatny kierunek int = 1; prywatne miasta ArrayList<City>; private ArrayDeque<City> citiesQeque = new ArrayDeque<>(); private LinkedList<Rule> rulesQeque = new LinkedList<>(); public void init(ArrayList<City> cities) { this.cities = cities; } public void swap(int index1, int index2){ Rule rule = new Rule(); rule.weight = Math.abs(indeks2 - indeks1); miasta.get(indeks1).rule = reguła; miasta.get(indeks2 + 1).rule = reguła; } @Override public void remove() { throw new IllegalStateException("Nie zaimplementowano"); } @Override public Miasto next() { Miasto miasto = miasta.get(pozycja); if (citiesQeque.peek() == miasto){ citiesQeque.pop(); Zmień kierunek(); pozycja += (miasto.rule.weight + 1) * kierunek; miasto = miasta.get(pozycja); } if(city.rule != null){ if(city.rule != rulesQeque.peekLast()){ rulesQeque.add(city.rule); pozycja += miasto.zasada.waga * kierunek; Zmień kierunek(); miastaQeque.push(miasto); } else{ rulesQeque.removeLast(); pozycja += kierunek; } } else{ pozycja += kierunek; } powrót miasto; } private void changeDirection() { kierunek *= -1; } @Override public boolean hasNext() { return position < cities.size(); } @Override public Iterator<Miasto> iterator() { pozycja = 0; zwróć to; } } A oto przykładowy program: public static void main(String[] args) { ArrayList<City> list = new ArrayList<>(); for(int i = 0 ; i < 20; i++){ list.add(new City()); } CitiesList citiesList = new CitiesList(); miastaList.init(lista); for (Miasto miasta : citiesList) { System.out.print(miasto + " "); } System.out.println("\n******************"); miastaLista.swap(4, 8); for (Miasto miasta : citiesList) { System.out.print(miasto + " "); } System.out.println("\n******************"); miastaLista.swap(2, 15); for (Miasto miasta : citiesList) { System.out.print(miasto + " "); } } Jak obsłużyć odwrotne skrzyżowania?


title: Jak napisać dobrą wiadomość o wyjątku

text: Obecnie robię przegląd kodu i jedną z rzeczy, które zauważam, jest liczba wyjątków, w których komunikat o wyjątku wydaje się powtarzać _gdzie_ wystąpił wyjątek. np. throw new Exception("BulletListControl: CreateChildControls nie powiodło się."); Wszystkie trzy punkty w tej wiadomości mogę wypracować na podstawie reszty wyjątku. Znam klasę i metodę ze śladu stosu i wiem, że nie powiodło się (bo mam wyjątek). To sprawiło, że pomyślałem o tym, jaką wiadomość umieściłem w wiadomościach o wyjątkach. Najpierw tworzę klasę wyjątku, jeśli jeszcze nie istnieje, z ogólnego powodu (np. `PropertyNotFoundException` \- the _why_ ), a następnie, gdy ją wyrzucam, komunikat wskazuje, co poszło nie tak (np. „Nie można znaleźć właściwości 'IDontExist ' w węźle 1234" - _co_ ). Gdzie znajduje się w „StackTrace”. _Kiedy_ może znaleźć się w dzienniku (jeśli dotyczy). _Jak_ jest dla programisty do wypracowania (i naprawienia) Czy masz jakieś inne wskazówki dotyczące zgłaszania wyjątków? W szczególności w odniesieniu do tworzenia nowych typów i komunikatu o wyjątku.


title: Pytanie dotyczące czasu trwania

text: Mam tablicę A składającą się z n liczb całkowitych, posortowaną od min do max, oraz dwie liczby a<=b, o których wiadomo, że są w A. Chciałbym napisać pseudokod dla procedury, której czas działania to c1+c2log (n) i która zwraca liczbę elementów w A, które spełniają a<=A[i]<=b. Napisałem co następuje, ale nie jestem pewien, czy spełnia wymagania dotyczące czasu działania i byłbym wdzięczny za pomoc: _NB <\- oznacza strzałkę_ LBound(Input: integer n, posortowana tablica liczb całkowitych A, integer a) { min ← 1 max ← n while (min <= maks) { mid ← | _ (min  + maks) / 2_| if (A[mid] < a) min ← mid + 1 else max ← mid - 1 } output(min) } LBound(Input: integer n, posortowana tablica liczb całkowitych A, integer a) { min ← 1 max ← n while (min <= maks) { średni ← | _ (min  + maks) / 2_ | if (A[mid] > b) max ← mid - 1 else min ← mid + 1 } output(max) } Range(Input: integer n, posortowana tablica liczb całkowitych A) { output (1 + UBound(n,A, b) – LBound(n,A,a)) }


title: Naprawianie nagłego poważnego problemu w oprogramowaniu

text: Na przykład firma, która korzysta z naszego oprogramowania, nagle znalazła poważny błąd i nie może dalej działać. Błąd ujawnił duży problem w projektowaniu oprogramowania i naprawienie go zajmie kilka dni. Jakie jest najlepsze podejście do rozwiązania takich problemów? Co programiści powinni zrobić: zacząć przepisywać kod, aby naprawić błąd, najpierw napisać szybką poprawkę itp.?


title: Jak promować ponowne wykorzystanie kodu i dokumentację?

text: Jako lider zespołu liczącego ponad 10 programistów chciałbym promować ponowne wykorzystanie kodu. Napisaliśmy dużo kodu — wiele z nich powtarza się w ciągu ostatnich kilku lat. Problem polega na tym, że wiele z tych kodów to po prostu duplikaty innego kodu lub ich niewielka odmiana. Rozpocząłem ruch (dyskusja) na temat tego, jak przerobić kod na komponenty, aby można je było ponownie wykorzystać w przyszłych projektach, ale problem polega na tym, że boję się, że nowi programiści lub inni programiści, którzy nie znają komponentów, po prostu pójdą do przodu i pisać własne rzeczy. Czy mimo to należy przypomnieć programistom, aby ponownie wykorzystali komponenty/ulepszyli dokumentację/ wnosili wkład w podstawowy komponent zamiast duplikować istniejący kod i go poprawiać lub po prostu pisać własny? Jak sprawić, by komponenty były łatwe do odnalezienia, łatwe w użyciu, aby wszyscy z nich korzystali? Edycja: Myślę, że każdy programista wie o zaletach komponentów wielokrotnego użytku i chce ich używać, po prostu nie wiemy, jak sprawić, by były wykrywalne. Ponadto programiści, kiedy piszą kod, wiedzą, że powinni pisać kod wielokrotnego użytku, ale nie mają do tego motywacji.


title: Czy kod o niskim opóźnieniu czasami musi być „brzydki”?

text: (Jest to skierowane głównie do tych, którzy mają konkretną wiedzę na temat systemów o niskim opóźnieniu, aby uniknąć osób, które odpowiadają bezpodstawnymi opiniami). Czy uważasz, że istnieje kompromis między pisaniem „ładnego” kodu obiektowego a pisaniem bardzo szybkiego kodu o niskim opóźnieniu? Na przykład unikanie funkcji wirtualnych w C++/narzut związany z polimorfizmem itp. – przepisywanie kodu, który wygląda paskudnie, ale jest bardzo szybki itp.? Ma to sens – kogo to obchodzi, jeśli wygląda brzydko (o ile można go utrzymać) – jeśli potrzebujesz szybkości, potrzebujesz szybkości? Chciałbym usłyszeć od osób, które pracowały w takich dziedzinach.


title: Szkolenie początkującego testera

text: Szkolę inżyniera świeżo po studiach do pracy nad testowaniem (zarówno testowanie ręczne, jak i automatyczne). Jakie są możliwe sposoby na to? (książki, filmy, strony z testami beta itp.) Oczywiście będę również używał tej osoby w naszym kodzie, ale interesuje mnie również, aby ta osoba uzyskała szerszy zakres wiedzy testowej, którą mogą następnie wnieść do naszego projektu.


title: Obsesja, ile to za dużo?

text: Mam 17 lat i zacząłem programować i czytać SE cały dzień, każdego dnia. Uwielbiam to i chcę programować na życie, ale ile to za dużo? Czy niezdrowe jest ciągłe siedzenie przy komputerze? Czy to tylko faza? Czy ci się to przydarzyło? Jeśli tak, co z tym zrobiłeś?


title: Oczekiwane zachowanie, gdy żądanie kolekcji będzie zawierało zero elementów

text: Załóżmy, że otrzymujesz następujące... List<Thing> theThings = fubar.Things.All(); Gdyby nie było nic do zwrócenia, czego można by się spodziewać po zwróceniu funkcji fubar.Things.All()? Edycja: Dzięki za opinie. Poczekam trochę i przyjmę wpis z największą liczbą wzlotów. Zgadzam się z dotychczasowymi odpowiedziami, szczególnie tymi sugerującymi pustą kolekcję. Dostawca dostarczył API z kilkoma wywołaniami podobnymi do powyższego przykładu. Dostawca, który w zeszłym roku zarobił 4,6 miliona dolarów za pośrednictwem swoich interfejsów API, BTW. Robią coś, z czym zasadniczo się nie zgadzam — rzucają wyjątek.


title: Jaki powinien być plan działania dla JAVA EE

text: Zrobiłem Java SE i chcę uruchomić JAVA EE. Ale jestem bardzo zdezorientowany, od czego mam zacząć. Więc proszę, powiedz mi mapę drogową, od czego zacząć Java EE?


title: Planowanie przejścia do sektora finansowego

text: Planuję dostać pracę w dziedzinie oprogramowania finansowego. Mam duże doświadczenie w programowaniu (10 lat), ale żadnego w oprogramowaniu finansowym. Mam podstawową wiedzę na temat pojęć finansowych, ale zastanawiam się, jakiego oprogramowania finansowego szukają przy doborze pracowników. Dziękuję


title: Jak przyrostowo aktualizować bazę danych podczas wdrażania strony internetowej?

text: Używamy JSF zamiast Tomcata wraz z zastrzeżoną bazą danych wspierającą. Chcę wiedzieć, jak powinno być obsługiwane dodawanie nowych pól bazy danych lub/i procedur składowanych podczas wdrażania nowej wersji aplikacji. Wdrażamy, wysyłając plik WAR do zespołu hostingowego, dlatego nasz plik WAR powinien być w stanie skonfigurować procedurę składowaną po jej uruchomieniu. Jakie są możliwe odpowiednie strategie, aby móc przyrostowo aktualizować bazę danych?


title: Czy mówimy obiektowi, żeby coś zrobił, czy też robimy coś (na/z/do/itd.) z obiektem?

text: Weźmy (bezprecedensowy i przełomowy) przykład kalkulatora: public class Calculator { public double Add(double augend, double addend) { return augend + addend; } } Kiedy piszę `calculator.Add(val1, val2)` co robię? * Mówienie kalkulatorowi, aby dodał dane wejściowe * Dodawanie danych wejściowych za pomocą kalkulatora (Można też zapytać: "Czy jest to metoda _z_ obiektu, czy jest to metoda _na__ obiekcie?") Inne przykłady: czy mówimy repozytorium, aby dodało encji czy dodajemy encję do repozytorium? Czy mówimy usłudze wiadomości, aby dostarczyła wiadomość, czy wysyłamy wiadomość za pośrednictwem usługi wiadomości? Czy mówimy puszce z farbą, żeby się wymieszała, czy też mieszamy puszkę z farbą?


title: Dostęp do elementów pojemnika ze wzorem

text: Mam dwie klasy C++ z relacją: klasę kontenera, która ma listę elementów. Na przykład biblioteka ma wiele książek. Zajęcia to biblioteka i książka. Teraz ze świata zewnętrznego muszę tworzyć, aktualizować i usuwać książki. Ponadto istnieją inne klasy, które są zainteresowane wiedzą, kiedy ma miejsce zdarzenie w książce, a te instancje (obserwatorzy) mogą być tworzone w czasie wykonywania. Teraz mam różne sposoby postępowania: 1) Zawsze używaj kontenera do wykonania operacji: centralny punkt zarządzania, ale muszę stworzyć kilka metod, na przykład setTitle(bookID), które wywołują setTitle() w książce, źle; 2) Użyj getBook() na kontenerze, aby zwrócić odwołanie do książki, zezwól na modyfikację, w tym momencie muszę użyć metody commit, aby powiadomić kontener, który może powiadomić obserwatora, ale w ten sposób wzorzec nie wymusza "zatwierdzenie", to znaczy, jeśli zewnętrzny wywołujący nie wywoła commit(), tracę :) 3) Użyj getBook() na kontenerze, aby zwrócić kopię książki i metody aktualizacji kontenera, aby nadpisać książka, znowu centralny punkt zarządzania, ale książka, jeśli jest duża, jest problemem, wiele egzemplarzy jest naprawdę kiepska. Jakieś wskazówki? Czy istnieje jakiś wzorzec, który obejmuje ten przypadek użycia?


title: Sprawdzanie współbieżności z czasem ostatniej zmiany

text: Mam aplikację z następującymi trzema tabelami 1. E-mail (emailNumber, Address) 2. Odbiorcy (reportNumber, emailNumber, lastChangeTime, status) 3. Raport (reportNumber, reportName) Mam aplikację `C#`, która używa wbudowanych zapytań o dane wybór. Mam zapytanie wybierające, które wybiera wszystkie raporty i ich adresatów. Odbiorcy są wybierani jako ciąg oddzielony przecinkami. Podczas aktualizacji muszę sprawdzić `współbieżność`. Obecnie używam **MAX(lastChangeTime)** dla każdego reportNumber. Jest to wybrane jako maxTime. Przed aktualizacją sprawdza, czy lastChangeTime <= maxTime. --//Działa dobrze Jeden z moich współprogramistów zapytał, dlaczego nie użyć `GETDATE()` jako „maxTime” zamiast użyć operacji `MAX`. To też działa. Tutaj sprawdzamy, czy rekordy nie są aktualizowane po `czasie wyboru rekordu`. Czy istnieją jakieś pułapki w używaniu metody `GETDATE()` do tego celu?


title: Jak działa ładowanie strony Google plus

text: W Google plus, kiedy klikam profil Google plus lub dowolny link Google plus, strona zostaje przekierowana do tego linku bez pełnego załadowania strony, ale zmienił się adres URL i dodano rekord do historii przeglądarki. Jak to zrobić? Czy jest jakiś tutorial lub dokument?


title: Jaki język był „standardowy” w programowaniu Apple przed osiągnięciem celu C?

text: Nie sądzę, aby Objective C był używany od początku rozwoju sprzętu Apple. Jakich języków używali twórcy aplikacji na wcześniejszych komputerach Apple, takich jak Apple II czy Mac Classic?


title: Dlaczego nie użyć słowa bug zamiast wyjątku?

text: Jeśli nazywamy wyjątki błędami, dlaczego nie nazwać tego po prostu błędem, a nie wyjątkiem? Jeśli w kodzie nazywa się to wyjątkiem, a jak tylko się pojawi, nazywa się to błędem. Dlaczego więc nie nazwać tego błędem? Dziękuję za każdą odpowiedź lub komentarz.


title: Jak często szybkość oprogramowania widoczna jest w oczach klientów?

text: Teoretycznie klienci powinni być w stanie odczuć poprawę wydajności oprogramowania z własnego doświadczenia. W praktyce czasami ulepszenia nie są na tyle zauważalne, że aby z nich spieniężyć, konieczne jest wykorzystanie cytowalnych wyników w marketingu w celu przyciągnięcia klientów. Znamy już różnicę między postrzeganą wydajnością (opóźnienie GUI itp.) a wydajnością po stronie serwera (maszyny, sieci, infrastruktura itp.). Jak często programiści muszą poświęcać więcej czasu na „napisanie” analiz wydajności, których odbiorcami nie są koledzy programiści, ale menedżerowie i klienci?


title: Hosted Mercurial z narzędziami do zarządzania projektami

text: Użyłem wcześniej kilku hostowanych SCM, takich jak Unfuddle i Codespaces i podoba mi się, że mają wbudowane narzędzia do zarządzania projektami. Zacząłem używać Mercurial i naprawdę mi się podoba, chciałbym się na to przełączyć, ale mogę Wydaje się, że nie można znaleźć żadnych hostowanych rozwiązań mercurial, które zawierają narzędzia do zarządzania projektami. Czy ktoś zna jakieś hostowane rozwiązania, które mają repozytoria mercurial z rozwiązaniami do zarządzania projektami? Podobnie jak Aseembla, CodeSpaces, Unfuddle itp. Wiem, że istnieje BitBucket, ale nie widzę żadnych narzędzi do zarządzania projektami. EDYCJA: Szczegóły dotyczące rodzajów narzędzi, których szukam. Jest dla bardzo małego zespołu, 2-5 osób. Poszukuje narzędzi Agile (lub zbliżonych do Agile). Na przykład w CodeSpaces jest ściana kart, Assembla ma solidny system biletowy, w którym można tworzyć tory do pływania itp.


title: Jak podszedłbyś do tego problemu Domino?

text: To problem z konkursu algorytmicznego sprzed kilku lat. Ma bardzo prosty opis, ale nie widzę żadnego algorytmu, który by go skutecznie rozwiązał. Nie szukam realizacji, ale ogólnego pomysłu jak rozwiązać ten problem. > Opis: Chcielibyśmy zbudować łańcuch domino ze wszystkich > podanych przez nas płytek (podobnie jak w domino dwie płytki można połączyć, jeśli po > sąsiednich stronach pojawi się ten sam numer). Nie zawsze jest to możliwe. Dlatego powinniśmy wypisać > minimalną liczbę płytek, którą trzeba dodać, aby zbudować łańcuch. > > Wejście: n par liczb całkowitych z zakresu [0, 10000] n <= 1000000 (więc algorytm > może być w najgorszym przypadku O(nlogn)) > > Wyjście: Ile płytek (przynajmniej) należy dodać. > > Przykład: Wejście: > > > 2 1 > 2 3 > 4 5 > > > Wyjście: > > > 1 > > > Wyjaśnienie: (1 2) (2 3) ! (4 5) Niemożliwe jest zbudowanie łańcucha bez > dodania jakichkolwiek płytek. Dodanie jednego kafelka ((3 4)), gdzie "!" stojaki tworzą poprawny łańcuch > zawierający wszystkie kafelki, dlatego odpowiedź brzmi 1.


title: przejście od rozwoju do zapewnienia jakości

text: Szukam porady, jak najlepiej przejść od inżynierii oprogramowania do pracy typu zapewnianie jakości. Wyobraźmy sobie programistę w średnim wieku, który nie jest na bieżąco ze wszystkimi obecnymi technologiami i ma trudności ze znalezieniem pracy inżyniera oprogramowania, ponieważ tak naprawdę nie jest typem starszego/głównego inżyniera, a wszystkie niekierownicze stanowiska wydają się być zajmowane przez młodszych ludzi . Ma przyzwoite doświadczenie w pisaniu skryptów w Perlu/Pythonie/Shell. Myślę, że mógłby być bardzo przydatny w zespole QA jako QA/scripter. Czy to ma sens? Czy możliwe jest znalezienie takiej pracy w zakresie kontroli jakości bez czystego doświadczenia w kontroli jakości w CV? Jaki jest dobry sposób na napisanie listu motywacyjnego wyjaśniającego to? Szukam pomysłów/dobrze brzmiących fraz do listu motywacyjnego/ogólnych opinii na temat kierunku, o którym myślę.


title: Jak zarządzać plikami projektów IDE w rozwidlonym repozytorium

text: Niedawno rozwidlałem repozytorium Git i lokalnie stworzyłem projekt w moim IDE do kompilacji. Moje IDE tworzy różne artefakty, które chciałbym gdzieś zachować. Oczywistym miejscem byłby VCS. Jeśli dodam te pliki, zostaną one zapisane w historii mojego forka. Jeśli chcę wysłać żądanie ściągnięcia, aby scalić w górę, nie chciałbym, aby te pliki były dołączone. Jaki byłby zalecany przepływ pracy do zarządzania tymi zmianami, którego nigdy nie chciałbym iść w górę.


title: Jak mogę zarządzać moimi ViewControllers w grze?

text: Tworzę bardzo prostą grę na iOS, która nie wymaga żadnego wymyślnego OpenGL; Chciałbym trzymać się Core Graphics i Core Animation. Chciałbym, aby była to gra pełnoekranowa, a moje pytanie dotyczy hierarchii + zarządzanie ViewController: Wygląda na to, że powinienem mieć dwa typy ViewControllers: Podstawowe VC do nawigacji między ekranami menu (tj. Ustawienia, Menu główne, Wybór poziomu , itd.) oraz Gameplay VC do zarządzania wszystkimi moimi widokami UIView i CALayerami. Jaki jest dobry sposób na zarządzanie nimi? Czy najlepszym rozwiązaniem jest posiadanie jednej hierarchii wirtualnych systemów wirtualnych, takiej jak tradycyjna aplikacja oparta na „UINavigationController”, obejmująca pasek nawigacyjny, gdy wyświetlam Game ViewController? Czy zamiast tego powinienem usunąć wszystkie inne ViewControllers ze stosu, gdy wchodzę w „tryb gry” i ustawić go jako moją właściwość `window.rootViewController`? Jakieś alternatywy / wady ciągłego resetowania `window.rootViewController`? Moje przeczucie mówi mi, że ten ostatni jest lepszy pod względem zasobów + wydajności, ale porady + wskazówki byłyby tutaj mile widziane.


title: Kraje referencyjne za pomocą ograniczenia klucza obcego

text: Aby uprościć sprawę: mam dwie tabele: `Tabela1` i `Kraje`. Tabela `Countries` zawiera ładną flagę i pewne informacje, takie jak DisplayName, kod ISO3166 ALPHA3 i kod telefonu (+49, +xx). „Tabela1” zawiera klientów z kolumną „Kraj”. Czy można (pod względem użyteczności, normalizacji i zdrowego rozsądku) odwoływać się od „Table1.CountryId” do „Countries.Id” za pomocą klucza obcego zamiast zwykłego pola „Table1.Country” „nvarchar(255)” i wstawić w to „napis”?


title: Samodzielna praca nad projektem

text: Pracuję więc nad małym projektem w mojej firmie, jestem zaledwie inżynierem stażystą (w połowie studiów z inżynierii oprogramowania), gdzie rozwijamy system zarządzania projektami i ludźmi oparty na intranecie - zawiera oceny pracowników, zarządzanie umiejętnościami osobistymi i rozwój i tak dalej. Pracowałem nad tym projektem od jakiegoś czasu pod kierunkiem starszego inżyniera i pracował nad nim inny stażysta. Jednak wkrótce zbliża się duży kontrakt, a pozostali dwaj zostali zaproszeni do części pracy, co zwiąże ich na bardzo, bardzo długi czas. To zostawia mnie samą w pracy nad tym (naprawdę zabawnym i pełnym nauki) projektem. Spełnienie marzeń! Albo to jest? Martwiłem się, jak po prostu poradzę sobie z pracą trzech osób, czy są techniki, narzędzia, których mogę użyć? Im więcej o tym myślę, tym bardziej jestem onieśmielona (ale wciąż rozkoszuję się ideą dobrego wyzwania). Muszę myśleć o planowaniu, diagramowaniu, informacjach o wydaniu, specyfikacji testów i własnych testach na korytarzach (gdzie chwytam przypadkową osobę i mówię „przełam to!”), nie wspominając o rzeczywistej pracy programistycznej! Krótko mówiąc, **jak jedna osoba może przystosować się do pracy trzech osób?**


title: Dlaczego większość „dobrze znanych” języków imperatywnych/OO umożliwia niekontrolowany dostęp do typów, które mogą reprezentować wartość „nic”?

text: Czytałem o (nie)wygodzie posiadania `null` zamiast (na przykład) `Może`. Po przeczytaniu **tego artykułu** , **jestem przekonany, że znacznie lepiej byłoby użyć `Może`** (lub czegoś podobnego). Jestem jednak zaskoczony widząc, że wszystkie "dobrze znane" imperatywne lub obiektowe języki programowania nadal używają `null` (co pozwala na niekontrolowany dostęp do typów, które mogą reprezentować wartość 'nic') i że `Być może` jest głównie używane w funkcjonalnych językach programowania. Jako przykład spójrz na następujący kod C#: void doSomething(string username) { // Sprawdź, czy nazwa użytkownika nie jest null // Zrób coś } Coś tu brzydko pachnie... Dlaczego powinniśmy sprawdzać, czy argument jest pusty? Czy nie powinniśmy zakładać, że każda zmienna zawiera referencję do obiektu? Jak widać, problem polega na tym, że z definicji prawie wszystkie zmienne mogą zawierać odwołanie do wartości NULL. Co by było, gdybyśmy mogli **zdecydować**, które zmienne są „nullable”, a które nie? Zaoszczędziłoby nam to wiele wysiłku podczas debugowania i szukania „NullReferenceException”. **Wyobraź sobie, że domyślnie żaden typ nie może zawierać odwołania o wartości NULL**. Zamiast tego możesz **określić wyraźnie, że zmienna może zawierać referencję null** , tylko jeśli naprawdę tego potrzebujesz. To jest idea stojąca za Maybe. Jeśli masz funkcję, która w niektórych przypadkach zawodzi (na przykład dzielenie przez zero), możesz zwrócić `Może<int>`, wyraźnie stwierdzając, że wynikiem może być int, ale także nic! To jest **jeden powód, aby preferować Maybe** zamiast null. Jeśli jesteś zainteresowany więcej przykładami, to proponuję przeczytać **ten artykuł**. Fakty są takie, że pomimo wad związanych z domyślnym ustawieniem większości typów na wartość null, większość języków programowania OO faktycznie to robi. Dlatego zastanawiam się nad: * **Jakie argumenty miałbyś**, aby zaimplementować `null` w swoim języku programowania zamiast `Być może`? **Czy w ogóle są powody**, czy to tylko „historyczny bagaż”? _Przed udzieleniem odpowiedzi na to pytanie upewnij się, że rozumiesz różnicę między wartością null i Maybe._