title: Jak przeprowadzić wywiad z naukowcem na stanowisko dewelopera?

text: # Pytanie oryginalne Zrobiłem już kilka wywiadów dla mojej firmy, głównie informatyków na stanowiskach deweloperskich, ale także testerów i kierowników projektów. Teraz muszę obsadzić wakat w naszej grupie badawczej w dziale R&D (przypis: „badania” oznaczają, że staramy się rozwiązywać problemy w naszej profesjonalnej domenie/niszy rynkowej za pomocą oprogramowania w projektach badawczych wspólnie z uczelniami, innymi firmami, ośrodkami badawczymi i organizacje użytkowników końcowych. To nie są badania informatyczne, nie rozwiążemy problemu P=NP). Teraz zaprosiliśmy faceta z tytułem magistra chemii (z dużą ilością fizyki w CV), który nigdy nie miał lekcji informatyki. Rozmawiałem z nim już około pół godziny podczas dni kariery na lokalnym uniwersytecie i nie ma wątpliwości, że facet jest mądry. Również jego oceny są doskonałe i ukończył studia z wyróżnieniem. Aby uzyskać tytuł licencjata, musiał nauczyć się programowania w Mathematica i powiedział mi wiarygodnie, że bardzo lubi programować. Rozwiązał też pewien problem z chemii fizycznej, którego prawdopodobnie nie rozumiem, używając własnego oprogramowania, zaimplementowanego w Mathematica, do swojej pracy magisterskiej. Zawiera graficzny interfejs użytkownika i godny uwagi rozmiar 8000 LoC. Wydaje się, że bardzo go pociąga to, co robimy w naszej grupie badawczej i szczerze mówiąc, firmom takim jak my trudno jest pozyskać dobrych ludzi. Jestem również bardzo zainteresowany zatrudnieniem go, ponieważ mógłby mi pomagać w pisaniu propozycji projektów, raportach, prezentacjach i tak dalej. Pewnie pasowałby też do naszego zespołu. Pozostaje tylko pytanie: **Jak mogę sprawdzić, czy zdobędzie umiejętności programistyczne, których potrzebuje** do wdrożenia oprogramowania w naszych projektach, skoro będzie to znacząca część pracy? Oczywiście zapytam go, co to jest, co go fascynuje w programowaniu. Zapytam też, jak zaczął pisać swoje oprogramowanie do nauk przyrodniczych i jak je zorganizował. Zapytam, jak udało mu się zdobyć potrzebne mu umiejętności i informacje o tworzeniu oprogramowania. Ale czy jest coś więcej, o co mógłbym zapytać? Może coś bardziej konkretnego? Czy powinienem poprosić go o wyjaśnienie jego rozwiązania Mathematica? Żeby było jasne: nie szukam wiedzy w określonym stosie językowym lub technologicznym. Jesteśmy sklepem .NET zajmującym się rozwojem produktów, ale chcę mieć wolny wybór dla naszych projektów badawczych. Dlatego interesuje mnie metakompetencja, aby móc uczyć się wszystkiego, co jest rzeczywiście potrzebne. Mam nadzieję, że na to pytanie można odpowiedzieć, a nie otwarte, ponieważ naprawdę lubię wiedzieć, czy istnieje domyślny sposób sprawdzenia możliwości _uzyskania_ dalszych umiejętności programistycznych w pracy. Jeśli coś nie jest dla Ciebie jasne, daj mi kilka komentarzy i pozwól mi poprawić moje pytanie. # Aktualizacja odzwierciedlająca odpowiedzi udzielone do 01.12.2011 ## Jaką odpowiedź przyjąłem i dlaczego Dziękuję wszystkim za odpowiedzi, większość z nich jest bardzo pomocna, więc dużo przegłosowałem! Chociaż odpowiedź Toma Squiresa uzyskała najwięcej głosów, zamierzam zaakceptować odpowiedź udzieloną przez księcia Gulasza. Oczywiście Tom ma obiektywną rację, ale odpowiedź Prince'a jest dla mnie bardziej pomocna i dwukrotnie sprawdziłem w FAQ, że _to_ jest kryterium przyjęcia odpowiedzi. ## O co zamierzam go zapytać podczas wywiadu * Pozwolę mu wyjaśnić kilka prostych zadań, takich jak przykład w The Camel Has Two Humps wspomniany przez Chrisa Burt-Browna * Poproszę go o wyjaśnienie niektórych bardziej zaawansowanych przepływów sterowania może w notacji graficznej. * Sprawdzę jego rozumienie rekurencji na przykładzie matematycznym. * Pozwolę mu wyjaśnić wybrany przez siebie algorytm w języku naturalnym. * Pozwolę mu wyjaśnić jego rozwiązanie Mathematica, w szczególności poproszę o jego model procedury, użycie narzędzi, strukturę kodu i oprogramowania w ogóle oraz różne warstwy abstrakcji. * Aby sprawdzić jego motywację, poproszę o jego fascynację tworzeniem oprogramowania. * Zapytam go, czy wie, czego będzie musiał się nauczyć o tworzeniu oprogramowania dla przedsiębiorstw. Szczególnie chcę skierować dyskusję na kierunek pracy w zespołach, programowania w parach, TDD, ponieważ oczekuję, że nie będzie wiedział o tym zbyt wiele po pracy nad samym magistrem. Wygląda na to, że to będzie długi wywiad ;) # Aktualizacja po wywiadzie 09.12.2011 Jeszcze raz dziękuję wszystkim za dobre odpowiedzi. Wywiad zdał śpiewająco. Nigdy nie byłem bardziej zadowolony z kandydata. Jego rozwiązanie Mathematica wydaje się być dość dobrze skonstruowane. Był w stanie wyjaśnić, gdzie użył funkcji wyższego rzędu, chociaż nie wiedział, że tak się je nazywa. Odpowiedział na moje pytania dotyczące rekurencji opartej na matematyce, a także na proste zadania i elementy sterowania przepływem z The Camel Has Two Humps. Kiedy wyjaśniał niektóre algorytmy, wiele się nauczyłem o dopasowaniu nieliniowym ;) Również szczerze powiedział, że oczywiście nie może zagwarantować, że będzie mógł nauczyć się rzeczy o profesjonalnym tworzeniu oprogramowania, których do tej pory nie znał. Ale wiarygodnie stwierdził, że zawsze był dobry w uczeniu się nowych koncepcji - nawet sam - i naprawdę interesuje się tworzeniem oprogramowania. Poprosił również o stos technologiczny projektu, do którego byłby aplikowany jako pierwszy, aby obejrzeć go w domu. Był również ciekawy programowania w parach i pracy zespołowej. Teraz mam nadzieję, że umowa o pracę zostanie zawarta.


title: Kompatybilność wsteczna z pozyskiwaniem zdarzeń

text: Jak zachować kompatybilność wsteczną z pozyskiwaniem zdarzeń? Powiedzmy, że wypuszczasz wersję, która ma jeden rodzaj zdarzenia, nazwijmy to X. Wiesz, jak obsłużyć to zdarzenie we wszystkich systemach, które wyodrębniają zdarzenia ze źródła zdarzenia. W późniejszej wersji wprowadzasz zmiany w zdarzeniu X lub je usuwasz, jak zachować zgodność wsteczną z tym? Aby mieć w pełni funkcjonalny system, musisz być w stanie obsłużyć stare zdarzenie w tym samym czasie, co zaktualizowaną wersję. Lub jeśli usuniesz ten typ zdarzenia, utkniesz z kodem, który jest przeznaczony tylko do obsługi starszych zdarzeń, co w mojej głowie może być trochę bałaganiarskie na dłuższą metę.


title: Gdzie mogę uzyskać definicję kodu w VB.NET 2010?

text: Dopiero zaczynam naukę Visual Basic 2010. Mam książki i filmy. Wszystkie książki wydają się być napisane dla ludzi, którzy mają pewne doświadczenie w programowaniu, nawet te, które mówią, że są dla początkujących. Filmy były świetne, dopóki nie zaczęły mówić o zmiennych. Znam ich podstawy, ale zaczęły się one od skomplikowanych zmiennych i nie widzę ich od razu potrzeby. Gdzie mogę zobaczyć kod dla dość skomplikowanych aplikacji napisany, z nałożonymi definicjami, która część kodu jest metodą, a nie klasą i tak dalej? Ponadto pracuję w firmie, która nie używa SQL. Więc muszę używać Access 2007 dla wszystkich moich tabel. Czy jest duża różnica w kodowaniu?


title: W jaki sposób kończysz na pozyskiwaniu zdarzeń, jeśli korzystasz z podejścia xDD?

text: Podczas pracy w sposób TDD lub BDD testy jednostkowe powinny kierować twoim projektem. Ale w jaki sposób kończysz na pozyskiwaniu zdarzeń przy użyciu technik xDD? Jak widzę, pozyskiwanie zdarzeń to coś, co musisz wcześnie zaadoptować, aby w pełni z niego skorzystać. Powiedzmy, że zaczynasz bez pozyskiwania informacji o wydarzeniach i robisz wydanie. Później, gdy wypuszczasz wersję 2.0, zdajesz sobie sprawę, że byłoby wspaniale korzystać z sourcingu zdarzeń, ale w tym momencie przeoczyłeś już wszystkie zdarzenia z wersji 1.0, co znacznie utrudnia implementację. A może bierzesz jakąś kopię zapasową bazy danych sprzed pozyskiwania zdarzeń i używasz jej jako linii bazowej, a następnie dodajesz do tego pozyskiwanie zdarzeń?


title: Zakończ funkcję cofnięto zatwierdzenia z programowania

text: Używam git jako systemu kontroli wersji i używam git-flow jako modelu rozgałęzienia. Kilka tygodni temu założyłem gałąź funkcji, aby utrzymać system w stanie czystym podczas opracowywania tej funkcji. Główny rozwój kontynuowano w gałęzi `develop`, a zmiany z fazy deweloperskiej były okresowo łączone z funkcją, aby była jak najbardziej aktualna. Jednak nadszedł czas, w którym funkcja została ukończona, a ja użyłem funkcji „finish” git-flow, aby połączyć ją z powrotem w programowanie. Scalenie zostało pomyślnie wykonane, ale potem dowiedziałem się, że niektóre z zatwierdzeń, które wykonałem podczas tworzenia, zostały cofnięte przez zatwierdzenie scalające! Nigdzie w `develop` ani w gałęzi funkcji te zmiany nie zostały cofnięte, nie widzę żadnego commita, który by je nadpisał. Po prostu nic nie mogę znaleźć. Jedyną teorią, jaką mam w tej chwili, jest to, że git na mnie zawodzi, ale byłoby to bardzo mało prawdopodobne. Może zrobiłem jakąś niewłaściwą manipulację, która sprawiła, że ta sytuacja się spełniła? Mogę prześledzić wstecz w historii, kiedy dokonano zatwierdzenia. Widzę, że zmiany z tego zatwierdzenia zostały cofnięte przez zatwierdzenie scalające. Nigdzie w gałęzi nie widzę zatwierdzenia, które cofa te zmiany. Jednak zostały odwrócone. Jak to w ogóle jest możliwe?


title: Czy ktoś z powodzeniem używał OpenCalais w projekcie?

text: W poprzednim pytaniu tutaj dotyczącym programistów system OpenCalais został wymieniony jako rozwiązanie. Czy ktoś używał OpenCalais? Czy potrafisz zidentyfikować plusy i minusy systemu?


Całkiem proste pytanie. Czy struktura pakietu powinna być zbliżona do hierarchii klas? Jeśli tak, jak blisko? Dlaczego lub dlaczego nie? Załóżmy na przykład, że masz klasę A i klasę B, a także klasę AFactory i klasę BFactory. Umieszczasz klasy A i B w pakiecie com.something.elements, a AFactory i BFactory w com.something.elements.factories. AFactory i BFactory byłyby niżej w hierarchii pod względem pakietów, ale byłyby wyżej pod względem klasowym. Czy tego typu rzeczy to dobry czy zły pomysł?


title: Dlaczego złożoność pobierania wartości z tablicy jest O(1)?

text: Jak to się dzieje, że złożoność pobierania wartości z tablicy według jej indeksu to O(1)? Myślałem, że algorytm musi przejść przez wszystkie indeksy, znaleźć właściwy indeks, a następnie wiedzieć, jaką wartość zwrócić. Oznacza to, że złożoność wynosi średnio O(n/2). Dlaczego tak naprawdę jest O(1)?


title: Jakie funkcje funkcjonalne są warte trochę zamieszania związanego z OOP ze względu na korzyści, jakie przynoszą?

text: Po nauczeniu się programowania funkcjonalnego w Haskell i F#, paradygmat OOP wydaje się być tyłkiem z klasami, interfejsami, obiektami. Jakie aspekty FP mogę wprowadzić do pracy, aby moi współpracownicy mogli je zrozumieć? Czy są jakieś style FP, które warto porozmawiać z moim szefem o przekwalifikowaniu mojego zespołu, abyśmy mogli z nich korzystać? Możliwe aspekty FP: * Niezmienność * Częściowe zastosowanie i curry * Funkcje pierwszej klasy (wskaźniki do funkcji / Obiekty funkcjonalne / Wzorzec strategii) * Leniwa ocena (i monady) * Czyste funkcje (brak efektów ubocznych) * Wyrażenia (w porównaniu z instrukcjami - każda linia kodu generuje wartość zamiast lub oprócz powodowania skutków ubocznych) * Rekursja * Dopasowywanie wzorców Czy jest to metoda bezpłatna dla wszystkich, w której możemy zrobić wszystko, co obsługuje język programowania, do limitu, który obsługuje to język? A może istnieje lepsza wytyczna?


title: Czy powinienem pominąć symbol waluty?

text: Uaktualniam aplikację komputerową, która obecnie wyświetla symbol waluty za każdym razem, gdy wartości pieniężne są wyświetlane lub drukowane. Mój przyjaciel z Wielkiej Brytanii powiedział mi: „Kiedy Brytyjczycy widzą oprogramowanie ze znakiem dolara amerykańskiego ($), automatycznie je wyłącza”. Biorąc pod uwagę fakt, że my (programiści) mamy tylko jedną szansę na zrobienie pozytywnego pierwszego wrażenia, czy nie byłoby bardziej sensowne formatowanie wszystkich wartości pieniężnych bez symbolu waluty?


title: Najlepsze praktyki dotyczące przeprojektowania bazy danych

