title: Wszechstronna książka projektowa dla programisty (programista JavaScript)

text: Zacząłem ostatnio dużo rozwijać javascript, głównie front-end, ale także używając node.js. Ponieważ obecnie przechodzę z dużej firmy do startupu, oczekują, że jako programista front-end będę wiedział, jak tworzyć pół przyzwoite projekty (czego nie mogę). Szukam książki (lub zestawu screencastów), aby dać mi trochę dobre, dobrze zaokrąglone porady dotyczące projektowania. Znam CSS, ale mój projekt zawsze wygląda okropnie, nie wiem też nic o Photoshopie (a jestem na Linuksie i nie mam do niego dostępu) Jakie masz wybory? Nie chcę być projektantem na pełen etat, chciałbym tylko móc wnieść swój wkład.


title: Testowe pytanie do rozmowy kwalifikacyjnej

text: Gdybyś miał czas na przetestowanie tylko 5 funkcji produktu, który ma łącznie 10 funkcji, jak byś zdecydował, które funkcje chcesz przetestować? Kolejne pytanie: kiedy można wysłać produkt z błędem?


title: Kiedy używać typedef?

text: Jestem trochę zdezorientowany, czy i kiedy powinienem używać typedef w C++. Czuję, że jest to balansowanie między czytelnością a wyrazistością. Oto przykład kodu bez żadnych typedefs: int sum(std::vector<int>::const_iterator first, std::vector<int>::const_iterator last) { static std::map<std::tuple<std:: wektor<int>::const_iterator, std::vector<int>::const_iterator>, int> lookup_table; std::map<std::tuple<std::vector<int>::const_iterator, std::vector<int>::const_iterator>, int>::iterator lookup_it = lookup_table.find(lookup_key); if (lookup_it != lookup_table.end()) return lookup_it->second; ... } Dość brzydka IMO. Dodam więc kilka typedef w funkcji, aby wyglądała ładniej: int sum(std::vector<int>::const_iterator first, std::vector<int>::const_iterator last) { typedef std::tuple< std::vector<int>::const_iterator, std::vector<int>::const_iterator> Klucz_szukania; typedef std::map<klucz_podglądu, int> tablica_podglądu; statyczny Lookup_table lookup_table; Lookup_table::iterator lookup_it = lookup_table.find(lookup_key); if (lookup_it != lookup_table.end()) return lookup_it->second; ... } Kod wciąż jest trochę niezgrabny, ale pozbywam się większości koszmarnych materiałów. Ale wciąż istnieją iteratory wektorów int, ten wariant pozbywa się ich: typedef std::vector<int>::const_iterator Input_iterator; int sum(Input_iterator pierwszy, Input_iterator ostatni) { typedef std::tuple<Input_iterator, Input_iterator> Lookup_key; typedef std::map<klucz_podglądu, int> tablica_podglądu; statyczny Lookup_table lookup_table; Lookup_table::iterator lookup_it = lookup_table.find(lookup_key); if (lookup_it != lookup_table.end()) return lookup_it->second; ... } To wygląda czysto, ale czy nadal jest czytelne? Kiedy powinienem używać typedef? Jak tylko mam typ koszmaru? Jak tylko zdarzy się więcej niż raz? Gdzie mam je umieścić? Czy powinienem używać ich w sygnaturach funkcji, czy zachować je do implementacji?


title: Znalezienie odpowiedniej aplikacji internetowej do śledzenia błędów

