title: jaka jest korzyść z używania magazynów klucz/wartość w odniesieniu do fragmentowania bazy danych?

text: Co mają wspólnego magazyny klucz/wartość z ułatwianiem fragmentowania bazy danych? Ponieważ jeśli nie używam magazynu kluczy/wartości, mogę łatwo podzielić moją bazę danych na fragmenty, prawda? (Jak powiedzmy, mogę łatwo powiedzieć, że użytkownicy o nazwach zaczynających się od tego znaku będą mieli swoje dane przechowywane na tym serwerze, a te tabele same w sobie nie są magazynami klucza/wartości. Więc co dokładnie magazyny klucz/wartość mają wspólnego z bazą danych sharding?)


title: Przydatność Javadocs z testami jednostkowymi?

text: Jestem pewien, że inni doświadczyli problemu z dokumentacją dotyczącą testów jednostkowych. Zastanawiałem się, czy ktoś używał javadocs z testami jednostkowymi do generowania własnych wewnętrznych plików javadoc, aby śledzić i dokumentować swoje testy jednostkowe? Jeśli tak, czy to się udało? Lub uważasz, że to zły sposób na dokumentowanie testów jednostkowych, daj mi znać. Jeśli masz jakieś sugestie dotyczące lepszego sposobu dokumentacji testów jednostkowych, byłoby to bardzo mile widziane.


title: Jak radzić sobie ze zmianami, które wymagają dalszych testów podczas pracy nad kolejnym testem?

text: TDD oznacza testowanie przed rozpoczęciem pisania kodu produkcyjnego. Więc zaczynam pisać test dla `MyClass` o nazwie `MyClassTest`. To się nie udaje i zaczynam implementować pożądaną funkcjonalność w `MyClass`. Podczas fazy implementacji `MyClass` spotykam się z koniecznością wprowadzenia zmian w innej klasie (np. `MyClassUtils`). `MyClassUtils` ma własną klasę testową. Po TDD powinienem najpierw przetestować przed wdrożeniem jakiejkolwiek nowej funkcjonalności. Czy powinienem więc przerwać pracę nad `MyClass` dla pierwszego testu i najpierw zaimplementować potrzebne metody w `MyClassUtilsTest`? A może lepiej jakoś śledzić (np. spisać to na papierze, TODO w kodzie itp.) metody testowe, które trzeba dodać i zignorować „najpierw test”? Często spotykam się z tym problemem i nie wiem, jak najlepiej sobie z nim poradzić. Pierwsza możliwość prowadzi do większych i pokręconych zatwierdzeń ze zmianami w co najmniej czterech klasach i dłuższych okresów bez zatwierdzeń. Druga lekceważy zasadę test first, prowadzi do zaległości w niezaimplementowanych testach i zmniejsza pokrycie kodu. Jak sobie z tym radzisz? Jestem wdzięczny za wszelkie rady. :)


title: Po co używać zapieczętowanego zamiast statycznego w klasie?

text: Nasz system posiada kilka klas użytkowych. Niektórzy członkowie naszego zespołu używają (A) klasy z całkowicie statycznymi metodami i prywatnym konstruktorem. Inni używają (B) klasy z całkowicie statycznymi metodami (ci juniorzy). Podczas analizy kodu (A) i (B) podnoszą ostrzeżenie CA1052, które zaleca oznaczenie klasy jako zaplombowanej. W dokumentacji MSDN znajdują się następujące porady: > Jeśli celem jest platforma .NET Framework 2.0 lub starsza, lepszym rozwiązaniem jest > oznaczenie typu jako statycznego. Dlaczego to ma sens? Myślałem inaczej; AFAIK, przed wersją 2.0 nie było możliwości oznaczenia klasy jako statycznej.


title: Pytanie o wdrożenie systemu głosowania

text: Wdrażam system głosowania i potrzebuję wkładu od kolegów programistów. Czy widzisz coś, co może pójść nie tak, ponieważ użytkownicy wprowadzają prawidłowy adres e-mail i być może mają captcha, aby zatrzymać automatyczne głosowanie zamiast tradycyjnego logowania i głosowania?


title: Konwersja do mac-book pro w celu wielodyscyplinarnego programowania

text: Jestem w trudnej sytuacji. Zostałem zakontraktowany do stworzenia małego pakietu aplikacji na Androida, iOS i WP7. Obecnie jestem również na rynku nowego notebooka do rozwoju. Teraz problem, który mam, polega na tym, że mogę kupić macbooka i laptopa klasy konsumenckiej lub mogę po prostu kupić 8 GB pamięci RAM, SSD, mackbooka i7 i wirtualizację systemu Windows 7. Nigdy wcześniej nie korzystałem z komputera Mac lub MacBook, więc zanim kupię cokolwiek Chciałabym wiedzieć, co myślisz na ten temat. Czy ktoś ma z tym doświadczenie?


title: Jak sprawić, by wewnętrzna grupa użytkowników odniosła sukces?

text: Chciałbym uruchomić wewnętrzną grupę użytkowników/forum dla programistów w mojej firmie, ale nie jestem pewien, jak zacząć. Mamy kilka zespołów programistów obejmujących wiele technologii i poziomów doświadczenia. Wyobrażam sobie to jako okazję dla nas wszystkich do spotkania się i podzielenia się technikami, najlepszymi praktykami, wyciągniętymi wnioskami, problemami, nowymi technologiami lub czymkolwiek innym, co twórca uzna za interesujące. Może to być również świetny sposób dla nowych pracowników na integrację, naukę, jak robimy różne rzeczy i dzielenie się wiedzą, którą ze sobą przynoszą. To moja pierwsza próba zrobienia czegoś takiego i chciałbym to zrobić dobrze. Interesują mnie takie rzeczy jak: * Uczestnictwo w prowadzeniu pojazdów * Utrzymywanie interesujących rzeczy zarówno dla 20-letnich weteranów, jak i świeżo upieczonych, zielonych absolwentów * Unikanie pułapek znanych jako toksyczne dla grup użytkowników Czy ktoś zrobił to z powodzeniem? Jeśli tak, czym możesz się podzielić z tym doświadczeniem?


title: Równoważenie obciążenia pracą/algorytm dystrybucji zadań

text: Szukam algorytmu do użycia lub jako punkt przeskoku do równoważenia obciążenia. Środowisko: Mamy ~7 typów zadań, które mogą być zaplanowane w dowolnym momencie przez naszych użytkowników. Niektóre zadania są szybkie, inne powolne (duże przetwarzanie danych). Mamy pojedynczą instancję „procesora zadań”, który wykryje zaplanowane zadania, a następnie je wykona. "Procesor zadań" uruchomi do 5 zadań na raz, "wątki". Problem polega na tym, że jedno zadanie może zużywać tak wiele zasobów, że pozostałe 4 zadania nie są przetwarzane, a co gorsza, inne zaplanowane zadania są opóźnione o długie okresy czasu. Niektóre zadania można zaplanować jako "uruchomione natychmiast", co czyni je następnymi w kolejce. Rozwiązanie: Dodaj więcej wystąpień „procesora zadań”. Mamy duży serwer VM, na którym dział IT wdraża 3 maszyny wirtualne, aby każdy obsługiwał wystąpienie tego „procesora zadań”. Domyślnie to pomoże, ale uważam, że powinno być za tym więcej przemyśleń. Moje rozwiązanie: Oprócz tego, że „procesory zadań” skalują się poziomo, myślę, że musi istnieć sposób na określenie, które zadania instancja przechwyci na podstawie bieżącego obciążenia instancji, a także zezwoli na stronniczość. Sugeruję, abyśmy określili statystyki dla każdego typu zadania (średni czas działania itp.) i przyznali mu ocenę 1-5 (5 oznacza długotrwałość). Każda instancja określi, jakie jest jej bieżące obciążenie, albo na podstawie łącznego wyniku zadań, które są aktualnie uruchomione, a następnie uwzględni jej stronniczość. Na przykład myślę, że powinniśmy być w stanie ustawić instancję, która będzie nastawiona na małe zadania, aby uniknąć większych zadań, podczas gdy inna instancja będzie nastawiona na średnie zadania itp. Szukam porady, jak się do tego zabrać. Zadania mogą zajmować dużo czasu, procesora i/lub pamięci. Moim celem jest upewnienie się, że każda instancja tylko wyczerpuje pracę, którą jest w stanie wykonać, jednocześnie utrzymując kolejkę zaplanowanych zadań tak szybko, jak to możliwe. Jeden z innych deweloperów zasugerował, że zostawiamy „procesory zadań” w spokoju, aby po prostu ściągały to, co jest w kolejce, czyli „round robin”. Mówię, że może to prowadzić do potencjalnego problemu, w którym jedna instancja zerwała zbyt wiele dużych zadań i ma problemy z ich wykonaniem, podczas gdy inne instancje są bezczynne.


title: Co lepiej zrobić w Ruby, a co lepiej zrobić w Haskell?

text: Jeśli masz doświadczenie zarówno z Rubym, jak i Haskellem, które z poniższych najlepiej opisuje zastosowanie i moc porównawczą tych dwóch języków? 1. Dwa języki lepiej pasują do różnych rodzajów programów, tj. Ruby jest lepszy dla x, a Haskell jest lepszy dla y. 2. Obydwa są ogólnego przeznaczenia, a jeden język jest lepszy dla prawie wszystkich aplikacji niż drugi. 3. Obydwa są uniwersalne, a to, czy jeden język jest lepszy od drugiego, jest głównie kwestią osobistych preferencji. Możesz też dodać własne wnioski. Dobrze znam Rubiego i uczę się Haskella przez kilka tygodni, nie pisząc z nim żadnych poważnych aplikacji. Przede wszystkim chcę wiedzieć, które fragmenty moich produkcyjnych aplikacji Ruby powinienem spróbować przepisać w Haskell, a także jakie przyszłe aplikacje (nie zabawkowe, ale rzeczywiste aplikacje produkcyjne) powinienem rozważyć pisanie w Haskell, a nie w Ruby.


title: Kiedy można rejestrować informacje o nazwie pliku/wierszu pod kątem błędów?

text: Mamy komercyjną aplikację C++ o zamkniętym kodzie źródłowym. Niektóre z naszych zarejestrowanych komunikatów o błędach są w prostym języku angielskim, np. „BŁĄD: nie można odczytać pliku 'foo'”. Podczas gdy inni używają makra do drukowania informacji o nazwie pliku/linii, takich jak „SplineReticulator.cpp(423): poza granicami”. To nie jest potwierdzenie ani awaria, aplikacja działa poprawnie, ale jest to błąd, który chcemy zarejestrować. jest dobrą praktyczną zasadą, gdy komunikat o błędzie w zwykłym języku angielskim jest odpowiedni w porównaniu z nazwą pliku/wierszem? A może błędy nazwy pliku/rodzaju linii są odpowiednie nawet w przypadku oprogramowania komercyjnego o zamkniętym kodzie źródłowym? Słyszeliśmy argument, że wyglądają nieprofesjonalnie, ale są przydatne do debugowania.


title: Dwa elementy HTML z tym samym atrybutem id: Jak bardzo jest zły?

text:
Wystarczy przejrzeć kod źródłowy map Google. W nagłówku mają 2 elementy div z id="search" jeden zawiera drugi, a także ma atrybut jstrack="1". Oddziela je forma:
 <form action="/maps" id="...reszta nie jest ważna"> ...
... Ponieważ to jest google, zakładam, że to nie pomyłka. Więc jak źle może być złamanie tej zasady? Dopóki jesteś ostrożny w doborze CSS i Dom, dlaczego nie wykorzystać ponownie klas id? Czy ktoś robi to celowo, a jeśli tak, to dlaczego?


title: Kiedy NIE używać frameworka?

text: Obecnie można znaleźć ramy dla niemal każdego języka, pasujące do niemal każdego projektu. Większość nowoczesnych frameworków jest dość solidna (ogólnie mówiąc), z godzinami testów, recenzowanym kodem i dużą rozszerzalnością. Myślę jednak, że KAŻDY framework ma wadę, ponieważ programiści, jako społeczność, mogą stać się tak zależni od wybranych przez siebie frameworków, że nie rozumieją już podstawowych zasad działania lub, w przypadku nowszych programistów, nigdy nie nauczą się podstawowych zasad, aby zaczynać się. Łatwo jest się wyspecjalizować do tego stopnia, że nie jesteś już "programistą PHP" (na przykład), ale "programistą Drupala", z wyłączeniem czegokolwiek innego. Kogo to obchodzi, prawda? Mamy ramy! Nie musimy wiedzieć, jak „zrobić to ręcznie”! Prawidłowy? Rezultatem utraty podstawowych umiejętności (czasami do tego stopnia, że programiści, którzy **nie** używają frameworków, są postrzegani jako „przestarzałe”) jest to, że powszechną praktyką staje się używanie frameworka tam, gdzie nie jest to wymagane lub właściwe. **Funkcje**, które framework ułatwia, są mylone z możliwościami języka bazowego. Programiści zaczynają używać frameworków do wykonywania nawet najbardziej podstawowych zadań, więc to, co kiedyś uważano za podstawowy proces, teraz obejmuje duże biblioteki z własnymi dziwactwami, błędami i zależnościami. To, co kiedyś było osiągane w 20 liniach, jest teraz osiągane przez włączenie frameworka 20 000 linii ORAZ napisanie 20 linii, aby korzystać z frameworka. I odwrotnie, nie chce się wymyślać koła na nowo. Jeśli piszę kod, aby wykonać jakieś podstawowe, typowe małe zadanie, mogę mieć wrażenie, że marnuję czas, wiedząc, że framework XYZ oferuje wszystkie funkcje, o które mi chodzi, i wiele więcej. Część „o wiele więcej” nadal mnie martwi, ale wydaje się, że wielu już ją nawet nie rozważa. Musi istnieć dobra metryka, aby określić, kiedy należy użyć frameworka. Jaki jest według Ciebie próg, jak **_ty_** decydujesz, kiedy użyć frameworka, a kiedy nie.


title: Czy wzorzec „centrum powiadomień” zachęca do dobrego lub złego projektowania programu?