text: Znam kilka ogólnych najlepszych praktyk podczas projektowania bazy danych dla aplikacji, ale co z przeprojektowaniem? Jestem w zespole, którego zadaniem jest przeprojektowanie wewnętrznej aplikacji biznesowej, chociaż pomimo tego, że mówię „wewnętrzna”, jestem niestety wiele, wiele warstw ludzi z dala od rzeczywistych użytkowników systemu. Obecny program jest w Oracle Forms, rozproszony po kilku nieznormalizowanych tabelach, czasami z wieloma niemal zduplikowanymi tabelami, które zawierają drobne warianty danych innych. Ograniczenia często mają postać słabo wymuszonych procedur składowanych. Nawet typy nie wydają się być prawidłowo przechowywane. Napotkałem różnego rodzaju złe dane, które Oracle wydaje się ignorować, ale pasowały (i słusznie) do Kreatora importu/eksportu SQL Server. (Na przykład dwucyfrowe liczby całkowite nie stanowią pełnej daty i godziny!) Oryginalny program prawdopodobnie pochodzi sprzed dwudziestu lat, a wszyscy oryginalni programiści przeszli na emeryturę tak dawno temu, że nawet starsi ludzie tutaj nie mają pojęcia, kim byli. W rezultacie nie ma też tak naprawdę żadnych czystych wymagań do spełnienia — mamy po prostu powielać funkcjonalność istniejącej aplikacji i zachować jej istniejące dane. Efektem końcowym przepisania będzie wersja internetowa działająca na ASP.NET z MS SQL Server na zapleczu. Moi pozostali dwaj koledzy z zespołu programistów są znacznie starsi ode mnie, obaj mają doświadczenie w biznesie / MIS, podczas gdy ja jestem CS. Doświadczenie starszego członka dotyczyło prawie wyłącznie formularzy Oracle, a drugi członek zajmował się głównie pracą nad aplikacjami biznesowymi w języku Visual Basic. Chociaż moje doświadczenie w zakresie baz danych ograniczało się do projektowania nowych baz danych dla projektów w MySQL lub SQLite, głównie dla moich klas licencjackich, wydaje mi się, że jako jedyny mam doświadczenie w projektowaniu baz danych. Napisałem już mały program w C#, który wczytuje wszystkie istniejące dane do neutralnego formatu, gotowego do ponownego rzucenia i umieszczenia w nowej bazie danych. Planuję napisać kod wczytywania po zaprojektowaniu docelowej bazy danych, aby dane mogły zostać odpowiednio podzielone między nowe znormalizowane tabele, dodane w odpowiedniej kolejności zgodnie z nowymi ograniczeniami itp. Ten sam program można później uruchomić ponownie skopiować dane produkcyjne do rzeczywistego nowo wdrożonego ukończonego przeprojektowania. To pozostawia faktyczne przeprojektowanie bazy danych jako główną rzecz do ustalenia. **Więc sedno mojego pytania:** jakie są najlepsze praktyki dotyczące przeprojektowania istniejącej aplikacji z poziomu bazy danych w górę?


title: Zaprojektowanie aplikacji internetowej, która będzie używana z odległych lokalizacji geograficznych

text: Zaprojektowałem/zbudowałem wiele małych aplikacji internetowych. Większość z nich była wykorzystywana przez klientów, którzy działają w określonym obszarze geograficznym, najczęściej w obrębie tego samego stanu/prowincji. W tym przypadku postępowałbym zgodnie z najlepszymi praktykami, ale normalnie nie martwię się zbytnio problemami spowodowanymi odległością od serwera. Mam potencjalnego klienta, którego lokalizacje są rozsiane w kilku krajach na całym świecie. Jakie konkretnie uwagi należy wziąć pod uwagę, projektując aplikację, która będzie używana w lokalizacjach, które nie znajdują się blisko siebie? Niektóre z bardziej oczywistych, o których myślałem: * i18n/localized strings * Statyczne dostarczanie treści przez CDN * Zmniejszenie liczby przypadków, w których klient musi komunikować się z serwerem * Komunikacja z serwerem w tle, podczas gdy klient robi inne rzeczy Uważam, że ta lista powinna być dłuższa, ale na pewno nie mam dużego doświadczenia. Martwią mnie przede wszystkim marginalne problemy związane z obsługą rozproszonej geograficznie bazy użytkowników, która w innym przypadku nie byłaby problemem wysokiej rangi dla klientów znajdujących się w bliższym sąsiedztwie.


title: Jak udostępnić światu moją wtyczkę jQuery?

text: Zrobiłem wtyczkę do jQuery, która moim zdaniem jest całkiem przydatna. Łączy w sobie animowaną wtyczkę kolorów z wtyczką easings i dodaje zupełnie nową funkcję polegającą na numerycznym odwoływaniu się do kolorów (bardziej przydatne w notacji szesnastkowej, na przykład 0xff00cc), dzięki czemu łatwiej jest nimi manipulować matematycznie. Stworzyłem repozytorium na github i tam jest, nikt na nie nie patrzy. Przede wszystkim chciałbym, aby ludzie przyglądali się temu, używali go i ulepszali, abym mógł korzystać z ulepszeń i tak dalej. Myślę, że pomysł na numeryczną manipulację kolorami mógłby być interesujący. Ułatwia zmianę odcienia bez zmiany np. nasycenia. W połączeniu z animowanymi kolorami myślę, że można by zrobić coś ciekawego, ale nie wiem co dokładnie. Jak mam powiadomić ludzi, że (lub jakikolwiek inny projekt) tam jest...? Miałem zamiar opublikować go na http://plugins.jquery.com, który obecnie nie działa. Czy istnieją inne rynki zbytu dla tego rodzaju kodu?


title: MVC: interakcja z kontrolerem widoku

text: Mam aplikację Java, którą implementuję zgodnie ze wzorcem MVC. Chcę mieć okno (widok) zawierające formularz, który pozwala użytkownikowi dodać kilka pól tekstowych. Pojawi się również przycisk, który pozwoli użytkownikowi dodać więcej pól tekstowych do formularza. Mam kilka pytań na ten temat. Czy kod dodawania nowych pól tekstowych będzie uważany za część kontrolera czy widoku? 1. Jeśli kontroler, to ten kontroler nic nie zrobi z modelem, tylko zmodyfikuje mój widok, więc czy jest to naruszenie MVC? 2. Jeśli widok, to czy będzie to naruszenie MVC, ponieważ zmiany w widoku nie były skierowane z modelu?


title: Czy można skompilować Javę do kodu maszynowego? (Nie kod bajtowy)

text: Czy można skompilować Javę bezpośrednio do kodu maszynowego? Chcę to zrobić, aby mieć kontrolę nad tym, na jakich platformach jest używany i nie znam C,C++ itp.


title: Ustalenie odpowiedniej ilości dokumentacji

text: Tam, gdzie obecnie pracuję, ogólne podejście jest - **unikaj dokumentacji tak bardzo, jak to możliwe** **Dokumentuj tylko jeśli inny zespół będzie tego potrzebował** tylko dla wyjaśnienia, nie mam na myśli dokumentacji kodu - to robimy, ja oznacza całą dokumentację otaczającą proces projektowania - czy to schematy UML lub DB, diagramy klas i dokumenty tekstowe ze specyfikacjami i tym podobne. Wymienię powody mojego szefa, aby nie dokumentować: 1. to czasochłonne - skup się na wdrożeniu 2. jeśli projekt się zmieni - to dokumentacja powinna się zmienić, podwójne kłopoty 3. w końcu dostajesz setki stron, których nikt nie chce czytać, i nikt tak naprawdę nie edytuje, więc z czasem stanie się nieaktualny 4. To uciążliwe - nikt tak naprawdę nie chce tego robić Teraz zdaję sobie sprawę, że pracujemy szybciej, ale pamiętam też, że czas się tu pojawił i zanurkowałem prosto do jakiegoś starego kodu, nie rozumienie czegokolwiek. Właściwie to nadal nie rozumiem większości tego starego kodu, a czasami, kiedy wchodzę, widzę wiele łatek od różnych programistów próbujących wprowadzić drobne poprawki. Naprawdę uważam, że brak dokumentacji sprzyja tego rodzaju łatkom i brakowi zrozumienia systemu w szerokim tego słowa znaczeniu. moje pytanie brzmi: **Jak możemy zrównoważyć dokumentację, aby promować ciągłą wiedzę w zespole, a jednocześnie być szybkim i skutecznym?**


title: Nowoczesna implementacja wzorca tablicy w Javie?

text: Czy jest miejsce na praktyczną, nowoczesną aplikację w Javie wzorca tablicy opisanego w **"Pragmatic Programmer"**? Czy istnieje jakaś konkretna biblioteka, która stara się pomóc w realizacji tej koncepcji? Jaka jest ogólna zgoda co do tego wzorca w obecnej społeczności oprogramowania (zwłaszcza Java)? Choć pomysł jest intrygujący, mam wrażenie, że ta część książki może być nieaktualna. Jeśli nie znasz tej koncepcji: http://flylib.com/books/en/1.315.1.55/1/


title: Jaki jest najbardziej uprzejmy sposób obsługi zależności bibliotek podczas hostowania kodu online?

text: Załóżmy, że napisałeś fajną bibliotekę JavaScript, która wymaga jQuery i chcesz hostować ten projekt na github. Czy dołączasz źródło jQuery do swojego projektu? Czy kierujesz użytkowników do linku do pobrania jQuery?


title: Jak zarządzać krótkoterminowymi preferencjami użytkownika, aby uprościć czyszczenie danych?

