title: Czy do tworzenia aplikacji faktycznie wykorzystuje się programowanie funkcjonalne?

text: > **Possible Duplicate:** > Jakie są dobrze znane aplikacje napisane w F#? Widzę wielu ludzi mówiących o tym, jak fajne jest programowanie funkcjonalne, jak niesamowite są Lisp, Haskell i F#, itp., ale nie widzę, że faktycznie są _używane_. Prawie każdy program na moim komputerze jest napisany w czymś z rodziny C, Delphi lub Pythonie. Widzę samouczki mówiące o tym, jak łatwo jest używać języków funkcjonalnych do rozwiązywania skomplikowanych problemów matematycznych, ale nikt nie mówi o używaniu ich do robienia rzeczy, na których większość ludzi naprawdę interesuje używanie komputerów, takich jak aplikacje biznesowe i gry. Czy ktoś ma jakieś przykłady rzeczywistych programów, o których ludzie słyszeli i używają, napisanych w funkcjonalnym języku? Jedyne, jakie przychodzi mi do głowy, to nadużycie sprzed prawie 15 lat. (Nie liczą się takie rzeczy jak Emacs, gdzie główny program jest napisany w C z warstwą skryptów języka funkcjonalnego na wierzchu).


title: Niezmienność zorientowana obiektowo: klasy końcowe lub metody końcowe

text: Jedną z rzeczy, które widzisz w wielu miejscach w standardowej bibliotece java, są klasy końcowe. Twierdzi się, że dotyczy to niezmienności, którą rozumiem... do pewnego stopnia. Załóżmy, że masz klasę: final public class ImmutableTest { private String value; public ImmutableTest (wartość ciągu) { this.value = wartość; } public String getValue() { return this.value; } } Można powiedzieć, że wartość jest niezmienna, ponieważ nie można jej dostosować po utworzeniu. Ogranicza to jednak użyteczność klasy, ponieważ nikt nie może jej rozszerzyć (na przykład, aby użyć jako drop-in dla złego projektu bez interfejsu...). Załóżmy teraz, że masz tę klasę: public class ImmutableTest { private String value; public ImmutableTest (wartość ciągu) { this.value = wartość; } final public String getValue() { return this.value; } } "Wartość" jest nadal niezmienna, ale teraz przynajmniej ludzie mogą rozszerzyć klasę. Ktoś kiedyś wtrącił: ale jeśli go rozszerzysz, nie ma gwarancji, że rozszerzona klasa będzie niezmienna! Chociaż to prawda, myślę, że nie ma to znaczenia dla samej klasy. Jeśli użytkownik A używa mojej klasy ImmutableTest wszędzie w swoim kodzie, i tak ma dostęp tylko do „wartości”, która **pozostaje niezmienna**. O ile nie wykonuje jawnego rzutowania (innymi słowy: jest świadomy, że próbuje uzyskać dostęp do innych rzeczy), nie może uzyskać dostępu do „zmiennej” części rzeczywistej instancji, co oznacza, że z punktu widzenia dewelopera klasa jest tak niezmienna, jak powinna być, nawet jeśli rzeczywista instancja ma inne zmienne zmienne. Krótko mówiąc: moim zdaniem zajęcia końcowe są zbyteczne, ponieważ metody końcowe wystarczą. Chciałabym jednak usłyszeć argumenty przeciwne! **UPDATE** Aby wyjaśnić: nie twierdzę, że dodanie „final” do klasy lub jej metod czyni ją niezmienną. Załóżmy, że masz klasę, która ma być niezmienna, ale nie tworzysz ostatecznych metod lub klasy, podklasa może oczywiście ponownie sprawić, że będzie ona zmienna. Ten argument jest używany do wyjaśnienia, dlaczego niektóre klasy w bibliotece standardowej są ostateczne. Moim zdaniem powinno wystarczyć sfinalizowanie metod akcesorów do niezmiennej części i pozostawienie klasy nieostatecznej. Może to pozostawić okno otwarte dla obiektów podrzędnych **dodających** zmienne zmienne, ale oryginalny zestaw pól pozostanie niezmienny, a zatem spełniający „niezmienne” wymaganie początkowego zestawu metod. **UPDATE2** Wniosek jest taki, że końcowe klasy nie mają prawdziwego celu, z wyjątkiem być może zwięzłości, która sama w sobie nie jest wystarczającym powodem do utraty rozszerzalności moim zdaniem.


title: jakie rzeczy należy wziąć pod uwagę przy projektowaniu bazy danych, która prawdopodobnie zostanie rozprowadzona po pewnym czasie?

text: Jesteśmy teraz małym start-upem, nie mamy DBA. jeśli nasz projekt się powiedzie, będzie miał dużo danych, które prawdopodobnie będą musiały być rozłożone na kilka maszyn. Więc chcemy ułatwić ten krok, więc co powinniśmy teraz wziąć pod uwagę, aby tak było? To, o czym możemy teraz myśleć, to używanie uuid zamiast identyfikatorów autoincrement, ale nawet to nie wiemy, jak bardzo wpłynie to na wydajność? Więc używanie uuid jest właściwym wyborem? i co jeszcze powinniśmy zrobić?


title: Jakie są korzyści z używania „fabryki dekoratorów”, która ozdabia przedmioty?

text: W projekcie postanowiłem zaimplementować wzorzec Decorator. Mam klasę `Thing` z `methodA()` i klasę `AbstractDecorator`, która dziedziczy po `Thing` i po której wszystkie dekoratory dziedziczą: `ConcreteDecorator1`, `ConcreteDecorator2` itd. Wszystkie oczywiście zastępują ` methodA()` aby dodać trochę funkcjonalności przed delegowaniem do opakowanego `Thing`. Zwykła implementacja Dekoratora. Postanowiłem zaimplementować `WrappingFactory` (z braku lepszej nazwy): odbiera ona obiekty `Thing` i owija je określonym dekoratorem. Niektóre dekoratory wymagają parametru w konstruktorze, a `WrappingFactory` również się tym zajmuje. Oto on: public class WrappingFactory{ public static void addSomeFunctionality(thing thing){ rzecz = new SomeDecorator(thing); } public static void addFunctionalityWithParameter(Rzecz rzecz, int param){ rzecz = new DecoratorWithParameter(rzecz, param); } public static void addSomeAwesomeFunkcjonalność(rzecz){ rzecz = new AwesomeDecorator(rzecz); } } Zrobiłem to, ale właściwie nie wiem dlaczego. Czy przynosi to korzyści w przeciwieństwie do bezpośredniego tworzenia przez klienta dekoratorów? Jeśli ma to jakieś zalety, wyjaśnij mi je.


title: Czy istnieje alternatywa dla bitów?

text: Czy istnieje alternatywa dla bitów jako najmniejszej jednostki danych? Coś, co nie będzie tylko 0 lub 1, ale faktycznie zawiera wiele możliwych stanów pomiędzy? Czy nie byłoby bardziej naturalne przechowywanie takich pływaków?


title: Jeśli Schemat jest niewpisany, jak może mieć numery i listy?

text: Mówi się, że schemat jest po prostu rozszerzeniem rachunku lambda bez typu (popraw mnie, jeśli się mylę). Jeśli tak jest, jak może mieć listy i liczby? Te, dla mnie, wyglądają jak 2 typy podstawowe. Powiedziałbym więc, że Racket jest w rzeczywistości rozszerzeniem rachunku lambda Simply Typed. Nie? ## Pytanie: * **Czy system typów schematu jest rzeczywiście oparty lub bardziej podobny do rachunku lambda typu prostego lub nietypowego?** * **W jaki sposób różni się od rachunku lambda bez typu i/lub typu prostego?** (to samo pytanie jest prawidłowy dla języków „bez typu”, takich jak Python i JavaScript — z których wszystkie wyglądają, jakby miały typy podstawowe.)


title: Jak opłacalne jest stworzenie mini dokumentacji w kodzie źródłowym?

text: Pracuję więc jako programista. Jesteśmy małym zespołem. Większość osób (wszyscy oprócz kierownika projektu i starszego dewelopera) nadal studiuje. Mamy bardzo elastyczne godziny pracy, czasami nie widuję niektórych osób przez 3-4 dni. Możesz sobie wyobrazić, że komunikacja jest tutaj kluczowa. Piszemy dużo e-maili i używamy systemu śledzenia błędów i dopóki jesteś w pewnym stopniu związany z zadaniem, możesz być dobrze poinformowany. (o ile przeczytasz całą korespondencję). Jednym ze słabych punktów zespołu jest dokumentacja, którą ludzie zostawiają. Kod jest dość dobrze napisany i dopóki poświęcisz czas na przeczytanie go w całości, zrozumiesz go. (problem: zwykle zajmuje to sporo czasu, gdy zajmujemy się modułami zawierającymi kilka tysięcy linijek kodu) Uwaga: Istnieje bardzo dobra dokumentacja dla użytkowników, która jest pisana do użytkowników końcowych, jednak omawiamy dokumentację współdzieloną między programiści. Kiedy nowa osoba musi wprowadzić pewne rzeczy, nad którymi pracuje część zespołu, lub gdy ktoś musi zmodyfikować stary kod lub czyjś stary kod, sprawy się nieco komplikują. Jak wspomniałem wcześniej, czasami nie widujemy się od kilku dni, więc o ile kierownik projektu nie zna (i pamięta) szczegółów kodu, nowicjusz będzie miał następujące opcje: 1 Przeczytaj źródło 2 Przeczytaj stare e-maile z dyskusjami. Kiedy musisz dokonać refaktoryzacji dużych fragmentów kodu Jest to w porządku (zwłaszcza po pierwsze) jednak gdy algorytm musi zostaćzmieniony lub ktoś musi po prostu użyćstarego modułu jako części nowego modułu lub skryptu lub czegokolwiek możesz sobie wyobrazić to czekanie spotkanie z facetem, który stworzył moduł lub czytanie mnóstwa e-maili będzie **zmarnować czas**. Zacząłem dodawać małą dokumentację na początku każdego modułu. Składa się z: 1. 2-3 zdań o tym, co robi moduł. 2. Trochę informacji o każdej funkcji, która nie jest częścią innej funkcji. Zasadniczo, co robi i kilka konkretnych informacji o argumentach, które przyjmuje, jeśli argumenty są obiektami. Jeśli nie, po prostu piszę „zobacz źródło więcej na temat argumentów” Ponieważ nie wiem, czy jestem na dobrej drodze, pytanie jest proste: Co powinna zawierać taka minimalna dokumentacja, aby mogła dać ogólny pogląd o tym, co robi moduł i jak ludzie mogą z niego korzystać?


title: Jak mogę nauczyć się efektywnie pisać kod w Pythonie?

text: Wyszukiwanie w Google hasła „pythonic” ujawnia szeroki zakres interpretacji. Strona wikipedii mówi: > Powszechnym neologizmem w społeczności Pythona jest pythonic, który może mieć > szeroki zakres znaczeń związanych ze stylem programu. Powiedzieć, że kod jest > pythonic, to powiedzieć, że dobrze używa idiomów Pythona, że jest naturalny lub > wykazuje biegłość w języku. Podobnie, powiedzenie o interfejsie lub funkcji języka >, że jest pythoniczne, oznacza stwierdzenie, że działa dobrze z idiomami Pythona, > że jego użycie dobrze współgra z resztą języka. Omawia również termin „unpythonic”: > W przeciwieństwie do tego, oznaką kodu niepythonowego jest to, że próbuje on napisać kod C++ (lub > Lisp, Perl lub Java) w Pythonie — to znaczy zapewnia zgrubną transkrypcję > zamiast tłumaczenie idiomatyczne formularzy z innego języka. Koncepcja pythonicity jest ściśle związana z minimalistyczną filozofią Pythona > czytelności i unikania podejścia „jest więcej niż jeden sposób na zrobienie tego”. > Nieczytelny kod lub niezrozumiałe idiomy są niepytoniczne. Co oznacza termin „pytoniczny”? Jak nauczyć się go skutecznie stosować w praktyce?


title: Renderowanie pliku STL do przeglądarki STL znajdującej się na nowej stronie