text: Czasami spotykam interfejsy API w stylu centrum wiadomości, na przykład Cocoa NSNotificationCenter: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html Zazwyczaj te interfejsy API zapewniają globalny punkt dostępu, w którym subskrybujesz lub rozgłaszasz komunikaty/zdarzenia. Myślę, że jest to problem, ponieważ zachęca do płaskiej i nieustrukturyzowanej architektury programu, w której zależności nie są jawne w API, ale ukryte w kodzie źródłowym. Nie jesteś zmuszony do myślenia o własności obiektów i hierarchiach, ale możesz raczej sprawić, że dowolny obiekt w twoim programie spowoduje wywołanie dowolnego kodu w dowolnym miejscu. Ale może to dobrze? Czy ten wzorzec generalnie zachęca do dobrego lub złego projektowania programu i dlaczego? Czy to utrudnia czy ułatwia testowanie kodu? Wybacz, jeśli to pytanie jest zbyt niejasne lub szerokie. Staram się owinąć głowę wokół potencjalnych konsekwencji intensywnego korzystania z takiego interfejsu API i różnych sposobów jego wykorzystania. Edycja: Myślę, że moim największym problemem z tym wzorcem jest to, że API "kłamie" na temat zależności i sprzężeń obiektów i można to zilustrować następującym przykładem: myObj = new Foo(); mójOtherObj = nowy Bar(); print myOtherObj.someValue; // wyświetla 0 mójObiekt.doCoś(); print myOtherObj.someValue; // nieoczekiwanie wypisuje 1, bo nigdy nie wskazałem, że te obiekty mają ze sobą coś wspólnego


title: Framework Python MVC dla aplikacji desktopowych

text: Jestem przyzwyczajony do programowania w Pythonie i GTK przy użyciu biblioteki pygtk. Czuję, że moje programy nie są dobrze rozdzielone zgodnie z modelem MVC. Myślę, że podążanie za frameworkiem pomogłoby mi zaprojektować lepsze aplikacje desktopowe. Chciałbym wiedzieć, jakiego frameworka Python MVC dla aplikacji klasycznych używasz i dlaczego.


title: Wybór odpowiedniego wzorca projektowego

text: Zawsze zdawałem sobie sprawę, jak ważne jest wykorzystywanie wzorców projektowych. Jestem ciekaw, jak inni deweloperzy wybierają najbardziej odpowiednią. Czy używasz szeregu cech (takich jak schemat blokowy), aby pomóc Ci podjąć decyzję? Na przykład: > Jeśli obiekty są powiązane, ale nie chcemy określać konkretnej klasy > Rozważmy Abstrakcyjną > > Gdy tworzenie instancji pozostawiono klasom pochodnym, rozważmy Factory > > Potrzebujemy sekwencyjnego dostępu do elementów obiektu zagregowanego, wypróbuj Iterator lub coś takiego podobny?


title: Programowanie niskopoziomowe - co z tego dla mnie?

text: Przez lata zastanawiałem się nad zagłębieniem się w języki, które uważam za „niskiego poziomu”. Dla mnie oznacza to C i montaż. Jednak nie miałem jeszcze na to czasu, ani nigdy nie było to konieczne. Teraz, ponieważ nie widzę żadnej potrzeby, czuję, że powinienem albo po prostu zaplanować jakiś moment, w którym będę studiował temat, albo porzucić plan na zawsze. ## Moja pozycja Od 4 lat skupiam się na „technologiach webowych”, które mogą się zmienić i jestem programistą aplikacji, co raczej się nie zmieni. Myślę, że w tworzeniu aplikacji najważniejsza jest użyteczność. Piszesz aplikacje, które mają być „konsumowane” przez użytkowników. Im bardziej użyteczne są te aplikacje, tym większą wartość wytworzyłeś. Aby osiągnąć dobrą użyteczność, uważam, że następujące rzeczy są wykonalne * **Dobry projekt** : Dobrze przemyślane funkcje dostępne poprzez przemyślany interfejs użytkownika. * **Prawidłowość** : najlepszy projekt nie jest nic wart, jeśli nie jest poprawnie zaimplementowany. * **Elastyczność** : Aplikacja A powinna stale ewoluować, aby jej użytkownicy nie musieli przełączać się na inną aplikację B, która ma nowe funkcje, które A mógłby zaimplementować. Aplikacje zajmujące się tym samym problemem nie powinny różnić się cechami, ale filozofią. * **Wydajność** : wydajność przyczynia się do zadowolenia użytkowników. Aplikacja jest idealnie zawsze responsywna i wykonuje swoje zadania w miarę szybko (w zależności od ich częstotliwości). Wartość optymalizacji wydajności wykraczająca poza punkt, w którym jest ona zauważalna przez użytkownika, jest wątpliwa. Myślę, że programowanie na niskim poziomie nie pomoże mi w tym, z wyjątkiem wydajności. Jednak pisanie całej aplikacji w języku niskiego poziomu ze względu na wydajność jest dla mnie przedwczesną optymalizacją. ## Moje pytanie Czego mogłoby mnie nauczyć programowanie na niskim poziomie, czego nie nauczyłyby mnie inne języki? Czy czegoś mi brakuje, czy jest to tylko umiejętność, która jest bardzo mało przydatna przy tworzeniu aplikacji? Proszę zrozumieć, że nie kwestionuję wartości C i montażu. Tyle, że na co dzień cieszę się, że wszystkie zawiłości tego świata są dla mnie wyabstrahowane i zarządzane (głównie przez warstwy napisane w C/C++ i same asemblery). Po prostu nie widzę żadnych konceptów, które mogłyby być dla mnie nowe, tylko szczegóły, którymi musiałbym się upchnąć. Więc co w tym jest dla mnie? ## Moje wnioski Dziękuję wszystkim za odpowiedzi. Muszę powiedzieć, że nikt mnie tak naprawdę nie zaskoczył, ale przynajmniej teraz jestem całkiem pewien, że porzucę ten obszar zainteresowania, dopóki nie pojawi się jakakolwiek potrzeba. W moim rozumieniu, pisanie asemblera w dzisiejszych czasach dla procesorów, tak jak są one używane w dzisiejszych procesorach, jest nie tylko niepotrzebnie skomplikowane, ale także grozi gorszą wydajnością w czasie wykonywania niż odpowiednik w C. Ręczna optymalizacja jest prawie niemożliwa z powodu OOE, podczas gdy nie otrzymujesz wszystkich rodzajów optymalizacji, które kompilator może wykonać automatycznie. Ponadto kod jest albo przenośny, ponieważ wykorzystuje niewielki podzbiór dostępnych poleceń, albo jest zoptymalizowany, ale prawdopodobnie działa tylko na jednej architekturze. Pisanie C nie jest już tak potrzebne, jak było w przeszłości. Gdybym miał pisać aplikację w C, równie często korzystałbym ze sprawdzonych i sprawdzonych bibliotek i frameworków, co oszczędziłoby mi implementowania procedur kopiowania ciągów, algorytmów sortujących i innych rzeczy służących jako ćwiczenie na uniwersytecie. Mój własny kod wykonałby się szybciej kosztem bezpieczeństwa typu. Nie mam ochoty wymyślać koła na nowo w trakcie normalnego tworzenia aplikacji, ani próbować debugować, patrząc na zrzuty rdzenia :D Obecnie eksperymentuję z językami i interpreterami, więc jeśli jest coś, co chciałbym opublikować, przypuszczam, że d portuje działającą koncepcję do C, chociaż C++ może równie dobrze załatwić sprawę. Jeszcze raz dziękuję wszystkim za odpowiedzi i spostrzeżenia.


title: Jak przechowywać ceny, które mają obowiązujące daty?

text: Mam listę produktów. Każdy z nich jest oferowany przez N dostawców. Każdy dostawca podaje nam cenę na konkretną datę. Ta cena obowiązuje do momentu, gdy dostawca zdecyduje się ustalić nową cenę. W takim przypadku dostawca poda nową cenę z nową datą. Nagłówek tabeli MySQL wygląda obecnie tak: provider_id, product_id, price, date_price_ Effective Co drugi dzień tworzymy listę produktów/cen, które obowiązują na bieżący dzień. Dla każdego produktu lista zawiera posortowaną listę dostawców, którzy mają ten konkretny produkt. W ten sposób możemy zamówić określone produkty u każdego, kto zaoferuje najlepszą cenę. Aby uzyskać efektywne ceny, mam instrukcję SQL, która zwraca wszystkie wiersze, które mają `data_cena_efektywna >= NOW()`. Ten zestaw wyników jest przetwarzany za pomocą skryptu ruby, który wykonuje sortowanie i filtrowanie niezbędne do uzyskania pliku, który wygląda tak: product_id_1,provider_1,provider_3,provider8,provider_10... product_id_2,provider_3,provider_2,provider1,provider_10... This działa dobrze dla naszych celów, ale nadal swędzi mnie, że tabela SQL prawdopodobnie nie jest najlepszym sposobem przechowywania tego rodzaju informacji. Mam wrażenie, że tego rodzaju problem został wcześniej rozwiązany w inny, bardziej kreatywny sposób. Czy istnieje lepszy sposób przechowywania tych informacji w inny sposób niż w SQL? lub, jeśli używam SQL, czy istnieje lepsze podejście niż to, którego używam?


title: Czy C++ naprawdę wychodzi z mody?

text: Indeks TIOBE twierdzi, że popularność C++ spada i jest obecnie znacznie niższa od C i Javy. Nawiązując do tego twierdzenia, bloger zasugerował dzisiaj, że ponieważ C++ wychodzi z mody, programiści C++ mogą być okazją w stosunku do innych programistów. Jako programista C++ nie chcę zostać w tyle, jeśli branża przejdzie do czegoś innego, a na pewno nie chcę być „okazją”. Programuję w C++ od wielu lat i, jak może się wydawać, C++, w mojej obecnej dziedzinie (programowanie naukowe/numeryczne) po prostu nie widzę dobrych alternatyw, mimo że przyjrzałem się dziesiątkom języków. Wydają się być albo wolne, mniej przenośne, albo nawet bardziej niezgrabne niż C++. Tak więc moje pytanie brzmi: **czy istnieją wiarygodne dane dotyczące popularności różnych języków, a w szczególności C++** , w branży? Jestem sceptycznie nastawiony do C++, ponieważ 75% zakwalifikowanych wpisów Google Code Jam było w C++ w tym roku (nie obejmuje wpisów C)


title: Czy większość firm zajmujących się oprogramowaniem i użytkownicy mogą skorzystać z wersji kroczących?

text: Używając Google Chrome od kilku lat, naprawdę polubiłem aktualizacje kroczące/automatyczne. Wiem, że większość współczesnego oprogramowania ma „automatyczne aktualizacje”, ale wiele dużych części oprogramowania ma tylko „małe aktualizacje automatyczne”, co oznacza, że musisz zapłacić za każdą główną wersję. Oczywiście firmy te uzależniają Cię od wersji 1, a następnie zmuszają Cię do zakupu każdej kolejnej wersji, ponieważ często jesteś zablokowany i/lub przyzwyczajony do produktu. Czy istnieje opłacalny model biznesowy dla „automatycznych aktualizacji głównych wersji”? Na przykład: „Czy istnieje model biznesowy, w którym Microsoft mógłby po prostu sprzedawać pakiet Office”? Nie byłoby numeru wersji. W miarę pojawiania się nowych funkcji są one dodawane automatycznie. Jak mogliby/byliby nadal zarabiać tyle samo pieniędzy?


title: Jeśli przyjmę składki na podstawie umowy CLA, czy mogę napisać „Copyright (c) My-Name”?

text: Myślę o otwartym sourcingu mojego projektu. Akceptuję wkłady w ramach CLA, które przyznaje mi licencję na prawa autorskie (wyjaśnię, co mam na myśli na końcu tego pytania). — A teraz, jeśli ktoś prześle komentarz, czy to w porządku, że na górze każdego pliku piszę „Copyright (c) 2013 My-Name”? I wspominaj o wszystkich współtwórcach tylko w osobnym dokumencie i odsyłaj ludzi do dziennika zatwierdzenia Git i statystyk GitHub, jeśli chcą uzyskać szczegółowe informacje na temat poszczególnych współtwórców? Myślę, że to powinno być w porządku w przypadku `Copyright (c) My-Name`, skoro przyznano mi licencję na prawa autorskie? Jeśli to nie jest w porządku, to przypuszczam, że preambuła informacji o prawach autorskich każdego pliku z kodem źródłowym musiałaby zawierać nazwiska wszystkich współtwórców tego pliku? Co nie wydaje się praktyczne (jeśli jest bardzo wielu współpracowników). * * * Tutaj postaram się wyjaśnić, co mam na myśli, mówiąc _"CLA, który przyznaje mi licencję na prawa autorskie"_. To jest zredagowany fragment CLA od Google: > .2. [...] Niniejszym [ _to znaczy, kontrybutor_ ] udzielasz [ _My-Name, > to znaczy me_ ] oraz odbiorcom oprogramowania dystrybuowanego przez [ _My-Name_ ] wieczystą, ogólnoświatową, niewyłączną, nie -opłata, wolna od opłat, nieodwołalna > licencja praw autorskich na powielanie, przygotowywanie prac pochodnych, publiczne > wyświetlanie, publiczne wykonywanie, udzielanie sublicencji i rozpowszechnianie Wkładów Użytkownika oraz > takich prac pochodnych.


title: Posiadanie dwóch zestawów rzadko zmieniających się danych lub konwertujących w locie