text: Wdrażając nową funkcję, czasami warto powiadomić użytkownika końcowego, co to jest, i dać mu możliwość wyrażenia opinii, czy oprogramowanie powinno skłonić go do „spróbowania czegoś nowego” lub „odłożyć to”. ![Nowa funkcja Gmaila, „Wypróbuj teraz”, „Nie teraz”](http://i.stack.imgur.com/6jWVc.png) Jak należy zarządzać takimi danymi preferencji użytkownika w oprogramowaniu w chmurze? Niewielka informacja musiałaby być przechowywana, aby zapisać preferencję, ale ostatecznie staje się ona nieistotna. (Stary sposób jest wycofywany.) Prostą rzeczą do zrobienia jest po prostu pozostawienie tam tych danych. W końcu nie zajmuje dużo miejsca. W końcu, w miarę pojawiania się i znikania większej liczby funkcji i zmian, a także dodawania, odrzucania i usuwania kolejnych wiadomości; w magazynie danych znajdowałoby się wiele elementów, które nie są już używane, a zachowanie lub oddzielenie tych danych wiązałoby się z kosztami w postaci godzin pracy programisty. Czy istnieją wzorce kodowania i konserwacji oprogramowania, które miałyby sens, aby pozbyć się starych struktur danych wraz z usuwaniem starych funkcji? Czy istnieje wspólne rozwiązanie tego czyszczenia danych?


title: Rozróżnienie między API a frontend-backend

text: Próbuję napisać "standardową" witrynę biznesową. Mówiąc „standard”, mam na myśli, że ta strona uruchamia zwykły HTML5, CSS i JavaScript dla front-endu, back-end (do przetwarzania rzeczy) i uruchamia MySQL dla bazy danych. To podstawowa strona CRUD: front-end po prostu robi ładne to, co baza danych ma w zanadrzu; backend zapisuje do bazy danych wszystko, co wprowadzi użytkownik i wykonuje pewne przetwarzanie. Tak jak większość witryn. Tworząc moje repozytoria Github, aby rozpocząć kodowanie, zdałem sobie sprawę, że nie rozumiem różnicy między _front-end back-end_ i _API_. Innym sposobem sformułowania mojego pytania jest: **gdzie API pojawia się na tym obrazie?** Zamierzam podać więcej szczegółów, a następnie mam pytania - mam nadzieję, że da wam to lepsze wyobrażenie o tym, jakie jest moje rzeczywiste pytanie , ponieważ jestem tak zdezorientowany, że nie wiem, jakie pytanie zadać. Więcej szczegółów: * Chciałbym wypróbować wzorzec Model-View-Controller. Nie wiem, czy to zmienia pytanie/odpowiedź. * API będzie RESTful * Chciałbym, aby mój back-end używał mojego własnego API zamiast pozwalać back-endowi na oszukiwanie i wywoływanie specjalnych zapytań. Myślę, że ten styl jest bardziej spójny. Moje pytania: * Czy front-end wywołuje back-end, który wywołuje API? A może front-end po prostu wywołuje API zamiast wywoływać back-end? * Czy back-end po prostu wykonuje API, a API zwraca kontrolę do back-endu (gdzie back-end działa jako ostateczny kontroler, delegując zadania)? Zachęcamy do długich i szczegółowych odpowiedzi wyjaśniających rolę API wraz z frontendowym back-endem. Jeśli odpowiedź zależy od modelu programowania (modele inne niż wzorzec Model-View-Controller), proszę opisać te inne sposoby myślenia o API. Dziękuję. Jestem bardzo zmieszany.


title: XML/HTML: Czy potrzebujemy nazwy elementu w tagach zamykających?

text: W porównaniu z innymi językami serializacji, jednym z głównych zarzutów pod adresem XML jest jego gadatliwość; JSON jest bardziej zwięzły i czytelny w większości przypadków, ale nie we wszystkich. Ale wydaje mi się, że moglibyśmy zmniejszyć nadmiar XML po prostu usuwając nazwy z tagów zamykających. Przy prawidłowych wcięciach czytelność nie powinna stanowić problemu (jeśli mnie o to pytasz, powinna to być poprawa), a ponieważ nie są one wymagane strukturalnie, każdy przyzwoity edytor/przeglądarka XML może być z łatwością usunięty/ukryty lub dodany. **W związku z tym te dwa formaty powinny być całkowicie równoważne i wymienne.** Porównaj poniższe (źródło zaczerpnięte z http://www.w3schools.com/xml/simple.xml): <śniadanie_menu> <jedzenie> <nazwa> Belgijskie Gofry</name> <cena>5,95 USD</price> <description> Dwa nasze słynne belgijskie gofry z dużą ilością prawdziwego syropu klonowego </description> <kalorii>650</kalorii> </food> <food> <name >Belgijskie gofry truskawkowe</name> <cena>7,95 USD</cena> <description> Lekkie gofry belgijskie z truskawkami i bitą śmietaną </description> <kalorii>900</kalorii> </jedzenie> <jedzenie> <name> Berry-Berry Belgijskie Gofry</name> <cena>8,95 USD</cena> <description> Lekkie belgijskie gofry pokryte asortymentem świeżych jagód i śmietanka </description> <kalorie>900</kalorii> </jedzenie> <jedzenie> <name>Tosty francuskie</name> <cena>4,50 USD</cena> <description> Grube kromki z naszego domowego chleba na zakwasie < /description> <kalorie>600</kalorii> </food> <jedzenie> <name>Śniadanie w stylu domowym</name> <cena>6,95 USD</cena> <description> Dwa jajka, bekon lub kiełbasa, tosty i nasz -popularne placki ziemniaczane </description> <kalorii>950</kalorii> </jedzenie> </śniadanie_menu> i <śniadanie_menu> <jedzenie> <name>Belgijskie gofry</> <cena>5,95$</> <description>Dwa naszych słynnych belgijskich gofrów z dużą ilością prawdziwego syropu klonowego </> <calories>650</> </> <food> <na me>Belgijskie gofry truskawkowe</> <cena>7,95 USD</> <description> Lekkie gofry belgijskie z truskawkami i bitą śmietaną </> <kalorie>900</> </> <food> <name>Berry-Berry Belgian Gofry</> <cena>8,95 USD</> <description> Lekkie belgijskie gofry pokryte asortymentem świeżych jagód i bitej śmietany </> <kalorii>900</> </> <food> <name>Francuskie tosty</> > <price>4,50 USD</> <description> Grube kromki z naszego domowego chleba na zakwasie </> <kalorii>600</> </> <food> <name>Śniadanie w stylu domowym</> <price>6,95 USD</> <description> Dwa jajka, bekon lub kiełbasa, tosty i nasze zawsze popularne placki ziemniaczane </> < kalorie>950</> </> </>


title: Jak przenieść kod msvc++ z niezależnymi nazwami w szablonach do systemu Linux?

text: Potrafię zajmować się przenoszeniem funkcji zależnych od platformy. Mam problem, że kompilatory, które wypróbowałem na Linuksie (clang i g++) nie akceptują następującego kodu, podczas gdy kompilator msvc++ robi: template <klasa T> class Base { protected: T Value; }; template <klasa T> class Derived : public Base<T> { public: void setValue(const T& inValue){ Value = inValue; } }; int main(int argc, char const *argv[]) { Pochodne<int> tmp; tmp.setValue(0); zwróć 0; } g++ error: main.cpp: W funkcji składowej 'void Derived<T>::setValue(const T&)': main.cpp:11:3: error: 'Wartość' nie została zadeklarowana w tym zakresie. użycie nazwy niezależnej ("Wartość") w drugiej klasie. Więcej informacji. Problem w tym, że mam bardzo dużą bazę kodu, w której tego typu kod jest używany bardzo często. Rozumiem, że patrząc na standard jest źle. Jednak bardzo wygodnie jest nie pisać `this->` lub `Base<T>::` przed każdym użyciem `Value`. Nawet pisanie `używając Base<T>::Value;` na początku klasy pochodnej jest problematyczne, gdy używasz ~20 elementów klasy bazowej. Więc moje pytanie brzmi: czy są kompilatory dla Linuksa, które pozwalają na ten rodzaj kodu (z dodatkowymi przełącznikami kompilatora lub bez)? A może są **małe** modyfikacje, które pozwolą na kompilację tego kodu na Linuksie?


title: Wzorce dla drzewa trwałych danych z wieloma opcjami przechowywania?

text: Mam problem ze świata rzeczywistego, który postaram się streścić w ilustracyjnym przykładzie. Wyobraź sobie więc, że mam obiekty danych w drzewie, gdzie obiekty nadrzędne mają dostęp do dzieci, a dzieci do rodziców: // Interfejsy interface IParent<TChild> { List<TChild> Children; } interfejs IChild<TParent> { TParent Parent; } // Klasy class Top : IParent<Middle> {} class Middle : IParent<Bottom>, IChild<Top> {} class Bottom : IChild<Middle> {} // Użycie var top = new Top(); var middles = top.Dzieci; // List<Middle> foreach (var middle in middles) { var bottoms = middle.Children; // List<Bottom> foreach (var bottom na dole) { var middle = bottom.Parent; // Uzyskaj dostęp do rodzica var top = middle.Parent; // Uzyskaj dostęp do dziadka } } Wszystkie trzy obiekty danych mają właściwości, które są utrwalane w dwóch magazynach danych (np. bazie danych i usłudze sieciowej) i muszą odzwierciedlać i synchronizować się z magazynami. Niektóre obiekty tylko żądają od usługi sieciowej, inne tylko do niej zapisują. **Data Mapper** Moim ulubionym wzorcem dostępu do danych jest Data Mapper, ponieważ całkowicie oddziela on same obiekty danych od komunikacji z magazynem danych: class TopMapper { public Top FetchById(int id) { var top = new Top(DataStore .TopDataById(id)); top.Children = MiddleMapper.FetchForTop(Na górze); powrót Góra; } } class MiddleMapper { public Middle FetchById(int id) { var middle = new Middle(DataStore.MiddleDataById(id)); middle.Parent = TopMapper.FetchForMiddle(środek); middle.Children = BottomMapper.FetchForMiddle(bottom); powrót środek; } } W ten sposób mogę mieć jeden program mapujący na magazyn danych i skompilować obiekt z mapowania, którego chcę, a następnie zapisać go z powrotem za pomocą programu mapującego, którego chcę. Jest tutaj odwołanie cykliczne, ale myślę, że to nie jest problem, ponieważ większość języków może po prostu przechowywać odniesienia pamięci do obiektów, więc nie będzie tak naprawdę nieskończonych danych. Problem polega na tym, że za każdym razem, gdy chcę skonstruować nowe `Góra`, `Środek` lub `Dół`, muszę zbudować całe drzewo obiektów we właściwości `Parent` lub `Children`, ze wszystkimi danymi żądania przechowywania i związane z tym wykorzystanie pamięci. A w rzeczywistości moje drzewo jest znacznie większe niż to przedstawione tutaj, więc to jest problem. **Żądania w obiekcie** W tym przypadku obiekty żądają swoich `Rodzic` i `Dzieci`: class Middle { private List<Bottom> _children = null; // cache public List<Bottom> Children { get { _children = _children ?? BottomMapper.FetchForMiddle(to); zwróć _dzieci; } set { BottomMapper.UpdateForMiddle(to, wartość); _dzieci = wartość; } } } Myślę, że jest to przykład wzorca repozytorium. Czy to jest poprawne? To rozwiązanie wydaje się zgrabne - dane są pobierane z magazynu danych tylko wtedy, gdy ich potrzebujesz, a następnie są przechowywane w obiekcie, jeśli chcesz o nie poprosić ponownie, unikając kolejnych żądań. Mam jednak dwa różne źródła danych. Jest baza danych, ale jest też usługa sieciowa i muszę być w stanie utworzyć obiekt z usługi sieciowej i zapisać go z powrotem w bazie danych, a następnie zażądać go ponownie z bazy danych i zaktualizować usługę sieciową. To również sprawia, że czuję się nieswojo, ponieważ same obiekty danych nie są już nieświadome źródła danych. Wprowadziliśmy nową zależność, nie wspominając o zależności kołowej, co utrudnia testowanie. A obiekty teraz maskują swoją komunikację z bazą danych. **Inne rozwiązania** Czy są jakieś inne rozwiązania, które mogłyby rozwiązać problem wielu sklepów, ale jednocześnie oznaczać, że nie muszę za każdym razem tworzyć / żądać wszystkich danych?


title: Przechowuj dane dla wielu typów użytkowników

text: Tworzę aplikację, w której cztery typy użytkowników współdzielą ten sam moduł. Czy więc dobrym pomysłem jest stworzenie: 1. jednej tabeli i user_type i user_id (coś w tym rodzaju) 2. przedrostków tabeli w zasadzie 4 tabel różnic z tych samych kolumn 3. własnej sugestii (pamiętając, że jest to aplikacja CakePHP, więc łączy się i zawiera tam będzie)


title: Narzędzia do tworzenia specyfikacji/wymagań i zarządzania nimi (nie do śledzenia biletów)

text: Jestem zainteresowany, czy istnieją jakieś strony internetowe lub oprogramowanie, które pomogą w początkowym projektowaniu projektu, a następnie zarządzaniu projektem projektu w miarę wdrażania funkcji, znajdowania błędów itp. Mój projekt będzie zawierał wymagania (funkcjonalne i niefunkcjonalne), przypadki użycia i podstawowy projekt schematu bazy danych. Najbardziej pożądana funkcja: * Możliwość definiowania wymagań i śledzenia ich zmian w czasie (np. czym wersja 1.5 różni się od 1.0?) Ciekawe rzeczy: * Możliwość współpracy z innymi kierownikami projektów i zespołem podczas tworzenia specyfikacje Czego _nie_ szukam: * Urządzenia do śledzenia biletów (JIRA, fogbugz, itp...) * Systemy kontroli wersji oprogramowania * Wiki (chyba że są zbudowane z myślą o zarządzaniu wymaganiami) Dzięki.


title: Frameworki PHP, które nie używają kontrolera frontowego?

text: Tak jak mówi tytuł, czy są jakieś frameworki aplikacji internetowych PHP, które nie używają kontrolera frontowego? > Front Controller Pattern to wzorzec projektowy oprogramowania wymieniony w kilku > katalogach wzorców. Wzorzec dotyczy projektowania aplikacji internetowych. To > „zapewnia scentralizowany punkt wejścia do obsługi wniosków”. > > Kontroler frontowy może być zaimplementowany jako obiekt Java lub jako skrypt > w języku skryptowym, takim jak PHP, ASP, CFML lub JSP, który jest wywoływany przy > każdym żądaniu sesji internetowej. Ten skrypt, na przykład index.php, obsługuje wszystkie > zadania, które są wspólne dla aplikacji lub frameworka, takie jak obsługa sesji >, buforowanie i filtrowanie danych wejściowych. W oparciu o konkretne żądanie > następnie tworzyłby kolejne obiekty i wywoływał metody do obsługi > konkretnego wymaganego zadania (zadań). >> Alternatywą dla kontrolera frontowego byłyby pojedyncze skrypty, takie jak > login.php i order.php, z których każdy spełniałby rodzaj żądania. > Każdy skrypt musiałby powielić kod lub obiekty, które są > wspólne dla wszystkich zadań. Ale każdy skrypt może mieć również większą elastyczność w realizacji > konkretnego wymaganego zadania.


title: Badania schematów kolorów z podświetlaniem składni

text: Większość programistów ma własne preferencje dotyczące schematów kolorów z podświetlaniem składni, ale zastanawiałem się, czy ktoś kiedykolwiek przeprowadził rzeczywiste badania naukowe na temat najlepszego schematu kolorów? Wyobrażam sobie, że takie badanie dotyczyłoby takich rzeczy jak czytelność kodu, czy wzrok programisty przyciągają najważniejsze części itp. Być może zostało to już zrobione dla czegoś w rodzaju domyślnego motywu Visual Studio, ale chciałbym wiedzieć, czy są dostępne publicznie dostępne badania i co udało się znaleźć.


title: Czy możesz zarządzać swoim czasem, a jeśli tak, to czy czasem go nadużywasz?

text: Tytuł jest nieco niejasny, więc pozwólcie, że rozwinę: rozwijam zarówno sprzęt, jak i oprogramowanie, i jestem w sytuacji, w której otrzymuję listę „dużych” zadań/projektów do wykonania, ale nie regularnie. Czasami w ciągu miesiąca jest 10 nowych rzeczy do zrobienia, innym razem miesiące mijają bez żadnych prawdziwych terminów. Łączy się to z „małymi” zadaniami/projektami/błędami, które są niezwykle pilne. W zasadzie nikt poza mną nie jest w stanie decydować, ile czasu poświęcam na co i kiedy to robię: podstawowa filozofia brzmi: „robisz, co chcesz, kiedy chcesz, po prostu upewnij się, że to, co jest pilne lub mieć termin zrealizowania na czas”. Po pierwsze chciałbym usłyszeć od innych, czy pracują w podobnym środowisku? Powodem, dla którego pytam, jest to, że nie znam osobiście wielu innych programistów, a ci, z którymi rozmawiam, są bardziej w typowej pracy „od 9 do 5”, a ich czasem zarządzają, erm, menedżerowie. Po drugie, dla tych, którzy znajdują się w takiej sytuacji, czy kiedykolwiek zdarzyło Ci się spędzać dużo czasu na czymś, co nie było naprawdę konieczne, w ten sposób nadużywając swojej wolności? Podam kilka przykładów: około rok temu spędziłem co najmniej miesiąc na pisaniu aplikacji typu build server, by w zeszłym miesiącu porzucić ją na rzecz Hudsona. Co znowu zajęło kilka dni, aby skonfigurować. Czasami tracę ogromną ilość czasu na refaktoryzację podstawowej biblioteki po raz dziesiąty, chociaż nie jest to naprawdę potrzebne. Kiedyś spędziłem tygodnie na studiowaniu tajników filtrów cyfrowych, podczas gdy prawdziwym zadaniem było stworzenie podstawowego filtra pasmowoprzepustowego, który każdy prawdopodobnie mógłby zrobić w ciągu jednego dnia. Potem zmieniłem zdanie i mimo wszystko poszedłem na analogową implementację. Podziel się podobnymi historiami.


title: Najbardziej elastyczny framework UI dla punktu końcowego Windows?

text: Mam za zadanie zaprojektować i zaimplementować elastyczne rozwiązanie interfejsu użytkownika do wdrożenia w serii "kioskowych" punktów końcowych systemu Windows. Trwa debata na temat tego, co jest uważane za najlepsze rozwiązanie technologiczne dla samego interfejsu użytkownika. Wymagania to: * Musi być z akceleracją sprzętową * Musi odtwarzać wideo WMV (ze względów licencyjnych) * Musi mieć możliwość zmiany skórek/motywów. * Musi obsługiwać renderowanie poza ekranem.


title: Jak radzić sobie ze złą wersją oprogramowania jako SCM?

text: Zostałem poproszony o stanowisko SCM (Software Configuration Manager) w mojej firmie. Przeczytałem dokumentację online, aby dowiedzieć się, czym jest SCM, czym zajmuje się SCM itp. Obecnie firma pracuje z systemem kontroli wersji (Bazaar), więc oprogramowanie jest poprawnie wersjonowane, ale są stare programy, które nie są dobrze wersjonowane ( niektóre z nich w ogóle nie są wersjonowane), niektóre z nich są w CVS, starym systemie kontroli wersji używanym na początku, ale nie są aktualizowane. Proszę o pomoc, opierając się na doświadczeniu bardziej niż na informacjach teoretycznych, aby wiedzieć jak sobie z tym poradzić, jak być dobrym SCM nawet we wszystkich tych kwestiach.


title: Jakie prace programistyczne byłyby najlepsze dla matematyka?

text: Jestem profesorem matematyki, który traci pracę, i próbuję zdobyć umiejętności programistyczne, ponieważ w dzisiejszych czasach nie ma zbyt wielu prac akademickich. Czy istnieją określone rodzaje prac programistycznych, nad którymi powinienem pracować, aby wykorzystać mój doktorat z matematyki? Jakie konkretne umiejętności powinienem starać się zdobyć na te stanowiska? **Aktualizacja, 6 miesięcy później:** Dla tych, którzy są ciekawi, wybrałem ścieżkę certyfikacji i to zadziałało dla mnie. Nauczyłem się Javy, potem studiowałem do testu SCJP, potem dostałem pracę, która technicznie jest stażem, ale na pełny etat i porównywalnie opłaca się być profesorem matematyki w prywatnej szkole z trudnymi finansami. Polecam certyfikaty każdemu bez dyplomu CS lub doświadczenia IT, to najszybszy i najtańszy sposób na uzyskanie _coś_ celu w swoim CV.


title: Na co chcielibyście zwrócić uwagę projektanci języków?

text: Celem tego pytania nie jest zebranie listy funkcji języka programowania, bez których nie możesz żyć lub chciałbyś, aby był w twoim głównym języku. Celem tego pytania jest ujawnienie zakamarków projektowania języka, o których większość projektantów języków może nie myśleć. Więc zamiast myśleć o funkcji języka X, zastanów się trochę bardziej filozoficznie. Jedną z moich stronniczości, być może kontrowersyjną, jest to, że bardziej miękka strona inżynierii – dlaczego i co fors – jest wielokrotnie ważniejsza niż bardziej konkretna strona. Na przykład Ruby został zaprojektowany z określonym celem poprawy zadowolenia programistów. Chociaż twoje opinie mogą być mieszane, czy to się udało, czy nie, fakt, że był to cel, oznacza, że niektóre wybory w projektowaniu języka były pod wpływem tej filozofii. **Proszę nie publikować:** * Wojny płomieni składni. Spójrzmy prawdzie w oczy, mamy swoje preferencje, a składnia jest ważna, ponieważ dotyczy projektowania języka. Chcę tylko uniknąć epickich bitew natury emacs vs. VI (o których wielu ludzi w dzisiejszych czasach nic nie wie). * Komentarze typu „Każdy język, który nie ma funkcji X, nie zasługuje na istnienie”. Istnieje co najmniej jeden powód istnienia wszystkich języków programowania – dobry lub zły. **Proszę _zrobić_ post:** * Filozoficzne idee, za którymi projektanci języków wydają się tęsknić. * Koncepcje techniczne, które wydają się być słabo wdrażane częściej niż nie. Podaj przykład bólu, jaki powoduje i jeśli masz jakieś pomysły na to, jak chciałbyś, aby działał. * Rzeczy, które chcesz, aby znajdowały się we wspólnej bibliotece platformy, ale rzadko są. Po pierwsze, rzeczy, które zwykle znajdują się we wspólnej bibliotece, a których nie chcesz. * Funkcje koncepcyjne, takie jak wbudowana obsługa testów/potwierdzeń/kontraktów/błędów, które wszystkie języki programowania powinny poprawnie zaimplementować i poprawnie zdefiniować. Mam nadzieję, że będzie to zabawny i stymulujący temat. **Edytuj:** Wyjaśniłem, co mam na myśli przez Syntax Flame Wars. Nie staram się unikać wszelkich dyskusji na temat składni, szczególnie dlatego, że składnia jest podstawową częścią projektowania języka programowania.


title: OOP w C: które z tych dwóch podejść jest bliższe rozwiązaniu kanonicznemu?

text: Oto dwa podejścia do pisania obiektów OOP (jak w „mamy obiekty i możemy utworzyć ich dowolną liczbę, z których każdy ma swoje własne dane”). Język to C, a platforma jest osadzona na gołym metalu. Po prostu, co jest lepsze. Czy którekolwiek z tych dwóch podejść jest w ogóle sensowne? A może jest trzeci, kanoniczny sposób na zrobienie tego w C? ## Podejście I: Module.c struct input{}; struct wyjścia{}; struct notatnik{}; struct module{ struct dane wejściowe i; struct wyjścia o; struct notatnik prywatny; } main.c main(){ struct module obj; module_init(obj); module_do_fancy_stuff(obj); } ## Podejście II: Module.c #define OBJ_COUNT 5 struct inputa{}; struct wyjścia{}; struct notatnik{}; struct module{ struct dane wejściowe i; struct wyjścia o; struct notatnik prywatny; } statyczny moduł struktury obj[OBJ_COUNT]; main.c #define COOL_MODULE 3 #BORING_MODULE 4 main(){ module_init(); module_do_fancy_stuff(COOL_MODULE); }


title: Dlaczego VB.NET nie zezwala na używanie nienazwanych, jednowierszowych obiektów?

text: Dlaczego nie jest to dozwolone w VB.NET: New SqlCommand("jakiś ciąg", jakiśSqlConnection).ExecuteNonQuery() Dlaczego język został zaprojektowany tak, aby wymagał użycia tego zamiast: Dim com As New SqlCommand("jakiś ciąg" , someSqlConnection) com.ExecuteNonQuery() Nie wydaje mi się, żeby wdrożenie zajęło dużo czasu. Czy się mylę? Czy jest jakaś teoretyczna korzyść, jaką dałoby to językowi? **EDYTUJ** Proszę przeczytać: Myślałem, że ta funkcja języka nie jest obsługiwana w VB.NET. Zapomniałem, że używałem go w przeszłości, więc gdy linie takie jak pierwsza powyżej się zepsują, nie spodziewałem się, że będzie to obejście, jak w przyjętej odpowiedzi. ...Chociaż, patrząc wstecz, wydaje się, że jest problem z wykonaniem tego, gdy jest wyłączony w wierszu kodu i nie jest używany jako argument funkcji lub coś takiego. Założę się, że to prawdopodobnie część, dlaczego pierwotnie to opublikowałem. Zastanawiam się, dlaczego to w szczególności nie byłoby dozwolone, ale zadaję pytanie na SO, aby sprawdzić, czy istnieje podobne obejście tego ... To jest _nie_ pytanie o to, jak używać nienazwanych obiektów w jednym wierszu ; to było pytanie, dlaczego projektant języka celowo rezygnuje z takiej funkcji w języku takim jak ten. Czy odrzucenie tej funkcji miało jakąś zaletę językową, czy może po prostu zajęłoby to nieoczekiwanie dużo czasu? Zaszło nieporozumienie, ale to nie zmienia konceptualnego charakteru pierwotnego pytania i nie zmienia faktu, że poszukiwano logicznego powodu, by pominąć taką cechę. Najważniejsze jest to: jest to strona poświęcona „konceptualnym pytaniom dotyczącym tworzenia oprogramowania”. To niemal natychmiast implikuje śladowe ilości opinii, subiektywizmu, itp. - co konkretnie zanotowano w tej samej fladze, pod którą postawiono to pytanie. Zasadą jest, aby nie popychać tego za daleko, a moje pytanie nie. Proszę usunąć flagę. Dziękuję Ci.


title: Optymalna struktura organizacyjna dla IT?

text: Istnieje wiele podejść do tego, jak ustrukturyzować sklep IT firmy, aby lepiej odpowiadał potrzebom podstawowej działalności. W moim scenariuszu rozwój dostępu internetowego i mobilnego ma kluczowe znaczenie dla potrzeb organizacji, o której myślę. Jest skonstruowana w taki sposób, że rozwój jest wykonywany przez jedną grupę pszczół robotnic, inną dla utrzymania, inną do testowania itd. itp. Wydaje się, że ta struktura ma tendencję do poddawania się wrogom, ponieważ każdy obszar ma swoją własną miarę tego, czym jest sukces : Rozwój --> Czas na wprowadzenie na rynek --> Stabilność środowiska Testowanie --> Upewnianie się, że nie dostaną lanie, jeśli coś pójdzie nie tak. Istnieje wiele innych grup organizacyjnych (z braku lepszego określenia) dla analityków, kierowników projektów, projektantów itp. W idealnym świecie grupy te tworzyłyby wzajemne mechanizmy kontroli i równowagi, ale ostatecznie priorytet niezmiennie otrzymuje TTM , czasami ze szkodą dla innych graczy. Stwarza to wiele napięć za każdym razem, gdy pojawiają się wydania, ponieważ jako MO dominuje postawa „przerzucania kodu przez mur”. Jakie inne struktury organizacyjne zaobserwowałeś w przemyśle, które lepiej nadają się do większego poczucia spójności wśród graczy?


title: Najskuteczniejszy sposób na zwiększenie pensji programisty poza samą pracą?

text: Jeśli masz czas i zasoby, jaki byłby najskuteczniejszy sposób na zwiększenie wynagrodzenia jako pełnoetatowego _programisty_ , poza samą pracą? Przez „wynagrodzenie” rozumiem tutaj pensję (dostosowaną do kosztów utrzymania lokalizacji) pochodzącą z _pojedynczej_ pracy programistycznej.


title: Pomoc w znalezieniu dobrej dokumentacji dla C/C++?

text: Programowałem w Javie, PHP, C# i trochę w C na kursie OS, który ostatnio odbyłem na studiach. Dla wszystkich tych języków znalazłem przyzwoitą dokumentację z wyjątkiem C. Nie mogłem znaleźć dobrego źródła. Jakieś pomysły ?


title: W jaki sposób menedżer nietechniczny dodaje wartości zespołowi zmotywowanych programistów?

text: Widzę wielu programistów odchodzących od funkcji kierowniczych i administracyjnych. Chcą budować rzeczy. W rezultacie wiele z tych stanowisk jest obsadzanych przez osoby nietechniczne. Nie widzę, jak dodają wartości. Czy planowanie spotkań, rezerwacja wyjazdów i inne prace administracyjne są wystarczające, aby uzasadnić ich rolę? **Edytuj:** Dziękujemy za wspaniałe odpowiedzi. Wiem, że szczegóły administracyjne są ważne, ale dlatego mamy dedykowany zespół HR, zespoły rekrutacyjne i inne zespoły dedykowane do wspierania programistów. Różni się to od zajmowania ważnego stanowiska przez menedżera nietechnicznego.


title: Pomoc w podjęciu decyzji o podejściu/języku aplikacji internetowej

text: Mam własny projekt - aplikację internetową, którą chciałem stworzyć - ale nie wiem, którą drogą wybrać. Znam się trochę na programowaniu i parałem się Pascalem, C, HTML, CSS i Actionscript (dla Flasha). I nie mam nic przeciwko uczeniu się nowego języka (PHP, Python, mySQL itp.). Nie mam ograniczeń czasowych. **O aplikacji:** Najlepiej mogę to opisać jako rodzaj systemu eksperckiego (ale nie AI), który musi znaleźć najlepszy przepływ pracy dla procesu, biorąc pod uwagę zestaw parametrów początkowych i końcowych. Np. „kapsuła” danych musi przejść przez wiele „narzędzi” lub „środowisk”, aby osiągnąć pożądany wynik — coś w rodzaju bardzo skomplikowanej myjni samochodowej. Załóżmy, że istnieje wiele narzędzi, które można wykorzystać na różnych etapach procesu. Szacuję, że obecnie jest co najmniej 500 narzędzi i z pewnością będzie się rozwijało w przyszłości, gdy pojawią się nowsze narzędzia. Istniejące narzędzia również będą miały aktualizacje wersji. Każde narzędzie ma średnio co najmniej 100 właściwości, które definiują narzędzie. Niektóre z nich mają aż 1000 unikalnych właściwości. Niektóre z tych narzędzi są ze sobą powiązane – np. jeśli wybrane jest jedno narzędzie, tylko n narzędzi może mu odpowiadać w kolejnym kroku procesu. Mam też problem z „dopasowaniem” narzędzi do analizy. Np. Narzędzie A może mieć tylko trzy stałe obroty - 100, 200 i 500, ale narzędzie B może mieć obroty od 20 do 2000. Nie jestem pewien, jak mogę zbudować bazę danych bez przeliterowania każdej liczby, jak w powyższym przykładzie. Całkowitą liczbę narzędzi potrzebnych do procesu można zdefiniować na początku, jednak będzie się to zmieniać wraz ze wzrostem złożoności aplikacji w przyszłości. Planuję zająć się każdą ewentualnością w tym procesie. Chodzi o to, że jeśli użytkownik wprowadzi początkowe parametry i pożądany wynik (kolejny zestaw parametrów), aplikacja musi znaleźć „najlepszą” ścieżkę – coś w rodzaju drzewa decyzyjnego. Najlepsza ścieżka może być najszybsza, najtańsza itp. Chciałbym, aby użytkownik wybrał to, co jest dla niego najlepsze. Niestety, parametry mogą się zmieniać, relacje mogą się zmieniać (ale nie regularnie) - „reguły”, których będę używał, mogą zostać zmienione w celu uzyskania większej dokładności przewidywania. Muszę również śledzić ścieżkę i rozwiązania każdego użytkownika na przyszłość (ale żadnych danych osobowych poza nazwą użytkownika i adresem e-mail do logowania). Może, gdy aplikacja jest już uruchomiona, chciałbym, aby była bardziej demokratyczna, a użytkownicy przyczyniliby się do udoskonalenia zaangażowanej logiki/reguł. Jeśli to możliwe, chciałbym, aby aplikacja wyświetlała na końcu graficzny schemat blokowy pokazujący przepływ pracy ze wszystkimi narzędziami pogrupowanymi w łatwy do zrozumienia układ. **Moje pytania:** 1. Czy aplikacja będzie lepiej obsługiwana z relacyjną bazą danych, taką jak mySQL lub baza danych Object? 2. Czy mogę to zrobić z PHP+AJAX+CSS+mySQL? Czy istnieje lepsza alternatywa? Wolałbym darmowe programy — zamierzam, aby ta aplikacja była darmowa, ale może później zechcę ją komercyjnie. Potrzebuję tego programu do działania na dowolnym urządzeniu, które może łączyć się z Internetem, w tym tabletami i telefonami komórkowymi itp. 3. Czy potrzebuję frameworka? CodeIgniter/Symfony vs Django/ZOPE? Jaki jest dla mnie najlepszy sposób na rozpoczęcie, biorąc pod uwagę, że być może będę musiał zwiększyć skalę w przyszłości – z większą ilością danych, większą liczbą jednocześnie zalogowanych użytkowników i większą liczbą algorytmów? Nie chcę później zmieniać rozwiązań - jeśli mam zainwestować czas i wysiłek, wolę robić to we właściwy sposób od początku. Byłbym wdzięczny za każdą pomoc w rozpoczęciu pracy. Z góry dziękuję.


title: Co to znaczy „promować” plik?

text: Słyszę ten termin w biurze i wiem, że ma on znaczenie dla cyklu życia oprogramowania. Co oznacza „promować”? Kontekst: m.in. promować plik.


title: Gdzie wyświetlać komunikaty o prawach autorskich?

text: W mojej aplikacji na Androida używam kilku bibliotek open source. Jedynym wymogiem, jaki mają te biblioteki, jest umieszczenie w mojej aplikacji informacji o prawach autorskich. Próbuję zrozumieć, gdzie zwykle wyświetla się prawa autorskie osób trzecich. Prawdopodobnie mógłbym utworzyć pozycję menu „O” i wyświetlić okno dialogowe „Informacje”, zawierające wszystkie wymienione prawa autorskie. Jednak byłbym wdzięczny za opinie na temat standardowej praktyki.


title: Dlaczego większość ludzi zmienia się z wykonawcy na pełny etat w moich firmach, a nie na odwrót?

text: Widziałem, jak większość ludzi zmieniła się z wykonawcy na pełnoetatowego pracownika, ale nie na odwrót. I tak było w przypadku startupów, które miały może 20% szans na IPO lub przejęcie, i innych, które miały może 50% szans. O ile mi wiadomo, stawka (nawet dla projektanta grafiki lub programisty z 3 letnim doświadczeniem) może wynosić od 75 do 80 dolarów za godzinę. Podczas gdy programista z 15-letnim doświadczeniem może otrzymać 120 000 USD rocznie. Tak więc programista z 15-letnim doświadczeniem w programowaniu zarabia 10 000 USD miesięcznie. W tym samym czasie programista z 3 letnim doświadczeniem lub grafik dostanie 14 000 USD miesięcznie (80 USD x 22 dni x 8 godzin). Wiem, że muszę wykupić własne ubezpieczenie, ale nie wyobrażam sobie kupowania ich za 4000 dolarów miesięcznie... może 200, najwyżej 300 dolarów. Prawdopodobnie muszę płacić Ubezpieczenia Społeczne (FICA) w obie strony (ja i jako samozatrudniony = 210 $ x 2), ale i tak każdego miesiąca będzie dodatkowe 3000 $ dochodu. Czy powyższe obliczenia są poprawne? Ale najczęściej widzę kontrahentów, którzy chcą lub stają się pełnoetatowymi, ale nie pełnoetatowych pracowników, którzy stają się wykonawcami. Czy ktoś wie, jaki jest powód?


title: Elastyczne / dynamiczne tworzenie obiektów lub alternatywa dla listy list

text: Mam plik xlsx, który ma kilka zakładek z różnymi danymi. Chcę mieć możliwość zapisania każdego wiersza karty na liście. Pierwsze, co przychodzi mi do głowy, to lista list, ale zastanawiałem się, czy istnieje inny sposób. Chciałbym zapisać te informacje w obiekcie, ze wszystkimi jego zaletami, ale nie mogę wymyślić sposobu generowania/tworzenia tak różnorodnych obiektów w locie. Dane w xlsx są zróżnicowane i idealnie, że program jest niezależny od jakichkolwiek treści. Więc zamiast np. utwórz listę dla każdego wiersza, a następnie umieść tę listę na innej liście dla każdej karty i każdą kartę na innej liście, chciałbym przechowywać informacje, które reprezentuje każdy wiersz, w jednym obiekcie i po prostu mieć listę różnych obiektów. Pytanie można streścić w następujący sposób: **Jaka jest alternatywa dla listy list?** Mała grafika wizualizująca problem: +--------------------- -----------------------------------------------+ |LISTA | | | | +-------------------+ +------------------+ +--------- --------+ | | | Klasa 1 | | Klasa 2 | | Klasa3 | | | |------------------| |------------------| |-----------------| | | | zmienna1 | | zmienna1 | | var5 | | | | var2 | | var2 | | var6 | | |... | var3 | | | | var7 |...| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------------+ +------------------+ +--------- --------+ | | | +------------------------------------------------- -------------------+


title: Obsługa jednej bazy kodu dla wielu klientów, z własnym niestandardowym kodem

text: Pracuję nad systemem CMS, w którym korzysta z niego wielu klientów, więc kod jest przechowywany na ich serwerach. Każdy klient ma domyślny kod (menedżer użytkowników, menedżer stron itp.), ale każdy klient ma również swój własny zestaw kodu (motywy, skrypty, niestandardowe moduły). Staram się wymyślić sposób na utrzymanie aktualnej bazy kodu dla wszystkich klientów bez konieczności dokonywania każdej pojedynczej zmiany w rdzeniu każdego pojedynczego klienta. Używamy GitHub do kontroli wersji, więc myślałem o tym, aby wszyscy klienci byli różnymi gałęziami, ale jak mogę aktualizować rdzeń z masterem? Czy myślę o tym wszystkim źle? Jakie mam opcje?


title: Nazewnictwo wtyczek oparte na GPL v2

text: Programuję wtyczkę do oprogramowania na licencji GPL v2. Używam unikalnej nazwy dla mojej wtyczki, ale rozważam zmianę jej nazwy. Chciałbym wziąć nazwę innej wtyczki, która została porzucona i nie jest obecnie rozwijana. Czy mogę przyjąć to imię bez wcześniejszego pytania autora o zgodę?


title: Czy nadmierna niebezpośrednia i/lub nadmiarowa enkapsulacja jest uznaną koncepcją?

text: Jestem ciekaw, czy istnieje szereg tendencji lub antywzorców podczas programowania, w których programista zawsze będzie lokalnie przepakowywał zależności zewnętrzne podczas ich używania. Nieco mniej mglistym przykładem może być wykorzystanie implementacji interfejsu lub abstraktu i mapowanie każdego punktu styku lokalnie przed interakcją z nimi. Jak zbyt skomplikowane podejście do kompozycji. Biorąc pod uwagę mój przykład, czy interfejs nie byłby wystarczająco niezawodny i jakakolwiek zmiana w nim nigdy nie byłaby możliwa do pokonania na żadnym poziomie pośrednim? Czy to dobra czy zła praktyka? Czy to może kiedykolwiek posunąć się za daleko? Czy ma właściwą nazwę?


title: Ile Rubiego powinienem się nauczyć przed przejściem na Railsy?

text: Tylko szybkie pytanie.. Ja też nigdy nie mogę uzyskać ostatecznej odpowiedzi podczas wyszukiwania w Google. Niektórzy mówią, że możesz nauczyć się Railsów bez znajomości Rubiego, ale w pewnym momencie natkniesz się na ceglany mur i żałujesz, że nie znasz Rubiego i nie musisz wrócić, aby się go nauczyć. Ruby zanim nauczysz się Railsów, a to znacznie ułatwi Ci życie.. Moja obecna wiedza jest niska. Nie jestem początkującym, ale też nie jestem pro. Przejrzałem internetową książkę Learn Python The Hard Way w około miesiąc, ale przestałem, gdy dotarłem do OOP strony Pythona (znam wartości logiczne, elif/if/else/instrukcje, pętle for, pętle while, funkcje). zgadzam się z nauką "podstaw" Rubiego przed nauką Railsów, ale czym dokładnie są "podstawy" Rubiego? Czy musiałbym nauczyć się całej OOP strony Ruby, zanim przejdę do Railsów? A może po prostu musiałbym nauczyć się składni Rubiego do miejsca, w którym nauczyłem się Pythona (booleans, elif/if/else/instrukcje, pętle for, pętle while, funkcje) przed przejściem do Railsów? Dziękuję!


title: Czy automat stanów ze stanami synonimów powinien być jawnie pokazywany?

text: Jestem nowy w modelowaniu maszyn stanowych i próbując modelować system, mam pytanie. Przykład wyjaśni to lepiej: Rozważmy system, który dzwoni (prawdopodobnie spersonalizowany telefon komórkowy) z możliwymi stanami: **idle->calling->signal-dropping->handle->call ended** **idle-> dzwonienie->problem z systemem operacyjnym->obsługa->połączenie zakończone** **bezczynność->dzwonienie->wyczerpana bateria->obsługa->połączenie zakończone** **bezczynność->połączenie->jakiś inny problem->obsługa->połączenie zakończony** Powyższy przykład ma postać stan1->przejście1->stan2->przejście2->stan3 Pytanie: Czy te stany pośrednie mają znaczenie? Czy powinny być pokazywane/modelowane bezpośrednio w UML, czy nawet w programowaniu? **Uwaga:** Byłoby pomocne, gdyby ktoś mógł wymienić (niektóre istniejące, jeśli dotyczy) termin techniczny używany do opisania tego scenariusza


title: Jakie są zalety myBatis nad Hibernate?

text: Zrobiłem trochę badań na własną rękę i rozumiem podstawową koncepcję. Ale niektóre spostrzeżenia można uzyskać tylko poprzez rzeczywiste doświadczenie. Jakie są zalety myBatis, które sprawiają, że warto nauczyć się nowego frameworka? W jakim przypadku byś nie używał go?


title: Dlaczego nazywa się to wyciekiem pamięci?

text: Jestem programistą hobbystą, trochę pedantem terminologicznym, obecnie uczę się C, a ostatnio natknąłem się na pojęcie _Memory Leak_. Teraz rozumiem, co to znaczy. Pamięć dynamiczna przydzielona do programu nie jest zwracana przez program. Ale skąd wzięło się określenie „przeciek”? Czy wynika to z faktu, że inne programy nie mogą uzyskać dostępu do pamięci dynamicznej, ponieważ jeden z nich już ją przechwytuje, a zatem całkowita pamięć dostępna z systemu operacyjnego na stertę jest zmniejszona, a zatem „przeciekła” do tego, kto ją przechwytuje? Zasadniczo, czy widzimy wyciek pamięci z perspektywy systemu operacyjnego? A zatem mówiąc, że wyciekł do programu?


title: Techniczny przykład modelowania domeny za pomocą OOD?

text: Biorąc pod uwagę przedkładanie kompozycji nad dziedziczenie i przyglądanie się różnym wzorcom projektowym, istnieje wiele podejść do modelowania domeny. Załóżmy, że masz pewne Entity, które pod pewnymi względami są bardzo podobne, ale różnią się znacznie, jeśli chodzi o implementacje techniczne. Aby spróbować przedstawić ten scenariusz, posłużymy się przykładem klasycznego samochodu. (Pojazdy) Samochód Ciężarowy Van Z perspektywy użytkownika wszystkie są prawie takie same (wszystkie pojazdy). Z perspektywy **DDD** samochód, ciężarówka i furgonetka mają wspólny stan (liczba opon, silnik, ...) i pewne zachowania (kierowanie, zmiana prędkości, ...). Jednak mają one również różne stany i zachowania, które są unikalne, takie jak łóżko ciężarówki, wewnętrzna pamięć furgonetki lub 5 siedzeń samochodów. W miarę upływu czasu nastąpi spora ilość zmian. Walidacja byłaby inna w przypadku niektórych rzeczy, a podobna w przypadku innych. Zmiana prędkości, skrętu itp. są podobne, ale przyczepa ciągnąca jest opcjonalna, a nawet to różni się np. Van i ciężarówka. Jak zaprojektowałbyś to, aby poradzić sobie ze zmianami, a jednocześnie pozostać SUCHYM i trzymać się mentalności **DDD**? Proszę wyjaśnić, jak byś się do tego zabrał (pseudo kod?) i wspomnieć o wszelkich wzorcach projektowych lub strategiach, które chciałbyś wdrożyć, aby zamodelować tę (prostą, ale dynamiczną) domenę i jakie zasady OO są stosowane itp.


title: Zrozumienie algorytmu wyszukiwania mostów Tarjana

text: Algorytm Tarjana do znajdowania mostów w grafie można znaleźć tutaj: http://en.wikipedia.org/wiki/Bridge_(graph_theory)#Tarjan.27s_Bridge- find_algorithm. Nie rozumiem jednak warunku sprawdzania, czy krawędź jest mostem. Rozumiem, że L(w) = w jest warunkiem koniecznym, ale myślę, że warunek dla H(w) < w + ND(w) jest zbędny, ponieważ zawsze masz gwarancję, że to prawda (podczas wykonywania przechodzenie w przedsprzedaży, wszystkie wierzchołki w poddrzewie w są odwiedzane po kolei i są ponumerowane, a H(W) musi znajdować się w poddrzewie w, dzięki czemu H(W) < w + ND(W) zawsze jest prawdziwe) . Jestem więc ciekaw, czy warunek H(W) < w + ND(W) jest w ogóle konieczny, a jeśli tak, czy możesz podać przykładowy przypadek, w którym jest potrzebny?


title: programowanie oparte na testach akceptacyjnych w c++

text: Został zawieszony przy przepełnieniu stosu: miejmy nadzieję, że ma tutaj wartość. Chcę zastosować podejście BDD / TDD / ATDD w c++. Jednak naprawdę chcę podkreślić pionowe przekroje kompleksowej funkcjonalności, a nie testy jednostkowe. Istnieje wiele frameworków testów jednostkowych. Jak byś postąpił w c++, tworząc podejście, które emuluje strukturę testowania opartą na historyjkach użytkownika. Jeśli możesz uniknąć ponownego wymyślania koła, w przeciwnym razie nie mam pojęcia, jak napisać je od zera. Przykładem z innego języka może być specflow. Konkretne pytanie brzmi - jeśli ktoś to zrobił, wykorzystajmy jego pracę - w przeciwnym razie jak byś napisał framework taki jak specflow w c++?


title: Co jest kluczem do eleganckiego zaprojektowania aplikacji dla profesjonalnej firmy projektowej?

text: Koduję i stwierdziłem, że przy pierwszej próbie wymyślenie eleganckiego wyglądu mojej aplikacji jest dość trudne. * Za pierwszym razem jestem zadowolony tylko w 40%, a potem refaktoryzuję go, aby zakodować tę samą aplikację po raz drugi (prawie zaczynam od zera). * Po raz drugi koduję, jestem zadowolony tylko w około 60%, więc przerobiłem go jeszcze raz, aby zakodować tę samą aplikację po raz trzeci (nie zaczynam od zera, ale wprowadziłem wiele zmian). * Kodowanie po raz trzeci, jestem zadowolony tylko w około 80%. Tutaj jestem całkiem zadowolony, ale myślę, że gdybym mógł zacząć od nowa, mógłbym zrobić dużo lepiej i powinno być bardzo solidne. Ale teraz kończy mi się czas. Więc po prostu zostawiam to tak, jak jest. 80% szczęśliwy. Więc moim słowem kluczowym jest " **aby kontynuować refaktoryzację** ". Ale to jest mój punkt widzenia jako niezależnego programisty, więc nie wiem, jak firma projektowa zaprojektowałaby aplikację. Załóżmy, że przekażę swój pomysł profesjonalnej firmie projektowej, czy będzie ona dokonywać takich refaktoryzacji wiele razy, aby uzyskać elegancki projekt? A może dlatego, że są dużą firmą projektową, są w stanie zaprojektować wszystko dobrze za pierwszym razem? Pracujesz dla firmy zajmującej się projektowaniem oprogramowania? Jeśli tak, to w jaki sposób profesjonalna firma projektowa elegancko projektuje aplikacje?


title: Jak opracować zestaw instrukcji maszyny opartej na stosie?

text: Maszyny wirtualne oparte na stosie, takie jak CLR i JVM, mają inny zestaw instrukcji. Czy za opracowaniem zestawu instrukcji podczas tworzenia maszyny wirtualnej stoi jakaś teoria? np. istnieją zestawy instrukcji JVM do ładowania stałych od 0-5 na stos iconst_0 iconst_1 iconst_2 iconst_3 iconst_4 iconst_5 podczas gdy w CLR istnieją instrukcje ustawione do ładowania numerów od 0 do 8 na stos w następujący sposób ldc.i4.0 ldc.i4.1 ldc.i4.2 ldc.i4.3 ldc.i4.4 ldc.i4.5 ldc.i4.6 ldc.i4.7 ldc.i4.8 dlaczego nie ma ldc.i4.9 i czy ldc.i4 jest dlaczego potrzebujemy powyższych opkodów? I są inne takie jak te. Chętnie dowiem się, co jest przyczyną tej różnicy między opkodami różnych maszyn wirtualnych? Czy istnieje jakaś konkretna teoria do opracowania tych kodów operacyjnych, czy jest ona całkowicie napędzana przez cechy samej maszyny wirtualnej lub zależy od konstrukcji języka wysokiego poziomu?


title: Dlaczego minifikacja HTML/Javascript jest korzystna?

text: Dlaczego minifikacja HTML/Javascript jest korzystna, skoro protokół HTTP obsługuje już kompresję danych gzip? Zdaję sobie sprawę, że minifikacja JavaScript/HTML może znacznie zmniejszyć rozmiar plików JavaScript/HTML poprzez usunięcie zbędnych białych znaków i być może zmianę nazw zmiennych na kilka liter każda, ale czy algorytm LZW nie robi _szczególnie_ dobrze, gdy jest wiele powtórzeń znaków (np. dużo spacji?) Zdaję sobie sprawę, że niektóre narzędzia do minifikacji Javascriptu robią coś więcej niż tylko zmniejszają rozmiar. Kompilator zamknięć Google, na przykład, próbuje również poprawić wydajność kodu, wstawiając funkcje i wykonując inne analizy. Ale _głównym_ celem minifikacji JavaScript jest zwykle zmniejszenie rozmiaru pliku. Zdaję sobie również sprawę, że poza wydajnością istnieją inne powody, które możesz chcieć zminimalizować, takie jak zaciemnianie kodu. Ale znowu, ten powód nie jest zwykle podkreślany tak bardzo, jak wzrost wydajności i zmniejszenie rozmiaru pliku. Na przykład Closure Compiler nie jest reklamowany jako narzędzie zaciemniające, ale jako narzędzie do zmniejszania rozmiaru kodu i zwiększania szybkości pobierania. A więc, ile tak naprawdę można uzyskać dzięki minifikacji JavaScript/HTML, gdy już _znacznie_ zmniejszasz rozmiar pliku za pomocą kompresji gzip?


title: Po jakim wierszu kodu funkcja powinna zostać podzielona?

text: Pracując nad istniejącą bazą kodu, zwykle spotykam się z procedurami, które zawierają **Nadużywanie instrukcji IF i Switch**. Procedury składają się z **przytłaczającego kodu**, który moim zdaniem źle wymaga refaktoryzacji. Sytuacja pogarsza się, gdy zidentyfikuję, że niektóre z nich są również **rekurencyjne**. Ale to zawsze kwestia dyskusji, ponieważ **kod działa dobrze** i nikt nie chce obudzić smoka. Ale wszyscy akceptują, że zarządzanie kodem jest bardzo drogie. Zastanawiam się, czy istnieją jakieś zalecenia, aby ustalić, czy konkretna metoda jest winowajcą i wymaga ponownej wizyty/przepisania, aby można ją było skutecznie rozbić lub polimofizować. Czy istnieją jakieś metryki (np. liczba wierszy w procedurze), które można wykorzystać do identyfikacji takiego segmentu kodu. Lista kontrolna lub porady, które przekonają wszystkich, będą świetne!


title: Dlaczego formalna definicja notacji Big O jest sformułowana jako taka?

text: Rozważ formalną definicję: > f(n) = O(g(n)) Dlaczego nie: > f(n) = O(f(n)) lub > f(n) = O(c*f(n) )) ponieważ dla analizy Big O `f(n)=2n` i `g(n)=n` są identyczne? Jestem zdezorientowany funkcją `f(n)` używającą innej funkcji. * * * ### Aktualizacja Dlaczego definicja nie jest następująca: > f(n) <= c*abs(g(n)) Co dodaje formalne `O(g(x))` do definicji? Wydaje się, że to nadmiernie komplikuje sprawy.


title: Dlaczego niektóre projekty wbudowane unikają kompilacji krzyżowej?

text: Kiedy zagłębiałem się w systemy wbudowane, zauważyłem, że niektóre projekty (na przykład Arch Arm i OpenBSD) krzywo patrzą na kompilację krzyżową. Jakie jest tego uzasadnienie? Czy plik binarny skompilowany krzyżowo różni się od skompilowanego natywnie? OpenBSD sugeruje, że budowanie na sprzęcie zapewnia, że system jest w pełni funkcjonalny (a także samoobsługowy), co ma sens. Ale czy ludzie faktycznie opracowują i kompilują sterowniki jądra na sprzęcie, dla którego pracują? Brzmi to bardzo czasochłonnie. **Z OpenBSD FAQ:** "Narzędzia do kompilacji krzyżowej są w systemie, do użytku przez programistów wprowadzających nową platformę. Jednak nie są one utrzymywane do ogólnego użytku." -http://www.openbsd.org/faq/faq5.html#ProbXComp Sprawdzę, czy uda mi się znaleźć dziennik IRC, w którym deweloper z ArchLinux Arm powiedział mi, że nie przechodzą kompilacji, chociaż wydaje się, że zaktualizowały swoje informacje na temat kompilacji krzyżowej za pomocą DistCC: http://archlinuxarm.org/developers/distcc-cross-compiling


title: Jak stworzyć fajny interfejs użytkownika dla pliku Excela w java lub C#?

text: Mam plik Excela z wieloma arkuszami i relacjami między motywami (tj. formułami, które wiążą arkusze ze sobą). Chcę stworzyć interfejs użytkownika dla tego pliku Excel. Innymi słowy chcę stworzyć aplikację desktopową, która ma wiele kart i menu, a użytkownik wybierając karty lub menu widzi odpowiedni arkusz z pliku Excel w formularzu (w interfejsie aplikacji) i może wpisy danych i zobacz wyniki w innych zakładkach z innych arkuszy. Również chcę stworzyć fajny interfejs użytkownika dla aplikacji. Jak mogę to zrobić? Uwaga: używam Eclipse-jee-indigo dla java i Microsoft visual studio 2010 dla C#. Microsoft visual studio posiada również zestaw narzędzi do tworzenia GUI dla aplikacji C#. a także istnieje wielu projektantów GUI, takich jak jgoodies jako wtyczka eclipse i dotnetbar dla C#.


title: Najlepsze praktyki przy rozszerzaniu projektu

text: Muszę rozbudować aplikację webową dla klienta, nie ma dokumentacji bieżącej aplikacji, analizy, a co gorsza nie ma wsparcia technicznego ani zarządzania. Klient podaje mi listę swoich oczekiwań i nic więcej. Jaka jest najlepsza praktyka, aby rozpocząć taki projekt?


title: Technika wyszukiwania - wielokrotne trafienia, priorytety wyników

text: Opracowałem algorytm wyszukiwania, który zasadniczo dopasowuje rekordy według 3 różnych typów kryteriów. Imię i nazwisko, adres i słowa kluczowe. "doh" , znajdzie: * Nazwa: doh * Adres: re * Słowa kluczowe: ja * * * * Nazwa: re * Adres: doh * Słowa kluczowe: ja * * * * Nazwa: re * Adres: ja * Słowa kluczowe: doh Now , gdy dwa lub więcej rekordów jest zgodnych, zasadniczo traktuję priorytetowo pojedynczą znalezioną jednostkę, sprawdzając, ile razy została znaleziona. Mój problem polega na tym, że pojedyncze zapytanie zawsze znajdzie tylko jeden rekord, nawet jeśli pasuje do więcej niż jednego kryterium, więc nie można ustalić priorytetów. Obecnie tworzę jedno zapytanie, zawierające wszystkie słowa kluczowe, dla wszystkich 3 pól kryteriów. (Wiele instrukcji `AND / OR`) Moje bieżące zapytanie wygląda tak: **Wyszukiwany termin:** coś gdzieś błyszczące **Formulated Query:** select * from table where ((cl_address LIKE @something OR cl_name LIKE @something OR cl_key_words LIKE @something) OR (cl_address LIKE @gdzieś OR cl_name LIKE @gdzieś OR cl_key_words LIKE @gdzieś) OR (cl_address LIKE @shiny OR cl_name LIKE @shiny OR cl_key_words LIKE @shiny)) Aby rozwiązać ten problem, musiałbym uruchomić zapytanie dla każdego kryterium, dla każdego słowa kluczowego, dla każdego pola adresu, dla każdego imienia... Może to skutkować wielokrotnością 10 zapytań na wyszukiwanie... chociaż to "będzie" działać... Jak duzi chłopcy to robią? PS Powyższe jest moim własnym dzieckiem mózgu... i nie opiera się na niczym innym niż moja własna logika... która może, ale nie musi być wadliwa :-)