text: Przesłałem plik STL jako dodatkowy plik do produktu. I jest pobierany w interfejsie użytkownika, jak pokazano na zrzucie ekranu. ![powiązane pliki](http://i.stack.imgur.com/pgDsQ.png) Kiedy kliknę ten link do STL Downloader, ten plik STL zostanie pomyślnie pobrany. Próbowałem i testowałem zbyt wiele razy i zadziałało jak urok. Ale nie chcę, aby ten plik STL został pobrany. Chcę, aby został wyrenderowany do przeglądarki STL, którą zbudowałem. Ta przeglądarka STL znajduje się na innej stronie internetowej. Tak więc kliknięcie linku „Kliknij tutaj, aby pobrać powiązany plik STL” powinno wyrenderować plik STL do przeglądarki STL, która znajduje się na innej stronie internetowej. Jak mogę to zrobić? Nie chcę, aby użytkownicy pobierali pliki STL, ponieważ są one własnością intelektualną mojej firmy. Całość powinna być wykonana tylko w PHP.


title: Czy szablon „metaprogramowanie” w Javie to dobry pomysł?

text: W dość dużym projekcie znajduje się plik źródłowy z kilkoma funkcjami, które są wyjątkowo wrażliwe na wydajność (zwane milionami razy na sekundę). W rzeczywistości poprzedni opiekun zdecydował się napisać 12 kopii funkcji, z których każda różniła się nieznacznie, aby zaoszczędzić czas poświęcony na sprawdzanie warunków w pojedynczej funkcji. Niestety oznacza to, że kod jest PITA do utrzymania. Chciałbym usunąć cały zduplikowany kod i napisać tylko jeden szablon. Jednak język Java nie obsługuje szablonów i nie jestem pewien, czy generyki są do tego odpowiednie. Mój obecny plan polega na napisaniu zamiast tego pliku, który generuje 12 kopii funkcji (praktycznie jest to ekspander szablonów jednorazowego użytku). Oczywiście podałbym obszerne wyjaśnienie, dlaczego plik musi być generowany programowo. Obawiam się, że doprowadziłoby to do zamieszania przyszłych opiekunów i być może wprowadziłoby paskudne błędy, jeśli zapomną zregenerować plik po jego zmodyfikowaniu lub (co gorsza), jeśli zamiast tego zmodyfikują plik wygenerowany programowo. Niestety, poza przepisaniem całości w C++, nie widzę sposobu, aby to naprawić. Czy korzyści płynące z takiego podejścia przeważają nad wadami? Czy powinienem zamiast tego: * Wziąć uderzenie wydajności i użyć jednej, możliwej do utrzymania funkcji. * Dodaj wyjaśnienia, dlaczego funkcja musi zostać zduplikowana 12 razy, i łaskawie weź na siebie ciężar konserwacji. * Spróbuj użyć generyków jako szablonów (prawdopodobnie nie działają w ten sposób). * Krzyknij na starego opiekuna za uczynienie kodu tak zależnym od wydajności od pojedynczej funkcji. * Inna metoda utrzymania wydajności i łatwości konserwacji? PS Ze względu na kiepski projekt projektu, profilowanie funkcji jest dość trudne... jednak były opiekun przekonał mnie, że spadek wydajności jest nie do przyjęcia. Zakładam, że przez to ma na myśli więcej niż 5%, choć z mojej strony jest to zupełne przypuszczenie. * * * Może powinienem trochę rozwinąć. 12 kopii wykonuje bardzo podobne zadanie, ale ma drobne różnice. Różnice występują w różnych miejscach funkcji, więc niestety jest wiele, wiele instrukcji warunkowych. Jest faktycznie 6 „trybów” działania i 2 „paradygmaty” działania (słowa wymyślone przeze mnie). Aby skorzystać z tej funkcji, należy określić „tryb” i „paradygmat” działania. To nigdy nie jest dynamiczne; każdy fragment kodu wykorzystuje dokładnie jeden tryb i paradygmat. Wszystkie 12 par tryb-paradygmat jest używanych gdzieś w aplikacji. Funkcje te są trafnie nazwane func1 do func12, przy czym liczby parzyste reprezentują drugi paradygmat, a nieparzyste reprezentują pierwszy paradygmat. Zdaję sobie sprawę, że jest to najgorszy projekt w historii, jeśli celem jest łatwość utrzymania. Ale wydaje się, że jest „wystarczająco szybki”, a ten kod od jakiegoś czasu nie wymagał żadnych zmian… Warto również zauważyć, że oryginalna funkcja nie została skasowana (chociaż jest to martwy kod, o ile wiem) , więc refaktoryzacja byłaby prosta.


title: Wiele systemów intranetowych/internetowych działających częściowo na tych samych danych - strategia bazy danych

text: Zaczynamy przepisywać nasze aplikacje (portal internetowy, miliony unikalnych użytkowników i kilka systemów CRM/ERP, kilkaset użytkowników) i czeka nas teraz ogromna decyzja. Zamierzamy je pisać głównie (90-95%) w `Symfony2` z `Doctrine`, a niektóre usługi działające w tle (np. mailing) w `Java`. Baza danych — `MySql`/`MariaDb`. także wiele dodatkowych technologii (`redis/memcached`, `load balance`, `varnish`, `replication` i tak dalej). Najważniejsze (w tym przypadku) to - `symfony2`, `mysql/maria` i `doktryna`. Chodzi o to, że najlepiej będzie, gdy kilka systemów będzie pracowało na tych samych stołach. Na przykład: portal internetowy z ofertami pracy + system CRM do zarządzania klientami płacącymi za zamieszczanie tych ofert (podobnych przypadków jest wiele). Ważna jest również funkcjonalność jednego loginu dla naszych użytkowników pomiędzy każdym systemem. Widzę tu dwa podejścia: 1. Mamy jedną dużą bazę danych, zawierającą kilkaset tabel. Kiedyś pracowałem z ponad 200 tabelami, ale nie z tak dużym ruchem. Więc jeśli ruch wzrośnie, zaangażowany będzie sharding/partycjonowanie. 2. Mamy wiele baz danych, każda dla jednej aplikacji. Jeśli zajdzie potrzeba, aby jedna aplikacja komunikowała się z inną `DB`, napiszemy specjalne usługi, które zapewnią tę funkcjonalność. Teraz martwię się: 1\. łatwość tworzenia - łatwiej mieć tylko jedną bazę danych 2\. łatwość konfiguracji/zapewnienie redundancji 3\. wydajność Jedno wiem teraz, że baza danych będzie hostowana na trzech maszynach z replikacją `master-slave`, którą wspiera `Doctrine`. Jakie są Twoje myśli? Jakie są twoje zalety i wady? Dziękuję!


title: Czy należy zmienić nazwę zmiennej, jeśli zmieni się jej przeznaczenie?

text: Będę często zmieniał swój osobisty kod i nie martwię się o cofanie się i zmianę powiązanych nazw zmiennych. Czy nazwy zmiennych powinny być zachowywane w przypadku zmiany znaczenia? var wartośćBieżąca konta = x; var kontoWczorajWartość = y; var ZmianaWartościKonta = WartośćBieżącaKonta - WartośćKontaWczoraj; \--> `accountPastValue` staje się zamiast tego wartością z poprzedniego miesiąca var accountCurrentValue = x; var wartość ostatniego miesiąca konta = y; var ZmianaWartościKonta = WartośćBieżącaKonta - WartośćKontaOstatniMiesiąc;


title: Nauka Sparx Enterprise Architect

text: Posiadam podstawową wiedzę praktyczną Enterprise Architect z 6 miesięcznym doświadczeniem. Ale chciałbym się nauczyć, jak z niego korzystać więcej. Czy ktoś ma rekomendację dotyczącą źródła nauki lub kursu?


title: Jaki jest dobry punkt wyjścia do tworzenia PHP na małą skalę i czy framework byłby przesadą?

text: Jestem stażystą zajmującym się tworzeniem stron internetowych, pracującym nad małą aplikacją PHP (tylko kilka stron z niewielkim dostępem do bazy danych), która szybko stała się parą bardzo nie-DRY, nie-OO, indywidualnych skryptów. Framework wydaje się przesadą (może nie?), ale zastanawiałem się, jakie są najlepsze praktyki dotyczące struktury kodu / folderów i ogólnego rozwoju PHP na małą skalę. Jaki jest twój punkt wyjścia dla małej aplikacji takiej jak ta?


title: Czy interfejsy płynne są bardziej elastyczne niż atrybuty i dlaczego?

text: W samouczku Code First EF 4,1 podano następujący kod: public class Department { public int DepartmentId { get; ustawić; } [Wymagane] ciąg publiczny Nazwa { get; ustawić; } public virtual ICollection<Collaborator> Współpracownicy { get; ustawić; } } Następnie wyjaśniono, że płynny interfejs jest bardziej elastyczny: > Adnotacje danych są zdecydowanie łatwe w użyciu, ale preferowane jest > podejście programistyczne, które zapewnia znacznie większą elastyczność. Poniżej podano przykład użycia interfejsu fluent: protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Department>().Property(dp => dp.Name).IsRequired(); modelBuilder.Entity<Manager>().HasKey(ma => ma.ManagerCode); modelBuilder.Entity<Manager>().Property(ma => ma.Name) .IsConcurrencyToken(true) .IsVariableLength() .HasMaxLength(20); } Nie rozumiem, dlaczego płynny interfejs jest podobno lepszy. Czy to naprawdę? Z mojej perspektywy wygląda na to, że adnotacje danych są bardziej przejrzyste i mają bardziej czystą semantykę. Moje pytanie brzmi: dlaczego płynny interfejs miałby być lepszym rozwiązaniem niż używanie atrybutów, szczególnie w tym przypadku? (Uwaga: jestem całkiem nowy w całej koncepcji płynnych interfejsów, więc proszę nie oczekiwać wcześniejszej wiedzy na ten temat.) Odnośnik: http://codefirst.codeplex.com/


title: Jaki termin jest używany do opisania wykonywania częstych zadań wsadowych w celu emulacji w czasie zbliżonym do rzeczywistego?

text: Załóżmy, że użytkownicy aplikacji A chcą widzieć dane aktualizowane przez aplikację B tak często, jak to możliwe. Niestety aplikacja A lub aplikacja B nie mogą korzystać z kolejek wiadomości i nie mogą udostępniać bazy danych. Tak więc aplikacja B zapisuje plik, a zadanie wsadowe okresowo sprawdza, czy plik tam jest, i czy ładowanie ładuje go do aplikacji A. Czy istnieje nazwa dla tego pojęcia? Bardzo jednoznaczny i geekowy opis: „wykonywanie bardzo częstych zadań wsadowych w ciasnej pętli w celu emulacji w czasie zbliżonym do rzeczywistego”. Ta koncepcja jest podobna do „odpytywania”. Jednak sondowanie ma konotację, że jest bardzo częste, wiele razy na sekundę, podczas gdy najczęściej uruchamiasz zadanie wsadowe co kilka minut. Powiązane pytanie – jaka jest najciaśniejsza pętla, która jest rozsądna. Czy to 1 minuta z 5 minut, czy...? Przypomnij sobie, że zadania wsadowe są uruchamiane przez program do planowania zadań wsadowych (np. Autosys, Control M, CA ESP, Spring Batch itp.), więc zbyt częste uruchamianie zadania spowodowałoby obciążenie i bałagan.


title: Projektowanie konfiguracji dla podobiektów

text: Mam następującą sytuację: Mam klasę (nazwijmy ją Main) hermetyzującą złożony proces. Ta klasa z kolei organizuje sekwencję podalgorytmów (AlgoA, AlgoB), z których każdy jest reprezentowany przez indywidualną klasę. Aby skonfigurować Main, mam konfigurację przechowywaną w obiekcie konfiguracyjnym MainConfig. Ten obiekt zawiera wszystkie informacje konfiguracyjne dla AlgoA i AlgoB wraz z ich określonymi parametrami. AlgoA nie interesuje się informacjami związanymi z konfiguracją AlgoB, więc technicznie mógłbym mieć (a w praktyce mam) zawarte instancje MainConfig.AlgoAConfig i MainConfig.AlgoBConfig i zainicjować jako AlgoA(MainConfig.AlgoAConfig) i AlgoB(MainConfig .AlgoBConfig). Problem polega na tym, że istnieją pewne wspólne dane konfiguracyjne. Jednym z przykładów jest printLevel. Obecnie mam MainConfig.printLevel. Muszę rozpropagować te informacje zarówno do AlgoA, jak i AlgoB, ponieważ muszą wiedzieć, ile wydrukować. MainConfig musi również wiedzieć, ile ma wydrukować. Dostępne rozwiązania to 1. Przekazuję MainConfig do AlgoA i AlgoB. W ten sposób AlgoA ma technicznie dostęp do całej konfiguracji (nawet AlgoB) i jest mniej samowystarczalny. 2. Kopiuję MainConfig.printLevel do AlgoAConfig i AlgoBConfig, więc zasadniczo powtarzam trzy informacje printLevel. 3. Tworzę trzecią klasę konfiguracyjną PrintingConfig. Mam zmienną instancji MainConfig.printingConfig, a następnie przekazuję do AlgoA zarówno MainConfig.AlgoAConfig, jak i MainConfig.printingConfig. Czy kiedykolwiek znalazłeś taką sytuację? Jak to rozwiązałeś? Która jest stylistycznie wyraźniejsza dla nowego czytelnika kodu?


title: IValidatableObject a pojedyncza odpowiedzialność

text: Podoba mi się punkt rozszerzalności MVC, umożliwiający wyświetlanie modeli implementacji IValidatableObject i dodawanie niestandardowej walidacji. Staram się, aby moje kontrolery były odchudzone, mając ten kod jako jedyną logikę walidacji: if (!ModelState.IsValid) return View(loginViewModel); Na przykład model widoku logowania implementuje IValidatableObject, pobiera obiekt ILoginValidator poprzez wstrzyknięcie konstruktora: interfejs publiczny ILoginValidator { bool UserExists(string email); bool IsLoginValid(ciąg nazwa użytkownika, ciąg hasło); } Wygląda na to, że Ninject, wstrzykiwanie instancji do modeli widoków nie jest tak naprawdę powszechną praktyką, może być nawet antywzorcem? Czy to dobre podejście? Czy jest lepszy?


title: Dlaczego firmy mówią mi, że chcą mnie jako pracownika wewnętrznego, a nie jako wykonawcę?

text: ## Kontekst Nie chodzi tu o pieniądze. Chodzi o niezależność i upewnienie się, że wniosę swój wkład, pracując w mojej dziedzinie wiedzy, taktowność i upewniając się, że oczekiwania wszystkich są zgodne. Firmy, które próbują opracować nowe oprogramowanie, mówią mi, że chcą mnie jako pracownika wewnętrznego, a nie jako wykonawcę. Po ukończeniu doktoratu jestem ekspertem w bardzo wyspecjalizowanym rodzaju analizy danych, a nie w ogólnym programowaniu. Moje umiejętności programistyczne zostały zdobyte jako produkt uboczny moich badań naukowych. Uważam, że jestem nazywany „ekspertem dziedzinowym”, a nie „inżynierem oprogramowania”. Moje kodowanie koncentruje się na implementacji określonej klasy algorytmów analizy danych, więc uważam się bardziej za akademika, który doskonale myśli o kreatywnych sposobach tworzenia narzędzi do rozwiązywania problemów, który programuje testowanie i wdrażanie tych nowych pomysłów, a nie jest programista korporacyjny. Szukam pracy jako wykonawca w mojej specjalizacji i wolałbym zarabiać mniej pieniędzy i mieć mniejsze korzyści pracując jako krótkoterminowy wykonawca pomagający ludziom w tym, w czym jestem ekspertem, niż być pracownikiem wewnętrznym. Niektóre z omówionych przez nich problemów wydają się idealnie pasować do pracy z nimi tylko przez kilka miesięcy, a następnie przejść dalej i pozwolić ich prawdziwym programistom przejąć kontrolę. W ten sposób pomagałem naukowcom. Jestem w USA. ## **Problem:** Firmy twierdzą, że ze względu na własność intelektualną muszę być pracownikiem wewnętrznym. ## **Pytanie:** Czy nie byłoby im łatwo poprosić mnie o podpisanie umowy, że cała moja praca jest ich własnością? Jeśli pracuję jako wykonawca, mogą pozwolić mi odejść, gdy moja wartość się zmniejszy, i zaoszczędzić dużo pieniędzy, a ja mogę po prostu skupić się na tym, co uważam za fajny sposób pracy - przechodzenie od problemu do problemu. Czego mi tu brakuje?


title: Kurs odświeżający z matematyki dyskretnej?