text: Obecnie pracuję nad małym projektem, w którym pracuję z pewnymi „danymi statycznymi”, które są pobierane z jednego źródła. Dane mogą się od czasu do czasu zmieniać (maksymalnie raz w tygodniu). Nie potrzebuję wszystkich informacji zawartych w danych w moim projekcie, więc aby umożliwić łatwiejszy i bardziej logiczny dostęp do nich, napisałem małe narzędzie, które konwertuje wyodrębnione dane do pożądanego przeze mnie formatu. Konwersja polega głównie na usuwaniu danych, których nie potrzebuję, i dzieleniu niektórych ciągów na tablice. Żadnych intensywnych obliczeń ani niczego. Ale porzucam ponad 50% oryginalnych danych, ponieważ ich nie potrzebują. Teraz, ponieważ są to dane statyczne, czy bardziej sensowne byłoby przechowywanie tych przekonwertowanych danych i wykonywanie wszystkich dalszych operacji na tych danych, czy też bardziej sensowna byłaby konwersja z nieprzetworzonych danych w locie? Ponieważ projekt jest w JavaScript, szybkość jest oczywiście ważna, ale jeśli konwersja w locie ma znaczące zalety, bardziej sensowne może być skorzystanie z takiego podejścia. To statyczne dane z gry komputerowej, które definiują kilka jednostek i innych obiektów w grze. Są zapisane w JSON, więc mogę je łatwo wykorzystać w JavaScript. Ale nie potrzebuję wielu informacji, tylko niektóre ich części, aby zbudować rodzaj „encyklopedii”, teraz, ponieważ dane są już obecne w JSON, zastanawiałem się, czy powinienem go po prostu użyć, czy przekonwertować przed użyciem.


title: Jaką rolę odgrywa .ini?

text: Po raz pierwszy pracuję z aplikacją MFC i mam wiele wątpliwości, największe w tej chwili to Co to jest plik .ini i dlaczego tam jest? Jaką dokładnie rolę odgrywa? Czy niektórzy mogą mi powiedzieć, co jest wymagane? Edycja : Co jeśli zrobię aplikację i nie mam pliku .ini, na czym stracę?


title: Obsługa skryptów w systemie Windows

text: Pracowałem wcześniej w środowisku Linux i muszę pracować w systemie Windows XP dla mojego obecnego projektu. W Linuksie lubiłem używać skryptów do automatyzacji zadań (nawet mniejszych) i zaoszczędziło mi to dużo czasu. Widzę, że wiersz poleceń systemu Windows jest poważnie utrudniony pod względem mocy i liczby dostępnych poleceń. Natknąłem się na Power shell, ale myślę, że to przesada, bo nie jestem adminem windowsowym czy coś takiego. Czy byłeś w mojej sytuacji wcześniej? Pracujesz na oknach i automatyzujesz zadania? Czy jest jakieś miejsce, gdzie mogę się ich nauczyć?


title: Jak pracować ze źle napisanym i sformatowanym kodem

text: Zastanawiałem się jak ludzie radzą sobie z pracą w projekcie ze źle napisanym i sformatowanym kodem, mówię o mieszanych tabulatorach i spacjach, zbędnych nawiasach i znakach nowej linii oraz całej masie ostrzeżeń pojawiających się na kodzie z IDE. Dla kontekstu mam ten problem w projektach java, gdzie nie uzgodniono formatowania. Również w moim przypadku są to projekty, które nie zostały jeszcze upublicznione. Możliwe rozwiązania, które widzę to: 1. Spróbuj porozmawiać z liderem zespołu/właścicielem kodu, zgódź się na formatowanie i przeformatuj wszystko w jednym zatwierdzeniu. (mój preferowany wybór) 2. Sformatuj fragment lub fragmenty kodu, które musisz zmienić, zatwierdź, a następnie dokonaj zmiany i zatwierdź (drugi najlepszy) 3. Zajmij się tym, zrób zmiany tak minimalne, jak to możliwe, pozostawiając wszystko inne jako był... (najgorszy wybór dla mnie)


title: parser xml vs wydajność parsera JSON w Java / C / C++

text: Próbuję zrozumieć, który format danych jest lepszy na wbudowanym urządzeniu komunikującym się z serwerem przez REST API. XML czy JSON?. Czy parsowanie JSON jest szybsze niż parsowanie XML w Javie/C i C++? Rozumiem, że JSON klienta internetowego jest do zrobienia, ponieważ skrypt java ma wbudowaną obsługę JSON, ale nie mam pewności co do urządzenia wbudowanego (Java/C/C++).


title: Tworzenie stron internetowych na zlecenie a projektowanie

text: Czy freelancerzy zajmujący się projektowaniem stron internetowych (myślę o osobach, a nie o firmach) zazwyczaj sami zajmują się tworzeniem _i_ projektowania? Jakie są opcje dla osób z silną bazą w tworzeniu stron internetowych zaplecza, ale mniej z projektowaniem stron internetowych, schematami kolorów, układami, projektowaniem graficznym itp.?


title: TDD: Od czego powinienem zacząć?

text: Dużo czytałem o TDD i próbowałem rozwijać się przy użyciu TDD bez powodzenia...Zawsze przestaję wpatrywać się w ekran... Nauczyłem się, że nie powinienem pisać testów na metody czy klasy. Powinienem napisać testy zachowań. Dzieje się tak, ponieważ obiekty wchodzą ze sobą w interakcje i tę interakcję należy przetestować. Postępując zgodnie z poniższym przykładem: > Wyobraź sobie, że jako właściciel firmy chciałbym zachować moich klientów > informacje do późniejszego sprawdzenia. To moja wartość biznesowa. Żeby się tylko nauczyć, nie chciałbym używać żadnego frameworka ani biblioteki, po prostu PHP i PHPUnit. Ok, teraz, od czego mam zacząć? Myślę, że moi użytkownicy muszą podać adres URL, aby przejść do formularza ... Czy powinienem sprawdzić, czy ładuje się strona? Czy to dobry początek? Jeśli to prawda, jak mogę to przetestować?


title: Pytanie dotyczące projektu logicznego dla zapytania SQL

text: Zastanawiałem się, czy mógłbyś mi pomóc w rozwiązaniu problemu SQL, który mam. Mam zestaw zapisów wydarzeń, gdzie każde wydarzenie ma swój czas rozpoczęcia i zakończenia. Żadne wydarzenie nie ma tej samej godziny rozpoczęcia, a godzina zakończenia każdego wydarzenia jest większa lub równa wcześniejszemu wydarzeniu. To, co chcę zrobić, to wyciągnąć zestaw rekordów, które się nie nakładają – gdzie czas rozpoczęcia wydarzenia nie znajduje się między początkiem / końcem żadnego innego wydarzenia. W poniższym przykładzie czas rozpoczęcia dla B/C/D znajduje się pomiędzy początkiem i końcem A, więc chcę zachować A i pozbyć się B,C,D. Następnie zacznij od nowa, zachowując E i pozbądź się F, potem zacznij od nowa i zachowaj G, pozbądź się H/I itp. Wygląda na to, że wymaga to sprzężenia własnego, ale nie mogę określić kryteriów, które pozwoliłyby zidentyfikować zapisy w ten sposób. Jakieś pomysły? Wydarzenie | Start | Koniec A 1 10 (zachowaj) B 2 11 (odrzuć, ponieważ czas początkowy 2 < 10) C 5 15 (odrzuć, ponieważ czas początkowy 5 < 10) D 9 12 (odrzuć, ponieważ czas początkowy 9 < 10) E 10 13 ( zachowaj - to rozpoczyna nowy zestaw, ponieważ jest to pierwszy rekord po A z początkiem >= A koniec) F 11 20 (odrzuć, ponieważ 11 < 13) G 14 22 (zachowaj - to rozpoczyna nowy zestaw, ponieważ jest to pierwszy rekord po E z start >= E) H 15 22 (odrzuć ponieważ 15 < 22) I 17 27 (odrzuć ponieważ 17 < 22) J 22 27 (zachowaj - to rozpoczyna nowy zbiór ponieważ jest to pierwszy rekord po G ze startem >= G)


title: Co umieszczasz w specyfikacji architektury?

text: Obecnie dokonuję przeglądu wielu szablonów dokumentów dla mojej firmy. Jedyną rzeczą, której nigdy nie mieliśmy, jest formalna specyfikacja architektury, więc zaczynam ją składać. Jakie rzeczy umieszczasz w specyfikacjach architektury? Możesz skopiować i wkleić spis treści - to byłoby pomocne. Czy w sieci są już dostępne dobre szablony?


title: Związek między silnikami reguł biznesowych a językami programowania z ograniczeniami

text: Jeśli spojrzeć na (być może starsze) instrukcje obsługi Drools lub innych silników reguł, jednym z przykładów ich wartości dodanej jest rozwiązywanie zagadek, takich jak zagadka Miss Manners (podręcznik Drools). Teraz takie łamigłówki są naturalnie formułowane i rozwiązywane za pomocą Prologa lub nowszych języków programowania z ograniczeniami i można się zastanawiać, dlaczego ktokolwiek miałby używać do tego celu Drools. Wartością dodaną, jaką dają w tym przypadku Prolog i CPL, jest ich zdolność do naturalnego formułowania łamigłówki jako zbioru predykatów logicznych i automatycznego przeszukiwania przestrzeni rozwiązań (przy czym CPL jest pod tym względem wydajniejsze). Ale jaka jest wartość dodana produktu takiego jak Drools (mam na myśli poza dzwonkami i gwizdami wzięcia np. pliku Excela i przetłumaczenia go na zbiór reguł)? Dokładniej, Prolog implementuje wyszukiwanie wsteczne, CLP implementuje szukanie wsteczne z propagacją ograniczeń, a zatem zamiast przeszukiwać, że tak powiem, cały kartezjański iloczyn przestrzeni dla poszczególnych zmiennych, odcina duże części tej przestrzeni produktu. To właśnie czyni je skutecznymi i użytecznymi. Zarówno Prolog, jak i CLP są obszernie omówione w literaturze. Z drugiej strony, chociaż jasne jest, że algorytm Rete buforuje zestaw reguł w postaci pewnej struktury danych, co (według mojego rozumienia) czyni bardziej efektywną ocenę wyjścia, jeśli niektóre dane wejściowe uległy zmianie, i dając środki do efektywnego aktualizowania tej struktury danych pod kątem stopniowych zmian, trudno (mi) zrozumieć podstawową ideę, a tym bardziej jej skuteczność (w porównaniu z czym? do Prologu? do CLP)? Niestety, trudno znaleźć dobre referencje, które ujmują algorytm Rete w tym szerszym kontekście. Dokumentacja Drools jest niestety mało pouczająca w tym zakresie. Większość, jakie udało mi się znaleźć, to „Algorytm Rete, algorytm Leaps i jego potomkowie, tacy jak Reteoo (i Leaps) firmy Drools, zapewniają bardzo wydajne sposoby dopasowywania wzorców reguł do danych obiektu domeny. Są one szczególnie wydajne, gdy masz zestawy danych, które nie zmieniaj się całkowicie (ponieważ silnik reguł może zapamiętywać poprzednie mecze). Algorytmy te są sprawdzone w boju”. Bardzo wydajny - w porównaniu do czego? Sprawdzone w boju - czy można wskazać zastosowania w świecie rzeczywistym? Byłbym wdzięczny, gdyby można było rzucić więcej światła na ten temat lub podać ważne odniesienie.


title: Organizowanie repozytoriów Git ze wspólnymi zagnieżdżonymi modułami podrzędnymi

text: Jestem wielkim fanem podmodułów Git. Lubię mieć możliwość śledzenia zależności wraz z jej wersją, dzięki czemu można cofnąć się do poprzedniej wersji projektu i mieć odpowiednią wersję zależności do bezpiecznego i czystego kompilowania. Co więcej, łatwiej jest wydać nasze biblioteki jako projekty open source, ponieważ historia bibliotek jest oddzielna od historii aplikacji, które są od nich zależne (i które nie będą open source). Konfiguruję przepływ pracy dla wielu projektów w pracy i zastanawiałem się, jak by to było, gdybyśmy przyjęli to podejście nieco ekstremalne, zamiast mieć jeden monolityczny projekt. Szybko zdałem sobie sprawę, że _naprawdę_ przy użyciu podmodułów jest potencjalna puszka robaków. Załóżmy, że para aplikacji: `studio` i `player` oraz zależne biblioteki `core`, `graph` i `network`, gdzie zależności są następujące: * `core` jest samodzielny * `graph` zależy od `core` (podmoduł w `./libs/core`) * `network` zależy od `core` (podmoduł w `./libs/core`) * `studio` zależy od `graph` i `network` (podmoduł w `./libs/core`) -modules w `./libs/graph` i `./libs/network`) * `player` zależy od `graph` i `network` (podmoduły w `./libs/graph` i `./libs/ network`) Załóżmy, że używamy CMake i że każdy z tych projektów ma testy jednostkowe i wszystkie prace. Każdy projekt (w tym `studio` i `player`) musi mieć możliwość samodzielnego skompilowania w celu wykonywania metryk kodu, testowania jednostek itp. Chodzi o to, że rekurencyjne `git submodule fetch`, otrzymasz następującą strukturę katalogów: studio / studio/libs/ (głębokość podmodułu: 1) studio/libs/graph/ studio/libs/graph/libs/ (głębokość podmodułu: 2) studio/libs/graph/libs/core/ studio/libs/network / studio/libs/network/libs/ (głębokość podmodułu: 2) studio/libs/network/libs/core/ Zauważ, że `core` jest sklonowany dwukrotnie w projekcie `studio`. Oprócz marnowania miejsca na dysku, mam problem z kompilacją systemu, ponieważ buduję `core` dwa razy i potencjalnie dostaję dwie różne wersje `core`. ### Pytanie Jak zorganizować submoduły, aby uzyskać wersjonowaną zależność i samodzielną kompilację bez wielu kopii wspólnych zagnieżdżonych modułów podrzędnych? ### Możliwe rozwiązanie Jeśli zależność biblioteki jest czymś w rodzaju sugestii (tj. w sposób „wiadomo, że działa z wersją X” lub „tylko wersja X jest oficjalnie obsługiwana”), a potencjalne zależne aplikacje lub biblioteki są odpowiedzialne za kompilację z czymkolwiek wersji, którą im się podoba, to mógłbym sobie wyobrazić następujący scenariusz: * Niech system budowania dla `graph` i `network` powie im, gdzie znaleźć `core` (np. poprzez ścieżkę dołączania kompilatora). Zdefiniuj dwa cele kompilacji, „samodzielny” i „zależność”, gdzie „samodzielny” jest oparty na „zależności” i dodaje ścieżkę dołączania, aby wskazać lokalny podmoduł `core`. * Wprowadź dodatkową zależność: `studio` na `core`. Następnie `studio` buduje `core`, ustawia ścieżkę dołączania do własnej kopii podmodułu `core`, a następnie buduje `graph` i `network` w trybie zależności. Wynikowa struktura folderów wygląda następująco: studio/ studio/libs/ (głębokość podmodułów: 1) studio/libs/core/ studio/libs/graph/ studio/libs/graph/libs/ (pusty folder, podmoduły nie zostały pobrane ) studio/libs/network/ studio/libs/network/libs/ (pusty folder, moduły podrzędne nie zostały pobrane) Jednak wymaga to trochę magii systemu budowania (jestem całkiem pewien, że można to zrobić za pomocą CMake) i trochę ręczna praca nad aktualizacjami wersji (aktualizacja `graph` może również wymagać aktualizacji `core` i `network`, aby uzyskać kompatybilną wersję `core` we wszystkich projektach). Jakieś przemyślenia na ten temat?