title: Czy to wiersz czy rekord (lub krotka)

text: 1. Jeśli patrzę na tabelę bazy danych do edycji - czy składa się ona z wierszy czy rekordów? 2. Jeśli napiszę trochę sql, a następnie spojrzę na wynik, czy składa się on z tych samych elementów, co odpowiedź na 1.? 3. Czy to jest tak, że wszystkie są wierszami, ale w bardzo szczególnych okolicznościach są również rekordami? * * * **EDYTUJ** Niedawny artykuł Itzika Ben-Gana wywołał moje pytanie i widzę dość **_dyskusję na dba.stackexchange_**. W tym artykule Aaron Bertrand przytoczył ten sam cytat Itzika ze swojego „Training Kit (Exam 70-461): Querying Microsoft SQL Server 2012” > Jako przykład niepoprawnych terminów w T-SQL, ludzie często używają terminów > „pole” i „rekord” w odniesieniu do tego, co T-SQL nazywa odpowiednio „kolumną” i „wierszem” >. Pola i rekordy są fizyczne. Pola są tym, co masz w > interfejsach użytkownika w aplikacjach klienckich, a rekordy to, co masz w > plikach i kursorach. Tabele są logiczne i mają logiczne wiersze i > kolumny.


title: Dlaczego historyjka użytkownika nie może być dołączona do więcej niż jednej Funkcji?