text: Ukończyłem szkołę 8 lat temu i zrobiłem kurs matematyki dyskretnej na drugim roku, ale powiedziano mi, że prawdopodobnie zostaną mi zadane pytania z matematyki dyskretnej w nadchodzącym wywiadzie. Czy istnieje prosta strona internetowa/dokument, którego mogę użyć do odświeżenia mojej pamięci? Zrozumiałem pojęcia, kiedy brałem kurs 10 nieparzystych lat temu, ale moja pamięć jest trochę zardzewiała i chciałbym ją tylko odświeżyć.


title: Linie kodu a język optymalny

text: Zastanawiałem się, czy można podać jakąkolwiek radę jako maksymalną liczbę linijek kodu, przy której należy rozważyć przejście z powiedzmy MATLAB na język o niższym poziomie? Czy w ogóle jest tak, że w pewnym momencie bardziej sensowne jest zarządzanie pewnym stopniem złożoności danego programu w odpowiednim języku obiektowym niż MATLAB? Powinienem powiedzieć, że jestem nowicjuszem zarówno w MATLAB, jak i Javie, więc nie mam ukrytego planu w tym pytaniu, chociaż zdaję sobie sprawę z gorących dyskusji, jakie ludzie czasami toczą na temat tego, czy MATLAB jest odpowiednim językiem programowania. Nie mam wystarczającego doświadczenia, żeby nawet pomyśleć o udziale w takiej wymianie i szukam tylko porady, czy jest punkt odcięcia, w którym naprawdę trzeba przejść na inny język? Powinienem też dodać, że rozumiem, że kod może się wydłużyć po przejściu na niższy poziom, jednak miałem wrażenie, że programowanie obiektowe ułatwia zarządzanie złożonością większych programów. (Może wiersze kodu były złym wyborem jako zastępstwo dla złożoności?) Czy wybór niskiego lub wysokiego poziomu jest tylko jednym z aspektów wydajności? (za co w końcu trzeba zapłacić, mając do dyspozycji większe zadanie programistyczne dla języka niskiego poziomu?)


title: projekt bazy danych o otwartym kodzie źródłowym

text: Jaki jest najlepszy sposób na zbudowanie bazy danych typu open source? Chciałbym stworzyć bazę danych wszystkich pojazdów i związanych z nimi informacji dotyczących konserwacji (tj. Waga oleju, ilość, ciśnienie w oponach, wycieraczki itp.). Obecnie informacje te są fragmentaryczne lub po prostu nie są umieszczane w Internecie w łatwo dostępny sposób. Zaraz po rozpoczęciu zbierania chciałbym zaimportować te dane do bazy danych i udostępnić je każdemu. Czy istnieje proces (zakład lub grupa), dzięki któremu mogę zacząć zbierać te informacje w sposób wiarygodny i weryfikowalny? Oprócz tego, czy są jakieś problemy, o których powinienem wiedzieć?


title: Przechowywanie poprawek błędów jako zmian lokalnych, a nie w gałęzi SVN

text: Wdrażamy i utrzymujemy strony internetowe dla różnych klientów. Zwykle czekamy, aż najnowsze zmiany się ustabilizują, następnie oznaczamy wersję subversion jako wydanie i instalujemy ją u klienta. Następnie otrzymujemy prośby o wsparcie, a czasami jesteśmy zmuszeni do szybkiego poprawiania błędów między wydaniami. Uważam, że utrzymanie tych poprawek w oddziałach jest kłopotliwe i zastanawiam się, dlaczego nie przechowywać ich jako „zmian lokalnych” w jakimś folderze „Wydanie X.Y” (na maszynie budującej)? Czy to działa, czy tylko rozgałęzienie? Powody tej zmiany są następujące: * wydaje się, że znacznie łatwiej jest używać narzędzia WinMerge do łączenia najnowszych poprawek błędów z jakimś folderem "Release X.Y", niż używać "integracji gałęzi" tortoise-svn. WinMerge oferuje znacznie lepszą kontrolę nad tym, które zmiany należy scalić, a które nie (na podstawie pliku, a nie zatwierdzenia). * utrzymując poprawki jako "zmiany lokalne" masz trzystronne porównanie: w "Sprawdź modyfikacje" możesz zobaczyć wszystkie poprawki błędów w bieżącym wydaniu, a dzięki WinMerge możesz zobaczyć wszystkie najnowsze zmiany w trunku (jeśli porównasz "Wydanie X.Y" " z folderem "trunk") * również wydaje się zbyt obsesyjnie trzymać wszystko w SVN. IMO SVN powinien służyć użytkownikowi, a nie odwrotnie. * również reintegracja gałęzi nigdy nie łączy tylko tych plików, które faktycznie się zmieniły. Zabiera całą masę niepotrzebnych plików, które utrudniają śledzenie czegokolwiek w SVN-logu.


title: Jaki jest najbardziej optymalny algorytm liczenia wierszy tekstu w pliku?

text: Plik > 5Gb, po prostu z liniami takimi jak Apache access.log. Musisz uzyskać liczbę wierszy. Wszelkie konstrukcje typu file(nazwapliku).read().counter('\n') Odczytałyby wszystkie pliki i zajęłoby to bardzo dużo czasu. np. os.stat(nazwa pliku).st_size Działa bardzo szybko. Możliwe jest uzyskanie przynajmniej hipotetycznie liczby wierszy, według rozmiaru pierwszych wierszy w bajtach i całkowitego rozmiaru pliku. Czy istnieje dokładniejszy sposób?


title: Dlaczego nazwa folderu „bin” jest używana w niektórych frameworkach i językach?

text: Uczę się Javy. I nadal po dłuższym czasie nie wiem **dlaczego nazwa folderu to „bin”**, gdzie znajdują się wszystkie narzędzia dla javy? Czy jest za tym jakiś logiczny powód? Zauważyłem to również w .Net framework.


title: Czy środowiska programistyczne / testowe / QA / Staging powinny być podobne?

text: Po długim czasie i wysiłku w końcu używamy maven do zarządzania cyklem życia aplikacji na potrzeby rozwoju. Niestety nadal używamy ANT do budowania EAR przed wdrożeniem do Test / QA / Staging. Moje pytanie brzmi: chociaż zrobiliśmy ten krok naprzód, programiści nadal mogą robić, co im się podoba, testując swój kod. Jednym z problemów, który mamy, jest to, że połowa naszego zespołu używa Tomcata do testowania, a druga połowa używa Jetty. Wolę Jetty nieco od Tomcata, ale niezależnie od tego używamy WAS we wszystkich innych środowiskach. Moje pytanie brzmi, czy powinniśmy programować na tym samym serwerze aplikacji, na którym wdrażamy? Mamy wiele błędów wynikających z tych różnic w środowiskach. Tomcat, Jetty i WAS różnią się pod maską. Moim zdaniem wszyscy powinniśmy rozwijać się na tym, co wdrażamy do produkcji, więc nie mamy problemu z tym, że dobrze działało na mojej maszynie. Chociaż wolę Jetty, zakładam, że wszyscy pracujemy w tym samym środowisku, nawet jeśli oznacza to wdrożenie do WAS, które jest powolne i kłopotliwe. Jaka jest dynamika twojego zespołu? Nasi wiodący programiści odeszli z zespołu i od tego czasu rozwój jest darmowy dla wszystkich. Walter


title: Jakie podejście mogę zastosować, aby zmniejszyć prawdopodobieństwo wprowadzenia nowych błędów w złożonej starszej aplikacji?

text: Tam, gdzie pracuję, często muszę programować (i naprawiać błędy) w starym systemie (.NET 1), którego kod jest kompletnym spaghetti - bez zastanowienia nad nazwami zmiennych, strukturą programu ani komentarzami. Z tego powodu zrozumienie, jakie bity należy zmienić, zajmuje mi wieki, a często „łamię” istniejące oprogramowanie, ponieważ dokonałem modyfikacji. Naprawdę _naprawdę_ chcę spędzić kilka miesięcy (z kolegami) przechodząc przez to w celu refaktoryzacji, ale obecni programiści nie widzą potrzeby - ani nie sądzę, że jest na to czas (system jest ogromny). Boję się, że muszę pracować nad jego kodem, ponieważ naprawienie czegoś zajmuje kilka dni, tylko po to, aby dowiedzieć się, że zepsułem coś innego. To oczywiście sprawia, że wyglądam na niekompetentną – więc jak mam sobie z tym poradzić?


title: Lista najważniejszych obszarów do zbadania przy przenoszeniu projektu z x86 na x64?

text: Wiem, aby sprawdzić/wykorzystać twierdzenia i dokładnie zbadać wszelkie komponenty zespołu, ale nie wiedziałem, czy ktoś ma dość obszerną lub standardową w branży listę kontrolną konkretnych rzeczy, na które należy zwrócić uwagę? Patrzę bardziej na C i C++. uwaga: jest kilka naprawdę pomocnych odpowiedzi, po prostu zostawiam pytanie otwarte na kilka dni na wypadek, gdyby niektórzy ludzie sprawdzali tylko pytania, na które nie zaakceptowano odpowiedzi.


title: Zwracanie IQueryable z repozytorium

text: Czy przy użyciu wzorca Repozytorium należy zwrócić obiekt IQueryable zestawu danych (tabeli) do ogólnego użytku? Jest to bardzo przydatne w wielu przypadkach, zwłaszcza przy korzystaniu z zewnętrznych bibliotek, które wykorzystują ten interfejs, na przykład niektórych wtyczek sortujących/filtrujących i wiążących się z elementami interfejsu użytkownika. Jednak ujawnienie IQueryable czasami wydaje się narażać projekt na błędy. To, w połączeniu z niewłaściwym użyciem leniwego ładowania, może prowadzić do poważnych spadków wydajności. Z drugiej strony posiadanie metod dostępu dla każdego pojedynczego użycia wydaje się zbędne, a także dużo pracy (biorąc pod uwagę testy jednostkowe itp.).


title: Czy istnieje sposób na usunięcie tej nadmiarowości?

text: Obecnie mam następujący kod HTML <time datetime="2012-08-23"> 23. sierpnia 2012 </time> Mam to, ponieważ uważam, że format „23. sierpnia 2012” był łatwiejszy do odczytania dla odwiedzających witrynę niż < time>2012-08-23</time> Oba te przykłady HTML5 sprawdzają się w w3, ale pierwszy jest oczywiście zbędny i lubię wycinać znaczniki, których nie potrzebuję. Czy istnieje inny format daty, którego mogę użyć w drugim przykładzie, który jest (1) łatwy do odczytania dla odwiedzających witrynę i (2) ważny w3?


title: Dlaczego nie ma natywnych interpreterów JavaScript dla Windows/Mac/Linux?

text: Wydaje mi się, że bardzo przydatne byłoby użycie JavaScript do ogólnych zadań skryptowych po stronie serwera, ponieważ ma mniej więcej te same funkcje, co Perl i Python. Ale AFAIK nie ma ogólnie dostępnych interpreterów Javascriptu dla głównych architektur maszynowych. Myślę, że innym problemem może być brak bibliotek, ale na pewno by się pojawiły, gdyby byli tam tłumacze. V8 Google może być punktem wyjścia. Czy ktoś myśli, że wkrótce to zobaczymy?


title: Jak przeprowadzić test jednostkowy funkcji, która jest refaktoryzowana do wzorca strategii?

text: Jeśli mam funkcję w moim kodzie, która wygląda następująco: class Employee{ public string oblicz podatek(string name, int salary) { switch (name) { case "Chris": doSomething($salary); case "David": zróbCośDifferent($wynagrodzenie); case "Scott": doOtherThing($salary); } } Normalnie przerobiłbym to, aby użyć ploymorfizmu przy użyciu wzorca klasy fabrycznej i strategii: ciąg publiczny obliczany podatek(nazwa ciągu) { InameHandler nameHandler = NameHandlerFactory::getHandler(name); nameHandler->calculateTax($wynagrodzenie); } Teraz, gdybym używał TDD, miałbym kilka testów, które działają na oryginalnym `calculateTax()` przed refaktoryzacją. ex:               calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}         calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}          calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}        calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}           calculateTax_givenScottSalaryBelowThreshold_Expect333(){}     calculateTax_givenScottSalaryAboveThreshold_Expect333(){}      After refactoring I'll have a Factory class `NameHandlerFactory` and at least 3 implementation of „InameHandler”. Jak mam przystąpić do refaktoryzacji moich testów? Czy powinienem usunąć test jednostkowy dla `claculateTax()` z `EmployeeTests` i utworzyć klasę Test dla każdej implementacji `InameHandler`? Czy powinienem też przetestować klasę Factory?


title: Jaka jest przewaga singletona nad klasą w Object-c?

text: Wygląda na to, że ich użycie wymaga takiego samego wysiłku: Singleton: potrzebuje pliku .h i .m, musi zostać zaimportowany do dowolnej klasy, z której chcesz go wywołać, a następnie musi zostać utworzony. Klasa?


title: Kiedy nie będziesz już potrzebować języka, czy nadal powinieneś go używać?

text: Moim pierwszym głównym językiem była Java. Jednak z biegiem lat porzuciłem Javę na rzecz Pythona, JavaScriptu, basha itp. Nadal mam zaawansowaną znajomość Javy, ale ponieważ nie kodowałem w niej od tak dawna, moja wiedza na temat pisania jest co najwyżej średnia . Któregoś dnia, patrząc na jakiś stary kod napisany w Javie, znalazłem inspirację do napisania go od nowa jako doświadczenia edukacyjnego, aby ponownie się poznać. W tym momencie przestałem myśleć, że gdybym napisał to w Javie, to byłoby fajnie, ale kiedy uderzyła mnie nowa inspiracja, chciałem zaimplementować to jako aplikację webową (to była gra), więc inne ludzie mogliby w to zagrać. Więc teraz mamy dylemat: czy przepisuję (i mocno refaktoryzuję) kod, który wcześniej napisałem w Javie, a _następnie_ w JavaScript (dla wersji internetowej), czy po prostu całkowicie zapomniałem o Javie i przepisałem go w JavaScript? EDYCJA: Nie mam problemu z pisaniem najpierw w Javie, a następnie w JavaScript, ale najprawdopodobniej nie będę już potrzebować Javy przez długi czas. To, co próbuję zapytać, to czy powinienem najpierw przepisać stary kod w Javie, aby przećwiczyć umiejętność, której być może nie będę potrzebować w przyszłości. Rzeczywiste języki są mniej ważne niż to pytanie.


title: Czy diagramy kontekstowe mają poziomy?