title: Tworzenie aplikacji cross-DB

text: Do tej pory zawsze kodowałem używając surowego/osadzonego, dialektycznego SQL. Wydaje mi się to oczywiście błędne, ponieważ wiąże Cię z konkretnymi technologiami, więc Twoje oprogramowanie nie może zostać wdrożone na żadnej maszynie - zwłaszcza na serwerach. Ogólnie (niezależnie od języka programowania i RDBMS), jakie są opcje w tym przypadku? Jak dobry jest każdy z nich? Co powiedziałbyś, że jest podejściem standardowym?


title: Projektowanie uwierzytelniania dla REST API

text: Pracuję nad API dla usługi REST, którą zamierzam zarówno produkować, jak i konsumować. Spędziłem kilka ostatnich dni, próbując wymyślić, jak dobrze obsługiwać uwierzytelnianie i myślę, że w końcu coś wymyśliłem. Wymyślam to w oparciu o następujące fakty dotyczące stosu aplikacji: 1. Klient i serwer znajdują się w .NET4 (część klienta w profilu klienta) 2. Serwer eksponuje za pomocą WCF REST 3. Naprawdę nie chcę zachować nazwa użytkownika i hasło w pamięci w aplikacji Od 3 chciałem użyć formy uwierzytelniania tokenem, aby po weryfikacji danych uwierzytelniających przez serwer klient otrzymał token z powrotem do użycia przez resztę aplikacji (to pozwoli mi robić inne rzeczy, takie jak limit czasu użytkowników, możliwość płynnego przenoszenia użytkowników między wersją internetową a komputerową itp.). Po ustaleniu, jak sprawić, by połączenia były powtarzane i odporne na manipulacje, wymyśliłem następujące rzeczy: 1. Zanim klient spróbuje się uwierzytelnić, generuje parę kluczy Diffie-Hellman przy użyciu klasy `ECDiffieHellmanCng`. 2. Wysyła publiczną część pary kluczy przez przewód wraz z nazwą użytkownika i hasłem (oczywiście przez HTTPS). 3. Serwer uwierzytelnia kombinację nazwa użytkownika/hasło, jeśli się powiedzie, wykonuje następujące czynności: 1. Tworzy unikalny token sesji 2. Generuje własną parę kluczy DH i oblicza wspólny sekret z klucza publicznego dostarczonego przez klienta 3. Odnotowuje token sesji, wspólny klucz tajny, użytkownika i czas „ostatniej czynności” (używany w okienku wygasania kroczącego) w swojej bazie danych 4. Zwraca token sesji, jego publiczny klucz DH i komunikat o powodzeniu uwierzytelniania 4 Klient pobiera klucz DH z odpowiedzi, oblicza wspólny sekret i przechowuje zarówno token, jak i sekret w pamięci. Od tego momentu kombinacja token sesji / klucz tajny działa jak większość innych interfejsów API REST, z żądaniem jest odciskiem palca i znacznikiem czasu, a następnie generuje jakiś rodzaj HMAC. Za każdym razem, gdy klient wykonuje akcję na serwerze, sprawdza parę token/klucz tajny i zezwala na akcję, jeśli jest ważna i nie wygasła, oraz aktualizuje rekord ostatniej akcji w sesji. Nie widzę żadnych oczywistych wad i prawdopodobnie jest do tego przepracowany, ale w pewnym momencie muszę się nauczyć, jak to zrobić. HMAC zapobiega atakom powtórek, negocjacja DH pomaga zapobiegać atakom MITM (nie mogę wymyślić wykonalnego ataku z czubka głowy między HMAC/DH). Jakieś dziury, które ktoś może w tym grzebać?


title: Dobra praktyka testowania jednostkowego z dużymi lub złożonymi osprzętem?

text: Próbuję użyć JUnit do przetestowania klasy (`FooWriter`), która jest odpowiedzialna za zapisywanie danych mojej aplikacji na dysku przy użyciu niestandardowego formatu pliku. Zapisywany zestaw danych jest potencjalnie bardzo duży i chcę przynajmniej móc przetestować proste rzeczy, takie jak to, czy oczekiwana liczba wierszy została napisana. Mój problem polega na tym, że nie jestem pewien, jaki jest najlepszy sposób na skonfigurowanie testu z realistycznymi danymi testowymi. Wygląda na to, że moje opcje to: 1. Wczytanie danych testowych z dysku, a następnie użycie tych danych dla przypadku testowego `FooWriter` 2. Napisanie zakodowanego na stałe urządzenia tekstowego dla przypadku testowego `FooWriter` do użycia (1) jak zły pomysł, ponieważ wtedy przypadek testowy `FooWriter` nie byłby już odizolowany od innych złożonych, łamliwych operacji. (2) wydaje się to złym pomysłem, ponieważ skutkowałoby to około tysiącem linii kodu tworzących strukturę danych, na wzór: foo.addBar(new Bar("bof", "bam")); foo.addBar(new Bar("baz", "boom")); Nie tylko jest to żmudne i podatne na błędy, jeśli później dokonam zmiany w sposobie konstruowania danych, test może zakończyć się niepowodzeniem, niezależnie od tego, czy sama aplikacja jest faktycznie zepsuta. W takich przypadkach, w których nie widzę dobrych opcji, stwierdziłem, że zwykle dzieje się tak dlatego, że jestem głupi. Gdzie jest głupi?


title: Czy to normalne, że szkoła skupia się na określonych językach programowania i frameworkach?

text: W przyszłym roku idę do szkoły, aby studiować informatykę. Byłem już na dni otwartych drzwi niektórych szkół i otrzymałem wiele informacji. Jednak w jednej ze szkół powiedziano mi, że skupiają się głównie na .NET Framework i Javie. Martwię się tym, ponieważ uważam, że używany język programowania i frameworki nie są tak ważne, jak projektowanie oprogramowania. Martwi mnie również to, że możesz przyzwyczaić się do wad tych języków i frameworków i możesz nie znać innych paradygmatów (takich jak programowanie funkcjonalne). Czy mam rację? Czy to normalne, że szkoła skupia się na określonym języku lub strukturze?


title: Jak obsłużyć rebranding produktu w kodzie w krótkim czasie

text: Wszyscy tam byliśmy – cecha produktu nazywa się „złota”, a na tydzień przed premierą decydują, że ma się nazywać „platyną”. Na szczęście miałeś trochę o sobie, więc kod interfejsu użytkownika można łatwo zmienić. Ale… co ze wszystkimi zmiennymi i metodami? Jasne, możesz to wszystko zmienić, ale co z czasem testowania? Oczywiście Resharper lub inne narzędzie do refaktoryzacji na poziomie przedsiębiorstwa może pomóc, ale jak sprzedać firmie ofertę o zerowej wartości? W końcu ta zmiana tekstu na przednim ekranie to tylko 2 minuty pracy – prawda?


title: Jakie może być wąskie gardło między SQL Server, IIS i .net podczas odbierania json jako tekstu z bazy danych?

text: Spędziłem większą część miesiąca pracując nad wtyczką jQuery Calendar. Konfiguracja jest taka, że wszystkie wpisy kalendarza są przechowywane w tabeli w programie SQL Server i używam pojedynczej instrukcji „Wybierz jako” do konstruowania danych json w samym zapytaniu SQL. Ma to czas wykonania krótszy niż jedna sekunda. Jednak wywołanie rzeczywistej końcowej strony aspx w przeglądarce wymaga oczekiwania ponad 240 sekund, podczas gdy dane są przesyłane do przeglądarki jako json. Próbowałem różnych metod, aby to obejść. Na przykład próbowałem najpierw zapisać wyniki zapytania do pliku json, a następnie wywołać plik na ostatniej stronie. Skraca to czas ładowania strony do około 90 sekund, ale nadal nie jest wystarczająco szybki. Zaimplementowałem również funkcję, dzięki której jeśli dane nie uległy zmianie, zwracany jest ten sam plik json i nie jest ponownie generowany. Gdy w kalendarzu nie ma żadnych danych, które uległy zmianie, skróciło to czas ładowania strony do około 1 sekundy. Jestem przekonany, że zapisywanie danych json do pliku jest tutaj wąskim gardłem. Ale prawdziwe pytanie brzmi, czy jest to tak wydajne, jak realistycznie rzecz biorąc, w przypadku IIS i .net? A może jest miejsce na ulepszenia? Nie wiem też, który aspekt dalej badać. Nie wiem, czy należy rozważyć, czy IIS powoduje wstrzymanie, czy sposób, w jaki złożyłem projekt. Czy istnieje bardziej wydajne rozwiązanie niż to, które przygotowałem powyżej?


title: Jak mogę przejść od programisty do menedżera oprogramowania lub lidera zespołu?

text: Jestem programistą (w pełnym lub niepełnym wymiarze godzin) od prawie 3 lat. Zawsze byłem typem osoby, która miała talent do przewodzenia rzeczom i zapewniania organizacji wokół wykonywania zadań. Odkąd w college'u kierowałem moim starszym projektem projektowym, czułem, że to moje prawdziwe powołanie, a nie siedzenie za biurkiem do kodowania. Teraz wiem, że muszę zrozumieć, jak kodować, aby inni programiści naprawdę mnie szanowali. Poza tym naprawdę uwielbiam kodować. Pracuję nad wieloma projektami pobocznymi w domu poza pracą, nadążam za najlepszymi praktykami kodowania i staram się stale pogłębiać swoją wiedzę na temat domeny. Moje główne pytanie brzmi, jakiego rodzaju rzeczy lub możliwości powinienem szukać, aby pomóc mi w rozwoju mojej kariery do roli bardziej menedżerskiej, a nie roli kodera. Tak jak powiedziałem, KOCHAM kodować, jednak jeszcze bardziej chciałbym móc projektować rzeczy na wysokim poziomie i organizować zespół w taki sposób, aby załatwiać sprawy i monitorować ich postępy, jednocześnie pomagając w kwestiach technicznych decyzje tu i tam. Tego typu rzeczy naprawdę mnie uszczęśliwiają, w przeciwieństwie do siedzenia za biurkiem i kodowania przez cały dzień. Oczywiście jednym z moich głównych marzeń jest samodzielne tworzenie jakiegoś oprogramowania, które w końcu wybuchnie i stanie się duże, a potem zaczynam zatrudniać zespół i robić to wszystko sam, ale wydaje mi się, że szanse na to są znacznie gorsze niż po prostu trochę zmienić swoją ścieżkę kariery, aby dostać się tam, gdzie chcę. Czuję, że mogę czerpać taką samą satysfakcję, robiąc to dla pracodawcy, a nie dla siebie. Chociaż wcześniej nie czułem się w ten sposób, czuję, że tak było głównie dlatego, że nie robię tego, co NAPRAWDĘ chcę robić. Jakieś wskazówki, wskazówki lub rzeczy, o których warto pamiętać? Każdy, kto to zrobił, a jeśli tak, to jak to zrobiłeś?


title: Wzorce i architektury projektowania gier?

text: Niektórzy przyjaciele i ja chcielibyśmy stworzyć grę 2D tylko po to, by nauczyć się tego paradygmatu. Wszyscy jesteśmy inżynierami oprogramowania z doświadczeniem w aplikacjach biznesowych, ale nie jesteśmy pewni, czy typowe wzorce projektowe i architektury (MVC, 3-warstwowe itp.) mają również zastosowanie, i nie znamy technik, które są zwykle używane w tworzeniu gier (Scenegrafy, implementacja skrótów klawiszowych, zarządzanie zdarzeniami, banki dźwięków/tekstur...) Planujemy programowanie w C# i XNA/Monogame i byłbym wdzięczny, gdyby ktoś mógł wskazać jakąkolwiek przydatną bibliografię, która mogłaby nam pomóc w planowaniu architekturę i rozwiązywać codzienne problemy związane z tworzeniem gier. Dziękuję Ci


title: Dopasowanie do wielu wyrażeń regularnych — co zrobić, aby je zoptymalizować?

text: Mam wiele wyrażeń regularnych pasujących do danych wejściowych w trybie zachłannym. Wszystkie wyrażenia regularne są już skompilowane i nie widzę, co mogę zrobić, aby przyspieszyć działanie. Mam na myśli używanie narzędzi dostarczanych z frameworkiem .Net. Ponieważ nie robię żadnego zastępowania ani przechwytywania, zastanawiam się, czy ma sens budowanie własnego dopasowywania wyrażeń regularnych - w rezultacie wykonałbym dopasowywanie tylko raz (na wiele wyrazów regularnych) zamiast wielokrotnego dopasowywania (na każde pojedyncze wyrażenie regularne) . Czy myślę za daleko? Czy jest inny sposób na przyspieszenie?


title: Połączenia HMVC i bazy danych