text: Używam funkcji do dokumentowania funkcji, tak jak pierwotnie przekazaliśmy je naszemu klientowi na etapie propozycji. Teraz chcę tworzyć historie użytkowników, które odnoszą się do funkcji, aby móc łatwo mapować nasze historie z powrotem do propozycji. Wiele historii jest naturalnie mapowanych między funkcjami, ale Team Foundation Server (TFS) nie pozwala mi nadać historii więcej niż jednej funkcji nadrzędnej. Czy to dlatego, że „robię to źle”, czy jest to obecnie bardziej ograniczenie TFS?


title: Jakie są argumenty za produktami z półki komercyjnej (COTS)?

text: * Dlaczego firma powinna zainwestować w komercyjny produkt z półki (COTS)? * Czy jest to koszt wewnętrznego rozwoju, wsparcia, czy są inne powody, aby nie kupować produktu COTS? Przez komercyjne produkty z półki (COTS) rozumiem takie produkty jak SharePoint, SAP, MS Dynamics. Nie Word/Excel/Outlook. Przez firmę rozumiem duże przedsiębiorstwo.


title: Czy zawodowość programisty jest związana z językiem?

text: Słyszę, jak ludzie mówią, że _ „prawdziwy programista nie jest związany z językiem programowania, ponieważ programowanie wykracza poza to”_ i choć zgadzam się z założeniem, uważam, że mój profesjonalizm jest mocno związany z językami, które znam. Powiedziałbym więc, że to stwierdzenie jest praktycznie fałszywe. Zanim to pytanie zostanie zamknięte, jakie jest Twoje zdanie?