text: Słyszałem, że diagram analizy kontekstu ma różne poziomy. Nie mogłem znaleźć tego w .Net, ale widziałem, że DFD ma różne poziomy. Czy diagramy kontekstowe mają jakieś poziomy („poziom0”, „poziom1”, „poziom2”)? Jeśli tak, proszę zasugerować kilka przykładów.


title: W jakim stopniu umiejętności każdego członka zespołu powinny się pokrywać w zespole multidyscyplinarnym?

text: Zajmuję się tworzeniem oprogramowania wbudowanego dla tego małego startupu, a nasz zespół jest dość mały: około 3-4 osób. Jesteśmy odpowiedzialni za całość prac inżynieryjnych, które obejmują urządzenie RF sterowane przez wbudowany mikrokontroler, który łączy się z komputerem PC, na którym działa oprogramowanie do zbierania i analizy danych. Przyszedłem do opracowania tych dwóch wskazówek podczas pracy z moimi kolegami: 1. Zdefiniuj jasny rozdział odpowiedzialności i upewnij się, że wkład każdej osoby w końcowy produkt nie pokrywa się. 2. Nie zakładaj, że Twoi koledzy wiedzą wszystko o swoich obowiązkach. Zakładam, że jest jakiś rodzaj technologii, w której będę musiał być kompetentny, aby właściwie współpracować z pracą moich kolegów. Pierwszy punkt jest dla nas całkiem łatwy. Robię oprogramowanie, jeden zajmuje się RF, inny oprogramowaniem PC, a ostatni działa DSP. Nic się nie pokrywa, jeśli chodzi o połączenie pracy dwóch osób w finalny produkt. Aby tak się stało, jeden facet musi przekazać pracę drugiemu, który ją sprawdzi i sam ją zintegruje. **Druga kwestia to sedno mojego pytania.** Nauczyłem się na własnej skórze, aby nie ufać wiedzy moich kolegów absolutnie bez względu na to, ile mają lat doświadczenia. Przynajmniej dopóki nie zademonstrują mi tego kilka razy. Biorąc więc pod uwagę, że za każdym razem, gdy tworzę kawałek oprogramowania układowego, jeśli łączy się z jakąś technologią, której nie znam, spróbuję się jej nauczyć i opracować fragment kodu testowego, który pomoże mi zrozumieć, co robią. W ten sposób, jeśli mój kawałek produktu wchodzi w konflikt z innym kawałkiem, mam pewną wiedzę na temat możliwych przyczyn. Na przykład, facet PC zaczął wdrażać swoje GUI w .NET WPF (C#) i używać LibUSBdotNET do dostępu USB. Tak więc uczę się C# i biblioteki USB .NET, której używa, i buduję małą aplikację konsoli, aby pomóc mi zrozumieć, jak działa ta biblioteka USB. Teraz to wszystko wymaga dodatkowego czasu i energii, ale uważam, że jest to uzasadnione, ponieważ daje mi przyczółek do zmierzenia się z problemami integracji. Lubię też uczyć się nowych rzeczy, więc nie mam nic przeciwko. Z drugiej strony widzę, jak może to zamienić się w synchronizację czasu pracy, która nie przekształci się w produkt końcowy i nigdy nie stanie się problemem. **Więc, jak bardzo doświadczenie/umiejętności nakładają się na członków drużyny w stosunku do własnych umiejętności? Czy ten problem znika, gdy zespoły stają się większe i bardziej zróżnicowane?**


title: Jaki jest najlepszy sposób marketingu dla programistów?

text: Zastrzeżenie z góry – zdecydowanie nie zamierzam zamieszczać tutaj żadnych linków – to pytanie nie jest częścią mojego marketingu! Miałem ostatnio kilka projektów, w których produkt końcowy jest czymś, z czego będą korzystać programiści. W przeszłości byłem odbiorcą wszelkiego rodzaju marketingu - jako programista nie miałem końca śmieci - tysiące długopisów, koszulek i podkładek pod mysz; wystarczająco dużo płyt CD, aby moje biurko było wolne od herbaty; kilka bardzo przydatnych kluczy USB z niektórymi logo, których już nie rozpoznaję; ulotek z małego lasu; wybrzuszony folder ze spamem, pełen ignorowanych wiadomości e-mail itp. Więc to jest moje pytanie – **Jakie są dobre sposoby na reklamowanie się programistom?** A tak na marginesie – czy programiści to niewłaściwi ludzie, na których można kierować reklamy? - bo i tak często nie mamy budżetu zakupowego!


title: Dlaczego używanie abstrakcji (takich jak LINQ) jest tak tabu?

text: Jestem niezależnym wykonawcą iw związku z tym przeprowadzam wywiady 3-4 razy w roku na nowe koncerty. Jestem teraz w trakcie tego cyklu i odrzucono mnie z powodu szansy, chociaż czułem, że wywiad przebiegł dobrze. To samo przydarzyło mi się kilka razy w tym roku. Teraz nie jestem idealnym facetem i nie oczekuję, że będę pasował do każdej organizacji. To powiedziawszy, moja średnia mrugnięcia jest niższa niż zwykle, więc grzecznie poprosiłem mojego ostatniego ankietera o konstruktywną opinię, a on dostarczył! Według ankietera najważniejsze było to, że wydawało mi się, że zbytnio skłaniam się ku wykorzystaniu abstrakcji (takich jak LINQ), a nie w kierunku niskopoziomowych, organicznych algorytmów. Pozornie ma to sens – w rzeczywistości inne odrzucenia również miały sens, ponieważ w tych wywiadach również gadałem o LINQ i nie wydawało się, by ankieterzy wiedzieli dużo o LINQ (mimo że byli .NET chłopaki). **Więc teraz mam pytanie:** Jeśli mamy „stać na ramionach gigantów” i używać abstrakcji, które są dla nas dostępne (jak LINQ), to dlaczego niektórzy uważają to za tabu? Czy nie ma sensu ściąganie kodu „z półki”, jeśli realizuje te same cele bez dodatkowych kosztów? Wydaje mi się, że LINQ, nawet jeśli jest abstrakcją, jest po prostu abstrakcją wszystkich tych samych algorytmów, które można by napisać, aby osiągnąć dokładnie ten sam cel. Tylko test wydajności może powiedzieć, czy Twoje niestandardowe podejście było lepsze, ale jeśli coś takiego jak LINQ spełnia wymagania, po co w ogóle zawracać sobie głowę pisaniem własnych klas? Nie chcę tutaj skupiać się na LINQ. Jestem pewien, że świat JAVA ma coś porównywalnego, chciałbym tylko wiedzieć, dlaczego niektórzy ludzie czują się tak niekomfortowo z myślą o użyciu abstrakcji, której sami nie napisali. ## AKTUALIZACJA Jak zauważył Euphoric, w świecie Javy nie ma nic porównywalnego z LINQ. Jeśli więc programujesz na stosie .NET, dlaczego nie zawsze spróbować go wykorzystać? Czy to możliwe, że ludzie po prostu nie do końca rozumieją, co to robi?


title: Czy ScrumMaster i inni członkowie zespołu mogą być zarządzani przez Product Ownera?

text: Nasz zespół przechodzi na Scrum. Ja zostałbym ScrumMaster (oprócz bycia programistą), a inny programista zostałby Product Ownerem (oprócz naszego faceta od marketingu produktów). Wszyscy członkowie zespołu, w tym ja, byliby zarządzani przez niedoszłego Właściciela Produktu. Rozumiem przez to, że facet byłby tym, który decydowałby o naszej rocznej ocenie, podwyżkach itp. Czy to hierarchiczne powiązanie byłoby podatne na wprowadzanie problemów? W jaki sposób organizacje zazwyczaj mapują strukturę hierarchiczną na zwinne zespoły? Przypuszczam, że dość powszechne jest, że ScrumMaster ma hierarchiczne połączenie z innymi programistami w zespole. Tutaj byłby to Product Owner. Czy to jest inne?


title: wybór licencji open source na oprogramowanie

text: Miło mi powiedzieć, że zamierzamy uczynić Advanced Electron Forum (anelectron.com) projektem Opensource, ponieważ brakuje nam programistów i uważamy, że dzięki temu koło rozwoju będzie znacznie lepsze, zamierzamy opublikować kod źródłowy jest publicznie dostępny w github, ale nie jesteśmy pewni, jakiej licencji będziemy używać, GPL daje zbyt dużą swobodę, której nie chcemy, jedyną rzeczą, której chcemy uniemożliwić użytkownikowi, jest rozwidlenie, my nie chcę żadnych forków ani redystrybucji kodu bez pozwolenia, więc co wybrać?


title: Czy programiści często mają do czynienia z rozbudowanymi procedurami kontroli zmian?

text: To pytanie wymaga trochę konfiguracji, proszę o wyrozumiałość. W zeszłym tygodniu moja firma wprowadziła nową procedurę zarządzania zmianami. Każda zmiana przeznaczona do produkcji wymaga zapisu kontroli zmian; ta polityka już istniała i nie zgadzam się z nią. Nowa procedura obejmuje jednak bardzo skomplikowaną, intensywnie korzystającą z serwera aplikację internetową do tworzenia rekordów. Jako dodatkowy bonus serwery znajdują się w Europie (jestem w Seattle), co często powoduje problemy z opóźnieniami. **Każdy** dany zapis zmian wymaga (co najmniej) uzasadnienia biznesowego, dokumentu wymagań, planu przedwdrożeniowego, planu testów przedwdrożeniowych, planu wykonania, planu testów wykonawczych, planu powdrożeniowego i planu testów powdrożeniowych. Plany te należy wpisać ręcznie we wspomnianej aplikacji internetowej. Po utworzeniu rekordu programista dokonujący zmiany musi wziąć udział w godzinnej konferencji telefonicznej z Radą Doradczą ds. Zmian, aby uzasadnić zmianę. Nieważne, że prośba o zmianę przeszła przez cztery warstwy zarządzania, zanim trafiła na nasze biurka; to my musimy uzasadnić pracę. Uważam, że każda praca, która ląduje na moim biurku, powinna być już dawno uzasadniona, najlepiej przez osobę/dział zlecający pracę. Może to być dla mnie zerwaniem umowy. Moje pytanie brzmi, jak powszechna jest ta praktyka w sklepach programistycznych firm innych niż software? **Edytuj:** jest tu wiele dobrych opinii. Wygląda na to, że rozwiązaniem jest dołączenie do firmy zajmującej się oprogramowaniem, która nie jest zaangażowana w finanse, opiekę zdrowotną ani rząd. :) Dziękuję wszystkim za odpowiedzi.


title: Gdzie inne języki programowania pasują do modelu rozwoju Windows 8?

text: Obecnie aplikacje Windows można tworzyć w wielu językach i frameworkach. Ale w nadchodzącym Windows 8, wraz z wprowadzeniem WinRT, model rozwoju ulegnie zmianie na dużą skalę. A więc gdzie w tym modelu mieszczą się inne języki programowania?


title: Wzór projektowy dla drzew izomorficznych

text: Chcę utworzyć strukturę danych do pracy z drzewem izomorficznym. Nie szukam "algorytmów" ani metod sprawdzania, czy dwa lub więcej drzew jest ze sobą izomorficznych. Wystarczy stworzyć różne drzewa o tej samej strukturze. Przykład: 2 - - - - - - - 'a' - - - - - - - 3,5 / \ / \ / \ 3 3 'f' 'y' 1,0 3,1 / \ / \ / \ 4 7 'e' 'f 2.3 7.7 Pierwsza „warstwa” lub drzewo to „drzewo naturalne” (drzewo z liczbami naturalnymi), druga warstwa to „drzewo znaków”, a trzecia to „drzewo pływające”. Struktura danych ma metodę lub iterator do przechodzenia przez drzewo i wykonywania różnych operacji na jego wartościach. Operacje te mogą zmienić wartość węzłów, ale nigdy ich strukturę (najpierw tworzę strukturę, a następnie konfiguruję drzewo z różnymi jego warstwami). W takim przypadku dodaję nowy węzeł, który zostanie zastosowany do każdej warstwy. Który znany wzorzec projektowy pasuje do tego opisu lub jest z nim powiązany?


title: Ile błędów regresji z refaktoryzacji to za dużo.

text: Niedawne testy QA wykryły w naszym kodzie pewne błędy regresji. Mój lider zespołu obwinia niedawne próby refaktoryzacji za regresje. Postawa mojego lidera zespołu to „refaktoryzacja, ale nie psuj zbyt wielu rzeczy”, ale nie powiedziałby mi, ile to „zbyt wiele”. Moje stanowisko jest takie, że zadaniem QA jest znajdowanie błędów, których nie możemy znaleźć, a refaktoryzacja zwykle wprowadza przełomowe zmiany. Jasne, że mogę być ostrożny, ale świadomie nie wypuszczam kodu z błędami do kontroli jakości. Robię to, bo ich nie widzę. Jeśli refaktoryzacja była konieczna, ile błędów regresji należy uznać za zbyt wiele?


title: Jak zsynchronizować zegary przez sieć w celu tworzenia gier?

text: Piszę grę, która ma wiele aspektów związanych z czasem. Używam czasu, aby pomóc oszacować pozycje graczy, gdy sieć zatrzymuje się i pakiety nie są przesyłane (oraz czas między odebraniem pakietu a jego brakiem). Jest to gra typu pacman w tym sensie, że gracz wybiera kierunek i nie może przestać się poruszać, więc ten system ma sens (a przynajmniej tak mi się wydaje). Mam więc dwa pytania: 1) Jak zsynchronizować zegary gier na początku, skoro w sieci występuje opóźnienie. 2) Czy można ich NIE synchronizować i po prostu zakładać, że są takie same (mój kod jest niezależny od strefy czasowej). To nie jest super konkurencyjna gra, w której ludzie zmienialiby zegarki, by oszukiwać, ale jednak. Gra jest programowana w Javie i Pythonie (rozwój równoległy jako projekt)


title: Utrzymywanie dwóch oddzielnych wersji oprogramowania z tej samej bazy kodu w kontroli wersji