text: Poszukuję systemu śledzenia błędów (podobnego do http://www.mantisbt.org) z następującymi wymaganiami: * * * Specyfikacje wymagań to: 1. Prześlij zdjęcie i różne pliki bez żadnych ograniczeń przestrzeni pliku. 2. Jeżeli użytkownik należy do określonej grupy lub grupy biznesowej, logotyp GUI powinien zostać zmieniony na logotyp grupy po wprowadzeniu przez użytkownika nazwy użytkownika i hasła. Wszyscy użytkownicy korzystają z tej samej bazy danych z różnymi GUI. 3. Prawidłowe informacje o nieprzypisanym, zmodyfikowanym i rozwiązanym przypadku błędu zostaną wyświetlone w oparciu o grupę lub grupę biznesową, do której użytkownik jest przypisany. 4. Wszystkie informacje zostaną wyświetlone po zalogowaniu się użytkownika. 5. Włącz, aby utworzyć 1 lub więcej superużytkownika (administratora) i zwykłego użytkownika. 6. Właściwy użytkownik z odpowiednią grupą lub grupą biznesową uzyska odpowiednie informacje. Wymóg niefunkcjonalny: 1. Śledzenie błędów odbywa się w aplikacji internetowej. 2. Wszystkie informacje muszą korzystać z przeglądarki internetowej, aby wyświetlić wszystkie informacje. * * *


title: Komunikacja między usługą WCF [biblioteka] a samoobsługą [Winform]

text: **Wprowadzenie** : Mam bibliotekę usług WCF i samoobsługowego Winform. Funkcje usługi to Eksplorator plików, w tym _(kopiowanie, przenoszenie, usuwanie, nowy folder, usuwanie... itd.)_ i Menedżer zadań _(uruchamianie, zabijanie, aktualizowanie listy)_. Teraz chcę dodać inne funkcje, takie jak czatowanie między hostem własnym a klientem, wysyłanie obrazu od klienta do hosta własnego, aby po odebraniu był wyświetlany w obrazku w nowej formie. Do tej pory mam dwa punkty końcowe dla (Menedżer zadań, Menedżer plików), które działają w ramach jednej usługi „MainService”. I skonfigurowałem wszystkie połączenia przy użyciu konfiguracji i kreatorów WCF DotNet 4.0, a używam netTcpBinding. **Problem** : muszę wiedzieć, jak komunikować się z biblioteką usług WCF i hostem własnym, aby móc dołączyć otrzymany czat od klienta w polu tekstowym formularza `TextBoxChat` formularza self-host. Wywołaj również wywołanie zwrotne klienta z własnego hosta po kliknięciu przycisku Wyślij, aby wysłać wiadomość z pola tekstowego własnego hosta `TextBoxMessage`. Załóżmy, że jest to formularz czatu do samodzielnego hostowania ![http://i.stack.imgur.com/CWL8H.jpg](http://i.stack.imgur.com/CWL8H.jpg) Czy można to zrobić w WCF? Wolałbym uruchomić ChatEndpoint w MainService, więc wszystkie punkty końcowe używają jednego portu.


title: Jak odnaleźć swoją drogę w świecie programowania?

text: Wydaje się, że aby zostać odnoszącym sukcesy programistą, należy wybrać jeden język, technologię, platformę, dziedzinę i skupić się na tym. Problem polega na tym, że jest tak wiele interesujących rzeczy w tej dziedzinie, że nie mogę przestać wybierać, nauczyłem się podstaw wielu języków/technologii programowania i od razu przeniosłem się do czegoś innego. Więc spędzam dużo czasu z tak małym pożytkiem. Jestem programistą .NET/C#/WPF od ponad roku, nie jestem złym programistą, ale mógłbym być o wiele lepszy, gdybym był bardziej skoncentrowany na moim obecnym stosie technologicznym, chociaż czuję, że będę utknąłem w tworzeniu bezsensownych aplikacji biznesowych i GUI w tym przypadku. Być może pomogłoby mi zdobycie satysfakcjonującej pracy polegającej na robieniu czegoś pożytecznego, ale żeby dostać taką pracę, trzeba już być biegły w jakiejś dziedzinie. Więc rozpaczliwie potrzebuję porady. Jak wybrać swoją drogę i mieć pewność, że się nie pomylisz? Jak przestać się martwić i zacząć programować?


title: Jak oceniać podejścia JNI z Javą i Fortranem?

text: W tej chwili mamy około 150 tysięcy linijek Javy podzielonych na dwie główne części. Pierwszy zawiera implementację algorytmów, które mamy nadzieję powtórzyć w Fortranie, a drugi ma dobry kawałek GUI, aby doprowadzić je do punktu, w którym można je uruchomić. Interfejs użytkownika to głównie Swing, ale nowym dziełem jest JavaFX. Celem jest ponowne zaimplementowanie (i aktualizacja) tych algorytmów w fortran i powiązanie ich obecnego poziomu integracji z interfejsem Java. Model obejmuje dane przesyłane w obie strony przez most między dwoma językami: dane konfiguracyjne będą dostarczane z GUI do kodu fortran, a duże, interesujące macierze zostaną odesłane. Aby to skomplikować, dane konfiguracyjne będą zawierać pewną liczbę otwartych delegatów, zazwyczaj ci delegaci biorą wektor podwojeń i wypluwają wartość skalarną, ale w wielu przypadkach faktycznie wykonują złożone operacje na plikach lub sieci, które zajmują oba czasy i zasoby. Mam trzy przemyślenia na temat tego, jak możemy to zrobić: 1. Utwórz szeroki interfejs POJO w Fortran, użyj JNI * Pierwszym pomysłem, najprostszym i najszybszym do wartości jest wydzielenie kluczowych punktów w przepływie fortranu kodu, a te punkty wysyłają zwroty z Fortran przez JNI z powrotem do javy, z danymi wynikowymi. * Jest to najmniej preferowana opcja, ponieważ będzie wymagała dobrej współpracy między front-endem Java a back-endem Fortran, gdy tylko będziemy musieli zmienić ten interfejs. Co więcej, zachowanie tych krytycznych punktów w Javie może okazać się niemożliwe, ponieważ zmieniają się algorytmy w fortran i ponieważ chcemy głębszej integracji z front-endem. 2. Stwórz w Fortran interfejs oparty na wywołaniach zwrotnych, użyj JNI * Dla mnie jest to prawdopodobnie najbardziej wyrafinowane rozwiązanie, ponieważ obejmuje wywoływanie znanego, zorientowanego obiektowo pub-sub za pomocą nieprzyjemnych wskaźników procedur w fortran. Pomysł byłby dość typowy od strony front-endu. Utwórz interfejs z liczbą obsługi komunikatów „onInterestingDomainEvent” z możliwie najprostszym zestawem argumentów. * Zrobiliśmy tu trochę eksploracji i nie otrzymaliśmy potrzebnej składni: jeden z naszych kompilatorów stale na coś narzeka. 3. Utwórz dwa procesy przed uruchomieniem aplikacji, odczyt/zapis z potoków w Javie i Fortran * To wydaje mi się dobre rozwiązanie, które może być trochę trudne. Jestem trochę zaniepokojony wydajnością tego (zwłaszcza jeśli nie mogę uzyskać odpowiednich nazwanych potoków z Javy i Fortranu). * Martwię się o drugi proces ze względu na wszystko, co pociąga za sobą drugi proces, w tym synchronizację, obsługę błędów i bezpieczeństwo. * Jest dużo nietypowego kodu, który musi zostać napisany, aby to rozwiązanie zadziałało, ale jestem przekonany, że może działać i że spełnia wszystkie nasze wymagania, oprócz obaw o wydajność. **Gdzie potrzebuję pomocy:** potrzebuję pomocy w zrozumieniu, jak ocenić te trzy podejścia lub w zrozumieniu, na co powinienem patrzeć. Moim głównym problemem jest wydajność lub przepustowość między dwiema aplikacjami, ponieważ staram się zminimalizować wąskie gardła. I wiem, że muszę również pamiętać o zasadach decouplingu. * * * Aby zająć się niektórymi łatwiejszymi rozwiązaniami / problemami przed przejściem do JNI: * Zoptymalizowaliśmy już implementacje algorytmów podczas korzystania z analizatora wydajności. Nadal nie są wystarczająco szybkie, a podobne algorytmy napisane w Fortranie działają znacznie szybciej. * Nie kontrolujemy sprzętu, na którym nasi klienci wdrożą nasze rozwiązanie. Więc nie możemy po prostu rzucić coraz większego sprzętu na ten problem. * Zespół badawczy, który opracowuje te algorytmy, ma duże doświadczenie w Fortranie i będzie odpowiedzialny za utrzymanie tego portu.


title: Książki lub przewodniki dotyczące bezpiecznego przechowywania kluczy i szyfrowania baz danych

text: Mam pomysł na produkt SaaS, który chcę stworzyć, jednak ten produkt będzie przechowywać niezwykle wrażliwe dane, które w spoczynku muszą być szyfrowane. Problemem jest nie tyle szyfrowanie, ile problem bezpiecznego przechowywania kluczy, tak aby w przypadku włamania na serwer nie można było po prostu odzyskać kluczy i użyć ich do odszyfrowania bazy danych. Czy są jakieś porządne poradniki dotyczące szyfrowania baz danych, a w szczególności bezpiecznego przechowywania kluczy? Wydaje się, że nie jest to prosty temat i trudno go rozwiązać. Widzę wiele sposobów na zaatakowanie takiego systemu, ale nie mogę wymyślić takiego, który byłby wystarczająco bezpieczny, aby przechowywać wysoce poufne informacje.


title: Jakie stanowiska mogą wiązać się z doskonaleniem procesów z wykorzystaniem CMMI i Scrum?

text: Jestem studentem informatyki i od kilku lat pracuję nad projektami zespołowymi. Czytałem kilka artykułów na temat CMMI i Scrum; to jest dla mnie bardzo interesujące i chciałbym wiedzieć, jakie prace wiążą się z usprawnianiem procesów wewnątrz organizacji. Jakie studia mogą kogoś zaprowadzić do tych zawodów? Kierownictwo? Wątpię, czy chodzi tylko o to, że skoro CMMI/Scrum wpływa również na zarządzanie, myślę, że jest to coś ponad wszystko, co będzie spajać organizację.


title: Co odpowiedzieć klientowi, który pyta, którą z dwóch równoważnych technologii należy zastosować?

text: Jako freelancer często jestem pytany przez moich klientów, co muszą wybrać spośród podobnych elementów, z których żaden nie jest lepszy od drugiego. Przykłady: > „Czy moja witryna e-commerce musi być w PHP lub ASP.NET?” > > „Czy muszę hostować tę zwykłą usługę internetową w chmurze, czy korzystać ze zwykłej usługi hostingowej?” > > „Który z nich jest lepszy dla mojej nowej strony internetowej: MySQL czy Oracle?” itd. Może być co najwyżej 1% przypadków, w których wybór jest trafny i istnieje rzeczywisty, obiektywny powód, aby użyć jednego z nich zamiast drugiego, w oparciu o dokładne dane i badania. We wszystkich innych przypadkach to w ogóle nie ma znaczenia. Jest to całkowicie nieistotne, albo dlatego, że nie ma implikacji¹, albo dlatego, że te implikacje są zbyt małe, aby je brać pod uwagę², albo w końcu dlatego, że nie da się ich przewidzieć³. Jeśli wiesz jedno, a nie drugie, odpowiedź na te pytania jest prosta: > „Możesz napisać aplikację w C# lub w Javie, obie są prawdopodobnie > równoważne w twoim przypadku. Pamiętaj, że jestem programistą C#, więc jeśli wybierzesz > Java, nie będę mógł pracować nad Twoim projektem i będziesz musiał znaleźć > innego freelancera.” Kiedy znasz obie technologie, nie możesz na to odpowiedzieć. Jak w takim razie wytłumaczyć klientowi, że pytanie, które zadaje, jest zagrożone ogniem wojny i nie ma realnych konsekwencji dla jego projektu? Innymi słowy, jak wytłumaczyć, że wybrałeś jedną technologię zamiast równoważnej z powodów związanych z zasobami ludzkimi, nie sprawiając wrażenia, że jesteś nieprofesjonalny lub nie dbasz o projekt? * * * ¹ Przykład: Czy MySQL jest lepszy (gorszy?) pod względem wydajności w porównaniu do Oracle, dla osobistej strony internetowej, do której będą mieli dostęp, och, bądźmy optymistami, dwie osoby dziennie? ² Przykład: dla danego projektu poproszono mnie o zaspokojenie, czy hosting Windows Azure byłby tańszy niż hosting tej samej aplikacji u znanego dostawcy hostingu ASP.NET. Koszt okazał się dokładnie taki sam. ³ Przykład: Twój klient ma _pomysł_ na przyszłą aplikację (sam pomysł jest bardzo niejasny). Nie ma biznesplanu, żadnych wymagań, zupełnie nic. Tylko pomysł. Zostaniesz zapytany, czy Java jest lepsza niż C# dla tej aplikacji. Co odpowiadasz?


title: Wydajność Scali w porównaniu do Javy

text: Przede wszystkim chciałbym wyjaśnić, że nie jest to pytanie „język X kontra język Y” w celu ustalenia, który jest lepszy. Korzystam z Javy od dłuższego czasu i zamierzam nadal z niej korzystać. Równolegle z tym z dużym zainteresowaniem uczę się Scali: poza drobiazgami, które wymagają przyzwyczajenia do wrażenia, że naprawdę bardzo dobrze potrafię pracować w tym języku. Moje pytanie brzmi: jak oprogramowanie napisane w Scali wypada w porównaniu z oprogramowaniem napisanym w Javie pod względem szybkości wykonywania i zużycia pamięci? Oczywiście ogólnie jest to trudne pytanie, ale spodziewałbym się, że konstrukcje wyższego poziomu, takie jak dopasowywanie wzorców, funkcje wyższego rzędu itp., wprowadzają pewne obciążenie. Jednak moje obecne doświadczenie w Scali ogranicza się do małych przykładów poniżej 50 linii kodu i do tej pory nie prowadziłem żadnych testów porównawczych. Więc nie mam prawdziwych danych. Jeśli okazałoby się, że Scala _ma_ trochę narzutu na Javę, to czy ma sens mieć mieszane projekty Scala / Java, gdzie koduje się bardziej złożone części w Scali i części krytyczne dla wydajności w Javie? Czy to powszechna praktyka? **EDYTUJ 1** Uruchomiłem mały test porównawczy: zbuduj listę liczb całkowitych, pomnóż każdą liczbę przez dwa i umieść ją na nowej liście, wydrukuj listę wynikową. Napisałem implementację Java (Java 6) oraz implementację Scala (Scala 2.9). Uruchomiłem oba na Eclipse Indigo pod Ubuntu 10.04. Wyniki są porównywalne: 480 ms dla Javy i 493 ms dla Scali (uśrednione ponad 100 iteracji). Oto fragmenty, których użyłem. // Java public static void main(String[] args) { long total = 0; ostateczna int maxCount = 100; for (int liczba = 0; liczba < maxCount; liczba++) { final long t1 = System.currentTimeMillis(); ostateczna int max = 20000; final List<Integer> list = new ArrayList<Integer>(); for (indeks = 1; indeks <= max; indeks++) { list.add(indeks); } final List<Integer> doub = new ArrayList<Integer>(); for (wartość całkowita : lista) { doub.add(wartość * 2); } for (wartość całkowita: doub) { System.out.println(wartość); } końcowy długi t2 = System.currentTimeMillis(); System.out.println("Milisekundy, które upłynęły: " + (t2 - t1)); suma += t2 - t1; } System.out.println("Średnia milisekundy: " + (całkowita / maxCount)); } // Scala def main(args: Array[String]) { var total: Long = 0 val maxCount = 100 for (i <-1 do maxCount) { val t1 = System.currentTimeMillis() val list = (1 do 20000 ) toList val doub = mapa listy { n: Int => 2 * n } doub foreach ( println ) val t2 = System.currentTimeMillis() println("Milisekundy, które upłynęły: " + (t2 - t1)) total = total + (t2 - t1) } println("Średnia milisekundy: " + (total / maxCount)) } Tak więc w tym przypadku wydaje się, że narzut Scali (używając range, map, lambda) jest naprawdę minimalny, co nie jest dalekie od podanych informacji przez światowego inżyniera. Może istnieją inne konstrukcje Scala, których należy używać ostrożnie, ponieważ są one szczególnie _ciężkie_ do wykonania? **EDIT 2** Niektórzy z was wskazali, że println w wewnętrznych pętlach zajmuje większość czasu wykonania. Usunąłem je i ustawiłem rozmiar list na 100000 zamiast 20000. Wynikowa średnia wyniosła 88 ms dla Javy i 49 ms dla Scali.


title: Node.js, socket.io a przycisk odświeżania inicjowanego przez użytkownika i uwagi dotyczące obciążenia serwera

text: Mam tutaj do czynienia z sytuacją w dużej ilości aplikacji sieciowej dla wielu dzierżawców z ponad 100 tys. użytkowników z firm, które nie doceniają problemów z wydajnością. Potrzebujemy aktualizacji „w czasie rzeczywistym”.. Zasadniczo wysyłamy żądanie do systemu innej firmy i chcielibyśmy zobaczyć wyniki w czasie rzeczywistym, zwrócono około 5 statusów, a pierwsze trzy statusy pojawiają się bardzo szybko (w ciągu minuty). Nasza obecna implementacja ma mieć cykl odświeżania, który ma miejsce co pięć minut (częściowe ogłaszanie zwrotne strony z Jquery), użytkownik może to zmienić, klikając przycisk odświeżania.. Powodem, dla którego zdecydowaliśmy się na to podejście, jest potencjalne obciążenie serwera „długim odpytywaniem” lub częstymi postami zwrotnymi (co 2 sekundy) oraz obciążenie, jakie obciążyłoby to nasz serwer (mamy kilka baz danych i serwerów WWW, więc utrzymywanie dziennika zmian nie wchodzi w rachubę) w czasie, gdy nie zaglądaliśmy do node.js / socket.io, co prowadzi mnie do mojego pytania: jeśli socket.io działa tylko w nowoczesnych przeglądarkach i musi powrócić do Flash lub Long- odpytywanie, jeśli wymagana funkcja nie jest dostępna w przeglądarce, czy naprawdę istnieje jakaś korzyść z używania tego? s dzisiejsza technologia (w przeciwieństwie do 2 lat od teraz, kiedy ostatni z tj. 6 użytkowników będzie zmuszony do aktualizacji)? problem polega na tym, że nie chcemy rzucać serwera na kolana, ponieważ w najgorszym przypadku to utrzyma otwarte połączenia http przez dłuższy czas i naprawdę zepsuje doświadczenie naszych użytkowników (nasze aplikacje na serwerze WWW, nie zaprojektowałem systemu )


title: Dlaczego mamy tak wiele smaków .NET? Czy to dobrze?

text: Istnieje wiele "smaków" .NET Framework: * Pełny ("normalny") * Podzbiór profili klienta * Silverlight w przeglądarkach internetowych * "Silverlight" na Windows Phone * Compact framework * WinRT Gdy potrzebny jest kod C# na nowej platformie, wydaje się, że Microsot woli wziąć pełny CLR i rozebrać go do małego podzbioru, tworząc nowe zespoły i przenosząc typy, zamiast po prostu używać istniejących zespołów, takich jak te w BCL. Na przykład Silverlight ma różne klasy/metody do WPF (nawet do niektórych metod mających nieco inne sygnatury lub bardzo różne implementacje), zamiast po prostu odwoływać się do tej samej implementacji `List<T>` jako WPF. Czy to idealna architektura, czy znak dziedzictwa? Czy BCL nie powinien działać na wszystkich platformach, z różnymi bibliotekami prezentacji/IO na każdej? A może BCL i inne biblioteki są zbyt rozdęte, a ich rozdzielenie spowodowałoby zbyt wiele problemów ze zgodnością wsteczną, aby było możliwe do zaakceptowania? Gdybyśmy zaczęli od pustego płótna i nie przejmowali się wsteczną kompatybilnością, czy obecna sytuacja byłaby naprawdę najlepszym sposobem obsługi wielu platform?


title: Jak mogę zacząć używać TDD do kodowania prostych funkcji?

text: Zasadniczo mam sedno TDD. Sprzedaje mi się, że jest przydatny i mam rozsądną znajomość frameworka MSTEST. Jednak do tej pory nie udało mi się przejść do używania go jako podstawowej metody rozwoju. Przeważnie używam go jako substytutu do pisania aplikacji konsolowych jako sterowników testowych (moje tradycyjne podejście). Najbardziej użyteczną rzeczą dla mnie jest sposób, w jaki absorbuje rolę testowania regresji. Nie zbudowałem jeszcze niczego, co konkretnie izoluje różne testowalne zachowania, co jest kolejną dużą częścią obrazu, który znam. Tak więc to pytanie polega na poproszeniu o wskazówki na temat pierwszego testu, który mógłbym napisać dla następującego zadania programistycznego: Chcę stworzyć kod, który hermetyzuje wykonanie zadania na wzór producenta/konsumentu. Zatrzymałem się i postanowiłem napisać to pytanie po tym, jak napisałem ten kod (zastanawiałem się, czy tym razem rzeczywiście mógłbym użyć TDD) **Code:** interface ITask { Guid TaskId { get; } bool IsComplete { get; } bool Niepowodzenie { get; } bool Działa { get; } } interfejs ITaskContainer { Guid AddTask(akcja ICommand); } interfejs ICommand { ciąg NazwaPolecenia { get; } Dictionary<ciąg, obiekt> Parametry { get; } void Wykonaj(); }


title: Czy jacyś programiści używają pióra i tabletu zamiast myszy? Czy lepiej?

text: Uszkodziłem sobie nadgarstek i patrząc na projektanta siedzącego naprzeciw mnie, używającego swojego pióra i tabletu, pomyślałem, czy jest to coś, z czego mógłby skorzystać programista WWW (20-40% czasu spędzonego w Photoshopie), a może nawet być bardziej wydajny na dłuższą metę. termin? **Czy jesteś programistą używającym pióra/tabletu i naprawdę nie brakuje Ci już myszy? Dlaczego?** Przeszukałem i znalazłem te, ale nie odpowiadają one dokładnie na moje pytanie lub wystarczająco szczegółowo: * Programowanie za pomocą tabletu (z dnia 2008 r.) * Jednoręczne kodowanie za pomocą tabletu * Jeden facet korzystający z tabletu / pióra lubi to * Programowanie stopami? * Projektant przechodzi na tablet (dobre komentarze) Ale to, co znalazłem, mogę podsumować w następujący sposób: * Łatwiej jest na nadgarstku. * Jest krzywa uczenia się. * Do spoinowania intensywnej pracy (ala photoshop) jest lepszy. * Lepiej radzisz sobie ze skrótami klawiszowymi, jeśli jeszcze tego nie zrobiłeś. * Możesz trzymać pióro podczas pisania, jeśli uważasz, że podnoszenie/odkładanie jest trudniejsze. * Mapowanie tabletu na ekran jest niesamowite (pozycjonowanie bezwzględne, tj. róg tabletu = róg ekranu) Myślę, że prawie się tutaj przekonałem :)


title: Co powinienem umieścić w moim portfolio programistycznym online?

text: Portfele online są bardzo popularne wśród projektantów, ale co z programistami? Jestem programistą Java, który również lubi pisać JavaScript i myślałem o założeniu witryny z linkami do repozytorium Github. Jak myślisz, jakie rzeczy zaimponują potencjalnemu pracodawcy? Czy inni programiści tworzą takie portfele? Czy możesz udostępniać linki i swoje doświadczenia?


title: Niebezpieczeństwa związane z ogromnym monolitycznym zastosowaniem

text: Duży projekt, nad którym pracuję od kilku lat, to aplikacja sterująca (i wszystko) zaawansowanego urządzenia, serce jego firmware. Urządzenie jest dość zaawansowane, ma więcej różnych funkcji niż mógłbym powiedzieć z pamięci, a 98% z nich obsługuje ten jeden ogromny plik wykonywalny. Z jednej strony program jest dość łatwy w utrzymaniu, dobrze zmodularyzowany wewnątrz, właściwie udokumentowany, istnieje rozsądny podział funkcjonalności na katalogi i pliki i tak dalej. Ale w końcu wszystko jest skupione w jednej aplikacji, która robi wszystko, od zdalnej komunikacji z bazą danych, obsługi ekranu dotykowego, obsługi kilkunastu różnych protokołów komunikacyjnych, pomiarów, kilku algorytmów sterowania, przechwytywania wideo, czasu wschodu i daty Wielkanocy (poważnie i są potrzebne do bardzo poważnych celów!)... Ogólnie rzecz biorąc, rzeczy, które są bardzo słabo powiązane, często powiązane tylko przez niektóre dane, które sączy się między odległymi modułami. Można to zrobić jako kilka oddzielnych plików wykonywalnych komunikujących się ze sobą, powiedzmy przez gniazda, w bardziej konkretnym celu, może być ładowane/rozładowywane w razie potrzeby i tak dalej. Brak konkretnego powodu, dla którego jest to zrobione w ten sposób. Z jednej strony działa i działa dobrze. Projekt jest prostszy, bez utrzymywania budowy wielu binariów. Struktura wewnętrzna jest również łatwiejsza, gdy możesz po prostu wywołać metodę lub odczytać zmienną zamiast rozmawiać przez gniazda lub pamięć współdzieloną. Ale z drugiej strony rozmiar, skala tego czegoś po prostu mnie przeraża, czuję się jak pilotowanie Titanica. Zawsze uczono mnie modularyzować, a zbijanie wszystkiego w jeden gigantyczny plik jest nie tak. Jeden problem, który znam, to poważna awaria jednego (nawet nieistotnego) modułu, który powoduje awarię wszystkich - ale jakość kodu zapewnia, że tak naprawdę nie dzieje się to w wersjach wydanych. W przeciwnym razie wewnętrzna separacja i programowanie obronne zapewnia, że będzie to działać w większości poprawnie, nawet jeśli połowa wewnętrznych modułów z jakiegoś powodu ulegnie awarii. Jakie inne niebezpieczeństwa przeoczyłem? Dlaczego to mnie przeraża? Czy to tylko irracjonalny strach przed nieznanym? Czy robienie w ten sposób poważnych dużych projektów jest akceptowaną praktyką? Albo uspokój moje obawy, albo daj mi dobry powód do refaktoryzacji wersji 2.0 na wiele mniejszych plików binarnych.


title: Przechowywanie sesji w zmiennej statycznej?

text: Obecnie sprawdzam starszy fragment kodu C# używany do obsługi sesji logowania. public static ZRWebserviceSession Bieżąca sesja { get { return _currSession; } ustaw { _currSession = wartość; } } prywatny statyczny ZRWebserviceSession _currSession; public static bool IsSessionActive() { if (_currentSession == null || !_currentSession.IsOpen || !_currentSession.IsLoggedIn) { return false; } zwróć prawdę; } Zawsze mówiono mi, że używanie globals to zła praktyka i szukam sposobów na ulepszenie tego fragmentu kodu, przynajmniej poprzez pozbycie się pola statycznego używanego do utrzymania sesji. Obecna sytuacja wygląda następująco: Po uruchomieniu aplikacji obiekt sesji jest inicjowany adresem serwera (pobranym z pliku konfiguracyjnego), z którym powinien się połączyć. Obiekt następnie pobiera dane sesji (token itp.) z serwera do przechowywania w sobie, a następnie jest przypisywany do zmiennej statycznej w celu uzyskania dostępu przez całą aplikację. Odbywa się to tylko na początku uruchamiania aplikacji lub gdy użytkownik jawnie ponownie uruchamia sesję. Gdy sesja jest aktywna, inne fragmenty kodu mogą następnie wywoływać metody obiektu sesji w celu pobrania danych sesji i wywołania połączonej usługi sieciowej. Czy można to poprawić? Czy używanie globalnych nadal jest złą praktyką w przypadku sesji lub czegoś podobnego? EDYCJA: Aby wyjaśnić, jaki to rodzaj aplikacji: nie jest to aplikacja internetowa, ale aplikacja kliencka, która łączy się z usługą internetową. ZRWebserviceSession to obiekt biblioteczny, który reprezentuje sesję logowania dla użytkownika aktualnie korzystającego z aplikacji klienckiej. Coś jak obiekt sesji zestawu Fabebook SDK https://developers.facebook.com/docs/reference/ios/current/class/FBSession/.


title: Ograniczenia UML?

text: Obecnie uczę się do egzaminu i jednym z przykładowych pytań papierowych jest omówienie ograniczeń UML. Większość materiałów, które znajduję w sieci, dotyczy konkretnej implementacji lub języka UML. Zastanawiam się, z punktu widzenia generalistów, za jakie ograniczenia uważasz UML?


title: Jaki jest efekt tego zadania (niezależnie od języka)?

text: Myślę, że moja książka (Języki programowania: Zasady i paradygmaty) jest błędna. `a` jest wektorem, załóżmy język podobny do C: b = 0; a[f(3)] = a[f(3)] + 1; int f(int n) { jeśli (b == 0) { b = 1; powrót 1; } w przeciwnym razie zwróć 2; } > Skutkuje to przypisaniem wartości `a[1] + 1` do `a[2]` za każdym razem, gdy > ocena lewego składnika przypisania poprzedza > ocenę składnika po prawej stronie. Dla mnie ma to odwrotny skutek, czyli przypisanie wartości `a[2] + 1` do `a[1]`. Ponieważ składnik po lewej stronie jest oceniany jako pierwszy, „f” zwraca „1” (ponieważ „b” to „0”), stąd „a[1]”. Następnie oceniany jest składnik po prawej stronie, `f` zwraca `2` (ponieważ teraz `b` to `1`), a zatem `a[2] + 1`. Czy mam rację, a książka jest zła? Niestety nie ma erraty...


title: Gdzie w MVC mieszczą się obiekty parsera i usługi?

text: Czy obiekty usługi NSURLConnection i obiekty analizatora składni XML/JSON należą do warstwy kontrolera lub warstwy modelu? Czemu? Czy logika biznesowa w kontrolerze jest w porządku? A może powinien znajdować się tylko w warstwie modelowej? Czy warstwa modelu może być reprezentowana przez obiekty NSArray/NSDictionary, czy też powinna być ściśle ustrukturyzowana z obiektami niestandardowymi, aby była zgodna ze wzorcem MVC, biorąc pod uwagę, że moja aplikacja nie wymaga trwałego przechowywania.


title: Zasoby architektury/wzorców dla małych aplikacji i narzędzi

text: Zastanawiałem się, czy ktoś ma jakieś zasoby lub porady związane z używaniem wzorców architektury, takich jak MVVM/MVC/MVP/etc na małych aplikacjach i narzędziach, w przeciwieństwie do dużych, korporacyjnych. EDYCJA: Większość informacji, które widzę na temat architektury aplikacji, jest skierowana do dużych aplikacji korporacyjnych. Piszę tylko małe programy i narzędzia. Jeśli chodzi o korzystanie z tych wzorców architektury, czy ogólnie warto przejść przez obciążenie związane z korzystaniem z frameworka MVC/MVVM? A może lepiej byłoby zachować prostotę?


title: Jakie są najlepsze praktyki podczas przeprowadzania analizy wymagań poprzez obserwację pracy?

text: Rozważam siedzenie z użytkownikami końcowymi i obserwowanie ich podczas pracy przez jeden dzień, aby lepiej zrozumieć wymagania oprogramowania. Zanim spróbuję, mam nadzieję, że ktoś może dostarczyć listę najlepszych praktyk, sugestie, kiedy to podejście jest bardziej / mniej odpowiednie niż zwykła rozmowa z użytkownikami, oraz notatki z własnych doświadczeń związanych z obserwacją pracy / cieniowaniem. Mile widziane są zarówno odniesienia do innych witryn, jak i wspomnienia z osobistych doświadczeń.


title: Na jakim etapie projektu należy wykonać dokumentację?

text: Zostałem przydzielony do naprawienia niektórych problemów w projekcie PHP. Później zostałem poproszony o zaimplementowanie kilku nowych funkcji, co zrobiłem. Projekt nie używa żadnego frameworka ani nie używa OOP. Brakuje mu odpowiedniej struktury, z wyjątkiem wykorzystania folderów (bez podfolderów) do organizowania plików. Nie było dokumentacji stworzonej przez oryginalnego programistę. Teraz projekt jest prawie ukończony, trzeba wykonać kilka prostych testów, a klient prosi o dokumentację. Właściwie mam kilka pytań. 1. Dokumentację zawsze uważałem za proces, który rozpoczyna się przed rozpoczęciem kodowania części projektu i trwa do końca. Więc, czy się mylę? Czy dokumentacja jest sporządzona na koniec projektu? 2. Jaki powinien być mój sposób na dokumentowanie tego projektu. Prowadziłem podstawową dokumentację „log-like” na temat zmian, które wprowadziłem na własny użytek. Ale ponieważ nie stworzono wstępnej dokumentacji, nie zawracałem sobie głowy jej tworzeniem. 3. Czy istnieje dobry szablon dokumentacji, którego mógłbym użyć, aby zmniejszyć swój wysiłek? Mówię o dokumentacji kodu (nie dokumentacji użytkownika). Chociaż tak zakładam, ponieważ nic nie określili.


title: Baza danych Ruby on Rails przy użyciu statycznych tabel przeglądowych lub stałych ciągów

text: W niektórych projektach ruby on rails widziałem przypadki, w których ciągi znaków są używane zamiast odniesienia klucza obcego do tabeli odnośników. Zwykle koduję w C#/SQL Server i używam tabel odnośników, ale nie jestem szczególnie doświadczony w ruby on rails. Więc moje **pytanie** brzmi, czy powinienem używać ciągów znaków zamiast tabel wyszukiwania w moim projekcie internetowym ruby on rails (mysql i aktywny rekord)? Czy jest to coś specyficznego dla ruby on rails, czy też dla dynamicznie typowanych języków? Lub w pewnych szczególnych okolicznościach? A może to tylko zły projekt bazy danych? Przez tabele wyszukiwania mam na myśli następujące **UserStatus** Id Name 1 Aktywny 2 Wyłączone **User** Id Username UserStatusId 1 jan.kowalski@gmail.com 1 1 jane.kowalski@gmail.com 2 Podczas gdy tylko ciągi **Użytkownik** Identyfikator Nazwa użytkownika Status użytkownika 1 jan.kowalski@gmail.com aktywny 1 jan.kowalski@gmail.com wyłączony


title: Czy zapomniałeś więcej niż myślisz i jak bardzo zależy Ci na zapamiętywaniu?

text: Mam na myśli znajomość dziedziny informatyki lub języka, a potem zapominanie o tym z biegiem lat. Kiedy zbliżam się do 20 roku życia, zdaję sobie sprawę, że zapomniałem więcej, niż obecnie wiem. Czy to źle? Czy to jest dobre? Czy istnieje sposób na rozwiązanie tego problemu? A jeśli nie, to jakie rzeczy warto zapamiętać? Na przykład wszyscy wiemy (chyba), że Quicksort zapewnia O (n * log n) w przeciętnych przypadkach i wiemy, że może balonić do O (N ^ 2), gdy zostanie podany niewłaściwymi danymi wejściowymi. Ilu z nas, zapytanych bez uprzedzenia, mogłoby napisać działający Quicksort na tablicy lub w wybranym przez siebie edytorze kodu, bez mrugnięcia okiem? Czy to przydatne? A jeśli uda nam się to zrobić, czy to się liczy, że jest to naiwna implementacja, a nie zoptymalizowana wersja zaprojektowana przez Bentley & Company? Podaję to jako przykład, ale może to być cokolwiek. C++ ma wiele ciemnych zakamarków, o których nieużywany przez dłuższy czas można łatwo zapomnieć. I spójrzmy prawdzie w oczy, w C++ jest wiele ciemnych zakamarków, od których woli się omijać.


title: Idąc dalej z rozwojem C dla iOS

text: Jestem między innymi doświadczonym programistą iOS. Mam dobrą znajomość frameworków Objective-C i Apple w języku. Ale jeśli chodzi o frameworki oparte na C, często uderzam w sufit swoją wiedzą i często muszę szukać idiomów i składni. Nauczyłem się C od K&R, ale minęło trochę czasu. Znowu próbowałem się z tego uczyć i to była świetna zabawa; ale po rozdziale 6 odniosłem wrażenie, że jego C jest nieco archaiczne, przynajmniej idiomiczne. Poza tym chcę uczyć się C głównie ze względu na rozwój iOS, więc proces uczenia się skoncentrowany na Mac / iOS byłby idealny. Jaki będzie dobry sposób na zrobienie tego?


title: Jakie rozwiązania FOSS są dostępne do zarządzania wymaganiami oprogramowania?

text: W firmie, w której pracuję, zaczynamy planować zgodność z cyklem życia oprogramowania. Mamy już wiki, system vcs, system śledzenia błędów i system ciągłej integracji. Następnym krokiem, który chcemy wykonać, jest rozpoczęcie uporządkowanego zarządzania wymaganiami oprogramowania. Nie chcemy używać wiki ani udostępnionej dokumentacji, ponieważ mamy wiele danych wejściowych (programistów, menedżerów, sprzedawców, analityków bezpieczeństwa i inne) i nie chcemy obsługiwać rozprzestrzeniania się plików .doc w udziale sieciowym. Próbujemy szukać i mamy nadzieję, że uda nam się znaleźć i wykorzystać oprogramowanie FOSS do zarządzania tymi wszystkimi rzeczami. Mamy około 30 osób i nie mamy budżetu na oprogramowanie komercyjne. Potrzebujemy darmowego rozwiązania do zarządzania wymaganiami. To, czego chcemy, to oprogramowanie, które może zarządzać: Wymaganymi funkcjami: * Wymaganiami dotyczącymi oprogramowania podzielonymi w ustrukturyzowany, konfigurowalny sposób * Wersjonowaniem wymagań (historia, różnica, itp., jak kod źródłowy) * Współzależność wymagań (dziecko, rodzic, związane z ) * Kontrola dostępu oparta na regułach do obsługi danych * Wielu użytkowników, wiele projektów * Przesyłanie plików (dla wykresów, dokumentów powiązanych itp.) * Funkcje raportów i ekstrakcji Funkcje opcjonalne: * Oparte na sieci Web * Przypadek testowy * Zarządzanie oparte na czasie (oś czasu, z wyjątkiem danych, danych wynikowych) * Przydział osób i tak dalej * Rzeczy związane z biznesem * Obsługa przydziału sprzętu Grałem już z testlinkiem, a teraz gram z RTH, następną próbą jest redmine.


title: Wdrożenie: najlepsze praktyki (i rzeczywiste praktyki)

text: Jedną z rzeczy, których nauczyłem się w mojej krótkiej karierze dewelopera, jest to, że istnieją najlepsze praktyki (takie jak TDD), a także rzeczywiste praktyki, które pojawiają się pod presją lub z powodu ograniczeń budżetowych/czasowych. Pracuję w małym zespole PHP dev nad projektem przy użyciu frameworka Zend. Projekt może wymagać dużej skalowalności, dlatego staramy się stworzyć dobre środowisko programistyczne, aby promować łatwość programowania w dłuższej perspektywie. Pomijając wzorce/praktyki architektoniczne, patrzę na próby zautomatyzowania wdrażania, sprawdzanie jakości kodu za pomocą haków svn, a nawet konfigurowanie środowiska CI. Dlatego jestem zainteresowany poznaniem doświadczeń ludzi w zakresie praktyk wdrożeniowych. Sprawdziłem inne przykłady, które odnoszą się do innych języków - ale idealnie chciałbym usłyszeć od ludzi, którzy pracowali w środowisku PHP/Zend. Aby pytanie było mniej niejasne: Jakie są doświadczenia ludzi w korzystaniu z systemów wdrażania, takich jak phpUnderControl i rZsynchronizować?


title: Chcę napisać język programowania przetwarzania i analizy danych, który kompiluje się do SAS. Jak wybrać język, w którym napiszę mój kompilator?

text: W ramach projektu pobocznego napisałem proste makro w SAS-ie, aby dodać cukier składniowy do kodu SAS-owego. Nienawidzę tego, jak gadatliwy jest czasami SAS! Więc moje makro wygląda tak: %macro md(code); /* oczekuje napisu w super cudzysłowie */ * append a b; %if %lowcase(%scan(&code.,1)) = dołącz %to %do; proc append base = %scan(&code.,2) data=%scan(&code.,3); biegać; %koniec; %zaszyć; Zamiast pisać proc append base=a data=b; biegać; aby dołączyć dwa zestawy danych, mogę po prostu napisać %md(dołącz a b); To dało mi do myślenia. Ponieważ pracuję z SAS cały dzień i lubię programować. Dlaczego nie (dla zabawy) zaprojektować nowy język przetwarzania danych, który kompiluje się do SAS?! Jak wielu z was może się domyślać, pomysł ten został zainspirowany CoffeeScript, który kompiluje się do JavaScript. Dowiedziałem się, że CoffeeScript był początkowo napisany w Ruby? Ale dlaczego? Jak autor wybrał Rubiego? Co należy wziąć pod uwagę przy wyborze języka? A jakie są dostępne zasoby, które mogą być przydatne w dążeniu do tego?


title: Alternatywy dla Project Euler w celu poprawy możliwości programu Excel

text: Ostatnio lubiłem używać problemów matematycznych wymienionych w Project Euler do nauki Pythona. Moja umiejętność Excela jest lepsza niż mój Python, ale myślę, że nadal skorzystałbym z tego rodzaju uczenia indukcyjnego, który wiąże się z rozwiązywaniem serii coraz trudniejszych łamigłówek za pomocą określonego narzędzia. Wiem, że Project Euler można ukończyć za pomocą Excela, ale czy istnieją inne serie łamigłówek podobne do tej lub The Python Challenge specjalnie dla osób próbujących poszerzyć swoją wiedzę na temat Excela i jego możliwości? Nie szukam "poradnika", wiem, że jest ich mnóstwo.


title: Różne koncepcje programowania (z punktu widzenia Pythona)

text: Odkąd zacząłem czaić się na stackoverflow, ciągle natrafiam na koncepcje programowania, takie jak klasy abstrakcyjne, funkcje wirtualne, kontrakty, interfejsy itp., z pytań o inne języki, takie jak C++, Java i C#. O ile mi wiadomo, większość z tych rzeczy jest związana z programowaniem obiektowym, ale zwykle nie są wymienione w samouczkach Pythona, ponieważ Python używa kombinacji pisania kaczką i magii, aby takie koncepcje były zbędne. Niemniej jednak nadal chciałbym wiedzieć, czym one są. **Czym są klasy abstrakcyjne, funkcje wirtualne, kontrakty, interfejsy itp. (wyjaśnione z punktu widzenia Pythona?) Jakie inne koncepcje programowania/OOP powinienem wiedzieć o tym, że Python zazwyczaj nie używa lub wymaga od Ciebie wiedzy?**


title: Jak ludzie tworzą emulatory?

text: Mam nadzieję, że to właściwy obszar na Stack Exchange, aby zadać to pytanie. Ludzie zbudowali emulatory dla każdej konsoli do gier, ale nie rozumiem, jak to robią. Uważam się (i mam tytuł zawodowy) za programistę wyższego szczebla w kilku językach, w tym Javascript, ale nie mam zielonego pojęcia, jak zacząć pisać emulator w Javascript. Jak dowiadują się, jak czytać ROM-y i emulować grę?


title: Ubierasz się formalnie czy nieformalnie na rozmowę programistyczną?

text: W przypadku 4 prac, w których pracowałem, dwukrotnie ubierałem się formalnie, raz biznesowo, raz bardziej swobodnie. Jak ważny jest w dzisiejszych czasach dress code w programowaniu wywiadów? Czy pracodawca lub osoba przeprowadzająca rozmowę kwalifikacyjną nie potraktują Cię poważnie, jeśli wejdziesz niedbale: zwykła koszula i spodnie khaki z butami do chodzenia (nie-tenisówki)?


title: Właściwa formuła narzutu cen

text: Ok, więc nie jest to najbardziej zaawansowane pytanie programistyczne – i graniczy z e-commerce, ale specjalnie pojawiło się dwa razy w mojej karierze – która ma dopiero 10 lat, więc pomyślałem, że zadam je. **Pytanie:** Chcę doliczyć cenę 10% od pierwotnego kosztu strony internetowej, co jest poprawnym sposobem: **NP = (P * 1.1)** lub **NP = (P / 90) * 100** Gdzie P to pierwotna cena, a NP to nowa cena? **Tło:** Jestem programistą stron internetowych. W swoim czasie pracowałem przy kilku serwisach e-commerce. Kilka lat temu budowałem stronę dla freelancera dla warsztatu narzędziowego. Facet był w biznesie od lat i przeniósł się do sprzedaży internetowej. Napisałem skrypt, który wziął jego podstawowy spis inwentarzowy, przejrzał go i automatycznie oznaczył cenę 10% przed wstawieniem do bazy danych. Użyłem formuły #1. Kiedy ją przejrzał, powiedział, że cena jest zbyt niska i że użył formuły nr 2. Używając formuły nr 1, iloczyn za 15 dolarów jest teraz równy 16,5, przy użyciu dwóch to 16,66 dolarów. Jego logika polegała na tym, że 15 to 90% z 16,66 USD, a zatem 16,66 to 10% narzut, przy czym 16,5 to tylko około 9% narzutu. Przenieśmy się o kilka lat do dzisiaj i natrafiłem na ten sam problem. Moja firma ma ogromną listę zasobów, które są oznaczane na różne sposoby. Nasz stary DBA nabijał cenę dla dystrybutorów o 10%. Używał formuły 1. Nasz nowy DBA przepisał procedurę składowaną i zaczął używać formuły 2. Kilka osób wpadło w zakłopotanie i zaczęło mówić, że ceny dystrybutorów są zbyt wysokie i że stara formuła jest poprawna. Sprzedajemy duże ilości stosunkowo niedrogich artykułów, obawiamy się, że nasi dystrybutorzy będą się wahać. Logicznie wydawało się, że formuła nr 1 była właściwym sposobem oznaczania, ale doświadczony właściciel firmy powiedział mi, że jest inaczej. Teraz słyszę, jak ludzie mówią coś przeciwnego. EDIT: My Korzystanie z oryginalnego 15 przykładu. Zawsze wydawało mi się, że 15 to w rzeczywistości 10% obniżka 16,66, gdzie 16,5 to właściwy obniżka 10% 15.


title: Hosting decydujący się zapłacić za hosting lub hostować własny?

text: Czy istnieje przewodnik, jak wybrać, kiedy zapłacić za hosting, a kiedy za hosting własny? Zakładając, że dostęp do roota jest koniecznością, chciałbym porównać takie rzeczy, jak koszt, skalowalność i stres osobisty. Oto, co mógłbym wymyślić. Płacenie za hosting: Korzyści: * Znacznie taniej na małą skalę. Zakładam, że wszystko poniżej 50 USD miesięcznie byłoby tańsze niż płacenie za przepustowość hostingu. * Brak stresu w radzeniu sobie z przerwami w dostawie prądu, restartami serwerów lub awarią Internetu. * W większości mniej pracochłonna praca związana z konfiguracją. Negatywy: * Koszt rośnie, gdy potrzebne są wyższe specyfikacje (na przykład trzykrotny koszt miesięczny z możliwością użycia 8 GB pamięci RAM, którą można kupić za 90 USD). Oznacza to, że musisz ustawić określone użycie pamięci RAM i monitorować, aby Twoja instancja pozostawała w granicach progu. * Dostęp do roota w większości jest płatny. * Możesz zostać powiązany z procesem wdrażania określonym przez dostawcę. Hosting na własną rękę : Zalety: * 100% kontrola specyfikacji i oprogramowania. * Kiedy przestaniesz płacić za przepustowość, zbudujesz własną maszynę. Negatywy: * Nie ma sensu finansowego, jeśli koszty przepustowości są wyższe niż koszty hostingu. * Konieczność radzenia sobie z przerwami w dostawie prądu, restartami serwerów lub awarią Internetu. Myślę, że najlepsze z obu światów byłoby, gdyby istniało miejsce, które zajmowałoby się przepustowością, przerwami w dostawie prądu i restartami serwera, ale zapewniłeś własny serwer. Coś jak całodobowa opieka nad serwerem. Czy istnieje coś takiego?


title: Programista vs. Project Manager vs. Product Manager

text: Jestem programistą od 10 lat. Lubię być programistą i nic dziwnego, że dążę do poczucia osiągnięcia. Jednak zwykle robię rzeczy, które trzeba zrobić, bez względu na to, czy jest to moja praca, czy nie. Moje doświadczenie z różnymi menedżerami, z którymi pracowałem, pokazuje straszny wynik około 20% tych, których uważam za kompetentnych do pracy, którą wykonują. To sprawia, że myślę, że popyt na rozsądnych menedżerów musi być wysoki. Poważnie rozważam zmianę kariery ze stanowiska programisty na jedno z tych stanowisk, ale moje pytanie brzmi: - Czy warto? Zakładam, że jest mniej lub bardziej niezrozumiałe, co oznacza każda z tych pozycji. Pytanie tylko, czy ponadprzeciętny programista zwykle zarabia więcej niż przeciętny menedżer, czy nie?


title: Natura wiosny

text: Czy można powiedzieć, że ręczne wstrzykiwanie zależności przy użyciu javy (bez sprężyny) to nic innego jak implementacja wzorca strategii (jak w tym przykładzie)? Co więcej, czy słuszne jest stwierdzenie, że Spring zapewnia deklaratywny sposób określania zależności w przeciwieństwie do metody ręcznej, w której zależność należy utworzyć i „ustawić” za pomocą kodu java?


title: Jak mogę wykorzystać lub „sprzedać” umiejętności małego zasięgu w środowisku o dużym zasięgu?

text: Pracuję od 15 lat w średniej wielkości firmie (300-400 inżynierów) zajmującej się mieszanką oprogramowania wbudowanego / przetwarzania sygnału / inżynierii sterowania / projektowania obwodów. A ostatnio wydarzyło się wydarzenie, które zagraża mojej obecnej roli. Mam problem z podjęciem decyzji, jak znaleźć dobre dopasowanie u mojego obecnego pracodawcy lub z podjęciem decyzji, gdzie iść dalej. **Zastanawiam się, czy ktoś tutaj odnosi się do następującej sytuacji i może polecić sposób na wykorzystanie lub „sprzedanie” moich mocnych stron mojemu obecnemu (lub przyszłemu) pracodawcy:** Większość projektów w mojej firmie wymaga tego, czego ja postrzegaj jako silne umiejętności syntezy „w szerokim zakresie”: projekt X potrzebuje inżyniera oprogramowania, który przejmie odpowiedzialność za obszar Y w tym projekcie i szybko ukończy projektowanie, debugowanie, testowanie i dokumentację niezbędną, aby ten obszar odniósł sukces, pokrywając się wystarczająco z współpracowników, aby projekt jako całość zakończył się sukcesem. (lub zamień „inżyniera oprogramowania” na „projektanta obwodów” lub „inżyniera sterowania”, to nie ma znaczenia) To nie jest moja mocna strona i bez względu na to, jak bardzo się staram, zawsze kończy się to dla mnie frustracją. To, w czym jestem bardzo dobry, to połączenie następujących elementów: * rozwiązywanie problemów * uczenie się * analiza matematyczna * wykorzystanie szerokiego zestawu umiejętności (ee/matematyka/przetwarzanie sygnałów) * skrupulatność (wiele projektów w naszej firmie zostało opóźnionych, ponieważ ktoś "zakończył" zadanie szybko, ale niechlujnie, więc musiało zostać później odpowiednio przerobione przy znacznie większym ryzyku/kosztach) * identyfikowanie wąskich gardeł procesu projektowania, które powodują opóźnienia/ryzyko/itd., oraz pisanie narzędzi programowych, które pomagają przezwyciężyć te wąskie gardła. (na przykład: mieliśmy ostatnio przypadek, w którym nasz proces kompilacji dla projektu oprogramowania C++ brakowało niektórych zależności od automatycznie generowanych plików .h, więc czasami, gdy robiliśmy kompilacje przyrostowe zamiast świeżych kompilacji, jeden z plików .cpp nie byłby ponownie skompilowany i odwołuje się do niepoprawnej definicji struktury.Miałem już narzędzie programowe, które może odczytywać dane debugowania w pliku wykonywalnym, więc poprawiłem je, aby wykrywać i zgłaszać wiele sprzecznych definicji struktur obecnych w pliku wykonywalnym.Działa jak urok: teraz użyj go jako kroku w naszym zautomatyzowanym procesie budowania i szybko pomoże nam zidentyfikować brakujące zależności kompilacji w przypadku pojawienia się nowej.) * koncentracja na projektach syntezy (projektowanie/debugowanie/testowanie/dokumentacja) o bardzo ograniczonym zakresie * działanie wspierające rolę do podjęcia małych problemów, które utknęli inni inżynierowie, uwalniając ich do kontynuowania pracy To, w czym jestem zły, to synteza w średnich i dużych projektach. Nie jestem wół roboczym programisty. Wydaje mi się, że nie jestem w stanie poradzić sobie ze złożonością bez względu na to, jakiego rodzaju narzędzi organizacyjnych próbuję użyć, i wydaje mi się, że wpadam w przypadek przepełnienia stosu neuronowego: jeśli podejmę się nowych zadań, niektóre ze starych wymykają się mój mózg, zapominam o ważnych szczegółach, których ponowne poznanie zajmuje mi dużo czasu i po prostu czuję się przytłoczony. A na dodatek mam RSI w nadgarstkach i jednym ramieniu, które pogarszają się pod wpływem stresu. **W jaki sposób mogę skutecznie i zwięźle przedstawić moje mocne i słabe strony mojemu obecnemu pracodawcy (lub potencjalnym pracodawcom), aby znaleźć odpowiednie dopasowanie tam, gdzie moje umiejętności im przyniosą korzyść i znaleźć stanowisko, z którego jestem zadowolony?* *


title: Potrzebuję wskazówek dotyczących mojego pierwszego programu Windows

text: Jestem programistą uniksowym i muszę napisać (miejmy nadzieję prosty) program dla Windows, który wykona następujące czynności: (1) Instaluje z dysku USB (2) W jakiś sposób integruje się z systemem operacyjnym na niskim poziomie w taki sposób, że może filtrować/kształtować cały ruch sieciowy do/z komputera (tak jak IPSec) Potrafię pisać w C, asm, Pythonie, Javie, ale nie mam pojęcia o metodach Windows służących do robienia tego typu rzeczy, ani gdzie zacząć naukę. (Mogę łatwo zrobić powyższe z Linuksem przy użyciu modułu jądra.)


title: Najlepszy punkt wyjścia do pisania małych programów komputerowych dla systemu Windows?

text: Wiem, jak programować na Unix, Mac i iOS, ale nie mam pojęcia, jeśli chodzi o Windows. Teraz mam konkretny projekt, który wymaga zbudowania wersji Windows aplikacji komputerowej Mac OS X. Ale nie mam pojęcia, od czego zacząć naukę. W jakich językach mogę zbudować aplikację i jak ją spakować do pobrania i dystrybucji? Jakich narzędzi mogę używać? Czy mogę używać Vima i czegoś przypominającego linię poleceń Uniksa? Mogę dobrze programować w Ruby i Objective C, ale zgaduję, że nie będę w stanie użyć żadnego z nich do stworzenia aplikacji na komputery Windows. Jakieś wskazówki?


title: Testowanie jednostkowe metod „workflow”

text: Obecnie opracowujemy publiczne API dla naszej aplikacji. Metody w tym publicznym API polegają głównie na łączeniu funkcjonalności w różnych zakątkach systemu. Przykładem może być: (nazwy zostały zmienione w celu ochrony niewinnych) public String createAppUser(String app, String name, String email, byte[] pwd) { Application appl = applicationModule.retrieve(app); Użytkownik użytkownik = userModule.createUser(nazwa,e-mail); Skrót skrótu = cryptoModule.createDigest(pwd); authenticationModule.authorize(użytkownik,aplikacja,podsumowanie); AccountModule.createAccount(użytkownik,aplikacja); zwróć user.getId(); } Podczas testowania jednostkowego czegoś takiego, test jednostkowy jest po prostu kopią tego samego przepływu pracy, z dodatkowym szumem do konfiguracji makiet, obiektów i walidacji interakcji. Chociaż uważam, że test jednostkowy algorytmicznych części aplikacji jest niezbędny, w tej części dotyczącej „przepływu pracy” uważam, że test jednostkowy jest powtórzeniem przepływu pracy w pytanym formularzu. Zgodnie z zasadą DRY to strata czasu. Jakie są najlepsze praktyki w takich przypadkach? Biorąc pod uwagę, że te metody są częścią publicznego API, bardziej wartościowe byłoby przetestowanie ich za pośrednictwem klienta i sprawdzenie, czy efekty systemowe miały miejsce. Jest to bardziej „test systemowy” lub „test integracyjny” i wykracza poza zakres testu jednostkowego. Jakie byłoby najlepsze podejście testowe w tym kontekście?


title: środowiska flash o otwartym kodzie źródłowym

text: Szukałem naprawdę dobrego środowiska programistycznego flash o otwartym kodzie źródłowym, ale bez powodzenia. Najlepsze, jakie mogłem znaleźć, pomogłoby w rozwoju prawie wszystkiego, ale nadal potrzebowałem Adobe Flash Professional, aby skompilować moją pracę. Czy mogę tworzyć aplikacje Flash bez konieczności kupowania Flash Pro?


title: Czy typy zagnieżdżania są uważane za złą praktykę?

text: Jak zaznaczono w tytule, czy typy zagnieżdżania (np. typy wyliczone lub struktury w klasie) są uważane za złą praktykę, czy nie? Po uruchomieniu analizy kodu w programie Visual Studio zwraca następujący komunikat, który sugeruje, że jest to: > Ostrzeżenie 34 CA1034 : Microsoft.Design : Nie zagnieżdżaj typu > 'ClassName.StructueName'. Alternatywnie zmień jego dostępność, aby > nie był widoczny z zewnątrz. Jednak, gdy postępuję zgodnie z zaleceniem analizy kodu, stwierdzam, że w aplikacji znajduje się wiele struktur i typów wyliczanych, które mogą dotyczyć tylko jednej klasy lub byłyby używane tylko z tą klasą. W związku z tym, czy byłoby właściwe zagnieżdżenie typu sin w tym przypadku, czy też istnieje lepszy sposób na zrobienie tego?


title: Dlaczego obecnie więcej programistów nie jest freelancerami?

text: Pozostawiając całe ciasto tylko kilku z nich, wzmacniając ogromne różnice między tymi dwoma statusami. Płaca to (ogromna) jedna, a co innego brak nadgodzin. Pozostawiam pytanie otwarte, aby miejmy nadzieję uzyskać wiele świetnych odpowiedzi na wszystkie różne tematy, które wpływają na to uczucie i decyzję, by nie iść. **EDYTUJ** : Chociaż to pytanie jest naprawdę globalne, interesują mnie wszelkie badania, fakty, artykuły, opinie dotyczące lokalnych rynków, takich jak USA, Indie, a nawet Australia, w których jestem zakochany. **EDIT2** : Nagroda w wysokości 500 punktów dla każdego, kto przyjdzie z najnowszymi badaniami na ten temat. W przypadku kilku odpowiedzi wybierze tę z największą liczbą głosów za.


title: Najlepsze praktyki lub standardy projektowe

text: Jako wykonawca oprogramowania pracowałem przy wielu projektach o różnych standardach i konwencjach. Dość często te konwencje są sprzeczne z najlepszymi praktykami oprogramowania, które znamy i „kochamy”. Pytanie brzmi: kiedy pracujesz nad ustalonym projektem z określonymi sposobami robienia rzeczy, o których wiesz, że nie są najlepsze, czy łamiesz konwencje projektu, ponieważ wiesz, że jest to lepszy sposób na zrobienie czegoś, czy trzymasz się konwencji, co oznacza, że Twoja praca wtopi się w istniejącą bazę kodu? W końcu musisz pamiętać, że ktoś inny pewnego dnia natknie się na twoją pracę i jeśli nie będzie to zgodne z resztą projektu, będzie musiał poświęcić trochę czasu na ustalenie, co zrobiłeś inaczej. A więc spójność konwencji projektowej czy najlepsze praktyki?


title: Dziedziczenie poszło nie tak

text: Mam kod, w którym dobry model dziedziczenia pogorszył się i próbuję zrozumieć, dlaczego i jak to naprawić. Zasadniczo wyobraź sobie, że masz hierarchię Zoo z: klasą Animal Class Parrot : Animal Class Słoń : Animal Class Krowa : Animal itd. Masz swoje metody eat(), run() itd. i wszystko jest w porządku. Pewnego dnia ktoś przychodzi i mówi - nasza klasa CageBuilder działa świetnie i używa funkcji animal.weight() i animal.height(), z wyjątkiem nowego żubra afrykańskiego, który jest zbyt silny i może rozwalić ścianę, więc dodam jeszcze jedną właściwość do klasy Animal -- isAfricanBizon() i użyj jej podczas wybierania materiału i nadpisz ją tylko dla klasy AfricanBizon. Następna osoba przychodzi i robi coś podobnego, a następną rzeczą, o której wiesz, że masz wszystkie te właściwości specyficzne dla jakiegoś podzbioru hierarchii w klasie bazowej. Jaki jest dobry sposób na ulepszenie/refaktoryzację takiego kodu? Jedną z alternatyw byłoby po prostu użycie dynamic_casts do sprawdzania typów, ale to zaśmieca rozmówców i dodaje mnóstwo opcji jeśli-to-innych w całym miejscu. Możesz mieć bardziej szczegółowe interfejsy tutaj, ale jeśli wszystko, co masz, to odniesienie do klasy bazowej, które również nie pomaga. Jakieś inne sugestie? Przykłady? Dziękuję!


title: Jak mogę porównywać współbieżne sklepy klucz-wartość?

text: Mam kilka współbieżnych implementacji magazynu klucz-wartość, które są zaimplementowane za pomocą tabel mieszających i drzew wyszukiwania, które chciałbym porównać. Chciałbym porównać je z aplikacją ze świata rzeczywistego, w której kilka wątków podkreśla magazyny klucz-wartość. Mam już pewien mikro-benchmark, który podkreśla magazyny klucz-wartość, wykonując równolegle losowe operacje na magazynach klucz-wartość. To, co mnie teraz interesuje, to aplikacje, które wykonują pewną pracę, która może być użyteczna w „rzeczywistym świecie” i gdzie jeden lub kilka magazynów klucz-wartość jest ważnych dla skalowalności i szybkości. Chciałbym mieć benchmark, który jest łatwy do skonfigurowania i który można uruchomić na wielu różnych systemach. Wolałbym, gdyby nie wymagało to komunikacji sieciowej itp. Przykładem aplikacji, której szukam, jest równoległy algorytm PageRank. Jest on używany jako punkt odniesienia dla różnych magazynów klucz-wartość w artykule „Concurrent Tries with Efficient Non-Blocking Snapshots (PPoPP'12)”. Powody, dla których nie jestem usatysfakcjonowany „sztucznymi” testami, które dokonują wstawiania X%, usuwania Y% i wyszukiwania Z%, to: 1. Test może być bardziej przekonujący, jeśli chodzi o test, który również rozwiązuje rzeczywisty problem. Ryzyko związane z „sztucznymi” benchmarkami polega na tym, że mogą one nie odpowiadać żadnej sytuacji w świecie rzeczywistym. 2. Niektóre scenariusze użytkowania, które zdarzają się często w rzeczywistych aplikacjach, mogą nie być objęte sztucznym testem porównawczym.


title: Jak mógłby wyglądać algorytm, który iteruje przez wszystkie kombinacje dwóch zmiennych, aby dążyć do określonej liczby wpisów?

text: Aby uzyskać dodatkowe informacje, zobacz „Niektóre tło” poniżej. Mam listę, która wygląda tak: Start-Time-In-Seconds;End-Time-In-Seconds 1;2 4;6 12;15 ... Działa to razem z plikiem wave, działając jako lista cięć. Tak więc pożądane części to 1->2, 4->6, 12->15, ... Jeśli odległość między czasem zakończenia poprzedniego elementu a czasem rozpoczęcia w sekundach bieżącego elementu jest poniżej progu sekund (nazywam to _Pausendauer_ ) Łączę te dwa, tzn. jeśli próg wynosi 3 sekundy to lista będzie Start-Time-In-Seconds;End-Time-In-Seconds 1;6 12;15 ... Jeśli odległość między czasem rozpoczęcia w sekundach a czasem zakończenia w sekundach jest poniżej progu sekund (nazywam to _Minimalänge_ ) odrzucam tę próbkę, tj. jeśli próg wynosi 4 sekundy, lista zostanie być Czas rozpoczęcia w sekundach; Czas zakończenia w sekundach 1;6 ... Jak mógłby wyglądać algorytm, który iteruje (inteligentnie) przez wszystkie kombinacje _Minimallänge_ i _Pausendauer_, aby dążyć do określonej liczby wpisów? Przykład: Liczba wpisów powinna wynosić 3. Biorąc pod uwagę liczbę 3, algorytm powinien iterować (inteligentnie) przez wszystkie kombinacje _Minimallänge_ i _Pausendauer_, aby uzyskać coś takiego: Początek-Czas-W-Sekundach;Koniec-Czas-W-Sekundach 1 ;12 18;20 50;100 I to powinno być wszystko. Zauważcie, że nie dodałem do niej „...”, ponieważ ostateczna lista ma składać się tylko z trzech wpisów. _Some background_ : Plik wave zawiera kilka wywiadów nagrywanych w sposób ciągły z przerwami pomiędzy nimi. VAD dał mi obszary, w których przypuszczalnie jest głos. Ponieważ znam liczbę wszystkich rozmów (np. 3, zwykle więcej, dlatego ma to sens) moim celem jest ich automatyczne ustalenie. Lista cięć to surowe dane wyjściowe mojego VAD-a, które chcę przekształcić w użyteczną listę cięć dla ffmpeg. _PS_ : Jeśli możesz, udostępnij algorytm w c#.


title: Czy blokowanie całego klienta internetowego ze względu na zgodność jest rozsądną prośbą?

text: Nieco tła, stworzyliśmy elektroniczny system POS dla zarejestrowanych sprzedawców artykułów znanej marki. Sprzedawcy muszą się zalogować, aby korzystać z systemu. Ostatnio IE przysparzało nam wielu bolesnych problemów z konserwacją niż wcześniej. Nasz szef martwi się o kolejne problemy z konserwacją, więc poprosił mnie o znalezienie sposobu na automatyczne zainstalowanie i uruchomienie chrome, jeśli spróbują zalogować się za pomocą innych przeglądarek (dla przypomnienia, prawie wszystkie problemy są związane z niektóre funkcje działają dobrze na FF/Chrome/Opera/Safari, ale nie na IE). Odłóżmy na bok niedorzeczność uruchamiania zewnętrznego .exe z Javascript, co jest praktycznie niemożliwe (I słusznie, powiedziałem mu to. Ale on upierał się, że to możliwe, więc cokolwiek). Moje pytania to: * Czy ta prośba jest wykonalna technicznie? Czy istnieje gwarantowany sposób blokowania żądań ze wszystkich przeglądarek poza dozwolonymi? * Czy ta prośba jest uzasadniona? IMO, Z punktu widzenia użytkowników ograniczenie dostępności wyrządza więcej szkody niż pożytku, ale kwestia konserwacji jest zdecydowanie ważnym problemem biznesowym. * Czy kiedykolwiek zdarzył się taki przypadek, w którym inne strony internetowe wyraźnie zablokowały określone przeglądarki? Edycja: Dzięki za odpowiedzi. W tej chwili wspieramy IE 7+ i rzeczywiście 7/8 było tymi, które spowodowały większość żalu. Porzucenie tych dwóch znacznie ułatwi utrzymanie, ale mój szef uważa, że problem jest związany z samym IE, niekoniecznie z wersjami. Spróbuję zobaczyć, czy uda mi się go przekonać, ale mam silne przeczucie, że będzie się trzymał tego, co myśli.


title: Czy to „antywzór” i powinienem przestać go używać, czy jest to sprytny projekt?

text: Zasadniczo zacząłem wykonywać następujące czynności podczas tworzenia usługi REST: 1. Żądany jest kod HTML 2. Usługa zwraca żądaną stronę internetową, ale bez żądanego "zasobu", np. dane 3. strona internetowa zawiera JavaScript, który wysyła żądanie AJAX do tej samej usługi (inny typ treści) 4. usługa następnie zwraca rzeczywiste dane (JSON) i strona je wyświetla Z jednej strony wydaje się nieefektywne (2 żądania), ale potem były Użyłem tego, że „wydajność nie ma znaczenia”, co oznacza, że wewnętrzna aplikacja o małym ruchu i strony internetowe są proste i szybko się ładują. Powodem, dla którego tak skończyłem, jest to, że strona internetowa może być wtedy prawie czystym Html + JavaScript i prawie nie są wymagane żadne rzeczy po stronie serwera, zwłaszcza żadne pętle, aby tworzyć tabele i takie rzeczy (co moim zdaniem jest bardzo brzydkie w porównaniu do takie rzeczy jak slickgrid), m.in. oddzielenie danych i widoku. Teraz, zanim zabiorę się do tego, czy to dobry pomysł, czy powinienem po prostu przestać to robić?


title: Dlaczego znaczniki semantyczne mają większą wagę dla wyszukiwarek?

text: Pytanie to wynika wprost z części odpowiedzi na pytanie – po co zawracać sobie głowę poprawnym i semantycznym zaznaczaniem? . Chciałbym zrozumieć, dlaczego techniki SEO przykładają większą wagę do semantycznie poprawnego znacznika?


title: DbFirst vs Code First? czego powinienem użyć, jeśli polegam na procedurach składowanych

text: To pytanie jest zadawane wiele razy i zawsze wolę najpierw kod, ponieważ lubię zachować logikę w kodzie. Ale teraz mam wyzwanie, aby załadować ekran poniżej 5 sekund i bardzo mało czasu na zrobienie rzeczy. Mam duży zestaw rekordów i prawdopodobnie zamierzam je odzyskać asynchronicznie. W mojej głowie pojawia się kilka wątpliwości. * Czy użycie podejścia db-first ma jakieś zalety w wydajności w porównaniu z kodem? * Czy należy napisać logikę w procedurach składowanych czy w kodzie (Linq)? * Który ma mniejsze opóźnienia: Linq czy procedury składowane?


title: Protokoły aplikacji i maszyny stanowe: projektowanie skomplikowanego serwera

text: Projektuję i prototypuję serwer, który ma następujące cechy: * podczas inicjalizacji demona tworzy dziewięć serwerów „menedżera”, z których każdy rozwiązuje jedną część ogólnego problemu. * po zainicjowaniu demon akceptuje połączenia od klientów, dla każdego rozwidlając serwer „podrzędny”, który łączy się z menedżerami, a następnie akceptuje żądania od klienta, farmi je do menedżerów, gromadzi wyniki i odsyła je z powrotem do klienta , w nieskończoność. * demon, menedżerowie i urządzenia podrzędne powinni mieć możliwość jednoczesnego akceptowania połączeń „kontroli” z terminala oraz odbierania i przetwarzania poleceń (np. zapytań o statystyki wydajności). * współbieżnością we/wy gniazda każdego procesu zarządza funkcja select(). Problem, który mam, to złożoność kodowania. Po pierwsze, każdy program ma co najmniej dwie fazy — inicjalizację i główną pętlę — w których na różne sposoby nawiązuje połączenie ze swoim rodzicem lub akceptuje połączenia od swoich dzieci, lub wysyła i asynchronicznie oczekuje danych od swoich dzieci i tak dalej . W różnych momentach nie chcę, powiedzmy, akceptować połączenia klienta podczas inicjalizacji lub chcę akceptować sesje kontrolne nawet w trakcie zwykłego przetwarzania. Nie wspominając o zarządzaniu protokołem każdego takiego połączenia. Mając wystarczająco dużo czasu, prawdopodobnie mógłbym to wszystko skomponować w dość dobrze przemyślany zestaw wywołań podprogramów. Ale pamiętam, że słyszałem o zupełnie innym podejściu do tego rodzaju problemu, obejmującym libevent, wywołania zwrotne i automaty skończone. Mam nadzieję, że ktoś, kto to czyta, może powiedzieć: „Dlaczego, tak! To doskonały przykład na to, że wywołania zwrotne zdarzeń i FSM są znacznie lepsze niż pętle na select() – a świetnym artykułem wprowadzającym na ten temat jest…” lub „oto, o co w tym wszystkim chodzi w skrócie”. (Lub, być może, „to wcale nie jest to, do czego libevent jest przeznaczony”).


title: Układanie słów kluczowych jeden na drugim – kiepski styl?

text: Zawsze się nad tym zastanawiałem, zwłaszcza w językach stylu C/Java. Rozważmy na przykład pierwsze 3 wiersze tego kodu C#: lock (serviceLock) using (var client = new ServiceClient()) try { // Zrób coś client.DoSomething(); } catch (System.ServiceModel.FaultException ex) { // Obsługa błędu addLog(ex.ToString()); } To użycie zawsze wydawało mi się nieco wątpliwe. Jednak alternatywa nie jest zbyt praktyczna (ponad 3 poziomy wcięcia dla zgłoszenia serwisowego). Czy poza czystą estetyką jest jakiś praktyczny powód, aby w tym przypadku dodawać lub nie dodawać dodatkowych wsporników?


title: Lepszy sposób na zapoznanie się z Haskell

text: Jestem początkującym Haskellem. Zacząłem uczyć się Haskella około 20-25 dni temu. Z programowaniem robię to w wolnym czasie, ponieważ chciałem nauczyć się programowania funkcjonalnego. **Tło** Obchodziłem stackoverflow, aby zobaczyć, jak mam postępować. Przeczytałem pierwsze 6 rozdziałów nauki haskella i około 2 rozdziałów z Real World Haskell i trochę programowania w Haskell. Nie mam doświadczenia w programowaniu funkcjonalnym. Ale użyłem Pythona, w którym zastosowano **_some_** funkcjonalne koncepcje programowania. Teraz jestem naprawdę zdezorientowany, jak postępować. Jestem przyzwyczajony do uczenia się programowania poprzez pisanie programów w ruchu, ale tutaj w Haskell nie jestem pewien, jakie problemy programistyczne mam robić. Mam problem z myśleniem o rozwiązaniach problemów, które już rozwiązałem w Pythonie lub C. Próbowałem niektórych z 99 problemów Haskella, ale ich rozwiązania wykorzystują funkcje biblioteczne, o których nie wiem. Haskell kładzie nacisk na rekurencję, ale bez zapętleń nie wiem, jak rozwiązać wiele problemów. Próbowałem przejrzeć porady, które otrzymałem podczas nauki Pythona. Ale tym razem nauka Haskella nie pomaga, bo utknąłem na jeszcze niższym poziomie. Tym razem mam mniej czasu na ćwiczenia i jest po prostu inaczej. Czy jest sposób na lepsze zapoznanie się z Haskellem niż wspomniana powyżej metoda? Czy wychodzenie z imperatywnego tła zajmuje tylko trochę czasu?


title: Prawdziwe przykłady aplikacji napisanych z TDD i dobrym pokryciem testowym?

text: Czy istnieją jakieś aplikacje typu open source, które są tworzone przy użyciu programowania sterowanego testami, które służą jako modele tego, jak dobre testy jednostkowe powinny działać? Wolałbym zobaczyć przykłady w C# i .NET. (Zauważ, że wspomniałem o aplikacjach, nie tylko bibliotekach.) Jestem programistą średniego szczebla, który naprawdę chce wierzyć i praktykować TDD. Aplikacja, nad którą pracuję w mojej codziennej pracy, jest dość skomplikowana — około miliona wierszy kodu — i chciałbym wprowadzić więcej testów jednostkowych. Mamy kilka testów jednostkowych, ale moje wysiłki w TDD i praca nad kodem, który jest już w fazie testów, nie były zachęcające. W moim, przyznaję, ograniczonym doświadczeniu, TDD wydaje się zachęcać do dużej złożoności w imię oddzielenia. Te fragmenty aplikacji, które są trudne do przetestowania – i które przypadkowo są często krytyczne – są wypychane na peryferie, w sferę testów integracyjnych, które mogą, ale nie muszą, zostać napisane. (Myślę tu o zwykłych podejrzanych, dostępie do systemu plików, uwadnianiu obiektów z bazy danych, asynchronicznych wywołaniach sieci Web itp.) Testowany kod zwykle wymaga dużej współpracy między obiektami i być może jakiejś prostej logiki przepływu. co dzieje się w pamięci i które prawdopodobnie można by napisać w prostszy, bardziej zrozumiały sposób, gdyby nie wszystko musiało być całkowicie odseparowane do testowania. Rozumiem techniki mockowania zależności i tym podobne, ale z mojego doświadczenia wynika, że intensywne używanie mockowania prowadzi do bardzo kruchych testów. Jeśli mój pierwszy instynkt po zobaczeniu, jak kilka testów robi się czerwony, brzmi: „Świetnie, teraz muszę naprawić wszystkie fałszywki”, to moje testy stały się raczej hamulcem niż siatką bezpieczeństwa. Próbuję ominąć tę mentalną barierę iw ramach tego czytam książkę Michaela Feathersa _Praca efektywnie z Legacy Code_. Mam nadzieję, że pokaże mi trochę tego, czego mi brakuje. Chciałbym również przestudiować niektóre nietrywialne aplikacje .NET z dobrym pokryciem kodu, może system zarządzania treścią lub aplikację CRUD. Struktura testowa FitNesse, o której mówi Wujek Bob, jest czymś, na co prawdopodobnie się przyjrzę, ale byłoby miło zobaczyć coś napisane w języku, który najlepiej znam. Wszelkie sugestie lub słowa mądrości byłyby mile widziane.


title: Przekazywanie tokenów specyficznych dla impl w algorytmach generycznych w systemie typu statycznego/silnego

text: Byłem zainteresowany rozwiązywaniem kilku niepowiązanych problemów przy użyciu ogólnych technik wyszukiwania grafów, więc po pewnym manipulowaniu wymyśliłem następujący projekt: niech każdy problem zaimplementuje ogólny interfejs „Problem”, który ma stan początkowy i kilka metod, które przyjmują stany i ruchy oraz zwracają nowe stany i ruchy. Na przykład mogę `getMoves(state)`, `applyMove(state, move)` lub sprawdzić `isGoal(state)`. Wszystkie szczegóły dotyczące problemu znajdują się wtedy w jednym miejscu, a ogólne algorytmy mogą przekazywać stany i ruchy jako ogólne „tokeny”, na których im nie zależy, używając instancji Problem do oceny ich właściwości. Problemy są również w konsekwencji bezpaństwowe (lub stan, w jakim się znajdują, jest niezmienny), co sprawia, że ich zachowanie jest bardzo łatwe do zrozumienia. Wszystko było dobrze i dobrze w systemie typu dynamicznego/kaczkowego (JavaScript), ale podczas migracji pomysłu do systemu typu statycznego/ścisłego (Java), napotkałem pewne problemy. Najbardziej palącym problemem było to, że te „tokeny” mogły być naprawdę wszystkim. Tablice, obiekty, mapy, ciągi, cokolwiek. JavaScript to nie obchodziło, ponieważ algorytmy po prostu przekazywały je jako czarne skrzynki, a Problemy zakładały, że otrzymują własne tokeny. W Javie tak nie jest. Pierwszym najbardziej naturalnym rozwiązaniem jest posiadanie wszystkich "tokenów" implementujących jakiś pusty interfejs `State` lub `Move`. To już ma pewne problemy, jak gdyby mój stan był tylko jakąś strukturą danych, to muszę ją rozszerzyć lub owinąć, ale to jest _zasadniczo_ w porządku. Kolejny problem polega na tym, że tokeny są specyficzne dla implementacji, więc za każdym razem, gdy są przekazywane do Problemu, muszą być rzutowane na to, czym w rzeczywistości są. Dużo rzucania uderza mnie jak czerwona flaga, więc wydaje się to złym (z pewnością nieprzyjemnym) podejściem. Aby uniknąć rzucania, przez chwilę rozważałem coś, co wymagało mnóstwa szablonów (State<ChessProblem>, Move<ChessProblem>), ale wydawało się to być bólem głowy, który może nawet nie rozwiązać problemu. Czy istnieje jakiś „właściwy”/standardowy sposób na osiągnięcie tego w bardziej rygorystycznych systemach typu? Czy to tylko zły wzór do wykorzystania w nich (lub ogólnie zły wzór)? Wszelkie spostrzeżenia byłyby mile widziane. Ponadto, podczas gdy ja _ja_ używam Javy, jeśli inne języki statyczne/ścisłe mają nowatorskie narzędzia do tego rodzaju rzeczy, chciałbym o nich usłyszeć.


title: Co jest lepsze dla zwiększenia dokładności/widoczności harmonogramów projektu: programista i kierownik, czy dwóch programistów?

text: Obecnie jestem jednoosobowym zespołem programistycznym. Mój pracodawca chce zatrudnić menedżera. Robią to, ponieważ w przypadku bardziej skomplikowanych projektów zwykle przyjmuję podejście „to już zrobiłem – tyle zostało do zrobienia” zamiast „wtedy to będzie zrobione” i oni myślę, że zmieni się to w magiczny sposób, jeśli do zespołu dołączy menedżer. Czy mam rację, że drugi programista jest bardziej wydajny? Czy mógłbym przytoczyć pojawienie się programowania w parach jako dowód, czy jest to naprawdę wyspecjalizowana rzecz?


title: Setery czy konstruktor wielu zmiennych?

text: > **Possible Duplicate:** > Czy istnieją wytyczne dotyczące liczby parametrów, które funkcja powinna akceptować? Mam klasę z 30 zmiennymi (jest to formularz zgłoszeniowy), więc zastanawiam się, jaka jest najlepsza praktyka organizowania tworzenia klas. Czy powinienem używać ogromnego konstruktora: MojaKlasa mc = new MojaKlasa(a, b, c, d) Lub settery: MojaKlasa mc = new MojaKlasa(); mc.zestawA(a); mc.zestawB(b); mc.zestawC(c); mc.zestawD(d); Jaka jest najlepsza praktyka w OOP w takiej sytuacji? Widziałem podobne pytanie, ale teraz nie potrzebuję niezmienności.


title: Struktury danych w programowaniu funkcjonalnym

text: Obecnie gram z LISPem (szczególnie Scheme i Clojure) i zastanawiam się, jak radzą sobie typowe struktury danych w funkcjonalnych językach programowania. Załóżmy na przykład, że chciałbym rozwiązać problem za pomocą algorytmu odnajdywania ścieżki grafu. W jaki sposób można by zazwyczaj zabrać się za przedstawienie tego grafu w funkcjonalnym języku programowania (przede wszystkim zainteresowany czystym stylem funkcjonalnym, który można zastosować w LISP-ie)? Czy po prostu zapomniałbym o wykresach i rozwiązał problem w inny sposób?


title: Jaki jest poprawny/uprzejmy sposób dziedziczenia po porzuconym projekcie open source dla nowego projektu open source?

text: Mój zespół właśnie próbował skontaktować się z kilkoma facetami ze starego projektu open source hostowanego na code.google.com. Powiedzieliśmy im, że chcielibyśmy dołączyć do ich projektu i zobowiązać się do niego – przynajmniej do jakiejś jego gałęzi – ale nikt nam nie odpowiedział. Próbowaliśmy wszystkich, właścicieli i osób dokonujących zmian; nikt nie był w żaden sposób aktywny i nikt nie odpowiadał. Ale mamy trochę kodu do zatwierdzenia i naprawdę chcielibyśmy kontynuować pracę nad tym projektem. Więc musimy stworzyć nowy projekt. Wymyśliliśmy dla niego nazwę, która jest zbliżona, ale nie jest duplikatem nazwy projektu, z którego chcemy odziedziczyć. Jak powinniśmy wykonać nasze pierwsze zatwierdzenie i jaki powinien być komunikat o zatwierdzeniu? Czy powinniśmy po prostu skopiować ich kod do naszego repozytorium z komentarzem typu „odziedziczyliśmy ten kod, znaleźliśmy go tutaj na takiej a takiej licencji… teraz aktualizujemy go do tej mniej/niej ścisłej licencji…”? A może powinniśmy po prostu użyć ich kodu jako naszego pierwszego zatwierdzenia, z aktualizacjami mówiącymi „odziedziczyliśmy po… zrobiliśmy takie a takie zmiany…”?


title: Dlaczego niejawna równoległość/współbieżność nie jest bardziej rozpowszechniona?

text: Niejawny paralelizm^ może odciążyć wielu programistów, umieszczając go na komputerze. Więc... dlaczego obecnie nie jest bardziej rozpowszechniony? * * * ^ Niejawna równoległość polega na tym, aby komputer był w stanie sam wymyślić, jak robić więcej niż jedną rzecz naraz, zamiast programisty, który musi wykonać tę pracę za pomocą wątków i tym podobnych


title: Jaka jest różnica między kodem zawartym w klauzuli finally a kodem znajdującym się po klauzuli catch?

text: Mój kod Java jest taki jak poniżej: public void check() rzuca MissingParamException{ ...... } public static void main(){ PrintWriter out = response.getWriter(); spróbuj { check(); } catch (MissingParamException e) { // TODO Automatycznie wygenerowany blok catch out.println("wiadomość:"+e.getMessage()); e.printStackTrace(); out.zamknij(); }nareszcie{ out.close(); } //wyj.zamknij(); } W takim razie moje zamieszanie jest takie: jaka jest różnica, jeśli umieszczę `out.close()` w bloku końcowego kodu lub jeśli po prostu usunę blok końcowy kodu i wstawię `out.close()` za klauzulą catch (która została skomentowana w kodzie). Wiem, że w obie strony zostanie wykonana `out.close()`, ponieważ wiem, że niezależnie od tego, czy wystąpi wyjątek, kod za klauzulą catch będzie zawsze wykonywany.


title: Klasa lub słownik

text: Chcę utworzyć niezmienną klasę `Scale` w C#. public seal class Scale { string _Name; ciąg _Opis; SomeOrderedCollection _ScaleValueDefinitions; Unit _Unit // właściwości .... // metody ContainsValue(podwójna wartość) .... // konstruktory // wszystkie parametry poza definicją wartości skali są opcjonalne // aby Scale była użyteczna co najmniej 1 ScaleValueDefinition powinna istnieć public Scale(string name , opis ciągu, SomeOrderedCollection scaleValueDefinitions, jednostka) { /* zainicjuj */} } więc najpierw `ScaleValueDefinition` należy reprezentować przez wartości: * Wartość (podwójna) * Definicja (ciąg znaków) te wartości są znane przed utworzeniem klasy Scale i powinien być wyjątkowy. więc jakie jest najlepsze podejście. 1. utwórz niezmienną klasę ScaleValueDefinition z wartością i definicją jako właściwościami i użyj jej na liście. 2. korzystać ze słownika. 3. użyj innego sposobu, o którym nie pomyślałem ... i jak go zaimplementować. dla opcji 1. mogę użyć `params ScaleValueDefinition[] ValueDefinitions` w konstruktorze, ale jak to zrobić dla innych opcji? i na koniec przy jakiej wartości (właściwości) powinienem wybrać jedną opcję zamiast drugiej?


title: Czy to źle, że nie programujesz w wolnym czasie na uniwersytecie?

text: Pojawiło się kilka pytań dotyczących nieprogramowania w wolnym czasie, ale wszystkie dotyczą, gdy jesteś w pracy. A co z nauką? Czy musisz uczyć się także w wolnym czasie, kiedy uczysz się już w ciągu dnia (na uniwersytecie)?


title: Próbki kodu i wywiady?

text: Odkąd tu jestem, widziałem wiele pytań, w których w odpowiedzi ktoś zapewnił, że nigdy nie użyje portfolio ani próbek kodu zakodowanych poza procesem rozmowy kwalifikacyjnej do oceny kandydata, ponieważ istnieje taka możliwość kod został napisany przez kogoś innego. Jestem tym zaskoczony. Z mojego punktu widzenia, jeśli poproszę kogoś o przyjście i rozwiązanie prostego problemu na miejscu, niewiele mogę się z tego nauczyć. Nie pracuję dla firmy takiej jak Google, w której poszukuje się pracy i mogę zażądać czyjegoś dnia. Ale znaczna część kodu napisanego przez hobby może mi wiele powiedzieć. Tak, istnieje możliwość plagiatu, ale będą musieli być bardzo dobrze wyszkoleni, aby przejść przez godzinną dyskusję na temat tego kodu. A jeśli tak się stanie, będą musieli bardzo szybko się uczyć, aby przejść przez 3-miesięczny okres próbny (podczas którego mogę się ich pozbyć bez powodu i bez uprzedzenia). Jeśli tak szybko zostaną dobrymi programistami, to w porządku, zostałem oszukany, ale nadal mam dobrego programistę. Ostatecznie koszt dla naszej firmy i korzyść z plagiatu dla kandydata jest bardzo minimalna. To skłoniło mnie do myślenia o innych branżach. Artyści, fotografowie, projektanci używają portfolio i nikt nie przejmuje się zbytnio plagiatami. Autor otrzyma pieniądze na książkę opartą na rozdziałach, które napisał w swoim czasie. Nie poprosiłbyś architekta, aby przyszedł i narysował specyfikację projektu domu podczas rozmowy kwalifikacyjnej. Więc co nas wyróżnia? Dlaczego tak ważne jest, aby postawić kogoś przed komputerem i zmusić go do zakodowania scalania danych lub kalkulatora czynnikowego, czasami bez dostępu do narzędzi, z których korzystamy na co dzień, takich jak internet? Co jest złego w idei portfela kodu? Jestem naprawdę zainteresowany, aby wiedzieć, na wypadek, gdybym potencjalnie popełnił ogromny błąd, który po prostu mnie jeszcze nie spalił.


title: Potrzebujesz przejścia z mojego przepływu pracy lub ulepsz go / napraw

text: Oto jak rzucam z git: 1. Klonuję/forkuję coś lokalnie 2. Tworzę nową gałąź `devel`. To ma być gałąź quickfix. Ma też być rodzicem wszystkich oddziałów. 3. Tworzę gałąź tematu (powiedzmy stwórz nowy motyw `lex`) Właściwie tworzę kilka dodatkowych gałęzi tematycznych podrzędnych (powiedzmy `lex.th2`) aby przetestować/zobaczyć różne rzeczy. Ale teraz muszę szybko naprawić (w `devel`) podstawową funkcjonalność (powiedzmy, że poprawię poświadczenia bazy danych w `wp-config`). Następnie muszę przełączyć się na `lex` i `merge devel`. A potem do `lex.th2` i `merge lex`. (Więc zmiany z `devel` mogłyby przejść do `lex` i `lex.th2`) Robienie tego wszystkiego poważnie psuje moje wykresy historii ![C:\\Program Files \(x86\)\\Git\\bin \\wish.exe](http://i.stack.imgur.com/8Hy0H.png) Przyznam, że „oficjalny” workflow to dla mnie za dużo i po prostu wziąłem z niego części, które mi się podobały. .. chyba źle. Więc jakieś sugestie, jak sprawić, by było „uporządkowane”, a jednocześnie nie komplikujące lub zbytnio odbiegające?


title: Udostępniasz zarówno interfejsy RESTful, jak i Java?

text: Piszę serwis RESTful w Javie, oczywiście jest to typowy interfejs oparty na HTTP. Zastanawiam się, czy usługa powinna zapewniać interfejs Java, który ma taką samą semantykę jak interfejs RESTful? Myślę, że interfejs Java ułatwi innym kodowi Java wywołanie usługi. (Kod klienta Java nie musi używać klienta HTTP do wyzwalania żądań HTTP w celu wywołania RESTful) Problem polega na tym, że trudno jest napisać ten sam semantyczny interfejs Java do interfejsu RESTful, mam na myśli tę samą semantykę. Jakieś porady dotyczące projektu? Dziękuję!


title: Dlaczego nie możemy używać adresu IP zamiast plików cookie do identyfikacji klienta w serwletach?

text: Wiem, że korzystanie z plików cookie w porównaniu z adresem IP ma pewne dodatkowe zalety, ale moje pytanie brzmi: Dlaczego kontener nie może po prostu zapamiętać adresu IP klienta w celu identyfikacji klienta, gdy ponownie odwiedza on swoją witrynę? Czy kontener może zapamiętać klienta za pomocą adresu IP?


title: Oprogramowanie do zarządzania wydaniami

text: Mamy dość dobry proces zarządzania wydaniami. Jednak duża część tego zadania to zadania ręczne, tj. Promowanie kompilacji do kontroli jakości, wdrażanie kompilacji do grup wewnętrznych, śledzenie wydań itp. Kompilacje i testy są zautomatyzowane dzięki CruiseControl. Czy ktoś może polecić jakieś dobre narzędzia do zarządzania wydaniami/ciągłego wdrażania, których mogę użyć do zautomatyzowania reszty naszego procesu?


title: Do czego właściwie służy „testowanie warunków” (zgodnie z definicją zawartą w Syllabusie ISTQB)?

text: Obecnie sprawdzam sylabus do certyfikacji ISTQB "Techniczny Analityk Testów". Ten sylabus (zwany dalej "sylabusem TTA") zawiera rozdział poświęcony _"testowaniu warunków"_ (najwyraźniej jest to również nazywane _"pokryciem warunków"_ lub _"testowaniem pokrycia warunków_ ".) _Testowanie warunków_ zdefiniowane w sylabusie TTA wydaje mi się niezwykle dziwną i prawdopodobnie anachroniczną rzeczą, która ma więcej wspólnego z Babcią Ham Story niż z testowaniem oprogramowania. Pozwól, że wyjaśnię... **Co to jest „testowanie warunkowe” zgodnie z sylabusem TTA?** Odnosząc się do „Syllabusu poziomu zaawansowanego – Technical Test Analyst, wersja 2012” ISTQB, dostępnego tutaj, zdefiniowano „testowanie warunkowe” w następujący sposób na stronie 12: > W porównaniu z testowaniem decyzyjnym (gałęziowym), które uwzględnia całą decyzję > jako całość i ocenia wyniki PRAWDA i FAŁSZ w oddzielnych przypadkach testowych, > testowanie warunkowe uwzględnia sposób podejmowania decyzji. Każdy predykat decyzyjny > składa się z jednego lub większej liczby prostych warunków „atomowych”, z których każdy > jest oceniany jako dyskretna wartość logiczna. Są one logicznie połączone, aby > określić ostateczny wynik decyzji. _Każdy warunek atomowy musi być > oceniany w obie strony przez przypadki testowe, aby osiągnąć ten poziom pokrycia._ > > _Zastosowalność_ > > Testowanie warunków jest prawdopodobnie interesujące tylko w skrócie z powodu > trudności opisanych poniżej. Zrozumienie go jest jednak konieczne, aby > osiągnąć większe poziomy pokrycia, które się na nim opierają. **Więc wyjaśnijmy słowa** Załóżmy, że mamy testowane oprogramowanie, na którym chcemy przeprowadzić _testowanie whitebox_ (tj. mamy kod źródłowy). Kod naturalnie zawiera wiele z tych _predykatów decyzyjnych_, które wszyscy znamy i kochamy i które pojawiają się po ciągach takich jak `if`, `while`, `until` itd. Przykładem predykatu decyzyjnego może być: > `((x> y+z) AND (y<-3)) OR ((z²+x²<4) AND (z≤y))` ![Przykład predykatu decyzyjnego](http://i.stack.imgur.com /HlZtV.png) Ten predykat decyzyjny akceptuje potrójne _(x,y,z)_ wartości całkowitych (powiedzmy) i wyprowadza wartość logiczną _b_out_. Funkcje pierwszego poziomu, które odwzorowują _(x,y,z)_ na {PRAWDA,FAŁSZ} są nazywane _warunkami_ (również _warunkami atomowymi_ ) w sylabusie TTA. **Pokrycie testowania warunkowego** _"Pokrycie testowania warunkowego"_ osiąga się, uruchamiając przypadki testowe, aż wszystkie _warunki_ znalezione w _decyzji_ dadzą co najmniej raz _prawdę_ i co najmniej raz _fałsz_. W ten sposób można osiągnąć pokrycie testowania warunków, uruchamiając następujące pięć przypadków testowych (na przykład): ![Tabela prawdy osiągająca pokrycie testowania warunków](http://i.stack.imgur.com/nO80z.png) Każdy z _b0_ , _b1_ , _b2_ , _b3_ pojawia się przynajmniej raz jako _prawda_ i przynajmniej raz jako _fałsz_. W niektórych przypadkach testowych nie dbamy o daną wartość, ponieważ nie ma ona wpływu na warunek, którego wyjście chcemy uzyskać. **Uzupełnienie: Pokrycie decyzji** Nawiasem mówiąc, tabela prawdy pokazuje również, że _"pokrycie decyzji"_ zostało osiągnięte dla tej decyzji, ponieważ _b_out_ pojawia się przynajmniej raz jako _prawda_ i przynajmniej raz jako _fałsz_ , więc obie gałęzie dowolnego kod będzie objęty. **A teraz pytanie** Do czego właściwie służy zdefiniowane powyżej „testowanie stanu”? W ogóle nie pomoże to w ustaleniu poprawności orzeczenia decyzyjnego. _To_ najlepiej wykonać przez inspekcję kodu, pozwalając drugiemu zespołowi na napisanie tego samego wyrażenia i porównanie wyników lub uruchomienie przypadków testowych przy „wartościach granicznych” (np. tutaj, dla y = -4, -3, -2). Sprawdzenie poszczególnych warunków wydaje mi się, że bardziej chodzi o testowanie jednostki ALU procesora, a może o testowanie wyjścia kompilatora. Z pewnością nadaje się do sprawdzania ręcznie napisanego kodu asemblera lub weryfikacji ręcznie składanej logiki. I to każe mi myśleć, że „testowanie stanu” może być pozostałością z czasów, kiedy warunki były faktycznie okablowane na panelach (na przykład w ENIAC), a zatem mogą być przedmiotem błędów w okablowaniu. W dzisiejszych czasach warunek jest napisany w kodzie wysokiego poziomu i jest _dokładnie_ tym, czego konceptualnie chcesz. Chociaż przegląd może być przydatny, testowanie stanu to tylko strata czasu. A może czegoś mi brakuje? **Dodatek: Wyszukiwanie literatury** Przeszukiwanie biblioteki IEEE Xplore pod kątem „testowania warunków” daje tylko dwa artykuły dotyczące oprogramowania (wszystkie pozostałe wydają się dotyczyć tylko sprzętu), oba autorstwa K.C. Tai z Wydziału Informatyki Uniwersytetu Stanowego Karoliny Północnej. Sprawdzenie jednej z tych strategii testowania oprogramowania opartych na warunkach pokazuje, że autor używa terminu _warunek_ w znaczeniu _decyzji_ powyżej, tj. w tym artykule „testowanie warunków” jest w rzeczywistości „testowaniem decyzji”. _Warunek_ używany w sylabusie TTA nazywa się _warunkiem prostym_. Wydaje się, że definicje sylabusa TTA nie są powszechnie stosowane. Ze streszczenia: > Program komputerowy składa się z instrukcji, takich jak instrukcje JEŻELI i GDY, > które zawierają warunki, które są kombinacją wyrażeń logicznych i relacyjnych >. Podejście testowe, określane jako _testowanie warunków_, polega na > testowaniu programu poprzez skupienie się na testowaniu warunków w tym programie. Opracowano wiele strategii testowania warunków, ale nie są one skuteczne w wykrywaniu błędów w skomplikowanych warunkach. W tej pracy > definiujemy dwie strategie testowania warunków, oparte na wykrywaniu logicznych > i wyrażenia relacyjnego [tj. wyrażenie postaci E1 _op_ E2, gdzie E1 > i E2 są wyrażeniami arytmetycznymi, a _op_ jest jednym z sześciu możliwych operatorów relacyjnych >: < <=, =, !=, >, >=] błędy w warunku. W przypadku tych dwóch > strategii testowania warunków, pokazujemy pewne właściwości teoretyczne i > wyjaśniamy, dlaczego są one praktyczne i skuteczne w testowaniu programów zawierających > skomplikowane warunki.


title: Wzorzec MVC - Jak przenieść błędy z modelu do kontrolera?

text: Powiedzmy, że mam typową konfigurację MVC. Kontroler przekazuje dane do modelu i prosi go, aby coś z nim zrobił. Ale sprawdzanie poprawności danych kończy się niepowodzeniem lub jest jakiś inny problem. Jaki jest najlepszy sposób na przekazanie tych błędów z powrotem do kontrolera, który następnie przekaże je do widoku, który zostanie wyświetlony użytkownikowi? W tej chwili w moim modelu mam po prostu tablicę błędów. Gdy wystąpią jakiekolwiek błędy, po prostu dodaję komunikaty o błędach do tej tablicy i `zwracam false` do kontrolera, aby wiedział, że wystąpiły błędy. A w kontrolerze robię to: boolean result = model.process( input ); if (! wynik) { view.displayErrors( model.getErrors() ); zwrócić; } else view.displaySuccess(); Czy istnieje lepszy sposób na poradzenie sobie z tym?


title: Czy przegląd kodu otwartego rynku to dobry pomysł?

text: Mam ogromny program, który rozwijam od prawie 2 lat. Prawdopodobnie stanie się komercyjny za około 6-9 miesięcy, ale biorąc pod uwagę, że to tylko ja go rozwijam, nie miałem prawie żadnych informacji zwrotnych na temat kodu (wydajność, łatwość utrzymania, właściwe wykorzystanie najlepszych praktyk itp.). Naprawdę chciałbym, aby ktoś lub kilka osób zrecenzowało go w celu uzyskania opinii. A więc: 1. Czy są miejsca, w których mogę skorzystać z tej usługi. Czy strony takie jak oDesk są dobrym rozwiązaniem? 2. Czy to bezpieczne? Czy umowa NDA wystarczy do ochrony własności intelektualnej, czy też istnieją inne sposoby ochrony własności intelektualnej? 3. Czy są jakieś szczególne cechy, na które powinienem zwrócić uwagę u recenzenta, poza znajomością języka i być może niektórymi problemami? W rzeczywistości nie wiem nawet, czy powyższe 3 pytania są właściwe i powinienem najpierw zadać inne. Jakieś rady na ten temat?


title: Alternatywa addIfNotExist

text: Czy istnieją jakieś standardy lub konwencje dotyczące nazewnictwa metod, które dodają coś, jeśli nie istnieje w czymś innym. Na przykład: **Store.instance().addItemIfNotExist(item)** IfNotExist jest naprawdę brzydką częścią. Jakie może być obejście?


title: Jak zorganizować jednoosobowe badanie różnicy między BDD a Waterfall?

text: Wcześniej zadałem pytanie, jak mierzyć jakość projektu. Wynikiem tego pytania było to, że jakość projektu można podzielić na dwie części: * jakość wewnętrzną (jakość kodu, mierzalną za pomocą metryk jakości kodu) * jakość zewnętrzną (test akceptacyjny, jak dobrze oprogramowanie spełnia wymagania) to, chcę przeprowadzić pewne badania i zweryfikować wyniki projektu. Problem w tym, że te badania przeprowadzę sam, więc nie ma możliwości samodzielnego uruchomienia projektu raz w stylu BDD, a drugiego w wodospadzie. Nie jest również możliwe porównanie projektów BDD i kaskadowych na większą skalę, ponieważ nie ma wystarczającej liczby projektów BDD, które można zmierzyć ze względu na wiek BDD. Więc moje pytanie brzmi: czy ktoś napotkał ten problem? Jak mógłbym przeprowadzić mój eksperyment w taki sposób, aby miał wartość naukową?


title: Abstrakcyjne klasy bazowe i konstrukcja kopii, zasady kciuka

text: Często dobrym pomysłem jest posiadanie abstrakcyjnej klasy bazowej, aby wyizolować interfejs obiektu. Problem polega na tym, że konstrukcja kopii, IMHO, jest domyślnie zepsuta w C++, a konstruktory kopiujące są domyślnie generowane. Więc jakie są problemy, gdy masz abstrakcyjną klasę bazową i surowe wskaźniki w klasach pochodnych? class IAabstract { ~IAabstract() = 0; } class Pochodne : public IAbstract { char *theProblem; ... } IAabstract *a1 = new Derived(); IAabstrakt a2 = *a1;//??? A teraz czy całkowicie wyłączasz tworzenie kopii dla całej hierarchii? Zadeklarować konstrukcję kopii jako prywatną w „IAabstract”? Czy istnieją reguły trzech z abstrakcyjnymi klasami bazowymi?


title: Powody programowania w parach

text: Pracowałem w kilku sklepach, w których kierownictwo przekazało pomysł programowania w parach mnie lub innemu menedżerowi/deweloperowi i nie mogę się w ogóle za tym stać. Z punktu widzenia programisty nie mogę znaleźć powodu, dla którego przejście na ten styl kodowania byłoby korzystne, ani jako menedżer małego zespołu nie widziałem żadnych korzyści. Rozumiem, że pomaga to w podstawowych błędach składni i może być pomocne, jeśli musisz coś wymieszać, ale menedżerowie, którzy są poza pętlą programistyczną, wydają się nadal postrzegać to jako sposób na powstrzymanie swoich projektantów przed pójściem na Facebooka lub Reddit niż jako narzędzie do projektowania. Jako ktoś bliski światu programistycznego, który najwyraźniej nie może do końca zrozumieć z książki rzuconej w moją stronę lub strony wiki na ten temat... z wysokiego szczebla kierowniczego, jakie są korzyści z programowania w parach podczas pracy ze Scrumem lub Agile środowiska?


title: Czy mogę używać programu MSBuild do kompilowania starych projektów VS6 C++?

text: Mam komputer kompilacji, na którym nie zainstalowano programu Visual Studio, tylko MSbuild, który może budować projekty VS2008 bez zainstalowanego programu Visual Studio. Zastanawiam się, czy można używać MSbuild z plikami projektu VC++ 6.0, chociaż myślę, że nie byłoby to możliwe. W przeszłości używałem go z plikiem rozwiązania VS2008 dla C++, ale nie do budowania pliku dsw C++ 6.0. Dla Vb6 mamy pakiet rozszerzeń dla Msbuild (MSBuild.ExtensionPack.VisualStudio.VB6). Czy coś podobnego jest dostępne dla projektów C++ 6.0? Alternatywą może być to, że istnieją lekkie narzędzia do kompilacji, które mogą tworzyć pliki .dsw VC6++ bez konieczności instalowania programu Visual Studio 6.0?


title: Czym różni się "evented-io" w node.js od modelu zdarzeń windows?

text: Zastanawiam się, jak "evented-io" w node.js różni się od modelu Windows async IO? Czy wywołanie zwrotne z node.js jest wykonywane w wątku, jeśli nie, gdzie jest uruchamiane? Nie mam na myśli kwestionowania produktywności ani niesamowitości węzła, ale konkretnie, aby zrozumieć, czy projekt architektoniczny różni się od tego, co zwykle robi się w przestrzeni Windows, powiedzmy z WCF lub ASP.Net.


title: Najlepszy sposób na ujawnienie usługi zorientowanej na dane

text: Obecnie mam za zadanie napisać usługę wcf, która na razie będzie używana tylko w sieci firmowej, problem polega na tym, że nie jestem pewien, jak powinienem obsługiwać operacje, które ujawnia. Oprogramowanie, które będzie korzystać z tej usługi, będzie musiało modyfikować podobne tabele na różne sposoby. Na przykład tabela, która ma kolumny a,b,c i d. Program X aktualizuje tylko kolumny aib, podczas gdy program Y aktualizuje b,c id. Uważam, że ogólna metoda Update, która akceptuje cały rekord, jest łatwiejsza do napisania i sprawia, że usługa jest mniej rozdęta. Ale wydaje się mniej bezpieczny i prawdopodobnie utrudniłby zrozumienie nowym programistom. Jak najlepiej poradzić sobie z takimi sytuacjami na poziomie usług? edit: Tak, zadania są w pewnym sensie wyjątkowe, ale problem polega na tym, że trudno jest określić, jak wyjątkowa powinna być usługa. Czy wykonuję ogólną usługę, aby umożliwić dostęp do danych i pozwolić, aby szczegóły tych zadań były obsługiwane po stronie klienta? Obawy o bezpieczeństwo nie są tak duże. Największym problemem jest łatwość konserwacji i łatwość zrozumienia. W tej chwili mamy ponad 20 baz danych, z których niektóre mają ponad 100 tabel.


title: Dlaczego miałbyś chcieć spojrzeć na kod IL?

text: Czytałem wpis w blogu na kanale 9 o wydaniu dekompilatora open source .NET/CLR. Zastanawiałem się, dlaczego miałbyś chcieć dekompilować aplikację .NET/CLR i spojrzeć na jej kod IL? Jestem tylko ciekaw. **[Edytuj]** Czy dekompilatory są przydatne w fazie rozwoju? **[Edytuj]** Jestem trochę perwersyjny; Chcę wiedzieć, kiedy ostatnio użyłeś dekompilatora do projektu rozwoju oprogramowania i dlaczego?