title: Czy programiści są związani ze swoim kodem?

text: Zakładając, że pracujesz dla firmy lub zespołu programistów, czy kod jest powiązany z osobą, która to zrobiła? Kiedy ktoś opracowuje konkretną funkcjonalność lub obszar aplikacji, czy ta osoba jest jedyną osobą, która może, ma prawo lub po prostu może wprowadzać w niej zmiany? Osobiście uważam, że dobrze zrobiony fragment kodu lub programu powinien być łatwo modyfikowany przez dowolnego programistę, ale co z tym, co widzisz w swoim środowisku? W swojej pracy powiedziałbym, że większość kodu może być modyfikowana przez każdego (po to są standardy kodowania, prawda?). Jest jednak kilka rzeczy, które są „własnością” niektórych współpracowników, jak np. moduł obsługujący płace czy jakaś ważna funkcjonalność modułu produkcyjnego (rozwijamy system ERP). A co z twoim miejscem pracy? Czy tylko ja to przeżywam?


title: Algorytm gry w siatkę

text: Problem Link - http://www.iarcs.org.in/inoi/2009/zco2009/zco2009-1a.php Musisz znaleźć ścieżkę o maksymalnej wadze, od górnej lewej komórki do dolnej prawej komórki. Mogłoby to zostać rozwiązane za pomocą prostego podejścia do programowania dynamicznego, gdyby nie specjalny warunek - możesz mieć co najwyżej jeden ruch, który może być w lewo lub w górę. Jak mam teraz podejść do problemu z tym szczególnym przypadkiem? Poza tym szukam podejścia oszczędnego czasowo. Dziękuję!


title: Dlaczego porty .NET nazywają się Iron*?