text: Załóżmy, że piszę dwie różne wersje tego samego oprogramowania/programu/aplikacji/skryptu i przechowuję je pod kontrolą wersji. Pierwsza wersja to darmowa wersja „Basic”, a druga to płatna wersja „Premium”, która wykorzystuje bazę kodu darmowej wersji i rozszerza ją o kilka dodatkowych funkcji o wartości dodanej. Wszelkie nowe łatki, poprawki lub funkcje muszą znaleźć się w obu wersjach. Obecnie rozważam użycie gałęzi `master` i `develop` dla głównej bazy kodu (wersja darmowa) obok gałęzi `master-premium` i `develop-premium` dla wersji płatnej. Kiedy zmiana zostanie dokonana w wersji darmowej i połączona z gałęzią `master` (oczywiście po dokładnym przetestowaniu na `develop`), zostanie ona skopiowana do gałęzi `develop-premium` za pomocą polecenia `cherry-pick` dla więcej testów, a następnie scalono w „master-premium”. Czy to najlepszy przepływ pracy, aby poradzić sobie z tą sytuacją? Czy są jakieś potencjalne problemy, zastrzeżenia lub pułapki, o których należy pamiętać? Czy istnieje lepsza strategia rozgałęziania niż ta, którą już wymyśliłem? Twoja opinia jest mile widziana! PS To jest dla skryptu PHP przechowywanego w Git, ale odpowiedzi powinny dotyczyć dowolnego języka lub VCS.


title: Zadanie Scrum nad estymacją

text: W mojej obecnej firmie używamy Scrum z 2-tygodniowymi iteracjami i regularną sesją planowania. Normalnie planowanie w naszej firmie polega na tym, że bierzemy wstępnie zdefiniowany, priorytetowy (przed planowaniem przez PO) backlog produktowy historyjek użytkownika / PBI, bierzemy PBI z góry jeden po drugim i dzielimy go na zadania, aby następnie oszacować je w godzinach (za pomocą planowania pokera i fibonacciego) aż osiągniemy pojemność danego zespołu. Chociaż działa to w przypadku większości zespołów, jest jeden 2-osobowy zespół, w którym jestem SM, który ma tendencję do systematycznego przeceniania zadań (ponieważ ci programiści otrzymują wynagrodzenie za godzinę w tym projekcie i z zapisu pracy z nimi w innym projekcie, wiem na pewno, że mają znacznie lepszą prędkość). Nie będąc częścią tego zespołu jako developer, starając się trzymać Scruma, w jakikolwiek sposób powstrzymuję się od wpływania na te szacunki, jednak w miarę zbliżania się do terminów w projekcie sytuacja ta staje się coraz bardziej kłopotliwa. Moje pytanie brzmi - czy jest sposób / dobra praktyka w takich sytuacjach, aby utrzymać zespół na skraju szybkości i nie wpływać na jego oceny, czy może robimy coś źle w tym procesie?


title: Dlaczego Num&sizeMinusOne szybciej niż num&(size-1)

text: Powiedziano mi, że gdy mam tablicę mieszającą o rozmiarze `m` i `m=2^k`, mogę użyć operatora `&` jako `num & (size-1)` zamiast `num % size `, aby dopasować hashCode do rozmiaru mojej tabeli. Powiedziano mi również, że polecenie Num&sizeMinusOne jest ponad dwa razy szybsze niż `num & (size-1)`. Moje pytanie brzmi: dlaczego? I czy operacja tworzenia zmiennej o nazwie SizeMinusOne też nie zajmuje czasu?


title: Jak znaleźć dodatkową pracę poza pracą na pełen etat?

text: > **Możliwy duplikat:** > Czy oprócz pracy w pełnym wymiarze godzin pracujesz również nad projektami kontraktowymi? Obecnie pracuję jako programista C++ w pełnym wymiarze godzin (nie na umowę). Szukam dodatkowych możliwości poza pracą. Do tej pory robiłem małe koncerty dla ludzi na stronach takich jak Craigslist lub ODesk.com na boku za dodatkową gotówkę, ale po prostu nigdy nie są wystarczająco dochodowe. Moje pierwsze pytanie brzmi... czy można znaleźć stanowisko typu kontrakt, które pozwoli mi pracować poza normalnymi godzinami pracy (tj. wieczorami i weekendami)? Jak byś w ogóle znalazł taką pracę? Martwię się też o potencjalne konflikty interesów. Jeśli umowa dotyczyła zupełnie innej dziedziny, czy jest jakiś powód, dla którego muszę to zgłosić pracodawcy? Czy powinienem skorzystać z pomocy rekrutera, aby znaleźć tego typu oferty pracy? Jeśli znalezienie czegoś takiego jest zbyt trudne... gdzie się wybieracie, żeby znaleźć dodatkową pracę poza pracą na pełen etat? Wiem, że wiele osób robi własne projekty, ale po prostu nie mam żadnych własnych pomysłów na aplikację na iPhone'a ani nic w tym rodzaju. :P W przeszłości miałem najwięcej szczęścia z Craigslist, ale gdzieś tam muszą być lepsze strony. Czy ktoś chce ujawnić sekretne miejsce? ;) Dziękuję!


title: Jak nakłonić ludzi do korzystania z narzędzia do śledzenia błędów?

text: To jest właściwie pytanie, które powinienem zadać jakiś czas temu (jako że nawet nie pracuję w tej pracy), ale mimo wszystko pomyślałem, że jest to interesujące pytanie. Nasz zespół składał się w zasadzie tylko z jednego programisty (ja!). Menedżer czasami się rozwijał, ale głównie był tylko biznesem. Pomyślał, że powinniśmy mieć jakiś rodzaj śledzenia błędów, więc zainstalowaliśmy na naszym serwerze narzędzie do śledzenia open source. Początkowo nie korzystałem z tego narzędzia do śledzenia błędów. Następnie zatrudniono kolejnego dewelopera. Podwoił się jako tester (czasami) i wydawało się, że każdego ranka (jego zmiana była zaplanowana o 2 godziny wcześniej niż moja według preferencji) Przyszedłem do pracy, miałby około 2 kartek pełnych błędów i możliwych błędów . Przejrzałem każdy element, oznaczyłem je jako naprawiony lub napisałem zgodnie z projektem lub naprawiłem później. W każdym razie, przyszedłbym następnego ranka... kolejna lista błędów. Około 6 z 15 wymienionych błędów było duplikatami lub bardzo powiązanymi z błędami, o których wcześniej mówiłem zgodnie z projektem lub później naprawiono. Zacząłem więc używać narzędzia do śledzenia błędów na naszym serwerze. Nie był trudny w użyciu (wymagany tylko tytuł błędu), ale też nie był świetny. Powiedziałem drugiemu programiście, że powinien zacząć tam zgłaszać błędy, a ja sprawdzę zgłaszane przez niego błędy. W ten sposób będzie łatwiej śledzić. Przychodzę następnego ranka i widzę kolejną kartkę papieru na moim biurku z błędami. W tym momencie około 11 z 13 wymienionych błędów było duplikatami. Nawet nie zawracałam sobie głowy pisaniem na papierze. (trwało to w zasadzie przez około 4 miesiące, aż zostałem zwolniony) **TL;DR:** Co powinienem zrobić, aby przekonać tego innego programistę do korzystania z narzędzia do śledzenia błędów?


title: Programowanie konkurencyjne

text: Myślę, że może to być jedno z najczęściej zadawanych pytań przez nowicjusza (takiego jak ja) na tej stronie. Proszę wybacz mi to. Moje pytanie brzmi: chcę być lepszy w rozwiązywaniu trudniejszych problemów programowania konkurencyjnego, które prawie zawsze są bardzo trudnymi formułami programowania dynamicznego, dynamicznymi manipulacjami strukturą danych i twardymi kombinatorycznymi manipulacjami obiektami. Jak powinienem się szkolić, aby nie tylko zyskać pewność siebie, ale także zdobyć wiedzę w tych dziedzinach. Tak, wiem, że oczywistą odpowiedzią jest praktyka! Ale chciałbym wiedzieć, powiedzmy, książki lub materiały, na które powinienem spojrzeć przed wejściem na stronę programistyczną, taką jak powiedz spoj, hackerrank, codechef, codeforces i tym podobne.


title: Jak dopasować wersje beta do numerycznego schematu wersjonowania?

text: Niektóre narzędzia zmuszają programistów do przyjęcia schematu wersji o określonej formie, np. „major.minor.build.revision”, gdzie każde pole musi być liczbą. Jak zmieszczę się tam w wersji beta? Na przykład, jaką wersję powinienem wybrać dla wersji „2.0 beta2”? Powinien mieć postać „1.99.x.y” (nie jest jeszcze stabilna wersja 2.0) lub „2.0.x.y” (wersja 2.0 beta wprowadza przełomowe zmiany w wersji 1.x).


title: Definicja typu