text: Chociaż mam dobre doświadczenia z OOP, jestem całkiem nowy w koncepcji (H)MVC. Rozumiem podstawową koncepcję projektowania modułowego, która towarzyszy HMVC, jest to wielka atrakcja. Ale jedną rzeczą, która mnie denerwuje i mam nadzieję, że pomoże mi lepiej zrozumieć HMVC, jest to, jak radzisz sobie z połączeniem z bazą danych? Zakładałbym, że masz moduł, nazwijmy go bazą danych, który zainicjuje połączenie. Teraz na początku mojego skryptu miałbym coś w stylu: $dbConn = new Database(); To zainicjuje połączenie z bazą danych. Jednak gdy chcę uruchomić zapytanie, muszę uruchomić coś w następujący sposób: $query = "mój ciąg zapytania"; $wynik = $dbConn->zapytanie($zapytanie); Więc muszę uzyskać dostęp do funkcji zapytania obiektu bazy danych. Teraz, o ile wiem w HMVC, nie powinienem uzyskiwać bezpośredniego dostępu do `$dbConn` z modelu innego modułu. Ale prawie każdy moduł będzie potrzebował dostępu do `$dbConn`. Z mojego rozumienia oznacza to, że w kontrolerze wszystkich innych modułów, za każdym razem, gdy potrzebuję uruchomić zapytanie, musiałbym utworzyć nową instancję modułu Database, przekazując tablicę argumentów, mówiącą Database, którą metodę uruchomić i jaką argumenty, których potrzebuje metoda. Ale co, jeśli muszę wykonać wywołanie do bazy danych w połowie metody w modelu modułu? Dość często będę musiał zaktualizować tabelę lub wybrać jakieś dane na podstawie instrukcji if. Na pewno nie powinienem przenosić tej logiki do kontrolera? Oznacza to, że muszę mieć dostęp do innego modułu z poziomu modelu, co wydaje się łamać zasady HMVC. **Więc jak zaimplementować moduł bazy danych, ponieważ mnie to myli?**


title: Wstrzykuj zależność jako parametr metody zamiast parametru konstruktora