text: Program w języku C Prog po przeniesieniu do Javy nazywa się JProg, port na C++ to Prog++, a port na Pythona nazywa się PyProg. Wszystkie te nazwy są dość oczywiste. Ale port C# byłby nazwany IronProg, co wydaje mi się dziwne. Dlaczego programy przeniesione do Visual Basic lub C# są często nazywane Iron*? Przykłady: IronPython, IronScheme, IronRuby itp.


title: Czy odnośniki są niewidoczne podczas skanowania kodu i czy istnieją jakieś wytyczne dotyczące kodowania dotyczące ich użycia?

text: Wypracowałem nawyk używania bezpiecznych konstrukcji C++ tam, gdzie to możliwe, ale jest jedno miejsce, w którym zawsze nie jestem pewien, czy lepiej używać referencji, czy uciekać się do starych dobrych wskaźników. Przykładowy kod: int FillFancyPointer(char *&ptr) { ptr = NULL; char *tmp_ptr = static_cast<znak*>(calloc(...)); if(!ptr) zwraca -1; ptr = tmp_ptr; zwróć 0; } Później w kodzie: char *ptr = nullptr; if(FillFancyPointer(ptr)>=0 && ptr) Nice(); Problem z tym, IMHO, polega na tym, że ptr wydaje się być zmienną tylko do odczytu podczas patrzenia na kod, podczas gdy w rzeczywistości jest modyfikowany. Podejście COM `ISmthn *ptr;`, `CoCreate(..., &ptr)` wydaje się bardziej wyraźne. Ale jest też bardziej podatny na błędy, ponieważ wszędzie są te rzeczy `**`. Pomyśl o tym, zmienne wyjściowe, takie jak `std::string`, również będą maskowane przy takim podejściu. `int Foo(const string &in, string &inout)` Czy w takich miejscach odnośniki są mylące?


title: Projektowanie usług sklepów internetowych

text: Projektuję aplikację do obsługi sklepu internetowego z szynami. Każdy, kto chce założyć własny sklep, może to zrobić za pomocą tej aplikacji, po prostu rejestrując się i wybierając domenę. Chcę, aby była jak SaaS, jak to tylko możliwe. Czy powinienem kopiować wszystkie pliki sklepu za każdym razem, gdy ktoś tworzy nowy sklep, czy też mogę jakoś zachować te pliki w jednym miejscu i po prostu pozwolić każdemu nowemu sklepowi uzyskać do nich dostęp?


title: Jak ustrukturyzować testy integracyjne na środowisko?

text: Mam zestaw testów integracyjnych napisanych przy użyciu MSTest. Chcę wdrożyć moją aplikację w różnych środowiskach i uruchomić moje testy integracyjne w tym środowisku. Istnieją pewne wartości konfiguracyjne, które zmieniają się w zależności od środowiska, które nie są zawarte w pliku konfiguracyjnym. Dostarczam składnik COM na starszej maszynie, która nie obsługuje plików konfiguracyjnych aplikacji. Pomyślałem, że użyję TestCategories, aby podzielić testy na różne środowiska i uruchomić testy tylko w odpowiedniej kategorii. Jednak napotykam trudności podczas próby skonfigurowania moich zależności testowych z odpowiednimi wartościami konfiguracyjnymi. Na przykład mam następujący kod w mojej klasie testowej: Private Property ObjectToBeTested as BusinessObject Protected Sub New() ObjectToBeTested = New BusinessObject("URL do mojej usługi sieciowej.") End Sub Następnie moje testy są podzielone w następujący sposób: <TestMethod ()> <TestCategory("DEV")> Public Sub MyDevTest() ' kod tutaj End Sub <TestMethod()> <TestCategory("SIT")> Public Sub MySitTest() ' kod tutaj End Sub Ale robiąc to w ten sposób muszę zmienić adres URL i ponownie skompilować dla każdego środowiska, w którym chcę testować. Próbuję znaleźć lepsze podejście. Pomyślałem, że w jakiś sposób użyję ClassInitialization, ale nie mogę określić, czy w tym momencie jestem w teście DEV, czy SIT. Chciałbym, aby inicjalizacja odbyła się raz na poziomie klasy w zależności od środowiska, w którym się znajduję. Myśli?


title: Komputery kwantowe i maszyna Turinga

text: O ile mi wiadomo, maszyna Turinga jest szeroko stosowanym modelem w teorii obliczeniowej, aby wiedzieć, czy coś można obliczyć, a jeśli to można obliczyć, można to obliczyć w skończonym czasie (P, NP, NPSpace). Ale mam następujące wątpliwości: 1. Czy maszyna Turinga jest zasadniczo modelem czarnoskrzynkowym, w którym zestaw danych wejściowych daje zestaw danych wyjściowych taki, że nie może zachodzić żadna interakcja podczas obliczeń? Przez brak interakcji mam na myśli, że podczas obliczeń zmienne nie zostałyby zmienione przez czynnik zewnętrzny. 2. Jako rozszerzenie powyższego pytania, czy niedeterministyczne funkcje Turinga są kompletne? 3. Czy maszyna Turinga jest wydajnym modelem obliczeń kwantowych? Idąc zgodnie z tym, czego się do tej pory dowiedziałem, moje odpowiedzi są następujące: 1. Maszyny Turinga nie mogą poradzić sobie z interakcjami i przypadkowymi zachowaniami i nie jest to gwarantowane nawet przez Turinga w jego oryginalnym artykule. 2. Funkcje niedeterministyczne mogą spowodować zatrzymanie maszyn Turinga. 3. Nie, ponieważ maszyny Turinga nie mogą wydajnie obsługiwać superpozycji bitów. **Uwaga** Nie jestem dobrze zorientowany ani w teorii obliczeniowej, ani w obliczeniach kwantowych. Tak więc wiele linków i kilka rzeczy dla początkujących byłoby bardzo pomocnych, a przeczytanie tego artykułu zainspirowało to pytanie.


title: Czy to normalne, że programiści proponują pomysły na funkcje właścicielom produktów?

text: Zacząłem pracować jako programista całkiem niedawno, wcześniej pracowałem jako administrator systemów. Rozumiem, jak zespół programistów korzystający z funkcji Agile jest taki, że komunikacja „co musimy zaimplementować” odbywa się głównie w jednym kierunku, od właściciela produktu do programistów. Deweloperzy mogą wyrażać swoje obawy właścicielowi produktu dotyczące długu technicznego, ale wymyślanie pomysłów na nowe funkcje nie powinno być jednym z ich głównych obowiązków. Firma, w której pracuję, ma inny pogląd. Według nich programiści powinni nie tylko zwracać się do właścicieli produktów z ich własnego zespołu, aby zasugerować pomysły na funkcje, ale także do właścicieli produktów innych zespołów, jeśli uważają, że mogą coś wnieść do produktu tego zespołu. Pomysł polega na tym, że wszyscy jesteśmy jednym wielkim zespołem <nazwa firmy> i wszyscy programiści powinni wykorzystywać swoją wiedzę, aby udostępniać funkcje, które ich zdaniem będą przydatne. Czy takie podejście jest „normalne”, z braku lepszego słowa? Czy jestem zbyt pasywny, czy powinienem przejąć inicjatywę i zacząć przekazywać pomysły właścicielom produktów? Z drugiej strony, czy firma całkowicie się pomyliła i powinienem szukać pracy gdzie indziej?


title: Czy przy poszukiwaniu nowych pracowników właściwe jest oferowanie „opłaty za znalezienie” obecnym pracownikom?

text: Wiele dużych firm korzysta z rekruterów, aby znaleźć nowych pracowników i oczywiście wiąże się to z kosztami. Obecni pracownicy najprawdopodobniej znają osoby poszukujące pracy poprzez swoje sieci zawodowe. Firma mogłaby potencjalnie zaoszczędzić znaczne pieniądze, gdyby znalazła w ten sposób ludzi. Oczywiście należy wziąć pod uwagę kwestie związane z konfliktem interesów, ale ogólnie ** czy uważasz, że firma powinna oferować wynagrodzenie dla znalazcy za polecanie nowych pracowników?**


title: Korzystanie z praktyk kodowania „poza paradygmatem” w istniejącej bazie kodu

text: Załóżmy na chwilę, że jesteś „szefem”, architektem, czy też innym stanowiskiem, które pozwoliłoby Ci na podjęcie decyzji w następującym pytaniu: Pracujesz nad produktem, który istnieje od wielu lat i został całkowicie opracowany w imperatywnym stylu/języku. Załóżmy również, że istnieje funkcja lub podsystem do zaimplementowania, który skorzystałby na funkcjonalnym języku/podejściu. Hipotetycznym przykładem może być to, że produkt jest zaimplementowany w języku C#, a podsystem/funkcja może być zaimplementowana w języku F#. Więc twój programista, który jest biegłym programistą F#, przychodzi do ciebie i mówi „Chcę napisać ten podsystem/funkcję w F#”. Mówisz tak czy nie? Dlaczego lub dlaczego nie?


title: Jakiego stopnia potrzebuję, aby zostać programistą aplikacji mobilnych?

text: Interesuje mnie zmiana kariery i zostanie programistą aplikacji mobilnych. Próbowałem nauczyć się budować aplikacje mobilne za pomocą HTML5, jQuery Mobile i appmobi. Naprawdę chcę zostać programistą aplikacji mobilnych, ale potrzebuję wskazówek, jaki stopień i/lub certyfikat powinienem uzyskać, aby znaleźć dobrą pracę. Posiadam już tytuł licencjata - Bachelors of Science in Experimental Psychology.


Jak przydatny jest UML, jeśli jesteś programistą pracującym samodzielnie w projekcie?


title: Które warstwy powinny odzwierciedlać język domeny (jeśli język domeny może ściśle istnieć)?

text: To pytanie odnosi się do pytania, które zadałem wcześniej: http://stackoverflow.com/questions/5448574/under-what-conditions-could-we-justify-an-attempt-to-introduce-a-one-size-fits- al Czytając ponownie „Domain-Driven Design: Tackling Complexity in the Heart of Software” Erica Evansa, zauważyłem, że możliwość wypracowania wspólnej terminologii (języka domeny) jest oczywista. Gdzie zaczyna się język domeny? Które warstwy kodu (lub jakiekolwiek grupowanie) powinny odzwierciedlać ten język domeny?


title: Jakie są zalety korzystania ze Scruma?

text: Dlaczego powinienem używać tego oprogramowania zamiast, powiedzmy, Microsoft Project? Jakiego poziomu zaznajomienia z TFS wymaga? Czy jest coś podobnego, którego mógłbym użyć z SVN?


title: Jeśli algorytm "albo/albo" jest "Boolean", co to jest algorytm "zero, jeden lub wiele"?

text: W programowaniu jak nazywasz wybór, który nie jest logiczny? tj. warunek logiczny to prawda/fałsz, albo-albo możliwość. Jak nazywasz stan z jedną lub więcej możliwościami? I czy jest jakaś różnica, czy warunek wynosi zero lub więcej, a jeden lub więcej? Dziękuję! \--EDYTUJ-- Aby dodać trochę jasności: W szczególności mam trudności z opisywaniem pewnych typów algorytmów nie-programistom. Jestem programistą hobbystą, więc brakuje mi dużo słownictwa związanego z informatyką. Jeśli przedstawię użytkownikowi wybór „albo-albo”, stwierdzam, że użytkownicy rozumieją, co mam na myśli, nazywając to wyborem „logicznym”, nawet jeśli ma więcej niż dwie możliwości. Na przykład: „Wybierz kolor: czerwony, żółty, zielony lub niebieski”. Jeśli mam coś, co jest jednym lub więcej wyborem, nie wiem, jak to nazwać. Na przykład: „Wybierz dowolne kolory: czerwony, żółty, zielony, niebieski”. Jak wy (dobrze znający się na rzeczy programiści) odnosicie się do tego rodzaju wyborów, kiedy o nich mówicie? \-- DRUGA EDYCJA -- Jak wskazano w komentarzach, nie powinienem nawet mówić "Boolean", powinienem mówić "Binary". To ma sens... Więc czy istnieje coś takiego jak "wielostronny"?


title: Doradztwo IT z amerykańskiego i niemieckiego podatku VAT

text: Jestem niezależnym konsultantem IT w USA i właśnie wykonałem część pracy dla niemieckiej firmy, wszystko wykonywane zdalnie z USA. Wysłałem im fakturę, ale teraz pytają, czy mam numer identyfikacyjny VAT, którego oczywiście nie mam poza Europą. Czy muszę coś zrobić z niemieckim podatkiem VAT? Czy to od firmy, w której pracowałem, zależy rozwiązanie tego problemu?


title: Czy outsourcing (offshoring) jest nielojalny?

text: Proszę o to z perspektywy wszystkich. Jeśli jesteś w Ameryce i zlecasz outsourcing programistom offshore, czy jesteś nielojalny wobec swoich rodaków? Jeśli jesteś w Indiach i zlecasz outsourcing programistom offshore, czy jesteś nielojalny wobec swoich rodaków? To pytanie dotyczy wszystkich programistów i osób, które mogą zatrudnić programistów. Tak się składa, że jestem Amerykaninem, więc dla mnie oznacza to outsourcing do innych krajów, takich jak Indie i Meksyk. Czy przy tak wysokim bezrobociu w kraju jestem nielojalny wobec moich kolegów programistów, moich rodaków, zlecając outsourcing do innych krajów? To dla mnie prawdziwy dylemat. Tak, w każdym razie utrzymuję czyjąś rodzinę (Amerykańską lub Hinduską). Ale jeśli zlecam programistom offshore, czy przyczyniam się do problemów w domu? W miarę rozwoju mojej firmy pytania dotyczące zatrudniania stają się dla mnie coraz pilniejsze. Chcę zrobić właściwą rzecz. Zauważ również, że to pytanie _NIE_ zadaje pytania „Czy outsourcing jest skuteczny”. To pytanie brzmi: „wszystko jest jednakowo skuteczne, czy jest nielojalne” . . . Zauważ też, że nielojalność może nie być najlepszym słowem, ale rozumiesz, co mam na myśli. Możesz edytować lub zgłaszać sugestie, aby ulepszyć to pytanie.


title: Czy duplikowanie licencji użytkownika jest etyczne, jeśli będzie z niego korzystać ta sama osoba?