text: Koncepcyjnie myślałem o typach jako o zestawach. Myślę jednak, że widziałem ludzi, którzy chcieli rozróżniać typy „A”, „B”, nawet jeśli reprezentują identyczne zbiory wartości. Pomyślałem więc, że lepszą definicją typu jest para `(nazwa_typu, zestaw)`, gdzie dwa różne typy nie mogą mieć tego samego pierwszego elementu. Potem wpadłem w inną sytuację. Myślałem, że funkcja to po prostu zestaw par `(x, y)`. Ale wtedy funkcji „A->B” (gdzie „A, B” reprezentują te same zbiory wartości) nie można odróżnić od funkcji „B->B”, „A->A” lub „B->A” , i znowu myślę, że widziałem, jak ludzie chcą ich odróżnić. Jak więc zdefiniować funkcję? Jako krotka `(A, B, (x1, y1), (x2, y2), ...)`, gdzie każdy element `A` pojawia się dokładnie raz jako pierwszy element w parach, i gdzie każdy drugi element jest typu „B”? A typ `F` reprezentujący wszystkie funkcje przyjmujące `A->B` to `(F, ((A, B, (a1, b11), (a2, b12), ...), (A, B, (a1, b21), (a2, b22), ...), (A, B, (a1, b31), (a2, b32), ...)))", gdzie `a1, .. .` to wszystkie wartości reprezentowane przez A, a `b?1, b?2, ...`, dla dowolnego `?`, to niektóre z wartości reprezentowanych przez `B`. To wszystko wydaje się dość kłopotliwe, czy czegoś mi brakuje?


title: Hierarchiczny widok/ViewModel/Prezenter w MVPVM

text: Od jakiegoś czasu pracuję z MVVM, ale ostatnio zacząłem używać MVPVM i chcę wiedzieć, jak utworzyć hierarchiczną aplikację View/ViewModel/Presenter przy użyciu tego wzorca. W MVVM zwykle budowałbym swoją aplikację przy użyciu hierarchii widoków i odpowiadających im modeli ViewModels, np. Mógłbym zdefiniować 3 widoki w następujący sposób: ![Widok A](http://i.stack.imgur.com/eHsn6.png) Modele widoków dla tych widoków wyglądałyby następująco: public class AViewModel { public string Text { get { return "To jest A!"; } } obiekt publiczny Child1 { get; ustawić; } obiekt publiczny Child2 { get; ustawić; } } public class BViewModel { public string Text { get { return "To jest B!"; } } } public class CViewModel { public string Text { get { return "To jest C!"; } } } In miałby wtedy kilka szablonów danych mówiących, że BViewModel i CViewModel powinny być prezentowane przy użyciu Widoku B i Widoku C: <DataTemplate DataType="{StaticResource local:BViewModel}"> <local:BView/> </DataTemplate> < DataTemplate DataType="{StaticResource local:CViewModel}"> <local:CView/> </DataTemplate> Ostatnim krokiem byłoby umieszczenie kodu w AViewModel, który przypisałby wartości do Child1 i Child2: public AViewModel() { this.Child1 = nowy AViewModel(); this.Child2 = nowy BViewModel(); } Rezultatem tego wszystkiego byłby ekran wyglądający mniej więcej tak: ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/hXGz7.png) Zrobienie tego w MVPVM byłoby dość proste - po prostu przenoszenie kod w konstruktorze AViewModel do APresenter: public class APresenter { .... public void WireUp() { ViewModel.Child1 = new BViewModel(); ViewModel.Child2 = nowy CViewModel(); } } Ale jeśli chcę mieć logikę biznesową dla BViewModel i CViewModel, musiałbym mieć BPresenter i CPresenter - problem polega na tym, że nie jestem pewien, gdzie najlepiej je umieścić. Mógłbym przechowywać referencje do prezentera dla AViewModel.Child1 i AViewModel.Child2 w APresenter tj.: public class APresenter : IPresenter { private IPresenter child1Presenter; prywatny IPresenter child2Presenter; public void WireUp() { child1Presenter = new BPresenter(); child1Presenter.WireUp(); child2Presenter = nowy CPresenter(); child2Presenter.WireUp(); ViewModel.Child1 = child1Presenter.ViewModel; ViewModel.Child2 = child2Presenter.ViewModel; } } Ale to rozwiązanie wydaje się nieeleganckie w porównaniu z podejściem MVVM. Muszę śledzić zarówno prezentera, jak i model widoku i upewnić się, że są zsynchronizowane. Gdybym na przykład chciał mieć przycisk w widoku A, który po kliknięciu zamieniłby widok w Child1 i Child2, mógłbym mieć polecenie, które wykonałoby następujące czynności: var temp = ViewModel.Child1; ViewModel.Child1 = ViewModel.Child2; ViewModel.Child2 = temp; To działałoby tak dalece, jak zamiana widoku na ekranie (przy założeniu, że poprawny kod powiadomienia o zmianie właściwości jest na miejscu), ale teraz mój APresenter.child1Presenter wskazuje prezenter dla AViewModel.Child2, a APresenter.child2Presenter wskazuje prezentera dla AViewModel.Child1. Jeśli coś uzyskuje dostęp do APresenter.child1Presenter, wszelkie zmiany faktycznie nastąpią w AViewModel.Child2. Mogę sobie wyobrazić, że prowadzi to do wszelkiego rodzaju zabawy z debugowaniem. Wiem, że mogę nie rozumieć tego schematu, a jeśli tak jest, doceniłoby to wyjaśnienie, co robię źle. **EDYTUJ** \- to pytanie dotyczy WPF i wzorca projektowego MVPVM, a nie ASP.NET i MVP.


title: Podczas uruchamiania aplikacji pojawia się błąd, podczas debugowania nie

text: Wystąpił problem, który pojawia się podczas uruchamiania aplikacji. Nie jest to wyjątek, ale pożądana zmiana interfejsu użytkownika nie została zaimplementowana. Podczas debugowania w celu znalezienia kodu, który należy zmienić, aby naprawić ten problem, zmiany interfejsu użytkownika można zobaczyć poprawnie, a konkretnie, jeśli umieścimy jeden punkt przerwania w klasie, w której jest wywoływany, i naciśniemy przycisk Kontynuuj w NetBeans, problem występuje . Ale jeśli przejdziemy do następnych linii i spróbujemy zobaczyć stan na końcu debugowania, komponent wydaje się działać idealnie. Jak można rozwiązać tego rodzaju problemy?


title: W jaki sposób osoba przeprowadzająca rozmowę kwalifikacyjną ma wgląd w proces myślowy kandydata podczas rozmowy kwalifikacyjnej?

text: > **Możliwy duplikat:** > Jak przeprowadzić wywiad z kimś, kto ma większe doświadczenie niż ty? > Jak naprawdę „zachwycić” pracodawcę podczas rozmowy kwalifikacyjnej? Jestem trochę zdziwiony całym procesem wywiadu technicznego. Byłem ostatnio na kilku wywiadach i ciągle słyszę pewne zwroty podczas wywiadów. I chcę uzyskać lepszy wgląd w umysł ankietera i sam proces. Czy ktoś może rzucić na to trochę światła? Czego tak naprawdę chcą? Jestem przekonany, że nie jest to właściwa odpowiedź na postawiony problem, ponieważ uzyskanie prawidłowej odpowiedzi nie dało mi pracy. Jak „dostają wgląd w mój proces myślowy”? EDYCJA: Dodaję to do pytania, ponieważ myślę, że mogę pomóc. Podczas wywiadu, kiedy piszesz kod na tablicy i proszą Cię o wyjaśnienie procesu lub podejścia, czy oczekują, że będę zachowywał się jak gracz, który chce zostać milionerem? Czy muszę wyjaśniać każdy najmniejszy szczegół lub powód, dla którego coś robię?


title: Przeprowadzanie wywiadu ze starszym programistą, gdy będzie on o wiele bardziej kompetentny w programowaniu niż osoba przeprowadzająca wywiad

text: > **Możliwy duplikat:** > Jak przeprowadzić wywiad z kimś, kto ma większe doświadczenie niż ty? W przyszłym tygodniu będę przeprowadzał rozmowy kwalifikacyjne z wykonawcami na stanowisko starszego dewelopera na 6 miesięcy w projekcie. Sam jestem w porządku programistą, ale nic specjalnego, a w tej chwili nie mogę się domyślić, jakie pytania im zadać lub jakie wyzwania programistyczne postawiłem, ponieważ odpowiedzi i tak pewnie przeszłyby mi przez głowę. Projekt jest aplikacją ASP.NET MVC dla intranetu. Osobiście pomyślałem, że napiszą trywialną aplikację MVC, która pobiera pewne dane z bazy danych podczas rozmowy kwalifikacyjnej, pokazując, że mogą zaimplementować testowalną, luźno powiązaną aplikację, ale nie wiem, czy to jest _zbyt_ trywialne. Spodziewałbym się, że zaimplementowali kilka testów, ustawili wstrzykiwanie zależności i prawdopodobnie użyją repozytorium zamiast grubych kontrolerów. Jakieś pomysły, czy to, co sugeruję, to zły pomysł? Kodująca część wywiadu prawdopodobnie trwałaby około 40 minut. Zrobiłem to, co zaplanowałem, i zajęło mi to nieco ponad pół godziny. Kandydaci zobaczyliby wymagania aplikacji na kilka dni przed rozmową kwalifikacyjną. Po zastanowieniu się nad tym, może powinienem zacząć od ściśle powiązanej aplikacji i poprosić kandydatów o jej refaktoryzację i wdrożenie kilku testów? Edycja: w odniesieniu do komentarzy Roba poniżej, chciałbym, aby odpowiedzi bardziej skupiały się na tym, co zaplanowałem (ale wszystkie odpowiedzi zostały przyjęte z wdzięcznością)


title: Czego można się spodziewać po „wywiadu rówieśniczym” na nowe stanowisko?

text: Przepraszam, jeśli ktoś o coś takiego został poproszony, próbowałem poszukać czegoś podobnego. Kończę 16 maja i złożyłem podanie o stanowisko „Programista aplikacji .NET”, wymagające 1-2 lat doświadczenia i licencjata w CIS. Miałem ekran telefonu, co poszło dobrze. Zabrali mnie w piątek na rozmowę z dyrektorami, która składała się z pisemnego testu składającego się z 20 pytań oraz innych pytań behawioralnych i dziwnych, takich jak "Jak zrobiłbyś M&M?" Wydawało się, że to poszło dobrze, zabrali mnie na wycieczkę po kampusie i powiedzieli, że zwykle wrócą do kandydata, jeśli zdecydują się kontynuować, za około tydzień. Cóż, w następny poniedziałek punktualnie o 9:00 zadzwonili do mnie na trzeci i ostatni „wywiad rówieśniczy”. **Tu właśnie utknąłem - nie mam pojęcia, czego się tu spodziewać? Jak mam się przygotować?** Czy to jest jak „Hej, zobaczmy, czy pasujesz do kultury” lub „Pozwólmy mu przejść przez etapy z kodowaniem na tablicach” lub co? Każda rada byłaby BARDZO mile widziana. Ćwiczyłem właśnie kodowanie na tablicach na wszelki wypadek, i wejdzie z pokorną postawą „chcę się od was uczyć”.


title: Jakich pytań do rozmowy kwalifikacyjnej mogę się spodziewać po ocenie technicznej?

text: Mam 20 lat i od około 2 lat zajmuję się tworzeniem stron internetowych. Mam rozmowę kwalifikacyjną na stanowisko Junior Web Developera i firma o tym wie, ale nadal będę przechodził rozmowę techniczną, a ponieważ nie byłem na niej wcześniej, nie jestem pewien, jakich pytań się spodziewam. Udzielę wywiadu na temat PHP, HTML, CSS i JavaScript. Jakie są popularne lub raczej ważne pytania, które mogą mi zadać w tych czterech obszarach językowych? Wiem, że pytania mogą się znacznie różnić, ale tylko po to, żeby mieć pomysł. Chętnie zobaczę niektóre z twoich odpowiedzi. Dziękuję!


title: Jak przygotować się do programowania pytań do wywiadu?

text: > **Possible Duplicate:** > Naprawdę ich „wow” w wywiadzie Powiedzmy, że pojawiam się na wywiad. Jakich pytań mogę się spodziewać i jak się przygotować?


title: Jak naprawdę „zachwycić” pracodawcę podczas rozmowy kwalifikacyjnej?

text: Jestem programistą z najwyższej półki, ale notorycznie złym rozmówcą. Oblałem 3 wywiady z rzędu, ponieważ jestem tak zdenerwowany, że mój głos ściska się co najmniej 2 oktawy wyżej i zaczynam wyraźnie się trząść – pamiętajcie, poradzę sobie z wszystkimi pytaniami technicznymi, które zadaje mi ankieter w tym stanie, ale myślę, że tak źle wygląda na drżącą, piszczącą młodą kobietę podczas rozmowy kwalifikacyjnej. Właśnie mam osobowość nieśmiałego programisty. Bez względu na to, jak bardzo jestem techniczny, zostanę pominięty na korzyść płynnego mówcy. Niedługo mam kolejny wywiad i chcę naprawdę zaimponować firmie. Oto moje problemy: 1. **Co mogę zrobić, aby być mniej zdenerwowanym podczas rozmowy kwalifikacyjnej?** Zawsze jestem podekscytowany, gdy słyszę, że mam rozmowę twarzą w twarz, ale jestem coraz bardziej niespokojny, gdy podejścia do rozmowy kwalifikacyjnej. 2. **Jak długo lub krótko powinienem przechowywać odpowiedzi?** Ankieterzy chcą, abym wyjaśnił, co robiłem w poprzednim zatrudnieniu, ale jestem bardzo rozmowną osobą i mam tendencję do mówienia/piszczenia przez 10 minut na czas. 3. **Czego dokładnie szuka moja osoba prowadząca rozmowę kwalifikacyjną, gdy pytam o wcześniejsze prace?** 4. Podczas rozmowy zapytam mnie, czy mam jakieś pytania do ankietera. _Powinienem_ , ale **jakie pytania powinienem zadać, aby pokazać, że jestem zainteresowany zatrudnieniem?** 5. **Jak mogę pokryć „Chcę zarobić więcej pieniędzy” czymś, co brzmi ładniej?** Ankieterzy zawsze pytają, dlaczego szukam nowej pracy. Prawdziwym powodem jest to, że moja obecna pensja nie jest zbyt wysoka i chcę zarobić więcej pieniędzy: w przeciwnym razie środowisko pracy jest w porządku. 6. Mam tylko jedną pracę programisty i pracowałem tam przez 18 miesięcy, ale mam umiejętności kogoś z 4 do 6 letnim doświadczeniem. **Co mogę powiedzieć, aby konkurować z kandydatami z większym doświadczeniem zawodowym?**


title: Przygotowanie do wywiadów

text: > **Możliwy duplikat:** > Jak przygotować się do programowania pytań do rozmowy kwalifikacyjnej? Czy ktoś mógłby mi udzielić wskazówek, jak przygotować się do rozmowy technicznej? Jako absolwent CS myślę, że trzeba być dokładnym w następujących tematach: **Struktury danych:** Tablica, Lista połączona, Stos, Kolejki, Sterta, Tablica mieszająca, Drzewo binarne, Drzewo wyszukiwania binarnego, Drzewo binarne samo równoważenia (AVL , Red Black Tree), B-Tree, Tries/Suffix Tree **Algorytmy:** Sortowanie (Sortowanie bąbelkowe, Sortowanie przez wstawianie, Sortowanie przez zaznaczenie, Sortowanie według skorupy, Szybkie sortowanie, Sortowanie przez scalanie, Sortowanie zewnętrzne), Wyszukiwanie (w czasie liniowym i logarytmicznym) wyszukiwanie), teoria grafów (lista sąsiedztwa, macierz sąsiedztwa, DFS, BFS, sortowanie topologiczne), programowanie dynamiczne, algorytmy zachłanne, dziel i zwyciężaj. **Algorytmy Adhoc:** Wybierz algorytm, tasowanie kart Fisher Yates, próbkowanie ze zbiornika, a lista jest nieskończona. **Bazy danych:** Zapytania SQL **Programowanie i projektowanie:** C,C++, Java, języki skryptowe (Perl, Python), (podstawy OOPS, funkcje wirtualne, głębokie i płytkie kopiowanie, konstruktor kopiujący, operator przypisania, STL, zarządzanie pamięcią, wskaźniki/odniesienie, interfejs, klasy abstrakcyjne **Systemy operacyjne:** Synchronizacja wątków (Mutex, zmienne warunkowe, semafory, zakleszczenia), zarządzanie pamięcią (segmentacja, stronicowanie, TLB, mechanizmy buforowania) * * * wspaniale, gdybyśmy wszyscy mogli skompilować zasoby dostępne w Internecie, aby odświeżyć te tematy. Dodam kilka z nich: Lista połączona i drzewa: http://cslibrary.stanford.edu/103/ Pomóż mi znaleźć przydatne źródło przygotuj się na te tematy, również byłbym wdzięczny, gdybyś mógł dołączyć do tych tematów.


title: Czy prowadzisz praktyki w zakresie poszukiwania pracy/rozmów technicznych?

text: > **Możliwy duplikat:** > Jak naprawdę „zachwycić” pracodawcę podczas rozmowy kwalifikacyjnej? Ukończyłem studia w zeszłym roku i nigdy nie przeszedłem przez proces rozmowy kwalifikacyjnej - moja obecna pozycja programistyczna wyewoluowała z projektów, które robiłem w szkole, ale za kilka miesięcy robię czystą przerwę i przeprowadzam się po kraju, więc jestem będzie musiał zmierzyć się z poszukiwaniem pracy „dorosłym”. Trochę boję się wywiadów technicznych - myślę, że jestem całkiem dobry w mojej pracy i moich hobbystycznych projektach programistycznych ... ale co, jeśli okaże się, że należę do tej grupy, która myśli, że są wykwalifikowani, ale tak naprawdę po prostu wywołać rozpacz nad stanem edukacji w sercach ankieterów? Zastanawiam się więc nad „praktycznym” poszukiwaniem pracy w moim obecnym mieście, aby zorientować się, jak to jest i jakiego rodzaju doświadczenia/specjalizacji pracodawcy naprawdę szukają. Czy to etyczny ruch kutasa (aplikowanie/rozmowa o pracę, której nie mogę przyjąć)? Jeśli tak, czy istnieje inny dobry sposób na przygotowanie się do wywiadów technicznych, zwłaszcza do pytań typu łamigłówka?


title: c# wywiad z zadaniem programistycznym

text: > **Możliwy duplikat:** > Jak przygotować się do programowania pytań do rozmowy kwalifikacyjnej? Idę do zadania serwera c#-sql i szukałem linku, z którego mógłbym pobrać kilka pytań i odpowiedzi, które warto obejrzeć. Googling Znalazłem wiele, ale ponieważ nie ma pobierania, musisz kliknąć i nawigować dla każdego pytania i odpowiedź, która sprawia, że proces jest bardzo intensywny. Czy znasz link, z którego mogę pobrać kilka dobrych pytań dotyczących serwera c#/sql? Powiedziano mi też, że dostanę zadanie programistyczne. Nie mam pojęcia, co to może być. Mam nadzieję, że nie jest to jakiś głupi algorytm matematyczny, o którym wiem, że mi się nie uda, ani jakieś rzeczy do sortowania bąbelkowego, których nigdy nie używałem w moim życiu programowania w C#. Jakieś pomysły lub przykłady, o które pytano ludzi? A może jest miejsce, do którego menedżerowie udają się po te rzeczy? To nie jest przypadek oszustwa, ale wydaje mi się, że niektóre pytania nie są zbyt praktyczne w prawdziwym świecie. typowym głupim pytaniem dla c# moim zdaniem jest Jaka jest różnica między stosem a stertą? Teraz powiedz mi, czy jako programista c# naprawdę przejmujesz się stosem i stertą. Jeśli trochę rozpakujesz, kompilator powie, że masz błąd.itd. Dlaczego ciągle zadają to pytanie. Nawet agencja zadała mi to pytanie niedawno. bardzo dziękuję za wszelkie sugestie


title: Potrzebujesz pomocy w usuwaniu martwych ścieżek kodu i zmiennych z kodu źródłowego C

text: Mam na rękach przestarzały kod C i dostaję zadanie odfiltrowania z niego martwych/nieużywanych symboli i ścieżek. Z biegiem czasu było wiele wstawień i usunięć, powodując wiele nieużywanych symboli. Zidentyfikowałem wiele martwych zmiennych, które były zapisywane tylko raz lub dwa razy, ale nigdy nie były z nich odczytywane. Zarówno testy czarnoskrzynkowe, białoskrzynkowe, jak i regresyjne wykazały, że usunięcie martwego kodu nie wpłynęło na żadne procedury. (Mamy kompleksowy zestaw testowy). Ale to usunięcie zostało wykonane tylko na małej części kodu. Teraz szukam sposobu na zautomatyzowanie tej pracy. Polegamy na GCC, aby wykonać pracę. PS Interesuje mnie usuwanie takich rzeczy jak: 1. zmienne, które są czytane tylko po to, aby z nich odczytać. 2. zmienne, które są rozmieszczone w wielu plikach źródłowych i są tylko do nich zapisywane. Na przykład: plik1.c: int i; file2.c: extern int i; ....i=x;


title: Jak języki programowania integrują się ze środowiskami wykonawczymi systemu operacyjnego?

text: Na przykład Objective-C, Swift i Ruby (czyli RubyMotion) integrują się z frameworkiem Cocoa. Czy odbywa się to za pośrednictwem połączonych bibliotek? Zakładam, że wywołują funkcje w istniejących plikach binarnych, zamiast po prostu odtwarzać jakiś wspólny interfejs.


title: Aplikacja GUI z technologią sieciową, która może robić zrzuty ekranu

text: Otrzymałem zadanie stworzenia prototypu aplikacji desktopowej za pomocą ff. wymagania: 1. Musi używać javascript, nodewebkit, node.js 2. Musi być wieloplatformowy, szczególnie Windows i OSX 3. Może zrobić zrzut ekranu określonego obszaru, na którym można wskazać i przeciągnąć 4. Musi być w stanie oglądać wiele katalogów dla zmiany Przeważnie `1,2,4` są możliwe, ale nie mogę zrozumieć (3) jak będę robił zrzuty ekranu w określonych obszarach w zależności od punktu użytkownika i przeciągania danych wejściowych tylko przy użyciu technologii internetowych? Jakie są pomysły na to? Planuję też używać angularJS/css dla interfejsu użytkownika.


title: Jak uczyć się nowych technologii bez projektów na żywo

text: Mam roczne doświadczenie w .Net, ale posiadam wiedzę z podstawowych rzeczy jak framework 2.0, java script oraz podstawy sql server. Ale w przemyśle nie ma potrzeby tych podstawowych rzeczy, chcą więcej niż te, ale ponieważ nie mamy projektu na żywo, jak się do tego zabrać...?


title: Plusy i minusy korzystania z Grails w porównaniu do czystego Groovy

text: Powiedzmy, ty (mam na myśli abstrakcyjnego faceta, każdego członka twojego zespołu) masz doświadczenie w pisaniu i tworzeniu aplikacji internetowych Java, wiesz o filtrach, mapowaniach serwletów i tak dalej, i tak dalej. Załóżmy również, że znasz całkiem dobrze każdą bazę danych sql, niezależnie od tego, czy jest to mysql, oracle czy psql. Na koniec udajmy, że znamy Groovy i jego standardowe biblioteki, na przykład wszystkie te rzeczy JsonBuilder i XmlSlurper, więc nie potrzebujemy konwerterów Grails. Pytanie brzmi – jakie są w tym przypadku korzyści z zastosowania Graala. Nie próbuję rozpoczynać wojny z ogniem, tylko proszę o porównanie - jakie są wzloty i upadki rozwoju Graala w porównaniu z czysto groovy. Na przykład, poza czubkiem głowy, mogę wymienić dwa plusy - automatyczne mapowanie DB i niestandardowe tagi gsp. Ale kiedy chcę napisać skromną aplikację, która zapewnia małe API do obsługi jakiegoś dobrze zdefiniowanego zestawu danych, jestem całkowicie w porządku z niesamowitą obsługą SQL Groovy. Jeśli chodzi o gsp, w ogóle go nie używamy, więc nie interesują nas również niestandardowe tagi.


title: Odporność na awarie dzięki replikacji baz danych SQL

text: Załóżmy, że serwery warstwy środkowej są replikowane w 3 kierunkach, a baza danych backendu (MySQL, PostgreSQL itp.) jest replikowana w 3 kierunkach. Żądanie użytkownika kończy się utworzeniem niektórych danych użytkownika na serwerach warstwy pośredniej i chciałbym zatwierdzić to do bazy danych zaplecza w sposób odporny na awarie. Kandydujące rozwiązanie próby, na przykład, jeśli wyślę dane do jednej bazy danych SQL i zlecę jej replikację danych do innych baz danych, to jeśli jedna baza danych SQL ma awarię dysku twardego, zanim będzie mogła zreplikować dane, dane zostaną utracone. Jakie jest najlepsze rozwiązanie w zakresie odporności na awarie, które jest używane w rzeczywistym świecie.


title: Struktury danych do reprezentowania wyrażeń logicznych

text: Oto logiczne stwierdzenie: term1 AND (term2 OR term3) OR term4 Jaki jest efektywny sposób przechowywania tych informacji w strukturze danych? Na przykład, czy powinienem używać grafu z właściwością na każdej krawędzi definiującą operator następnego terminu? (Ta sugestia nie ma sensu IMO, ale jest to struktura danych, która może być do tego przydatna)


title: Organizowanie warstwy dostępu do danych

text: Używam Entity Framework jako mojego ORM w aplikacji ASP.Net. Mam już utworzoną bazę danych, więc skończyło się na tym, że wygenerowałem z niej model encji. Jaki jest dobry sposób organizowania plików/klas w warstwie dostępu do danych. Mój model struktury encji znajduje się w bibliotece klas i planowałem dodać dodatkowe klasy na Entity (tj. Na tabelę bazy danych) i umieścić wszystkie zapytania związane z tymi tabelami w odpowiednich klasach. Nie jestem pewien, czy to słuszne podejście, a jeśli to gdzie idą zapytania wymagające danych z wielu tabel? Czy całkowicie się mylę organizując moje pliki na podstawie encji/tabeli i czy powinienem organizować je w oparciu o obszary funkcjonalne.


title: Wyjaśnij, co to oznacza, „Kod buldożera”

text: Natknąłem się na artykuł na temat rzeczy, których programiści powinni unikać i natknąłem się na ten termin: Kod buldożera. Autor zdefiniował to jako „nadając pozory refaktoryzacji poprzez rozbijanie kawałków na podprogramy, ale których nie można ponownie wykorzystać w innym kontekście”. Interpretuję to tak, jak mówi, aby uniknąć tworzenia procedur dla kodu, które nie mogą być używane w więcej niż jednym miejscu, co trochę mnie dezorientuje, ponieważ mam instruktora, który woli używać procedur w celu „czystszego” kodu. Czym właściwie jest kod buldożera i dlaczego powinienem go unikać?


title: Co można zrobić, aby zmniejszyć liczbę aktywnych problemów z aplikacjami?

text: Po pierwsze widziałem ten post, który jest nieco podobny do mojego pytania. : Co możesz zrobić, aby zmniejszyć liczbę błędów wdrażania działającej witryny? Pozwól, że przedstawię ci sytuację. Zespół programistów do którego należę posiada metryki związane z naszym kodem. W ciągu ostatnich kilku miesięcy nasze błędy w naszym systemie na żywo znacznie się zwiększyły. Wymagamy, aby nasze aktualizacje aplikacji zostały przetestowane przez co najmniej jednego innego programistę przed uruchomieniem. Osobiście jestem całkowicie temu przeciwny, ponieważ uważam, że aplikacje powinny być testowane przez użytkowników końcowych, ponieważ użytkownicy końcowi są znacznie lepszymi testerami niż programiści, nie jestem przeciwny testowaniu programistów, oczywiście programiści muszą testować kod, ale w większości przypadków są zbyt blisko do kodu. Powodem, dla którego uważam, że użytkownicy końcowi powinni testować w naszym scenariuszu, jest fakt, że nie mamy analityków biznesowych, mamy tylko programistów. Pochodzę z przeszłości, w której BA zajmowali się wszystkimi testami, gdy programiści sprawdzili, czy jest gotowy do uruchomienia. Mamy środowisko pomostowe, które jest klonem środowiska live, którego używamy, aby upewnić się, że nie mamy problemów między środowiskami programistycznymi i live, co powoduje wyłapywanie pewnych błędów. Tak naprawdę wcale nie testujemy użytkowników końcowych, powinienem powiedzieć, że tak naprawdę nie mamy nikogo testującego nasz kod poza programistami, co moim zdaniem wpędza nas w ten bałagan (najlepiej, gdybyśmy mieli testy BA, QA lub profesjonalnych testerów) . Nie mamy zespołu QA ani nic w tym rodzaju. Nie mamy przypadków testowych dla naszych projektów, które są w pełni rozplanowane. Ok, jestem tylko peonowym programistą na dole szczebla, ale prawdopodobnie jestem bardziej zmęczony tymi problemami niż menedżerowie, którzy na nie narzekają. Więc nie mogę im powiedzieć, że robisz to wszystko źle…..Próbowałem delikatnych pchnięć we właściwym kierunku. Jakieś rady lub sugestie, jak złagodzić ten problem?


title: Implementacja ogólnego/dynamicznego systemu właściwości niestandardowych w C#

text: Mam problem z projektowaniem architektury, który moim zdaniem jest odpowiedni dla tej strony. _Zauważ, że dokonałem_ **EDYTUJ** _do tego postu poniżej, odzwierciedlając moje najnowsze potencjalne rozwiązanie tego problemu._ **Ogólny opis problemu:** Moim głównym celem jest zaprojektowanie biblioteki oprogramowania/programu (C#) do automatyzacji bardzo szczególny rodzaj eksperymentów mikroskopowych. Nasze eksperymentalne konfiguracje składają się z wielu odrębnych urządzeń sprzętowych, które generalnie dzielą się na ograniczoną liczbę kategorii: * Detektor punktowy * Stolik próbny XY * Urządzenie z autofokusem * ... Naturalnym wyborem jest zaprojektowanie interfejsu `IDurządzenie` z pewnymi podstawowymi właściwościami wspólnymi dla wszystkie urządzenia takie jak m.in. `IDevice.Initialize()`, `IDevice.Name`, ... Możemy nawet zaprojektować klasę abstrakcyjną, dziedziczącą `IDurządzenie`, np. `DeviceBase` implementujący pewne funkcje wspólne dla wszystkich urządzeń. Podobnie możemy również projektować interfejsy dla konkretnych urządzeń, za każdym razem implementując typowe rzeczy (`IXYSampleStage` może zawierać np. `IXYSampleStage.Move(posX, posY)` lub `IXYSampleStage.AxisXStepSize`). Docelowo wszystkie te interfejsy mogę zaimplementować w końcowych klasach reprezentujących konkretne urządzenia. Chyba wiem, co tam robić. Jednak nie wszystkie urządzenia tej klasy są dokładnie takie same. Niektórzy producenci oferują bogatą funkcjonalność poza standardowymi rzeczami. Stolik XY może mieć m.in. dowolna ilość parametrów opcjonalnych/niestandardowych do ustawienia takich jak np. opóźnienia kanałów, wartości regulacji PID lub cokolwiek innego. Aby rozwiązać ten problem, > Potrzebuję mechanizmu do dodawania dodatkowych właściwości (nie metod, właściwości > wystarczą) do określonych klas urządzeń. Kod wyższego poziomu, wchodząc w interakcję z > urządzeniami, powinien rozumieć te dodane właściwości, być w stanie > uzyskać/ustawić je, niezależnie od ich ilości. Tyle o podstawowym problemie projektowym. **Co już istnieje** Istnieje program operacyjny Micro Manager, który ma taki system zaimplementowany, czy to w C++ (pełne źródło tutaj i nie, nie mogę użyć tego SW bezpośrednio do moich celów): class PropertyBase { public : virtual ~PropertyBase() {} // typ właściwości virtual PropertyType GetType() = 0; // ustawianie i pobieranie wartości virtual bool Set(double dVal) = 0; wirtualny bool Set(long lVal) = 0; wirtualny bool Set(const char* Val) = 0; virtual bool Get(double& dVal) const = 0; virtual bool Get(long& lVal) const = 0; virtual bool Get(std::string& strVal) const = 0; // Ogranicza wirtualny bool HasLimits() const = 0; wirtualny podwójny GetLowerLimit() const = 0; wirtualny podwójny GetUpperLimit() const = 0; wirtualny bool SetLimits(double lowerLimit, double upperLimit) = 0; // Trochę więcej rzeczy pominiętych dla zwięzłości ... }; Następnie klasa `Property` implementuje niektóre z czystych funkcji wirtualnych związanych z ograniczeniami. Następnie `StringProperty`, `IntegerProperty` i `FloatProperty` implementują metody Get()/Set(). Te rodzaje własności są zdefiniowane w wyliczeniu, które dopuszcza tylko te trzy rodzaje własności. Następnie właściwości można dodać do `PropertyCollection`, który jest zasadniczo rodzajem słownika będącego częścią klasy urządzeń. To wszystko działa ładnie. Często używamy MM w laboratorium do innych rodzajów eksperymentów, ale próbując zrobić podobne rzeczy w moim rozwiązaniu C#, natknąłem się na kilka bardziej podstawowych pytań. Większość z nich wiąże się z brakiem pewności, jak wykorzystać określone funkcje oferowane przez C#/.NET (ogólne, ale zdecydowanie także dynamika, ...), aby być może poprawić istniejącą implementację C++. **Pytania:** _Pierwsze pytanie_ : Aby ograniczyć dozwolone typy właściwości, MM definiuje wyliczenie: enum PropertyType { Undef, String, Float, Integer }; Podczas gdy C# ma odbicie i dużo wbudowanej obsługi typów/ogólnych. Dlatego rozważyłem to: public interface IProperty<T> { public T value { get; ustawić; } ... } Mógłbym następnie wykonać abstrakcyjne `PropertyBase<T>` i ostatecznie IntegerProperty : PropertyBase<int> StringProperty : PropertyBase<string> FloatProperty : PropertyBase<double> Ale to sprawia mi kłopoty, gdy próbuję umieścić je w kolekcji, ponieważ w .NET następujące nie jest możliwe: PropertyCollection : Dictionary<string, IProperty<T>> Chyba że przyjmę tę strategię, tj. Mam niegeneryczną klasę bazową, która zwraca tylko typ, a następnie jeszcze więcej klas bazowych do faktycznego wdrożyć mój system nieruchomości. Wydaje mi się to jednak zawiłe. **Czy jest lepszy sposób**? Myślę, że korzystanie z ogólnych funkcji języka może pozwolić mi zrezygnować z konieczności używania wszystkich tych metod Get()/Set() w powyższym przykładzie MM, ponieważ byłbym w stanie poznać typ kopii zapasowej mojej wartości właściwości. Zdaję sobie sprawę, że jest to bardzo szerokie pytanie, ale istnieje duża luka między zrozumieniem podstaw niektórych funkcji języka a umiejętnością pełnego podejmowania właściwych decyzji projektowych od samego początku. _Drugie pytanie_ Zastanawiam się nad tym, aby wszystkie moje końcowe klasy urządzeń dziedziczyły z rodzaju `DynamicDictionary` (np. podobnego do tego tutaj): public class DynamicDictionary : DynamicObject { internal readonly Dictionary<string, object> SourceItems; public DynamicDictionary(Dictionary<ciąg, obiekt> elementy źródłowe) { elementy źródłowe = elementy źródłowe; } public override bool TrySetMember(SetMemberBinder spinacz, wartość obiektu) { if (SourceItems.ContainsKey(binder.Name)) { SourceItems[binder.Name.ToLower()] = wartość; } else { SourceItems.Add(binder.Name.ToLower(), value); } zwróć prawdę; } public override bool TryGetMember(GetMemberBinder binder, wynik z obiektu) { if (SourceItems != null) { if (SourceItems.TryGetValue(binder.Name.ToLower(), out result)) { return true; } } wynik = null; zwróć prawdę; } } } ale zamiast `<string, object>` chciałbym użyć `<string, MyPropertyBase>`, gdzie ciąg byłby aliasem dla mojej właściwości (co odpowiadałoby projektowi z Q1). Czy zrobienie czegoś takiego miałoby sens z punktu widzenia projektowania? W rzeczywistości musiałbym tylko dodać niestandardowe właściwości do urządzeń w czasie projektowania (tj. Podczas pisania niestandardowego sterownika urządzenia). W czasie wykonywania musiałbym tylko sprawdzić moje niestandardowe właściwości lub pobrać/ustawić ich wartości. C++ MM rozwiązuje ten problem, używając kilku metod `CreateProperty("alias", Property)` w konstruktorze urządzeń, co znowu działa, więc może użycie dynamiki tutaj jest przesadą. Ale znowu zastanawiam się, czy ktoś mógłby dać wgląd w możliwe zalety, ale na pewno i wady pokonywania dynamicznej trasy. **Podsumowując** Czy istnieją funkcje .NET (4.5), które mógłbym wykorzystać, aby wdrożyć niektóre koncepcje MM w bardziej elegancki sposób, skupiając się na wyżej wymienionych konkretnych kwestiach? Ponownie zdaję sobie sprawę, że jest to bardzo szerokie pytanie i być może niektóre z możliwych odpowiedzi są bardziej kwestią gustu/stylu niż czegokolwiek innego, ale jeśli tak (co sprawia, że pytanie jest nieodpowiednie dla tej platformy), prosimy o przesłanie opinii/komentarzy w taki sposób, aby Mogę odpowiednio dostosować. **EDYTUJ** Poświęciłem trochę czasu na przemyślenie tego i spróbowałem rozwiązać go w następujący sposób: Po pierwsze, wyliczenie określające dozwolone typy właściwości: public enum PropertyType { Undefined, String, Float, Integer } Po drugie, interfejs `IPPropertyType ` odpowiedzialny za sprawdzanie wartości przekazanych do właściwości określonego typu: public interface IPropertyType { Type BackingType { get; } PropertyType TypeAlias { get; } bool IsValueTypeValid(wartość obiektu); } Następnie klasa bazowa implementująca `IPPropertyType`: public bool IsValueTypeValid(object value) { if (value == null) { return true; } Typ typu = wartość.GetType(); if (type == this.BackingType) { return true; } zwróć fałsz; } ... public Type BackingType { get { switch (this.TypeAlias) { case PropertyType.Integer: return typeof(long); case PropertyType.Float: zwraca typeof(double); case PropertyType.String: zwraca typeof(string); domyślnie: return null; } } } Następnie mam trzy `IPropertyType`: `StringPropertyType`, `IntegerPropertyType` i `FloatPropertyType`, gdzie za każdym razem właściwość `PropertyTypeAlias jest ustawiona na jedną z wartości wyliczenia.` Mogę teraz dodać mój IPropertyType do `IProperty` typy: interfejs publiczny IProperty { string Alias { get; } /// Jeśli chcemy ograniczyć właściwość do wartości dyskretnych. Dictionary<ciąg, obiekt> DozwoloneWartości { get; } bool HasLimits { get; } bool HasValue { get; } bool IsReadOnly { get; } /// Wywołanie zwrotne dla operacji sprzętowych przy użyciu wartości właściwości. Func<PropertyFuncType, bool> PropertyFunction { set; } PropertyType TypeAlias { get; } obiekt Wartość { get; ustawić; } void AddAllowedValue(string alias, wartość obiektu); nieważne ClearAllowedValues(); // W przypadku właściwości liczbowych przydatne może być ograniczenie zakresu wartości. void SetLimits(obiekt LowerLimit, obiekt upperLimit); // Zajmą się tym sprzętem... bool TryApply(); bool TryUpdate(); } Tutaj ustawiacz wartości uruchomi walidację wartości wejściowej zdefiniowanej przez `IPPropertyType`. `IPProperty` jest prawie w pełni zaimplementowany w `PropertyBase`, który ma również pole `IPropertyType`, które jest ustawiane podczas tworzenia instancji (i nie może być później zmieniane; właściwość nie może zmienić typu. Z klasy bazowej, np.: obiekt publiczny Wartość { get { return this.storedvalue; } set { if (this.propertyType.IsValueTypeValid(value) && this.IsValueAllowed(value)) { this.storedvalue = value; } } } To pozostawia tylko określone klasy `IPproperty`: `StringProperty`, `IntegerProperty` i `FloatProperty` gdzie jest tylko jedno nadpisanie, `SetLimits()` ponieważ opiera się na porównaniu wartości. Wszystko inne może znajdować się w klasie bazowej: public override void SetLimits(object lowerlimit, object upperlimit) { // Domyślnie this.HasLimits = false ; // Narzucanie ograniczeń właściwości za pomocą wartości dyskretnych nie ma sensu. if (this.AllowedValues.Count != 0) { // Jeśli przekazane obiekty są faktycznie podwojone, możemy przystąpić do ich sprawdzania. if (this.IsValueTypeValid(lowerlimit) && this.IsValueTypeValid(upperlimit)) { // Aby umożliwić porównanie, musimy rzutować obiekty na dublowanie. double lowerdouble = (double)limit dolny; podwójna górna podwójna = (podwójna) górna granica; // Dolny limit nie może być większy niż górny limit. if (lowerdouble < upperdouble) { // Przekazane wartości są w porządku, więc ustaw je. this.DolnyLimit = dolnypodwójny; this.GórnyLimit = upperdouble; this.HasLimits = prawda; } } } } W ten sposób myślę, że mam system, który pozwala mi mieć kolekcję `IPProperty`, która może faktycznie przechowywać dane różnych typów (int, float lub string), gdzie dla każdego typu `IPproperty` mam umiejętność implementacji limitów wartości itp. (tj. rzeczy, które są różne, w zależności od typu danych) ... Jednak nadal mam wrażenie, że są albo lepsze sposoby na zrobienie tego typu rzeczy, albo że jestem nad inżynierią. Dlatego wszelkie opinie na ten temat są nadal mile widziane. **EDYTUJ 2** Po dalszych poszukiwaniach w Internecie wierzę, że ostatnie fragmenty kodu zamieszczone tutaj w poprzedniej edycji skłaniają się w stronę „wzoru” Adaptive Object Model (jeśli naprawdę tak jest). Jednak większość zasobów na ten temat wydaje się być dość stara i zastanawiam się, czy istnieją obecnie lepsze sposoby na osiągnięcie tego typu rzeczy.


title: Jakie są małe, ale rozszerzalne pomysły na gry, które można wykorzystać jako inspirację?

text: Niedawno natknąłem się na grę Dopewars (lub ogólniej Drugwars). Teraz jest to niezwykle prosta gra do zaimplementowania. Trywialne podstawowe wdrożenie można wykonać najwyżej w kilka dni. I jest niezwykle rozszerzalny. Teraz moje pytanie brzmi, jakie są inne gry, które mają ten sam rodzaj „poziomu trudności” w implementacji? Gra, która jest naprawdę zabawna, ale prosta w implementacji i którą można łatwo rozbudować?


title: Czy jQuery może być używane po stronie serwera?

text: Wiem, że możesz używać strony serwera JavaScript z node.js, ale czy możemy użyć jQuery również dla backendu? Czy po prostu będę musiał nauczyć się CoffeeScript zamiast jQuery?


title: Jak przeglądarki malują drzewo renderowania na ekranie?

text: Interesuje mnie budowa silnika renderującego podobnego do przeglądarki. Rozumiem trochę, jak działają zestawy narzędzi OpenGL i GUI. Ale w jaki sposób przeglądarki faktycznie umieszczają piksele na ekranie? Czy są jak rasteryzatory programowe, które skanują każdą linię i malują wszystko, co jest w drzewie renderowania? A może działają jak zestawy narzędzi GUI i wywołują funkcje do wyświetlania elementów w określonych współrzędnych? Czy są jakieś biblioteki, które skupiają się konkretnie na części malowania krytycznej ścieżki renderowania przeglądarki?


title: Najlepsze narzędzia RAD dla aplikacji internetowych

text: Planuję stworzyć internetową aplikację do **fakturowania**. Będzie on używany przez osoby fizyczne do rejestrowania i przeglądania swoich faktur. Ich dane muszą być zapisane we wspólnej bazie danych, ale przechowywane oddzielnie od innych loginów (tj. dane nie mogą być udostępniane innym użytkownikom/loginom). Podejrzewam, że będę potrzebować: 1. strony logowania / uwierzytelnienia 2. formularzy do wprowadzania unikalnych klientów i pozycji danej osoby 3. formularza do wprowadzania faktur 4. solidnych narzędzi do raportowania / możliwości dashboardu Obecna baza wiedzy to pakiet Microsoft (np. C#, .Net) **Czy ktoś może doradzić najlepsze narzędzia/środowisko RAD, aby osiągnąć ten wynik? Twoje zdrowie!**


title: Jak połączyć aplikację Django z aplikacją Java Web za pomocą JMS

text: Zajmuję się moim projektem kursu systemów DB, jest to aplikacja do symulacji giełdy używająca Oracle 10g, umowa jest taka, że wsparcie jest dla Javy, ale zamierzam to zrobić w Pythonie. Ostatnią iteracją projektu jest połączenie dwóch aplikacji za pomocą kolejek wiadomości (protokoły MQ), jeśli obie aplikacje są w Javie, TA zaproponowało połączenie ich za pomocą JMS, czy możesz mi doradzić, jak połączyć aplikację Django (moja aplikacja) z aplikacja Java (aplikacja partnera). Odkryłem, że protokół MQ jest oparty na uniwersalnym standardzie, więc nie może to być trudny problem do rozwiązania. Inną opcją, której szukałem, jest Spring Python, framework, który ułatwia to połączenie. Więc ehat jest najlepszą opcją.


title: Czy w Agile powinienem utworzyć zadanie przeglądu kodu?

text: Mój zespół wykorzystuje Agile jako podejście programistyczne. Obecnie każde zadanie ma cztery stany, które są do zrobienia, w toku, testowane i wykonane. Właśnie zaczęliśmy robić przeglądy kodu i zastanawiam się, czy muszę utworzyć zadanie przeglądu kodu, czy też powinienem dodać czas na przegląd kodu do oszacowania?


title: Jak wykonać plik w podkatalogu

text: Więc mam mały plik instalacyjny, który musi zainstalować kilka plików run-time. Pliki znajdują się w podkatalogach katalogu głównego dysku. Litera dysku będzie inna na każdym komputerze klienta, więc próbowałem tej i kilku innych metod bezskutecznie. // Plik jest uruchamiany z D:\ "eg: D:\setup.exe" // Wszystkie moje środowiska uruchomieniowe znajdują się w ścieżce narzędzi Tools\Runtime direcorties = Directory.GetCurrentDirectory(); ciąg wew = "/q /norestart"; string location = "\\Narzędzia\\Runtimes\\Net\\"; string step1 = "dotnetfx35.exe"; var process = Process.Start(ścieżka + lokalizacja + krok1 + ext); proces.WaitForExit(); Jak wiecie profesjonaliści i bardziej doświadczeni programiści, z jakiegoś powodu... To nie działa, ciągle otrzymuję plik nie znaleziony.


title: Jaki jest problem z literałami XML Scala?

text: W tym poście Martin (główny szef języka) pisze: > [litery XML] Wydawało się wtedy świetnym pomysłem, teraz wystaje jak bolący kciuk. Wierzę, że dzięki nowemu schematowi interpolacji ciągów będziemy mogli umieścić w bibliotekach całe przetwarzanie XML, co powinno być dużym sukcesem. Zainteresowany projektowaniem języka, zastanawiam się: dlaczego pisze, że błędem było włączenie literałów XML do języka? Jakie są kontrowersje dotyczące tej funkcji?


title: Najlepsze praktyki dotyczące geolokalizacji

text: Piszemy wyszukiwarkę lotów. Chcemy wstępnie wypełnić lotnisko wylotu dla użytkowników telefonów komórkowych najbliższym ich lokalizacji. Aby to zrobić, naszym planem jest 1. Znajdź listę lotnisk z ich szerokością/długością geograficzną. 2. Znajdź geolokalizację użytkownika za pomocą czegoś takiego jak Geolokalizacja HTML5 (która prosi użytkownika o pozwolenie). 3. Oblicz odległość między lokalizacją użytkownika a każdym lotniskiem, aby znaleźć najbliższe. 4. Wypełnij formularz wyjazdu. Czy to standardowy sposób postępowania? Jestem młodszym programistą i nie jestem przyzwyczajony do tego rodzaju problemów. Czy jest jakaś przeszkoda, o której powinienem pamiętać podczas tworzenia mojego rozwiązania? Mam wrażenie, że algorytm obliczania odległości między jednym punktem a 300 lokalizacjami może być nieco ciężki.