text: Używam ORM, który nie pozwala mi wstrzykiwać zależności w konstruktorze. Załóżmy, że używam DDD dla logiki biznesowej i wzorca MVC dla interfejsu użytkownika. Teraz jeden z moich obiektów domeny musi uzyskać dostęp do usługi zewnętrznej. Jestem bardzo przeciwny antywzorcowi lokalizatora usług (nie dotknąłbym go dziesięciostopowym słupem), ale jak widzę, pozostawia mi to: class Controller { private readonly IExternalService _externalService; kontroler publiczny(IExternalService externalService) { _externalService = externalService; } public ViewResult Action(Guid Id) { // Pominięty dostęp do repozytorium dla zwięzłości. domainObject.DoSomethingWichNeedsAnExternalService(_externalService); } } Jakoś mam wrażenie, że to nie jest zbyt czyste, co jeśli "domainObject" jest głęboko zakopany w modelu/wykresie, czy "_externalService" powinien zostać przekazany do końca? Czy istnieją alternatywy najlepszych praktyk?


title: Standardy ograniczające renderowanie HTML tylko w USA-EN

text: Czy W3C lub jakakolwiek inna organizacja ma standard lub protokół ograniczający wszystkich programistów, aby upewnili się, że muszą używać amerykańskiego angielskiego podczas opracowywania dowolnego rodzaju tłumacza? Aby uniknąć czegoś takiego, > pisałem kod i próbowałem wyrównać obrazek do środka (napisane w języku brytyjskim > angielskim) > > align='centre' > > powyżej nie działało!! > > Nie ma błędów ortograficznych, znaczenie powyżej pisanego słowa to "środek" > > kiedy pisałem > > align='center' zadziałało, > > Czy to oznacza, że HTML jest napisany w "Amerykańskim angielskim"? Co się stanie, jeśli deweloper z brytyjskiego środowiska napisze renderer dla przeglądarek internetowych, takich jak gecko? **EDYTUJ** Przepraszam, że nie oceniam, ale zastanawiałem się, czy W3C ma jakieś standardy napisane gdzieś, które stwierdzają, że każdy przyszły kod lub tag html napisany dla języka HTML musi być w US-EN. Czy ktoś ma pojęcie, czy W3C ma jakieś ograniczenia?


title: Czego powinienem się dowiedzieć więcej o debugowaniu?

text: Do debugowania moich programów używam głównie następujących metod: 1. Użyj printf (lub odpowiednika w innych językach), aby sprawdzić wartość zmiennej po określonej instrukcji lub sprawdzić, czy program wprowadza instrukcję warunkową lub pętlę. 2. Używaj watch/breakpoints podczas korzystania z IDE. Potrafię rozwiązać problemy za pomocą powyższych metod. Zauważyłem jednak, że istnieją dwa rodzaje kompilacji - debugowanie i wydanie. Z nazwy rozumiem, że kompilacja debugowania byłaby pomocna w debugowaniu. Przeczytałem również, że kompilacja debugowania przechowuje coś, co nazywa się informacjami o tablicy symboli i tak dalej. Jak mogę użyć kompilacji debugowania do debugowania? Czy są jakieś inne techniki debugowania, których powinienem się nauczyć?


title: Które popularne języki obiektowe obsługują metody tylko do odczytu?

text: Pomyślałem, że wiele języków zorientowanych obiektowo ma zarezerwowane słowo kluczowe dla metod, które nie modyfikują stanu obiektu. Te metody często mają nazwy zaczynające się od `get`. AFAIK „pobieracz” jest zawsze powiązany z pojedynczym atrybutem obiektu, a „akcesor” jest zbyt ogólny, więc „tylko do odczytu” może być właściwym terminem dla tego rodzaju metod (?). Na przykład: object Timespan { atrybut start atrybut end // getter, bez zmiany stanu readonly metoda getStart { return start } readonly metoda getEnd { return end } // również bez zmiany stanu readonly metoda getDuration { return ( end - start ) } } Kompilator/interpreter powinien sprawdzić, czy metody readonly nie mają skutków ubocznych, modyfikując atrybuty obiektu. Zastanawiam się, dlaczego ta funkcja języka nie jest bardziej powszechna - samo nazwanie metody `getFoo` nie gwarantuje, że nie zmodyfikuje ona obiektu.


title: Co to znaczy być zwinnym?

text: Mamy projekt, o którym wszyscy mówią, że będziemy robić w zwinny sposób, ale wątpię, czy dobrze zrozumieliśmy, czym jest zwinność. W poprzednich projektach odbyliśmy spotkania planistyczne, następnie zdefiniowaliśmy back log produktu i przydzieliliśmy pracę deweloperom w 2-3 tygodniowych sprintach. Każdego ranka mieliśmy spotkania scrumowe (które wydawały się trwać za każdym razem przez pół godziny), po czym każdy programista zabrał się za to. Mało kto pisał testy do końca sprintu, a praca, która nie została ukończona, została dodana do kolejnego sprintu. Deweloperzy prawie ze sobą nie rozmawiali i nie było TDD zaangażowanego w rozwój. W rzeczywistości większość programistów miała specyfikację na początku i po prostu zajęła się nią przez 2 lub 3 tygodnie, na które zaplanowano sprint. Nie było prawie żadnej komunikacji z klientem/udziałowcem. Kontrola jakości angażowała się zwykle kilka miesięcy później i do tego czasu znaleźliśmy brakujące wymagania, co jeszcze bardziej zwiększyło ilość pracy, którą musieliśmy wykonać. Najwyraźniej nie było sprzężenia zwrotnego. Więc moje pytanie brzmi, gdzie popełniliśmy błąd i jak mogę zapobiec popełnianiu tych samych błędów przez zespół.


title: Czy C# jest lepszy niż Java jako język programowania, obiektywnie rzecz biorąc?

text: Kolega (fan .NET) przekonywał, że (w kontekście porównania Java vs .NET), chociaż istnieją różne argumenty za Javą i za .NET, a ustalenie, który z nich jest lepszym wyborem, jest decyzją biznesową lub osobistą w zależności od wiele czynników, ale z punktu widzenia języka programowania, C# .NET jest wyraźnie potężniejszym językiem programowania niż Java Podsumowując, wszystko, co można napisać w Javie, można napisać w C# równie łatwo lub łatwiej, ale odwrotnie nie jest prawdą . Wiele funkcji, takich jak wyrażenie lambda i linq jest niemożliwych (lub bardzo trudnych w Javie), a C# ma również cukier składniowy, który znacznie ułatwia rzeczy, na przykład metoda rozszerzająca, automatyczne właściwości itp. Ale prawie nie ma funkcji, która może być zrobione w Javie, ale niemożliwe lub bardzo trudne w C#? Tak więc w każdej możliwej sytuacji C# jest równy lub bardziej wydajny niż Java. Czy twierdzenie mojego kolegi jest poprawne? Jeśli nie, jakie są przykłady kodowania, które jest czyste i łatwe w Javie, ale niechlujne, trudne lub niemożliwe w C#? Uwaga: nie sądzę, że jest to pytanie subiektywne/kłótliwe. Nie szukam argumentów, że Java jest lepszym wyborem, czy .NET jest. Proszę tylko o ocenę na podstawie faktów i konkretnych przykładów. Na przykład (przykład wymyślony): w .NET iterowanie po liście będzie wymagało brudnego obejścia i zajmuje dziesiątki linii, podczas gdy w javie to tylko kilka czystych linii


title: Uruchom RSpec z poziomu skryptu ruby podczas odświeżania wszystkich konfiguracji ruby itp

text: Pracuję z bardzo dużym projektem z mnóstwem ustalonych testów, które obejmują dość skomplikowane konfiguracje środowiska i nie tylko. Niedawno spotkałem się z sytuacją testującą niektóre ostatecznie prawdziwe warunki i tym podobne, w których chcę mieć możliwość wielokrotnego uruchamiania określonego testu i obliczania przybliżonego czasu działania, aby pomóc mi dowiedzieć się, jak powinienem skonfigurować czekanie razy w tych testach, zanim założę niepowodzenie. Chciałem to zrobić za pośrednictwem ruby, aby móc łatwo zrzucić wyniki rspec do bloków json, aby ułatwić interpretację i modyfikację, ponieważ wiele testów zrzuca TONY tekstu do strumienia sysout i tak naprawdę nie chcę tego analizować tylko po to, aby uzyskać na końcu ten fragment, który informuje o wynikach. Ostatecznie chcę również możliwość wstrzykiwania flag w środku testów, aby uzyskać dokładniejsze informacje o czasie ziarna, na przykład, jak długo trwa przeciętnie określona część określonego testu. Jak na razie moja próba wygląda tak. #niektóre kody instalacyjne, aby uzyskać konfiguracje $runnerargs itp., aż $i >= $repetitions do $config = RSpec.configuration $json_formatter = RSpec::Core::Formatters::JsonFormatter.new($config.output) $reporter = RSpec: :Core::Reporter.new($json_formatter) $config.instance_variable_set(:@reporter, $reporter) #kilka innych rzeczy RSpec::Core::Runner.run($runnerargs) #uzyskaj wyniki w pliku json i rób fajne rzeczy z nimi się kończą Problem, który mam, polega na tym, że wygląda na to, że ruby domyślnie nie odświeża środowiska z poziomu skryptu podczas uruchamiania rspecs. Na przykład, jeśli zrobię coś podobnego do tego testu w skrypcie powłoki, działa to dobrze, ale daje mi naprawdę brzydkie wyniki, z którymi nie chcę pracować. ale uruchamiając to w ten sposób, pierwszy test działa dobrze, ale następny test ulega awarii, ponieważ zmienne środowiskowe używane w specyfikacji testu zmieniły się podczas wykonywania pierwszego testu i nie są poprawnie uruchamiane ponownie. Nie jestem pewien czy wina to ruby czy rspec. Zresztą, ktoś jeszcze spotyka coś podobnego? Czy istnieje sposób, aby zmusić ruby lub rspec do całkowitego zamknięcia starego środowiska i uruchomienia nowego, tak jak robi to skrypt powłoki?


title: Po co budować modele danych w dynamicznym języku?

text: **Tło** To pytanie wynika z dyskusji o architekturze, którą odbyliśmy podczas pracy. W bieżącym projekcie używamy Pythona i bazy danych zorientowanej obiektowo. Istnieją usługi wejściowe, które wykorzystujemy, oraz pewne interfejsy, przez które oczekuje się, że będziemy dostarczać dane wyjściowe. Ktoś z naszego zespołu zaczął projektować model danych, a moje pytanie brzmiało: dlaczego? Obiekt tylko do danych w Pythonie może być równie dobrze reprezentowany przez dict (jest sporo pytań na ten temat na tej stronie). Nie mamy relacyjnej bazy danych zawierającej kolumny, na które musimy mapować obiekty. Jednocześnie model danych wiąże się z pewnym kosztem polegającym na tym, że zawsze będzie trzeba go utrzymywać. Kiedy interfejsy to zmieniają (IMHO), po prostu staje się kolejną zależnością, którą należy spełnić, ale w przeciwieństwie do języków statycznych nie wymusza niczego. **Pytanie:** wydaje mi się, że gdy jesteś w środowisku, w którym wszystko jest dynamiczne, interfejsy mają sens, aby definiować model danych w sposób niejawny, zamiast utrzymywać jakieś klasy, które definiują model. Czy istnieją jakieś dobre powody, aby było inaczej? **EDYTUJ** W komentarzach i odpowiedziach wydaje się, że ludzie koncentrują się na dwóch obszarach, są to: mapowanie i reprezentacja bazy danych oraz walidacja modelu danych. Przepraszam, że nie mówię wyraźniej o DB, ale w tym środowisku, z którym mamy do czynienia, mamy DB zorientowany obiektowo, który przechowuje bloby w reprezentacji podobnej do systemu plików. Nie ma mapowania do SQL ani żadnego ORM, o którym można by mówić. Rozumiem jednak ten argument. Na przykład modele Django wymagają tworzenia podklas, aby ORM działał. W tym przypadku tworzenie klas modeli ma sens, ponieważ DB jest faktycznie magazynem danych typu statycznego, a nie „dynamicznym”. Ale to nie jest scenariusz pytania, ponieważ nie jest to czysto dynamicznie typowane środowisko. Jeśli chodzi o walidatory: tak. Trzeba będzie stworzyć walidatory, które sprawdzają obecne pola i są one odpowiedniego typu. W językach z typami statycznymi model robi to domyślnie (kiedy kodujesz C++/Java, nie możesz umieścić użytkownika 'std::string' w miejscu, w którym powinna znajdować się klasa User). Ale w Pythonie klasa modelu niczego nie wymusza. Jeśli i tak buduję walidatory, które sprawdzają obecność atrybutów, czy to nie powoduje, że klasy, komunikaty, generatory itp. są funkcjonalnie wymienne? A jeśli tak, to czy rozwiązaniem nie powinno być takie, które ma najmniej kodu? Ogólnie rzecz biorąc, walidatory wydają mi się raczej argumentem przemawiającym za _nie_ budowaniem klas modeli danych, niż przeciwnie. Czy się w tym mylę?


title: Jakie są zalety C nad językami OOP, poza wydajnością?

text: > **Possible Duplicate:** > Kiedy używać C zamiast C++ i C++ zamiast C? C nadal ma swoje znaczenie w świecie programowania! Jednym z powodów jest jego wydajność. Ale mam kilka pytań. * Czy jest coś szczególnego w C, czego brakuje innym językom? * Jakie jest jego znaczenie dzisiaj, poza problemami z wydajnością? * Jakie są zalety języka C nad językami OOP, takimi jak C++, Java, Python itp.? * Czy jest coś innego, co daje plus do C?


title: Czy istnieje bardziej rygorystyczna strtoull() we wszechobecnej bibliotece C?

text: Potrzebuję funkcji, która będzie interpretować ciąg jako liczbę całkowitą bez znaku, która kończy się niepowodzeniem, gdy ciąg się przepełni, reprezentuje liczbę ujemną lub nie reprezentuje liczby. `strtoull()` ustawia errno na ERANGE przy przepełnieniu lub EINVAL dla łańcucha, który nie zaczyna się od liczby, ale akceptuje liczby ujemne jako poprawne. `strtoumax()` jest tym samym co `strtoull()```atoll()` i `strtonum()` są wykluczone, ponieważ dotyczą wyłącznie liczb całkowitych ze znakiem. `sscanf()` ustawia errno na ERANGE w przypadku przepełnienia i zatrzymuje przetwarzanie łańcucha, jeśli nie zaczyna się on od liczby (odzwierciedlone w wartości zwracanej przez sscanf), ale akceptuje również liczby ujemne jako prawidłowe. Czy jest jakaś inna opcja, której mi brakuje?


title: Deklarowanie funkcji w celu uniknięcia jawnych zagnieżdżonych pętli

text: Mój profesor programowania powiedział mi, że dobrą praktyką programistyczną (przynajmniej w C/C++) jest deklarowanie funkcji z wewnętrzną pętlą podczas zagnieżdżania pętli (nie pętli _for_, od kiedy np. pętla przez tablicę wielowymiarową jest to bardzo intuicyjne ). Na przykład, jeśli napiszę int main() { while (cond1) { // ...(1)... while (cond2) { // ...(2)... } } } to lepiej : type inner_loop(param) { // ...(1)... while (cond2) { // ...(2)... } } int main() { while (cond1) { inner_loop(param) ; } } Jakie ulepszenia wiążą się z tą metodą? Czy jest jakiś przypadek, w którym ten sposób programowania zagnieżdżonych pętli może przynieść efekt przeciwny do zamierzonego? Z góry dziękuję.


title: Język, który może statycznie zapewnić obecność pól mapy

text: Jeśli dane są proste, a obiekty złożone, jestem ciekawy, czy istnieją jakieś języki statycznie typowane, które byłyby w stanie rozszerzyć(?) typ mapy do typu z gwarantowanymi polami. Zdaję sobie sprawę, że w czasie wykonywania, w każdym języku tego typu sprawdzenie jest całkiem wykonalne. Ale teoretycznie uważam również, że powinno to być możliwe do sprawdzenia za pomocą kompilatora. Zrobienie wszystkiego poniżej w Javie byłoby eksplozją interfejsów (HasComplete, HasTitle, HasTitleAndComplete). Czy ktoś to zrobił? Jeśli nie, to dlaczego? Jeśli tak, w jaki sposób został wdrożony? Umożliwiłoby to wczytanie danych, ale potem manipulowanie nimi z przynajmniej pewnym bezpieczeństwem typu: // Dane wejściowe użytkownika są często po prostu konwertowane na funkcję Map parse(json) -> Map {...} // wynik nadal ma wszystkich użytkowników input pól, // ale byłby to wyjątek w czasie wykonywania // jeśli w określonych polach brakuje funkcji rzutowania (Map, Map<fields...>) -> Map<fields...> { ... } input = "{ title:'do it', complete: false, rank: 5, subtitle: 'now'}" // Zrzuci wyjątek rzutowania klasy, jeśli brakuje complete lub title todo = cast(parse(input), Map<title:str, complete:bool>) // Runtime introspekcja rzeczy do zrobienia instanceOf Map -> true todo instanceOf Map<title:str, complete:bool> -> true todo instanceOf Map<title:str> -> true todo instanceOf Map<complete:bool> - > true instancja rzeczy do zrobienia instancja Map<complete:date> -> false instancja rzeczy do zrobienia instancja mapy<rank:int> -> false ponieważ cast() nie określiła rangi rzeczy do zrobienia instancja mapy<title:str, comp lete:bool, author:str> -> false // Wpisywane metody oparte na mapie z określonymi polami function capitalize_title(Map<title:str>) {...} function finish_task(Map<complete:bool>) {... } function finish_and_rename(Map<title:str, complete:bool>, newTitle) {...} function Increase_rank(Map<rank:int>) {...} // Statyczne sprawdzenie kompilacji pass todo = capitalize_title(todo) todo = finish_task(todo) todo = finish_and_rename(todo, "[complete]") // Statyczne sprawdzanie kompilacji nie powiodło się, ponieważ cast() nie określił rangi Increase_rank(todo) // Metody mogły zwrócić typ z funkcją dodanych (lub usuniętych) pól add_uuid(Map) -> Mapa<+id:int> {...} todo_with_id = add_uuid(todo) todo_with_id instanceOf Map<title:str, complete:bool, id:int> // true


title: Wydajne metody przechowywania dziesiątek milionów obiektów do zapytań, z dużą liczbą wstawek na sekundę?

text: Jest to w zasadzie aplikacja rejestrująca / licząca, która zlicza liczbę pakietów i zlicza typ pakietu itp. w sieci czatu p2p. Odpowiada to około 4-6 milionom pakietów w ciągu 5 minut. A ponieważ robię tylko „migawkę” tych informacji, usuwam tylko pakiety starsze niż 5 minut co pięć minut. Tak więc maksymalna liczba przedmiotów, które znajdą się w tej kolekcji, wynosi od 10 do 12 milionów. Ponieważ muszę wykonać 300 połączeń z różnymi superpeerami, istnieje możliwość, że każdy pakiet będzie próbował wstawić co najmniej 300 razy (dlatego prawdopodobnie przechowywanie tych danych w pamięci jest jedyną rozsądną opcją). Obecnie do przechowywania tych informacji używam słownika. Ale z powodu dużej ilości elementów, które próbuję przechowywać, napotykam problemy z dużą stertą obiektów, a ilość użycia pamięci stale rośnie z czasem. Słownik<ulong, Pakiet> public class Pakiet { public ushort RequesterPort; public IsSearch; ciąg publiczny SearchText; publiczne bool Oznaczone; bajt publiczny PacketType; publiczny znacznik czasu daty i godziny; } Próbowałem używać mysql, ale nie był w stanie nadążyć z ilością danych, które muszę wstawić (sprawdzając, czy nie jest to duplikat), a tak było podczas korzystania z transakcji. Próbowałem mongodb, ale użycie procesora do tego było szalone i też nie zachowało się. Mój główny problem pojawia się co 5 minut, ponieważ usuwam wszystkie pakiety starsze niż 5 minut i robię „migawkę” tych danych. Ponieważ używam zapytań LINQ do zliczania pakietów zawierających określony typ pakietu. Wywołuję również zapytanie differ() na danych, w którym usuwam 4 bajty (adres IP) z klucza pary klucz-wartość i łączę go z wartością żądającego portu w wartości pary klucz-wartość i używam jej, aby uzyskać odrębną liczbę peery ze wszystkich pakietów. Aplikacja obecnie krąży wokół 1,1 GB wykorzystania pamięci, a gdy wywoływana jest migawka, może posunąć się nawet do podwojenia użycia. Nie byłoby to problemem, gdybym miał niesamowitą ilość pamięci RAM, ale maszyna wirtualna, na której działa, jest obecnie ograniczona do 2 GB pamięci RAM. Czy jest jakieś proste rozwiązanie?


title: Jaki jest prawdziwy koszt TDD, gdy cały zespół się do tego przyzwyczai?

text: Jaki procent czasu jest zaoszczędzony i kosztowany na TDD. Zakładam ten procent zmian kosztów i wynagrodzeń w trakcie cyklu życia projektu. Wyobrażam sobie, że **faza początkowa** wiąże się z dużo większymi kosztami, ale z niewielkimi nagrodami. Dalej (podczas **refaktoringu** ) zyskujesz korzyści ze swoich testów. Słyszałem, że **30-50% Twojego czasu** zajmuje się pisaniem testów jednostkowych. Nie uwzględnia to jednak **czasu zaoszczędzonego** na pisaniu tych testów. Jakie są z tym wszystkim doświadczenia? Wes **EDYTUJ** Jaki jest zaoszczędzony czas i koszt czasu? W naprawie błędów i refaktoryzacji?


title: Konkretny problem związany z architekturą Twojej aplikacji

text: Najpierw postaram się opisać model świata rzeczywistego tego, co próbujemy wyrazić w kodzie C#. Mamy urządzenie o nazwie M100. Jego celem jest odczyt\zapis danych z\na kartach (plastikowych lub ULTRALIGHT takich jak MIFARE). Może być z jedną do 3 anten (urządzenie odczytuje/zapisuje dane przez antenę). Jedna z anten jest wewnętrzna (dzięki czemu kartę można położyć na powierzchni urządzenia i urządzenie będzie mogło wykonywać operacje odczytu/zapisu), inne są zewnętrzne. Rozważmy zwykłą sytuację. Posiadamy punkt obsługi klienta. M100 znajduje się wewnątrz terminala i ma dwie zewnętrzne anteny, które są umieszczone nad traktem dyspensera kart. Dozownik kart jest kolejnym urządzeniem, które odpowiada za przyjmowanie i wydawanie kart do wykonywania operacji odczytu/zapisu przez M100. Tak więc dyspenser odbiera kartę od użytkownika, przesuwa ją do pozycji odczytu/zapisu, po czym M100 może wykonywać operacje odczytu/zapisu. M100 może być wyposażony tylko w jedną (wewnętrzną) antenę. Mamy więc do czynienia z głównymi przypadkami: z dyspenserami kart i bez nich. Mamy jedną aplikację, która współpracuje z dyspenserami, a druga używa M100 bez dyspenserów kart. Opracowaliśmy M100Provider z jego interfejsem IM100Provider. Jest to klasa niskiego poziomu, która bezpośrednio współpracuje z M100, przekazuje polecenia przez port COM. Mamy na wyższym poziomie operacje takie jak AuthorizeOperator, WriteTicket, ReadCard (wszystkie te operacje wymagają M100) więc opracowaliśmy klasę M100Communicator (może nazwa nie oddaje jej w tym czasie intencji, ale o nazwie pomyślimy nieco później) . M100Communicator to singleton. Ponieważ musimy manipulować wydawaniem kart, aby akceptować i wydawać karty użytkowników, M100Communicator współpracuje z klasą CardDispensersManager. Nie zdecydowaliśmy jeszcze, czy zostanie on wkomponowany w M100Communicator, czy będzie to singleton (wydaje się, że to singleton). Wszystkie te operacje należy wykonać w pewien ujednolicony sposób: 1. Zablokuj bieżący obiekt. 2. Sprawdź, czy są skonfigurowane jakieś dyspensery. 3. Jeśli są - przekaż im polecenie otwarcia traktu do akceptacji kart. 4. Przekaż do M100 polecenie przeszukania karty przez określone anteny. 5. Po znalezieniu karty wykonaj operacje odczytu/zapisu. 6. Wydaj kartę z powrotem do użytkownika. Oto problemy, z którymi się borykamy: 1. Biorąc pod uwagę, że M100Communicator czasami nie wymaga CardDispensersManager, jesteśmy zmuszeni do sprawdzania jego stanu, aby wszędzie miał wartość zerową (i byłoby dość dziwne mieć specjalny przypadek CardDispensersManager, który zwróci sensowne odpowiedzi, gdy tam nie ma dozowników!). 2. M100Communicator i CardDispensersManager muszą być zainicjalizowane od samego początku systemu, więc nie jest jasne, jak zaktualizować konfigurację CardDispensersManager i M100Communicator oraz jak komunikować się bezpośrednio z CardDispensersManager, gdy chcemy wyraźnie zamknąć porty i przerwać komunikację z dozownikami, ponieważ być bardzo dziwne, aby ujawnić API dozowników za pomocą M100Communicator. (tak, musimy mieć dostęp do API dozowników z dowolnego miejsca, więc uważamy, że CardsDispenserManager musi być singletonem).


title: W jakim języku programowania pojawiło się „niech”?

text: Zastanawiałem się nad pochodzeniem "let" użytego w Lisp, Clojure i Haskell. Czy ktoś wie, w jakim języku pojawił się pierwszy?


title: Czy muszę wydać swój kod jako open source, jeśli używam Git?

text: To jest pytanie **skoncentrowane na prawnych aspektach licencjonowania oprogramowania**. Zaczynam opracowywać projekt dotyczący opcji roszczenia do kodu źródłowego jako własności i zachowania pełnych praw autorskich. Lubię „git” (licencja pod GNU v2), ale chcę się upewnić, że kilka rzeczy jest legalnych. 1. Jaki jest status prawny kodu źródłowego pod kontrolą wersji 'git' (rozprowadzanego na licencji GNU v2)? Czy kwalifikuje się jako „dzieło pochodne”? 2. Jakie są prawne konsekwencje statusu prawnego kodu źródłowego? W szczególności w odniesieniu do prawnego obowiązku udostępnienia kodu źródłowego. 3. Co oprócz git (licencja GNU v2), jakie mam inne opcje kontroli wersji (z prawnego punktu widzenia)?


title: Cytat Dijkstry na temat orientacji obiektowej?

text: Natknąłem się na następujący rzekomy cytat Dijkstry na temat orientacji obiektowej > Programowanie obiektowe jest wyjątkowo złym pomysłem, który mógł > powstać tylko w Kalifornii. Jednak nawet moje źródło nie jest przekonane, że cytat jest prawdziwy. Czy ktoś wie, czy jest prawdziwy, a jeśli tak, jaki był kontekst, w jakim mówił? Zdaję sobie sprawę z niedociągnięć OOP, zastanawiałem się tylko, który z nich był wtedy w jego głowie.


title: Jak zabezpieczyć się przed przestojami usług internetowych spowodowanymi przez osoby trzecie?

text: Używam iPage jako mojego dostawcy serwerów w chmurze. Nie miałem z nimi jeszcze żadnych problemów. Zawierają skrypty moich usług RESTful dla aplikacji mobilnej, którą tworzę. Mój problem polega jednak na tym, że dziś wieczorem usługa spadła. Dostałem błąd „To jest 500”. Zastanawiam się, jak zbudować nadmiarowość w moich usługach RESTful, aby temu zapobiec. Mówią, że miną co najmniej 2 godziny, zanim rozwiążą ten problem. Jeśli moja aplikacja jest aktywna, nie mogę czekać 2 godziny. Moi użytkownicy będą zirytowani. Wiem, że tak się dzieje, ale jak mogę zbudować redundancje, aby temu zapobiec.


title: Pomysły, jak zapobiec przedostawaniu się złośliwego kodu do produkcji, szczególnie w przypadku środowisk SAAS

text: Obecnie SAAS staje się popularnym sposobem tworzenia i wdrażania aplikacji, a ja właśnie zacząłem pracować w firmie dostarczającej rozwiązanie SaaS dla usług autoryzacji płatności. Od kilku dni zastanawiałem się, co by się stało, gdyby jakiś "niezadowolony/zły" programista napisał złośliwy kod (powiedzmy, że skasował tabelę transakcji!), który aktywowałby się w określonym czasie (aby nie został wyłapany podczas procesu testowania ) i może spowodować spustoszenie w każdej krytycznej aplikacji SAAS. Każda dobra oferta SAAS zawiera odpowiednią strategię tworzenia kopii zapasowych, a zatem przywracanie danych może być do pewnego stopnia możliwe, ale poważnie utrudniłoby dostępność systemu, a co za tym idzie, obraz z klientami. Czasami wydaje mi się, że można to kontrolować poprzez przeglądy kodu, ale widziałem, że w większości przypadków przeglądy kodu nie są wykonywane prawidłowo i taka złośliwa logika może być zakamuflowana za skomplikowanymi manipulacjami ciągów. Dlatego po prostu kieruję swoje myśli do społeczności w poszukiwaniu dobrych pomysłów, które mogłyby zostać wdrożone w procesie rozwoju, aby wyłapać takie złośliwe działania na wczesnym etapie. PS : Czasami jestem niezadowolony/zły deweloperem, ale nigdy nie zrobiłbym tak nieetycznych rzeczy będąc miłośnikiem kodowania.


title: Jaki jest najlepszy sposób na utworzenie statycznej klasy narzędziowej w Pythonie? Czy używa zapachu kodu metaklasy?

text: Ok, więc muszę stworzyć kilka klas użytkowych w Pythonie. Normalnie użyłbym do tego prostego modułu, ale muszę mieć możliwość dziedziczenia, aby dzielić między nimi wspólny kod. Wspólny kod musi odwoływać się do stanu modułu, który go używa, aby proste importy nie działały dobrze. Nie lubię singletonów, a klasy korzystające z dekoratora classmethod nie mają odpowiedniej obsługi właściwości Pythona. Jednym z często używanych wzorców jest tworzenie wewnętrznej klasy Pythona poprzedzonej podkreśleniem i tworzenie pojedynczej instancji, która jest następnie jawnie importowana lub ustawiana jako sam moduł. Jest to również używane przez sieć Fabric do tworzenia wspólnego obiektu środowiska (fabric.api.env). Zdałem sobie sprawę, że innym sposobem na osiągnięcie tego byłoby użycie metaklas. Na przykład: #util.py class MetaFooBase(type): @property def file_path(cls): raise NotImplementedError def inherited_method(cls): print cls.file_path #foo.py from util import * import env class MetaFoo(MetaFooBase): @ property def file_path(cls): return env.base_path + "relative/path" def other_class_method(cls): pass class Foo(object): __metaclass__ = MetaFoo #client.py from foo import Foo file_path = Foo.file_path Podoba mi się to podejście lepszy niż pierwszy wzorzec z kilku powodów: po pierwsze, tworzenie instancji Foo byłoby bezsensowne, ponieważ nie ma atrybutów ani metod, co zapewnia, że ta klasa działa jak prawdziwe narzędzie z pojedynczym interfejsem, w przeciwieństwie do pierwszego wzorca, który opiera się na konwencji podkreślenia, aby zniechęcić klienta kod z tworzenia większej liczby instancji klasy wewnętrznej. Po drugie, podklasowanie MetaFoo w innym module nie byłoby tak niezręczne, ponieważ nie importowałbym klasy z podkreśleniem, która jest z natury sprzeczna z jej prywatną konwencją nazewnictwa. Po trzecie, wydaje się to być najbliższym przybliżeniem do klasy statycznej, która istnieje w Pythonie, ponieważ cały kod meta dotyczy tylko klasy, a nie jej instancji. Pokazuje to powszechna konwencja używania cls zamiast self w metodach klas. Ponadto klasa bazowa dziedziczy po typie zamiast po obiekcie, co uniemożliwiłoby użytkownikom próby użycia jej jako bazy dla innych niestatycznych klas. Jego implementacja jako klasy statycznej jest również widoczna, gdy używa się jej zgodnie z konwencją nazewnictwa Foo, w przeciwieństwie do foo, które oznacza użycie metody klasy statycznej. Chociaż uważam, że jest to dobre dopasowanie, uważam, że inni mogą czuć, że nie jest to _pytoniczne_, ponieważ nie jest to _sankcjonowane_ użycie metaklas, których należy unikać _99%_ czasu. Uważam również, że większość twórców Pythona ma tendencję do unikania metaklas, które mogą wpływać na ponowne użycie / konserwację kodu. Czy ten kod jest uważany za zapach kodu w społeczności Pythona? Pytam, ponieważ tworzę pakiet pypi i chciałbym zrobić wszystko, co w mojej mocy, aby zwiększyć adopcję.


title: Zapewnienie, że nagłówki są jawnie zawarte w pliku CPP

text: Myślę, że ogólnie dobrą praktyką jest `#dołączanie` nagłówka dla dowolnych typów używanych w pliku CPP, niezależnie od tego, co jest już zawarte w pliku HPP. Mogę więc `#zawrzeć <string>` zarówno w moim HPP, jak i CPP, na przykład, mimo że nadal mógłbym skompilować, gdybym pominął go w CPP. W ten sposób nie muszę się martwić, czy mój HPP użył deklaracji forward, czy nie. Czy są jakieś narzędzia, które mogą wymusić ten styl kodowania „#include”? _Czy_ powinienem wymusić ten styl kodowania? Ponieważ preprocesor/kompilator nie dba o to, czy `#include` pochodzi z HPP czy CPP, nie otrzymuję informacji zwrotnej, jeśli zapomnę zastosować ten styl.


title: Aktualizujesz nagłówki praw autorskich co nowy rok tylko dlatego, że minął 1 stycznia?

text: Widziałem kilka projektów, które - z każdym nowym rokiem - zaczynają zmieniać wszystkie pliki w swoim drzewie źródłowym, aby zaktualizować rok praw autorskich. Czy to nie jest po prostu wypychanie gorącego powietrza na poziom wielkości? AFAIK: * Rok praw autorskich opiera się na odpowiednich zmianach utworu (również) - nie tylko ze względu na trywialną zmianę roku praw autorskich w nagłówku pliku, który jest jedyną zmianą. * Zmiana prawie wszystkich plików bez rzeczywistej potrzeby powoduje awarię kodu w kontroli wersji. Nie mogę się powstrzymać, ale mam problem, aby zobaczyć, dlaczego ktoś chce robić takie zbędne rzeczy, chociaż wiem, że niektóre projekty to robią (na przykład Zend Framework 1 w 2012). Czy można zmienić rok praw autorskich w każdym pliku tylko dlatego, że minął 1 stycznia?


title: Dlaczego potrzebujemy lat licencji na oprogramowanie?

text: Każdy plik `.java` w moim projekcie zaczynam z licencją (w moim przypadku BSD). A jego pierwsza linia mówi: /** * Prawa autorskie (c) 2011-2014, Imię Nazwisko * * Redystrybucja i użycie w postaci źródłowej i binarnej, z lub bez * modyfikacji, jest dozwolone pod warunkiem spełnienia następujących warunków itp. Pytanie brzmi: dlaczego muszę tam pokazywać lata? Widzę, że wiele innych projektów robi to samo. Co stracę, mówiąc po prostu „Prawa autorskie (c) Imię Nazwisko”, bez tego przedziału czasowego.


title: Najszybszy sposób na podzielenie rozdzielanego ciągu w Javie

text: I 'm budowanie komparatora, który zapewnia możliwość sortowania wielokolumnowego na ciąg rozdzielany. Obecnie używam metody split z klasy String jako preferowanego wyboru do dzielenia nieprzetworzonego String na tokeny. Czy jest to najskuteczniejszy sposób konwersji nieprzetworzonego ciągu na tablicę ciągów? Będę sortować miliony wierszy, więc myślę, że podejście ma znaczenie. Wydaje się, że działa dobrze i jest bardzo łatwy, ale nie jestem pewien, czy istnieje szybszy sposób w javie. Oto jak działa sortowanie w moim Comparatorze: public int Compare(String a, String b) { String[] aValues = a.split(_delimiter, _columnComparators.length); String[] bValues = b.split(_delimiter, _columnComparators.length); int wynik = 0; for( int index : _sortColumnIndices ) { wynik = _columnComparators[indeks].compare(aValues[indeks], bValues[indeks]); if(wynik != 0){ przerwa; } } zwraca wynik; } Po przetestowaniu różnych podejść, wierzcie lub nie, metoda podziału była najszybsza przy użyciu najnowszej wersji javy. Mój kompletny komparator możesz pobrać tutaj: https://sourceforge.net/projects/multicolumnrowcomparator/


title: Dlaczego pracownik miałby nie mieć możliwości dzielenia się technikami?

text: Kilka dni temu odbyłem dwa wywiady. To oczywiste, że będą pytać o różne techniki, których się nauczyłem. Więc dałem im link do moich tutoriali, udzielając wywiadu telefonicznego (Skype). Krótko mówiąc, wyjaśniałem na moich blogach rzeczy, o których chcieli wiedzieć. Powiedz na przykład: P: Jakie wyzwanie napotkałeś wcześniej i jak je rozwiązałeś? Odp.: utknąłem, gdy klient nalegał, abym miał dostosowany moviePlayer w iPhonie, znalazłem rozwiązanie. Podałem tutaj pełny opis tej techniki. Po tej rozmowie taka była ich odpowiedź: > Cieszymy się, że jesteś tak aktywny. Ale nasza firma ma pewne > zasady i przepisy. Nie możesz publikować niczego na temat naszego > projektu. Jeśli chcesz przestrzegać naszych zasad, cieszymy się z tego i > zatrudnimy Cię. Po prostu nie mogłem zrozumieć, dlaczego dzielenie się wiedzą jest surowo zabronione? W pełni zgadzam się, że jeśli firma opracowuje nowe API lub nowe technologie, nie powinienem o tym publicznie dyskutować. Ale moje blogi dotyczą niektórych technik dzielenia się. Dlaczego muszę zamknąć udostępnianie open-source, jeśli chcę dołączyć do tej firmy? Wyjaśniłem im też, że jeśli nikt nie będzie się dzielił swoją wiedzą, jak zamierzasz się tego nauczyć? Podałem takie przykłady: * Jeśli Ray Wenderlich nie pisze o tworzeniu gier, jak mam się nauczyć podstaw tworzenia gier na iPhone'a/iOS? * Jeśli Jon Skeet nie może udzielić odpowiedzi na Stack Overflow, jak mam się uczyć przesądnych rzeczy? **Podsumowanie** : 1. Dlaczego firma myśli tak: „Nasz programista udostępnia dane naszej firmy?” 2. Dlaczego firma myśli w ten sposób: „To ich własna własność, jeśli zrobimy jakieś badania dotyczące rozwoju na biurze?” (potrzebuję briefu, mogę rozwinąć więcej, po prostu skomentuj, zredaguję pytanie). **Edytuj** : Cóż! Dzielę się technikami w małych kawałkach i funkcjonalnościami. Nie udostępniam całego projektu. Podobnie robię też prace badawcze w moim domu i dzielę się swoimi doświadczeniami technicznymi. Jaki jest powód przerywania komuś życia. Chodzi o udostępnianie rzeczy, których się nauczyłeś i zdecydowanie nie chodzi o udostępnianie danych klientów firmy lub projektów firmowych.


title: Jak jako nastolatek mogę znaleźć „przyjaciół” do programowania?

text: Jestem nastolatkiem, który programuje od około 3 lat, umiem zrobić podstawowe oprogramowanie i tak, ale czuję, że nie mogę zrobić wszystkiego sam. Co mogę zrobić, aby znaleźć osoby zainteresowane programowaniem? Żaden z moich znajomych nie robi, mam tylko kuzyna, który studiuje inżynierię oprogramowania, ale jest w innym kraju. Mieszkam w Hiszpanii, więc jest trudniej niż w USA.


title: Czy powinieneś umieścić osobiste przekonania w swoim programie?

text: Ostatnio znalazłem dwa przykłady osobistych przekonań programistów w programach, które usunęły lub sparaliżowały użyteczną funkcjonalność * uTorrent używający KB (rzadko używany) vs Kb (co większość dostawców usług internetowych i innych programów używa jako swojej metryki) w ich obecnej szybkości połączenia. Różne próby innych osób i mnie, aby dać przynajmniej opcję wyświetlania w Kb, zakończyły się stwierdzeniem „Dostawcy usług internetowych powinni używać KB” * Kleopatra (menedżer kluczy gpg4Win) nie ma PGP Key Pictures, ponieważ „dają fałszywe poczucie bezpieczeństwa” oraz „zwiększyć wielkość certyfikatów”. Podczas gdy to drugie jest prawdą, to pierwsze jest dyskusyjne. Obie te rzeczy szkodzą programowi i jego użyteczności dla mnie. Fora uTorrenta były kiedyś wypełnione ludźmi, którzy mówili, że mają potok pobierania 10 Mb, ale uTorrent ma tylko 2 MB (nie wiedząc, że Mb `!=` MB) i żądaniami funkcji, które mają być wyświetlane w Mb. Kleopatra straciła dla mnie użyteczność, ponieważ nie mam możliwości dodawania obrazków do kluczy PGP. To wszystko są oświadczenia polityczne; programiści próbujący wprowadzić zmiany w ważnych dla nich kwestiach. Ale czy powinno to mieć koszt dla funkcjonalności użytkownika końcowego? Jeśli programista mocno wierzy w X, ale wszyscy inni wierzą w Y, czy powinien odmówić dodania wsparcia dla Y, ponieważ w jego mniemaniu X jest okropne? Krótko mówiąc, czy programista powinien składać oświadczenia polityczne w swoim programie?


title: Co zrobić, jeśli szef zawsze odkłada główne decyzje dotyczące wymagań i ogólnego projektu?

text: Rozpoczynając nowy projekt, mój szef zawsze unika podejmowania sztywnych decyzji. Zwykle mówi: ok, po prostu zacznij coś pisać i bądź tak ogólny, jak to tylko możliwe. Kiedy skończysz, przyjrzymy się, jak będziemy kontynuować. Jego argumentem jest w zasadzie to, że nigdy nie wiadomo i „zwinny rozwój”. Aby pytanie było jak najbardziej ogólne: co robisz, jeśli twój szef nie lubi podejmować decyzji? Po prostu trzymaj się tego i napisz kod, który może przejść ciężką refaktoryzację i częściowe przepisanie kilka tygodni później? A może kontynuujesz dyskusję, aż szef podejmie przynajmniej kilka decyzji? To mniej więcej moja obecna strategia. Ponieważ to jest jak prawo fizyki, w pewnym momencie coś musi zostać dostarczone. Albo dlatego, że szef szefa chce zobaczyć wyniki, albo dlatego, że w pewnym momencie rzeczy stają się śmieszne. Widzę też, że mój szef krytykuje prawie wszystko. Nawet sugestie oparte na jego własnych...


title: Rozumowanie, by czekać do trzeciego razu w zasadzie trzech?

text: Właśnie natknąłem się na artykuł "Zasada trzech" w wikipedii > Reguła trzech jest praktyczną zasadą refaktoryzacji kodu, która decyduje, kiedy zreplikowany fragment kodu powinien zostać zastąpiony przez nową procedurę. Stwierdza, że > kod można skopiować raz, ale gdy ten sam kod zostanie użyty > trzy razy, należy go wyodrębnić do nowej procedury. Zasada została > wprowadzona przez Martina Fowlera w Refactoring i przypisana Donowi Robertsowi. Wiem, że to tylko praktyczna zasada, ale dlaczego zaleca się refaktoryzację dopiero po drugim duplikacji? Czy jest jakiś minus refaktoryzacji, kiedy piszemy pierwszą duplikację?


title: Co robisz, gdy twoja konwencja nazewnictwa koliduje z twoim językiem?

text: Dobra, to jedna z tych małych rzeczy, które zawsze mnie denerwowały. Zazwyczaj nie skracam identyfikatorów, a krótki identyfikator (np. `i`) używam tylko w przypadku wąskiej pętli. Tak więc irytuje mnie to, gdy pracuję w C++ i mam zmienną, która musi być nazwana „operator” lub „klasa”, i muszę to obejść lub użyć skrótu, ponieważ kończy się to wysunięciem. Zastrzeżenie: może się to zdarzyć nieproporcjonalnie często, ponieważ dużo pracuję przy projektowaniu języka programowania, w którym obiekty domeny mogą odzwierciedlać koncepcje w języku hosta i nieumyślnie powodować kolizje. Jak sobie z tym poradzisz? Skracać? ('op') Błąd pisowni? (`klasa`) Coś jeszcze? („operator_”)


title: Czy muszę rozumieć algorytmy i struktury danych, aby nazywać się programistą?

text: Minęło sześć lat, odkąd koduję. Kodowanie do wszelkiego rodzaju rzeczy, takich jak ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP itp. Używałem tablic, map, list połączonych, zestawów itp. i wszędzie tam, gdzie pracowałem z ludźmi takimi jak ja. Ale za każdym razem, gdy udzielam wywiadu, jest bardzo prawdopodobne, że ludzie zadają mi pytania dotyczące haszy, drzew, stosów i kolejek. Niektóre pytania dotyczą żonglowania niektórymi algorytmami sortowania. Nie wiem, czy naprawdę powinienem ich znać, czy powinienem przestać nazywać siebie programistą. Jest we mnie coś, co również mi mówi, że nawet jeśli ludzie, którzy zadają te wszystkie pytania, wybiorą mnie, nigdy nie zmuszą mnie do pracy nad tymi rzeczami. Czy naprawdę muszę to wszystko wiedzieć?


title: Dokumentowanie/definiowanie struktur danych w Pythonie

text: Jaki jest preferowany sposób dokumentowania zawartości i logiki za dynamicznie generowanymi strukturami danych w Pythonie? Np. dyktat, który zawiera mapowanie ciągu do listy list ciągów? Trudno mi przekazać znaczenie i algorytmiczne działanie elementów danych za pomocą samego kodu Pythona. Próba ukształtowania kodu, który tworzy taki nakaz, w formie, która łatwo przekaże innemu programiście strukturę wpisu nakazu, jest niezadowalająca, a czasami przynosi efekt przeciwny do zamierzonego. Podobnie umieszczenie komentarza z przykładowym wpisem nie jest w moich oczach optymalnym.


title: Czy ktoś z was próbował „Basic for Android”?

text: Rozwijam na Androida od około pół roku i idzie całkiem nieźle. Na początku stwierdziłem, że krzywa uczenia się jest stroma, ale potem jakoś wpadłem na to wszystko i teraz nie muszę już tak dużo walczyć. Raczej spędzam czas na konkretnych problemach, takich jak „Jak zrobić X w Androidzie”, ale zwykle jest to na tyle proste, aby wygooglować - lub zapytać tutaj :) W każdym razie właśnie odkryłem Basic dla Androida i muszę przyznać, że wygląda atrakcyjnie. Ma rodzaj IDE, do którego jestem przyzwyczajony (Delphi) i wydaje się być bardzo wydajny. Ale z drugiej strony wciąż jestem nowy w świecie Androida, więc nie jestem wystarczająco kompetentny, aby naprawdę ocenić zalety i wady narzędzia. Czy ktoś z was próbował tego, a jeśli tak, to co myślicie o tym?


title: Gdzie załadować i przechowywać ustawienia z pliku?

text: Myślę, że to pytanie powinno dotyczyć większości programów ładujących ustawienia z pliku. Moje pytanie jest z punktu widzenia programowania i tak naprawdę jest to, jak poradzić sobie z ładowaniem ustawień z pliku pod względem różnych klas i dostępności. Na przykład: * Jeśli program posiada prosty plik `settings.ini`, czy jego zawartość powinna być załadowana w metodzie `load()` klasy, czy może konstruktora? * Czy wartości powinny być przechowywane w zmiennych `public static`, czy też powinny istnieć metody `static` do pobierania i ustawiania właściwości? * Co powinno się stać, jeśli plik nie istnieje lub nie jest czytelny? Jak możesz poinformować resztę programu, że nie może uzyskać tych właściwości? * itd. Mam nadzieję, że proszę o to tutaj we właściwym miejscu. Chciałem, aby pytanie było jak najbardziej agnostyczne dla języka, ale skupiam się głównie na językach, które mają takie rzeczy jak dziedziczenie - zwłaszcza Java i C#.NET.


title: Co robisz, jeśli miałeś kilku złych pracodawców?

text: Miałem więc serię naprawdę złych doświadczeń i zastanawiam się, co robię źle. Zacząłem jako programista w niepełnym wymiarze godzin na dużym uniwersytecie. Miałem problem z moim nadgarstkiem i poprosiłem (ładnie) o pomoc w ergonomicznym mieszkaniu. Mój szef zaczął na mnie krzyczeć, a później twierdził, że krzyczałem na nią. Zapytana o to, po prostu zaczęła szlochać. Na szczęście w pobliżu byli inni, którzy słyszeli krzyki i wiedzieli, że mówię prawdę. W końcu została wypuszczona. Moja umowa wzrosła i zmieniłem pracę, tym razem na startup. Cóż, przez kilka miesięcy nie dostałem maszyny deweloperskiej. Kiedy gospodarka załamała się, zaczęli prosić o szaloną ilość nadgodzin. Spełniłam, bo bałam się szukać pracy. Ostatnią kroplą było to, że skontaktowali się ze mną tuż przed pogrzebem mojego ojca, aby rozwiązać problem. Zostałam zwolniona, nie otrzymałam na czas ostatniej kontroli, a firma schrzaniła moją COBRĘ do tego stopnia, że przez wiele miesięcy nie mogłam dostać recept. Niedawno zostali ukarani grzywną przez państwo X za to, co zrobili. Teraz, mimo że pracowałem dla nich całym sercem i byli gotowi, zanim zostali ukarani grzywną, odmawiają udzielenia referencji. Szybko podjąłem nową pracę, głównie dlatego, że naprawdę potrzebowałem ubezpieczenia zdrowotnego. Chcieli, żebym wykonał kilka miesięcy pracy w ciągu kilku tygodni. Nie mieli planu projektu. Ich klienci nie radzili sobie dobrze, ponieważ całe sekcje aplikacji przestawały działać, gdyby ktoś sprawdził pisownię. Mimo że mieli całkowicie nierozsądne oczekiwania co do mojej pracy, byli szczęśliwi mogąc powiedzieć, że naprawa błędu sprawdzania pisowni zajmie kilka miesięcy. Nie było praktycznie żadnego szkolenia. Kazali mi przeprowadzić rozmowę kwalifikacyjną z kandydatami i wybrałem jednego. Najwyraźniej ta osoba była moim zastępstwem, ponieważ po kilku miesiącach zostałem zwolniony. Niedawno mój były szef zadzwonił do mojego obecnego pracodawcy i wymyślił zarzuty, że zniechęcam ludzi do aplikowania na wolne stanowiska w jego firmie, co jest szalone, bo nawet nie wiedziałem, że zatrudniają. Czuję się, jakbym miał T-shirt z napisem: „Jeśli jesteś szalony lub chciałbyś, żeby ktoś się bawił i źle traktował, zatrudnij mnie!”. Z drugiej strony, kiedy patrzę na życiorysy niektórych programistów, widzę też horrory. Czy są więc rzeczy, które mogę zrobić inaczej, aby uniknąć tych problemów? Czy częścią naszego zawodu jest to, że ludzie nie mają standardów? Może to kwestia osobowości, która tkwi wyłącznie we mnie? Czy ktoś jeszcze miał serię złych doświadczeń i odwrócił sytuację?


title: Zalety i możliwe wady używania Javy do programowania międzyplatformowego vs. .NET?

text: Gdybym miał zacząć pisać aplikację przy użyciu Javy z zamiarem przeniesienia jej na inne platformy z niewielką modyfikacją lub bez niej, czy rozsądnie byłoby zamiast tego rozważyć użycie frameworka .Net? Nie mam na myśli konkretnych celów w odniesieniu do platformy. Przynajmniej wsparcie Windows/Mac/Linux byłoby miłe. Ważna jest również łatwość użytkowania dla użytkownika końcowego.


title: Co myślisz o korzystaniu z systemów kontroli wersji online?

text: Od wieków korzystam z własnego domowego serwera dla własnego kodu i wypróbowałem ten lub inny system (SVN, VSS itp.). Ale ostatnio podobało mi się posiadanie cenniejszych (bez kodu źródłowego) danych poza siedzibą firmy, bez ciągłego martwienia się o tworzenie kopii zapasowych w przypadku awarii sprzętu, korzystanie z usług takich jak Dropbox, Skydrive, aplikacje Google itp. To sprawiło, że chcę zrobić to samo z moim kodem źródłowym dla różnych projektów, jednak mam kilka obaw co do nich. Mianowicie, jak bezpieczny jest mój kod przed ciekawskimi/ciekawskimi oczami i czy muszę mieć usługę bezpieczną w razie awarii, na wypadek, gdyby ktoś spadł z dnia na dzień lub po prostu miał ogromne problemy z danymi? Nie było to problemem, dopóki nie przeczytałem czyichś doświadczeń z Mozy.com, która nie jest usługą repozytorium kodu, ale przechowywanie danych jest przechowywaniem danych. Jeśli korzystasz/polecasz taką usługę, co byś polecił? Jestem otwarty na używanie dowolnego systemu, czy to Mercurial, SVN, GIT, TFS, itp., o ile ma on opcję klienta Windows i Mac (internetowy byłby bardzo miłym "bonusem"). A co najważniejsze, dlaczego?


Programowanie funkcjonalne jest jednym z najstarszych paradygmatów programowania. Jednak nie jest on często używany w branży w porównaniu z bardziej popularnymi paradygmatami. Ale w środowisku akademickim jest to w dużej mierze podkreślane. Jaka jest twoja najsilniejsza opinia na temat programowania funkcjonalnego?