text: Rozmawiałem dzisiaj z kimś i ta dyskusja się pojawiła. Załóżmy, że kupujesz oprogramowanie i X licencji użytkownika. Następnie chcesz zainstalować kolejną instancję oprogramowania, jednak firma informuje Cię, że musisz kupić kolejne licencje X, aby użyć drugiej instalacji. Czy duplikowanie licencji jest etyczne, skoro będą z nich korzystać ci sami użytkownicy X? (Bezpieczeństwo programu, o którym mówiliśmy, nie jest zbyt dobre) **EDYTUJ** Licencje są na jednego współbieżnego użytkownika. W tej sytuacji użytkownicy (na ogół) nie byliby zalogowani do obu instalacji jednocześnie. Niezależnie od tego utrzymalibyśmy liczbę użytkowników zalogowanych między dwiema instalacjami ograniczoną do liczby zakupionych licencji.


title: Dziedziczenie a „specyfikacja” według pól

text: Obecnie czytam 'Head first design patterns' i już pierwszy rozdział rzucił mi kilka pytań. W tym rozdziale przedstawiono zasadę projektowania „preferuj kompozycję nad dziedziczenie”, wyjaśniając „wzorzec strategii”. Moje pytanie nie dotyczy wzoru, ale o wiele bardziej „prostej” rzeczy. W książce znajduje się abstrakcyjna klasa Duck, z której dziedziczy cała garść innych klas kaczek (jak np. 'Rubber-' czy 'Redhead-Duck'). Wszystkie te kaczki mają metodę „pokazu” i „kwakania”. Metoda „wyświetlania” jest tym, co powinno być inne w każdej specjalnej klasie kaczek (ponieważ każda kaczka wygląda inaczej, jak mówi książka). klasa abstrakcyjna Kaczka { public void display(); public void quack() { //Quack here } } class RubberDuck extends Duck { @Override public void display() { //Display a 'Rubber-Duck' } } class RedheadDuck extends Duck { @Override public void display() { / /Wyświetl 'Redhead-Duck' } } Ale moje pytanie brzmi: czy nie byłoby bardziej sensowne posiadanie pola wewnątrz (nieabstrakcyjnej) klasy Duck, która zawiera wyświetlane informacje (obraz lub model 3D na przykład) zamiast dziedziczenia z abstrakcyjnej klasy kaczek? class Duck { private String duckName; prywatne Zdjęcie kaczkiObraz; public Duck(String name, Picture picture) { this.duckName = name; this.duckPicture = obraz; } public void quack() { //Quack here } public void display() { //Pokaż kaczkę tutaj, zgodnie z polem 'duckPicture' } //Więcej metod tutaj, może getter dla pola 'duckName' } Co zrobić myślisz o tym? Czy ma sens posiadanie abstrakcyjnej klasy kaczki i dziedziczenie po niej, czy wolisz moją drugą próbę?


title: Czy nadal przekonywałbyś swoje kierownictwo o lepszych praktykach, jeśli ciągle coś psuje?

text: Mój menedżer, zapalony programista, jest pełen dobrej energii do programowania. Ale ma… zwyczaj, w którym będzie zaniedbywał spotkania, jeśli nie może zrozumieć problemu lub argumentu. W rezultacie schrzanił kilka rzeczy. Na przykład: * * * Kiedy mówiliśmy o procesie projektowania usług internetowych REST, sugerowałem, abyśmy najpierw sporządzili specyfikację usług internetowych REST, a dopiero potem przystąpili do implementacji. Nalegał, że gdybyśmy mogli użyć JAX-RS do zaimplementowania komponentu wielokrotnego użytku, to dokumentacja specyfikacji nie byłaby priorytetem. Powiedziałem, że komponenty wielokrotnego użytku byłyby problemem, gdybyśmy zmienili specyfikację usługi sieciowej REST i spróbowali uaktualnić systemy korzystające z tych komponentów. Nie rozumiał ani nie dbał o to, o czym mówię. Gdy API JAX-RS zostało wydane i wykorzystane w innych projektach, zdał sobie sprawę, że coś jest nie tak w projektowaniu klas Javy. Chciał **zmienić interfejs Java klienta API (z adnotacjami JAX-RS)**, ale nie wiedział, jak zaktualizować systemy, które go używały, więc postanowił napisać zupełnie nowe API. Nowe API było katastrofą z powodu braku dokumentacji i budowania z jego intuicją. Ostatecznie API serwisu WWW REST, który ukończył, nie odpowiadało specyfikacji serwisu WWW REST na serwerze. Zmodyfikowaliśmy nasze projekty tak, aby korzystały z nowego API. Nasze projekty się popsuły, znaleźliśmy problemy, a on je naprawił; Koniec opowieści. * * * Może to być problem komunikacji (zawsze komunikacji), ale nie przejmuje się technicznymi rzeczami, których nie zna - a mimo to pisał kod intuicyjnie. Czy powinienem przekonywać go o lepszych praktykach, z którymi mam doświadczenie, czy po prostu wykonywać swoją pracę? To nie jest odosobniony przypadek.


title: Dlaczego nie istnieje typeklas dla funkcji?

text: W problemie związanym z nauką, z którym się kręciłem, zdałem sobie sprawę, że potrzebuję typeklasy funkcji z operacjami do zastosowania, złożenia itp. Powody... 1. Wygodne może być traktowanie reprezentacji funkcji tak, jakby była samą funkcję, więc zastosowanie funkcji niejawnie korzysta z interpretera, a tworzenie funkcji wyprowadza nowy opis. 2. Kiedy już masz typeklasy dla funkcji, możesz mieć pochodne typeklasy dla specjalnych rodzajów funkcji - w moim przypadku chcę funkcji odwracalnych. Na przykład funkcje, które stosują przesunięcia liczb całkowitych, mogą być reprezentowane przez ADT zawierające liczbę całkowitą. Zastosowanie tych funkcji oznacza po prostu dodanie liczby całkowitej. Kompozycja jest realizowana przez dodanie opakowanych liczb całkowitych. Funkcja odwrotna ma zanegowaną liczbę całkowitą. Funkcja tożsamości opakowuje zero. Nie można podać funkcji stałej, ponieważ nie ma dla niej odpowiedniej reprezentacji. Oczywiście nie trzeba pisać rzeczy tak, jakby wartości były prawdziwymi funkcjami Haskella, ale kiedy wpadłem na pomysł, pomyślałem, że taka biblioteka musi już istnieć i może nawet używać standardowej pisowni. Ale nie mogę znaleźć takiej typeklasy w bibliotece Haskell. Znalazłem moduł Data.Function, ale nie ma typeklas - tylko kilka typowych funkcji, które są również dostępne z Prelude. Dlaczego więc nie istnieje typeklas dla funkcji? Czy to „tylko dlatego, że nie ma” czy „ponieważ nie jest tak przydatne, jak myślisz”? A może jest jakiś zasadniczy problem z tym pomysłem? Największym możliwym problemem, o jakim myślałem do tej pory, jest to, że aplikacja funkcji na rzeczywistych funkcjach prawdopodobnie musiałaby być kompilowana ze specjalnym przypadkiem, aby uniknąć problemu z zapętleniem - aby zastosować tę funkcję, muszę zastosować funkcję aplikacji funkcji, i aby to zrobić muszę wywołać funkcję aplikacji funkcji, a do tego... **Więcej wskazówek** Przykładowy kod pokazujący, do czego zmierzam... {-# JĘZYK MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} -- W mojej pierwszej wersji Doable miał tylko jeden argument f. Ta wersja — wydawała się potrzebna do obsługi typu UndoableOffset. --- Wydaje się działać, ale wydaje się też dziwne. W szczególności -- funkcja składu - a i b są w klasie, ale c nie, -- jednak nie ma nic szczególnego w c w porównaniu z aib. class Doable f a b gdzie fwdApply :: f a b -> a -> b compDoable :: f b c -> f a b -> f a c -- W pierwszej wersji potrzebowałem tylko ograniczenia dla -- Doable f a b, ale każda wersja ma sens. class (Doable f a b, Doable f b a) => Undoable f a b gdzie bwd :: f a b -> f b a bwdApply :: f a b -> b -> a bwdApply f b = fwdApply (bwd f) b -- Oryginalne narzędzie ADT - tylko upewniam się, że mogę zawinąć parę funkcji — i nie było naprawdę głupich błędów. data UndoableFn a b = UFN { getFwd :: a -> b, getBwd :: b -> a } instancja Doable UndoableFn a b gdzie fwdApply = getFwd compDoable f g = UFN ((getFwd f) . (getFwd g)) ((getBwd g) .(getBwd f)) instancja Undoable UndoableFn a b gdzie bwd f = UFN (getBwd f) (getFwd f) bwdApply = getBwd -- Sprawienie, aby ta jedna zadziałała, doprowadziła do wszystkich rozszerzeń. Ta reprezentacja -- może reprezentować tylko niektóre funkcje. Wydaje mi się, że potrzebuję typeklasy -- argumentów, ale także muszę ograniczyć przypadki, które mogą się zdarzyć, stąd -- GADT. GADT z tylko jednym konstruktorem nadal wydaje się dziwne. Być może – o dziwo, ten typ to nie tylko zabawka (poza tym, że całość jest – naprawdę zabawką) – to jedyny prawdziwy przypadek, którego potrzebuję do ćwiczenia. Wciąż jednak -- prosty przypadek specjalny. data UndoableOffset a b gdzie UOFF :: Int -> UndoableOffset Int Int instancja Doable UndoableOffset Int Int gdzie fwdApply (UOFF x) y = y+x compDoable (UOFF x) (UOFF y) = UOFF (x+y) instancja Undoable UndoableOffset Int Int gdzie bwdApply (UOFF x) y = y-x bwd (UOFF x) = UOFF (-x) -- Niektóre funkcje konstruujące wartości -- (-x) nie są skrótem do odejmowania - ups. undoableAdd :: Int -> UndoableFn Int Int undoableAdd x = UFN (+x) (\y -> y-x) undoableMul :: Int -> UndoableFn Int Int undoableMul x = UFN (*x) (`div` x) -- Z UndoableFn, możliwe jest zdefiniowanie funkcji odwracalnej — która nie jest odwracalna — aby złamać prawa. Aby temu zapobiec, trzeba — aby konstruktor UFN był prywatny (i wszystkie operacje publiczne, aby zachować — prawa). undoableMul już nie zawsze jest odwracalne. validate :: Undoable f a b => Eq a => f a b -> a -> Bool validate f x = (bwdApply f (fwdApply f x)) == x -- Sprawdzanie funkcji odwracalnej mnożenia przez zero pokazuje błąd -- w walidacja planu funkcji. Muszę się bardziej postarać. main = wykonaj putStrLn . show $ validate (undoableAdd 3) 5 putStrLn . show $ validate (undoableMul 3) 5 --putStrLn . show $ validate (undoableMul 0) 5 fb1 <- return $ UOFF 5 fb2 <- return $ UOFF 7 fb3 <- return $ compDoable fb1 fb2 putStrLn $ "fwdApply fb1 3 = " ++ (show $ fwdApply fb1 3) putStrLn $ " bwdApply fb1 8 = " ++ (pokaż $ bwdApply fb1 8) putStrLn $ "fwdApply fb3 2 = " ++ (pokaż $ fwdApply fb3 2) putStrLn $ "bwdApply fb3 14 = " ++ (pokaż $ bwdApply fb3 14) Aplikacja wiąże się z rodzajem unifikacji, w której ujednolicone wartości nie są równe, ale są powiązane za pomocą tych odwracalnych funkcji – logika w stylu Prologa, ale z ograniczeniami „a = f(b)” zamiast „a = b”. Większość składu będzie wynikać z optymalizacji struktury znajdowania związków. Potrzeba odwrotności powinna być oczywista. Jeśli żaden element w zunifikowanym zestawie nie ma dokładnej wartości, to określony element można określić ilościowo tylko w odniesieniu do innego elementu w tym zunifikowanym zestawie. Dlatego nie chcę używać "prawdziwych" funkcji - obliczania tych względnych wartości. Mógłbym porzucić cały aspekt funkcji i po prostu mieć wartości bezwzględne i względne - prawdopodobnie potrzebuję tylko liczb/wektorów i `(+)` \-, ale mój wewnętrzny astronauta ma ochotę na zabawę. Jedyny sposób, w jaki ponownie rozdzielę linki, to cofanie się i wszystko jest czyste - union-find zostanie wykonane za pomocą kluczy do `IntMap` jako "wskaźników". Mam proste narzędzie do znajdowania związków, ale ponieważ nie dodałem jeszcze funkcji odwracalnych, nie ma sensu ich tutaj wymieniać. **Powody, dla których nie mogę używać Applicative, Monad, Arrow itp.** Główne operacje, których potrzebuję do dostarczenia klasy abstrakcji funkcji, to aplikacja i kompozycja. Brzmi znajomo - m.in. `Applicative` `(<*>)`, `Monad` `(>>=)` i `Arrow` `(>>>)` to wszystkie funkcje kompozycji. Jednak typy, które implementują abstrakcję funkcji w moim przypadku, będą zawierać pewną strukturę danych, która reprezentuje funkcję, ale która nie jest (i nie może zawierać) funkcji i która może reprezentować tylko pewien ograniczony zestaw funkcji. Jak wspomniałem w wyjaśnieniu kodu, czasami mogę określić ilościowo tylko jeden element względem drugiego, ponieważ żaden element w „zunifikowanym” klastrze nie ma dokładnej wartości. Chcę móc wyprowadzić reprezentację tej funkcji, która ogólnie będzie złożeniem kilku dostarczonych funkcji (podążanie do wspólnego przodka w drzewie łączenia/znalezienia) i kilku funkcji odwrotnych (podążanie z powrotem do drugiego przedmiot). Prosty przypadek - gdzie oryginalne "funkcje" są ograniczone do "funkcji" z przesunięciem całkowitym, chcę, aby złożony wynik był "funkcją" z przesunięciem całkowitym - dodaj offsety komponentów. To duża część tego, dlaczego funkcja kompozycji musi znajdować się w klasie tak samo, jak w funkcji aplikacji. Oznacza to, że nie mogę podać operacji `pure`, `return` lub `arr` dla moich typów, więc nie mogę używać `Applicative`, `Monad` lub `Arrow`. To nie jest porażka tego typu - to niedopasowanie abstrakcji. Abstrakcja, której chcę, jest prostą czystą funkcją. Nie ma na przykład efektów ubocznych i nie ma potrzeby tworzenia wygodnej notacji do sekwencjonowania i tworzenia funkcji innych niż odpowiednik standardu (.), który ma zastosowanie do wszystkich funkcji. Mogę _mógłbym_ wystąpić `Kategoria`. Jestem przekonany, że wszystkie moje funkcjonalne rzeczy będą w stanie zapewnić tożsamość, chociaż prawdopodobnie jej nie potrzebuję. Ale ponieważ `Category` nie obsługuje aplikacji, i tak potrzebowałbym klasy pochodnej, aby dodać tę operację.