title: Czy specjalne (prostsze) przypadki powinny mieć osobne ścieżki kodu?

text: Mam dość złożoną metodę, którą można wywołać w dwóch możliwych „scenariuszach”. Jeden jest szczególnym przypadkiem drugiego, w którym wszystkie zagnieżdżone pętle `foreach` są wykonywane tylko raz, a kilka instrukcji `if` jest fałszywych, tak że zasadniczo wykonywane są tylko dwie linie kodu zagnieżdżone głęboko w metodzie. Teraz pytanie brzmi: czy powinienem podać oddzielną (prostszą) ścieżkę kodu dla specjalnego przypadku, mimo że złożony kod obsługuje ten przypadek równie dobrze? Przypuszczam, że w ten sposób kod byłby bardziej czytelny/zrozumiały, ale nie chcę sprawiać wrażenia, że te dwie sprawy są obsługiwane inaczej. Wydajność nie jest tutaj problemem, więc fakt, że prostsza ścieżka kodu może również działać szybciej, jest pomijalny. Przykładowy kod: foreach(...) { foreach(...) { ... if(...) { ... } Coś(); } } w porównaniu do if(SpecialCase) { Something(); } else { foreach(...) { foreach(...) { ... if(...) { ... } Coś(); } } }


title: jaka jest różnica między wywołaniami zwrotnymi a słuchaczami?

text: W blackberry możemy nadpisać metodę keyChar() i przechwycić zdarzenie naciśnięcia klawisza lub zarejestrować się naKeyPressListener. wiem, onKeyListener to wzorzec obserwatora. W Androidzie istnieje również KeyEvent.callback i onKeyListener Oba są zdarzeniami, dlatego nie musimy się rejestrować na zdarzenie keyChar. jaka jest różnica między obydwoma wzorami?


title: Gdzie mam umieścić funkcje, które nie są związane z klasą?

text: Pracuję nad projektem C++, w którym mam kilka funkcji matematycznych, które początkowo napisałem do użycia jako część klasy. Kiedy pisałem więcej kodu, zdałem sobie sprawę, że wszędzie potrzebuję tych funkcji matematycznych. Gdzie najlepiej je umieścić? Powiedzmy, że mam to: class A{ public: int math_function1(int); ... } A kiedy piszę inną klasę, nie mogę (lub przynajmniej nie wiem jak) użyć tej funkcji `math_function1` w tej innej klasie. Poza tym zdałem sobie sprawę, że niektóre z tych funkcji nie są tak naprawdę związane z klasą A. Wydawało się, że są na początku, ale teraz widzę, że to tylko funkcje matematyczne. Jaka jest dobra praktyka w tej sytuacji? W tej chwili kopiuję i wklejam je do nowych klas, co z pewnością jest najgorszą praktyką.


title: Architektura dyrektywy AngularJS: Gdzie umieścić parametry?

text: Używam wtyczki wykresów (Morris.js) w mojej aplikacji AngularJS. Buduję dyrektywę dla każdego typu wykresu. Wtyczka nazywa się tak: new Morris.Line({ // ID elementu, w którym ma być narysowany wykres. element: 'myfirstchart', // Rekordy danych wykresu -- każdy wpis w tej tablicy odpowiada punktowi na / / dane wykresu: [ { rok: '2008', wartość: 20 }, { rok: '2009', wartość: 10 }, { rok: '2010', wartość: 5 }, { rok: '2011', wartość: 5 }, { rok: '2012', wartość: 20 } ], // Nazwa atrybutu rekordu danych, który zawiera wartości x. xkey: 'rok', // Lista nazw atrybutów rekordu danych, które zawierają wartości y.ykeys: ['wartość'], // Etykiety dla ykeys -- zostaną wyświetlone po najechaniu kursorem na // wykres.labels: ['Wartość'] }); Pierwszym krokiem jest włączenie tego kodu do mojej funkcji `link`: angular.module('app') .directive('donutchart', function() { return { link: function (scope, element, attrs) { new Morris.Bar({ element: element[0].id, data: [ { Wiek: '20', wartość: 20 }, { Wiek: '25', wartość: 10 }, { Wiek: '30', wartość: 5 }, { Wiek: '40', wartość: 5 }, { Wiek: '50', wartość: 20 } ], xkey: 'Wiek', ykeys: ['Kwota'], etykiety: ['widoki'] } } }; }); Ale nie lubię manipulować dyrektywą, gdy chcę zmienić dane. Więc zapisuję każdy atrybut wewnątrz zakresu wewnątrz kontrolera. Ale czy jest to „właściwy” sposób na zrobienie tego? A może powinienem użyć zmiennej konfiguracyjnej do przechowywania samego atrybutu? Na przykład: var CONFIG = { bar_labels: ['views'] } a następnie wewnątrz kontrolera: $scope.bar_labels = bar_labels


title: Czy ma sens używanie interfejsów, jeśli nie masz polimorfizmu?

text: Załóżmy, że mam różne klasy, które zachowują się tak samo, co można przedstawić w następujący sposób: public interface Behavior { void operationA(); } public class ImplementerA implementuje Zachowanie { public void operacjaA() { } } public class ImplementerB implementuje Zachowanie { public void operacjaA() { } } Ale `ImplementerA` i `ImplementerB` są używane przez różnych klientów; „KlientA” używa tylko „ImplementeraA”, a „KlientB” używa tylko „ImplementeraB”; poza tymi nie ma innych klientów dla implementacji „ImplementerA” i „ImplementerB”. Czy w tym scenariuszu interfejs „Zachowanie” ma jakiś cel? Czy powinien zostać utworzony, ponieważ może przyszłe wymagania ulegną zmianie...


title: Potrzebujesz wyjaśnienia architektury heksagonalnej

text: Z zainteresowaniem czytam o Hexagonal Architecture Alistaira Cockburna http://alistair.cockburn.us/Hexagonal+architecture. Jedno z jego twierdzeń brzmi: „Ostatecznie, automatyczne testy regresji funkcji wykrywają wszelkie naruszenia obietnicy utrzymania logiki biznesowej poza warstwą prezentacji. Organizacja może wykryć, a następnie skorygować przeciek logiki”. Nie rozumiem tego punktu. Czy mówi, że ponieważ test jest bezgłowy, wywołania warstwy interfejsu użytkownika będą zgłaszać wyjątki? To nie wydaje się być dobrym testem!


title: Kiedy, jak i dlaczego należy aktualizować frameworki (Java)?

text: Krótkie podsumowanie jako wprowadzenie: Jesteśmy małym zespołem zajmującym się tworzeniem stron internetowych w języku Java, tworzącym aplikacje przy użyciu różnych frameworków i bibliotek, takich jak JSF, Hibernate, Seam, wszystkie razem wdrożone w JBoss AS. Początkowo aplikacja została skompilowana i dodano kilka funkcji, aby stworzyć wizytówkę, którą można pokazać potencjalnym klientom. Nastąpiło pewne dopracowanie, aplikacja została wydana, została zaakceptowana i działała, az biegiem czasu dodano dodatkowe funkcje, błędy zostały naprawione, pojawiły się nowe błędy, jak zawsze. Ze względu na wysokie współczynniki magistrali i wyścigi startowe, rozwój wymknął się nieco spod kontroli - dodawano coraz więcej funkcji, nie rozumiejąc w pełni podstawowej architektury systemu. Nadal działa, ale zawsze są pułapki, ponieważ system ewoluował od miejsca, w którym powstał, do czegoś innego i na początku używano różnych skrótów, aby przyspieszyć rozwój - teraz wszystko to wraca i rozwój spowalnia, ponieważ stosuje się obejścia i to jest dość ciężko wprowadzić do projektu nowych programistów. Teraz jestem w trakcie porządkowania i organizowania rzeczy – instalowania systemu śledzenia błędów, budowania kultury testowania/jakości, myślenia o tym, jak przeprowadzić testy automatyczne, przeglądów kodu (wszystkie te fantazyjne profesjonalne rzeczy, których brakowało w początku) i przeprowadzanie ogólnej refaktoryzacji, takiej jak organizowanie hierarchii klas i funkcji, aby ułatwić korzystanie z rzeczy. To sprawia, że wszystko jest trochę lepsze, ale wciąż jest wiele do zrobienia. Ponieważ nie jestem osobą, która początkowo budowała system (był były główny programista odszedł) i nie jestem aż tak doświadczony (rozwijający się od 2,5 roku, ale to moje jedyne dotychczasowe doświadczenie „otwartego świata”), nie zawsze wiem, co mam zrobić. robić. Oto mój problem: Refaktoryzacja zawsze jest czymś dobrym i ciągle to robię, żeby było łatwiej, ale zastanawia mnie kiedy, jak i dlaczego powinienem aktualizować podstawową architekturę (czyli biblioteki, na których opiera się system, serwer aplikacji, bazy danych itp.) Przykłady: * Obecnie używamy JBoss 4.2.2 - Czytałem gdzieś o JBoss 7.1, który jest już dostępny, czy powinienem to zrobić? Jak to ocenić? * Używamy Seam 2.2, co wydaje się być dużym blokerem (nie działa na wyższych wersjach JBoss, nie obsługuje JSF2). Ponadto widzę źródła, które mówią mi, abym używał funkcji JEE zamiast Seam. Zasadniczo interesuje mnie dowolne ogólne podejście do tych problemów, nie tylko te, które wymieniłem w powyższych przykładach - ponieważ mogę natknąć się na te problemy dla innej biblioteki na innym systemie w innym czasie (lub ktoś inny może napotkać podobne problemy) . Więc o co chodzi? Czy powinienem być na bieżąco i używać tylko najnowocześniejszych bibliotek, czy powinienem pozostać przy tym, co mam? Jak rozpoznam, że technologia, której używam, jest dosłownie martwym koniem i zeskoczę? Jak często powinny pojawiać się takie ulepszenia technologii? I jeszcze jedno pytanie poza ogólnym „jak robić ulepszenia”. Jak rozpoznać, że mój program można nazwać „stworzonym przez profesjonalistów”?. Czy poza zdrowym rozsądkiem programistów istnieje test Joela dla dobrze wykonanego oprogramowania?


title: Pytanie dotyczące synchronizacji wielowątkowej: Znajdź n słów podanych m wątków

text: Natknąłem się na to pytanie: > Dostajesz akapit , który zawiera n słów, dostajesz m > wątki. Co musisz zrobić, to każdy wątek powinien wypisać jedno słowo i przekazać > kontrolę następnemu wątkowi, w ten sposób każdy wątek będzie drukował jedno > słowo , w przypadku gdy nadejdzie ostatni wątek, powinien wywołać pierwszy wątek. Drukowanie > będzie powtarzane, aż wszystkie słowa zostaną wydrukowane w akapicie. Wreszcie wszystkie > wątki powinny zakończyć się wdzięcznie. Jaki rodzaj synchronizacji będzie używany? Mocno czuję, że nie możemy tutaj skorzystać z wątków, ale osoba przeprowadzająca rozmowę kwalifikacyjną próbuje zrozumieć moje umiejętności synchronizacji? Nie potrzebujesz kodu, po prostu wstaw kilka myśli. Zrealizuję sam.


title: Wybór licencji oprogramowania do publikacji na blogu w CodeProject.com

text: Planuję opublikować artykuł na codeproject.com, gdzie będę udostępniał kod, który czuję się godny tego wysiłku - więc poszedłem i przeczytałem wytyczne dotyczące publikowania. Wygląda na to, że będę musiał wybrać licencję oprogramowania dla mojego zgłoszenia. Naprawdę nie obchodzi mnie mój materiał i to, co ludzie zrobią z kodem, który podam. Jeśli na tym skorzystają, to wszystko w porządku i cieszę się, że podzieliłem się moimi pomysłami. Tak naprawdę martwię się bardziej o moją osobistą ochronę, że jeśli kod, który podaję z jakiegoś odległego powodu, wyrządzi im lub ich systemowi uszkodzenie, to nie powinienem za nic odpowiadać. Albo coś w tym stylu. Mój materiał dotyczy wzorców dla operacji ASP.NET CRUD. Używam tego wzoru w każdym projekcie, który mam. Jest całkowicie nieszkodliwy, ale tak naprawdę nigdy nie wiadomo, jak inni ludzie go wykorzystają. Chcę tylko mieć jakąś siatkę bezpieczeństwa. Jaka licencja jest dla mnie odpowiednia w tej sytuacji?


title: Zatrudnianie programistów dla małych firm?

text: Prowadzę firmę od prawie 10 lat i przez cały ten czas byłem tylko ja, inny programista (który jest świetnym przyjacielem i współzałożycielem) i sprzedawca (który jest również przyjacielem). Razem udało nam się zrobić przyzwoity interes i wszyscy zdołaliśmy zarobić na życie, ale już od dłuższego czasu próbujemy się rozwijać. Niestety jest kilka problemów: * Stosowana przez nas technologia nie jest przestarzała, ale też nie jest tak popularna w porównaniu do innych opcji tworzenia stron internetowych, takich jak PHP * Pracujemy na konkurencyjnym rynku, konkurując z wielomilionowymi firmami * Możemy” stać na bardzo dobre płacenie nowym programistom lub sprzedawcom. Zarabiamy dla siebie wystarczająco dużo, ale bez dużej liczby nowych klientów nie bylibyśmy w stanie dużo zapłacić. * Ze względu na to, że nie możemy dużo zapłacić, korzystamy z nieco rzadszej technologii i konkurujemy z dużymi firmami, trudno jest nam znaleźć nowych programistów lub sprzedawców. Rozpaczliwie musimy się rozwijać, ale kiedy staramy się zdobyć więcej klientów, nie możemy ich wspierać tak małą liczbą osób (lub ich wymagania wykraczają poza nasz zakres kompetencji), a gdy próbujemy zatrudnić nowych programistów i sprzedawców, zwykle nie uzyskują wysokiej jakości i zazwyczaj nie przynoszą większej korzyści naszej firmie. Czy ktoś ma jakieś sugestie lub wskazówki, jak moglibyśmy się rozwijać?


title: Czy lepszym pomysłem jest wywołanie zewnętrznej aplikacji wiersza poleceń czy zinternalizowanie logiki tej aplikacji?

text: Mam proces typu „potok”, który zasadniczo łączy ze sobą kilka istniejących narzędzi w celu zautomatyzowania przepływu pracy. W przypadku jednego z kroków istnieje narzędzie wiersza poleceń, które już wykonuje zadanie tego kroku. Zewnętrzne narzędzie CLI jest oparte na javie, podobnie jak mój potok, więc byłoby możliwe zintegrowanie narzędzia bezpośrednio z krokiem potoku, ale narzędzie jest bardzo złożone i jest obecnie ściśle powiązane z wprowadzaniem danych z wiersza poleceń (coś w rodzaju 37 opcji flag konfiguracyjnych). Pytanie brzmi: czy lepszym pomysłem jest po prostu wywołanie i wywołanie zewnętrznego procesu, czy też lepiej zintegrować zewnętrzny kod w mojej aplikacji? Jakie są plusy/minusy integracji czy wywoływania procesu zewnętrznego?


title: Jakie są dobre rozwiązania w zakresie programowania użytkownika końcowego, które widziałeś?

text: Programowanie dla użytkowników końcowych to miejsce, w którym zwykli użytkownicy końcowi, tj. nie-programiści, mogą dostosować program lub stworzyć nowy przy minimalnym szkoleniu lub instruktażu. Jednym z ostatnich przykładów jest App Inventor dla Androida, ale być może najpopularniejszym przykładem programowania przez użytkownika końcowego jest arkusz kalkulacyjny. Jakie przykłady programowania użytkownika końcowego były używane lub uważane za przydatne? Jaka jest filozofia systemu? Jakie wyzwania pozostają?


jak nazywa się podstawowy blok, jeśli zawiera instrukcję rozgałęzienia? Co powiesz na blok, który nie zawiera instrukcji rozgałęzienia? Dziękuję,


title: Moja architektura ma problem z widokami, które wymagały informacji z różnych obiektów. Jak mogę to rozwiązać?

text: Buduję taką architekturę: To są moje warstwy SW ______________ | | | Wyświetlenia | |______________| ______________ | | |Logika biznesowa| |______________| ______________ | | | Repozytorium | |______________| Moje widoki wygenerują mój kod HTML do wysłania do użytkownika Logika biznesowa jest tam, gdzie wszystkie logiki biznesowe są Repozytorium to warstwa dostępu do bazy danych Mój pomysł jest taki, że repozytorium używa encji (które są w zasadzie reprezentacją tabel, w w celu wykonywania zapytań do bazy danych Warstwy komunikują się między sobą za pomocą obiektów biznesowych, które są obiektami reprezentującymi sam obiekt świata rzeczywistego Mogą zawierać reguły i metody biznesowe Widoki budują/używają DTO, są to w zasadzie obiekty, które mają informacje wymagane do wyświetlenia na ekranie. Oczekują również tego rodzaju obiektu na działaniach i przed wywołaniem logiki biznesowej tworzą BO. Pierwsze pytanie: **Jakie są Twoje ogólne odczucia na temat tej architektury?** podobną architekturę dla niektórych projektów i zawsze mam ten problem: Jeśli mój widok ma tę listę do pokazania: Student1, wiek, kurs, Data rejestracji, Już zapłacono? Zawiera informacje z różnych BO. Jak myślisz, że należy zbudować strukturę? Oto alternatywy, które mogłem wymyślić: * **Warstwa widoku może wywołać metody pozyskania studenta, następnie kurs, który studiuje, a następnie informacje o płatnościach**. Spowodowałoby to wiele dostępów do bazy danych, a mój pogląd miałby wiedzę o tym, jak działać, aby wygenerować te informacje. To po prostu wydaje mi się niewłaściwe. * **Mógłbym mieć "obiekt adaptera", który ma wymagane informacje (klasa, która miałaby właściwości Student, Course i Payment).** Ale potrzebowałbym jednego obiektu adaptera dla każdego podobnego przypadku, może to być bardzo złe dla dużych projektów. Nadal ich nie lubię. **Czy masz pomysły? Jak byś zmienił architekturę, aby uniknąć tego rodzaju problemów?** @Rory: Czytam CQRS i nie sądzę, żeby to odpowiadało moim potrzebom. Jak zaczerpnięto z odnośników w linku > Przed opisaniem szczegółów CQRS musimy zrozumieć dwie główne > siły napędowe stojące za tym: współpraca i nieaktualność Oznacza to: wielu różnych aktorów używających tego samego obiektu (współpracy) i gdy dane zostały już pokazane użytkownikowi, że te same dane mogły zostać zmienione przez innego aktora – są nieaktualne (nieaktualne). Mój problem polega na tym, że chcę pokazać użytkownikowi informacje z różnych BO, więc musiałbym je otrzymywać z warstwy usług. W jaki sposób moja warstwa usług może gromadzić i dostarczać te informacje? Edytuj do @AndrewM: Tak, dobrze to zrozumiałeś, pierwotnym pomysłem było posiadanie warstwy widoku do budowania BO, ale masz bardzo fajny punkt na temat tworzenia BO wewnątrz warstw biznesowych. Zakładając, że zastosuję się do twoich rad i przeniosę logikę tworzenia do warstwy biznesowej, mój interfejs warstwy biznesowej będzie zawierał DTO, na przykład public void foo (obiekt MyDTO) Ale o ile rozumiem, DTO jest ściśle powiązany z każdym widokiem, więc nie nadawałby się do ponownego użycia przy drugim widoku. Aby z niego skorzystać, drugi widok musiałby zbudować konkretne DTO z konkretnego widoku lub musiałbym powielić kod w warstwie biznesowej. Czy to się zgadza, czy czegoś mi brakuje?


title: Kiedy pisać testy dla nowej klasy przy użyciu BDD?

text: Ćwiczę rozwój sterowany zachowaniem (BDD). Rozumiem, że musisz pisać testy, które testują zachowanie kodu, a to pozwoli projektowi twojego kodu ewoluować i nabierać kształtu. Kiedy robię BDD i stwierdzam, że muszę zrefaktoryzować swój kod, aby uzyskać lepszy projekt, a ta refaktoryzacja obejmuje wyodrębnienie kodu do nowej klasy, kiedy mam zacząć pisać testy dla tej nowej klasy? A może testy w ogóle nie są potrzebne dla tej klasy, ponieważ jest to szczegół implementacji, a jej zachowanie powinno być już przetestowane z istniejącym pokryciem testowym?


title: Wiele procesów Chrome na każdej karcie

text: Zastanawiam się, jaki jest cel używania przez Chrome wielu procesów dla każdej karty? Zapytałem o to na czacie C++ i jeden odpowiedział, że jest to produkt lenistwa. Osobiście uważam, że jest to przykład „przetwarzania rozproszonego”, jak w języku programowania Erlang. Co to właściwie jest?


title: Czy korzystasz z Mathematica w procesie tworzenia oprogramowania?

text: Jestem ciekaw, czy Mathematica mogłaby mi pomóc w tworzeniu oprogramowania, czy nie. Używasz go do tego i do czego? Na przykład, czy używasz go do analizy algorytmów, czy do czegoś innego? Prawdopodobnie kupię sobie licencję (studencką), ale nie jestem do końca pewien (jeśli nie jest dobra do tworzenia oprogramowania, oczywiście mogę jej użyć do matematyki).


title: Dlaczego niektórzy programiści nienawidzą części UI w rozwoju?

text: Wielu programistów, których spotkałem, zawsze mówi, że „On nie jest facetem od UI”. Faktem jest, że w dzisiejszych czasach programowanie, niezależnie od tego, czy jest to programowanie internetowe, Windows, Linux, OSX, czy jakikolwiek inny rodzaj programowania, obejmuje teraz oprogramowanie z dobrze wyglądającym interfejsem użytkownika. Dlaczego tak wielu programistów nie lubi działania interfejsu użytkownika?


title: Jak zmniejszyć liczbę plików konfiguracyjnych WCF w SOA?

text: Po ogarnięciu całej sprawy SOA odkryłem, że stopniowo tonę w morzu plików web.config i app.config. Na przykład jeden system ma 2 usługi, z którymi współdziała. Każda usługa ma 3 pliki konfiguracyjne - jeden dla deweloperów, jeden do testowania i jeden do produkcji. To 6 plików konfiguracyjnych. Następnie każda aplikacja (3 różne), która korzysta z tych usług, potrzebuje ponownie trzech plików konfiguracyjnych, czyli kolejnych 9. To jest 15 plików konfiguracyjnych tylko dla stosunkowo prostego systemu. Jak mogę uprościć konfigurację? Czy istnieje lepszy sposób na zrobienie tego? Czy powinienem starać się, aby moje pliki konfiguracyjne były niezależne od środowiska? Czy powinienem zbadać całe odnajdywanie WCF? Czy powinienem używać składni transformacji web.config?


title: Dlaczego źle jest pisać coś w języku X tak, jakbyś pisał program w języku Y w kontekście używania wspólnego paradygmatu kodowania

text: Jakiś czas temu zadałem na SO pytanie o coś napisane w C++, ale zamiast uzyskać odpowiedź na problem, komentarze oszalały na punkcie mojego stylu kodowania, nawet gdy wskazałem, że jest to fragment kodu WIP i że zamierzałem to posprzątać później, gdy uruchomię podstawową sprawę. (Dostałem tak wiele głosów odwrotnych, że postanowiłem wycofać się z pytania, ponieważ moja reputacja w SO jest już prawie beznadziejna) Zastanawiałem się, dlaczego ludzie przyjmują tak twarde podejście „jesteś noobem, idź się pieprzyć”. Oskarżano mnie o pisanie C++ tak, jakby to była Java. Coś, czego nie mogę zrozumieć, a to wciąż mnie zbija z tropu. Od kilku lat programuję w kilku językach OOP, aczkolwiek z przerwami. Wybieram język pod kątem dostępnych bibliotek i optymalnych środowisk wykonawczych do wykonywanej pracy. Przyjmuję wzorce projektowe w kodzie OOP i jestem całkiem pewien, że moje użycie wzorców jest rozsądne i że mądrze OO mogę się utrzymać. Rozumiem zestaw narzędzi OOP, ale wybieram korzystanie z narzędzi tylko wtedy, gdy uważam, że jest to naprawdę konieczne, a nie po prostu używam zgrabnej sztuczki, aby pokazać swój spryt kodowania. (Które wiem, że nie są na najwyższym poziomie, ale myślę, że nie są też na poziomie n00b). Projektuję swój kod, zanim napiszę jedną linijkę. Aby zdefiniować testy, wymieniam cele danej klasy i kryteria testów, które musi spełniać. Ponieważ łatwiej jest mi tworzyć diagramy sekwencji, a następnie pisać kod, zdecydowałem się na pisanie testów po tym, jak interfejs stał się oczywisty. Muszę przyznać, że w kawałku kodu, który zamieściłem w pytaniu, nadal używałem wskaźników, zamiast używać inteligentnych wskaźników. Używam RAII, kiedy tylko mogę. Wiem, że prawidłowe RAII oznacza zabezpieczenie przed wskaźnikami zerowymi, ale pracuję przyrostowo. To była praca w toku i zamierzałem to posprzątać później. Ten sposób pracy został mocno potępiony. Moim zdaniem najpierw powinienem mieć działający przykład, aby zobaczyć, czy przypadek podstawowy jest realnym sposobem myślenia. Czasami myślę, że czyszczenie kodu jest czymś typowym dla fazy refaktoryzacji agile, po udowodnieniu przypadku bazowego. Muszę przyznać, że chociaż powoli dostaję standard Cxx, wolę korzystać z tego, co rozumiem, niż ryzykować używanie pojęć, których jeszcze nie opanowałem w kodzie produkcyjnym. Od czasu do czasu próbuję nowych rzeczy, ale zwykle w projektach zabawowych, które mam na boku, tylko w tym celu. [edytuj] Chciałbym wyjaśnić, że sugestia komara [1] nie pojawiła się w wyszukiwaniu, które przeprowadziłem, zanim zacząłem zadawać moje pytanie. Jednak chociaż jego sugestia obejmuje jeden aspekt pytania, pytanie, z którym się połączył, nie odpowiada na sedno mojego pytania, a jedynie jego część. Moje pytanie dotyczy bardziej odpowiedzi, jaką otrzymałem na mój styl kodowania i profesjonalnych aspektów radzenia sobie z różnymi stylami kodowania i (pozornymi) poziomami umiejętności. Z moim poprzednim pytaniem na SO i odpowiedzią jako przykładem. [/edytuj] Pytanie brzmi: po co kpić z kogoś, kto nie używa twojego stylu kodowania? Kwestie/podziały, które mam pod ręką, to: * Dlaczego złą praktyką programistyczną byłoby używanie bardziej podatnego na błędy kodu w sytuacjach prototypowania, jeśli refaktoryzacja czyni go bardziej niezawodnym później? * Jak program napisany w C++ mógłby wyglądać tak, jakby był napisany w Javie? Co sprawia, że jest to zły program (biorąc pod uwagę, że wskazałem intencję obecnego stylu i planowaną pracę do poprawy?) * Jak byłbym złym profesjonalistą, gdybym wybrał konstrukcję, która jest używana w pewnym paradygmacie programowania ( np. OOP/DP)? [1] Rozwijać szybko i z błędami, potem poprawiać błędy czy być powolne, uważać na każdą linię kodu?


title: Jak ogólnie poprawić swoją logikę, aw szczególności programowanie?

text: Jestem dobry w zrozumieniu technologii i jej wdrażaniu. Przynajmniej tak się czuję. Wygląda jednak na to, że kiedy spotykam doświadczonych programistów, wytykają mi, że moja logika jest słaba. Czuję, że potrzebowałbym trochę czasu na prawdziwe programowanie, aby to poprawić. Ale nikt nie jest gotów mi tego czasu poświęcić. Zaraz zaczynam swoją opiekunkę i często czuję się przygnębiająco, gdy to słyszę. Chcę wiedzieć, jak mogę poprawić swoją logikę i czy takie rzeczy zdarzają się również innym?


title: Czy podejście „Jedna tabela opisów, aby nimi wszystkimi rządzić” jest dobre?

text: Dawno temu pracowałem (jako klient) z oprogramowaniem, które wykorzystuje scentralizowaną tabelę dla swojego skodyfikowanego elementu. Oto, o ile pamiętam, jak wygląda tabela: Nazwa_tabeli (PK) Nazwa_pola (PK) Kod (PK) Kolejność_sortowania Opis Czyli zamiast tworzyć tabelę za każdym razem, gdy potrzebują skodyfikowanego pola, po prostu dodają wiersz w tym tabela z nową nazwą_tabeli i nazwą_pola. Czasem kusi mnie, aby użyć tego wzorca w jakiejś projektowanej przeze mnie bazie danych, ale od tej pory się temu opierałem, myślę, że jest z tym coś nie tak, ale nie mogę tego dotknąć. Dzieje się tak tylko dlatego, że lądujesz z pewną logiką struktury w Danych lub czymś innym?


title: Czy modularne frameworki PHP naprawdę usprawniają aplikacje?

text: Jednym z celów modularnych frameworków, takich jak Kohana lub Alloy, jest ułatwienie dodawania i usuwania komponentów (tj. „wtyczek” lub „modułów”). Jednak we wszystkich większych projektach, w których pracowałem - system często staje się zależny od modułów, na których jest zbudowany. W końcu po to są – by z nimi budować. **Zastanawiam się więc, czy pomysł budowania odrębnych sekcji aplikacji internetowej jako niezależnych modułów jest w ogóle dobrym pomysłem na początek?** Na przykład możemy zbudować ogólny moduł użytkownika, forum i bloga - ale każdy projekt jest inny i zwykle obejmuje budowanie wielu warstw abstrakcji w celu dodania nowych funkcji - lub bezpośrednią edycję plików w celu ich dostosowania. Nie mogę ponownie użyć tego samego modułu w wielu projektach. Innymi słowy, nie są już tylko dodatkiem typu _plug-in-play_ do witryny. _Teraz nie mylę tego z odpowiednim projektem klasy, aby zapewnić niezwiązaną logikę MVC i biblioteki_. Ale zastanawiam się, czy "MMVC" było zbytecznym wysiłkiem, aby zastosować odpowiednie koncepcje projektowania klas również do projektowania aplikacji. W końcu wiele systemów migracyjnych lub bibliotek baz danych, takich jak Doctrine, wymaga wszystkich relacji zapisanych w modelach od pierwszego dnia, łącząc w ten sposób encje. Czy to jedna z tych rzeczy, która brzmi jak dobry pomysł na początku projektu, ale ostatecznie okazuje się, że jest bezużyteczną funkcją? Czy moduły mają swoje miejsce w systemach typu wordpress - ale nie we frameworkach, w których oczywiście budujesz coś niestandardowego?


title: Jak okazywać pewność siebie podczas rozmowy kwalifikacyjnej?

text: Dostałem się na rozmowę kwalifikacyjną, w której wiedziałem, co staram się wyjaśnić lub mam jakiś pomysł na pytanie ankietera. Jak najlepiej to wyjaśnić i pokazać moją pewność siebie?


title: Przygotowanie do rozmowy kwalifikacyjnej w C# - Referencje?

text: To jest konkretne pytanie dotyczące C#. Można go jednak ekstrapolować również na inne języki. Podczas przygotowań do rozmowy kwalifikacyjnej z programistą C# (ASP.NET lub WinForms lub ), jaki byłby typowy materiał referencyjny, na który należy spojrzeć? Czy są jakieś dobre kolekcje książek/pytań do wywiadów, którym warto się przyjrzeć, żeby je lepiej przygotować? To tylko poznanie różnych scenariuszy. Na przykład mogę pisać SQL Stored Procedures and Queries, ale mogę się potknąć, gdy zostaniem nagle zapytany Dana tabela pracowników z następującymi kolumnami. EmployeeId, EmployeeName, ManagerId Napisz zapytanie SQL, które da mi imię i nazwisko pracownika oraz imię i nazwisko menedżera? UWAGA: Nie proszę o Bank Pytań, abym mógł dowiedzieć się na pamięć, jakie są pytania i je odtworzyć (co oczywiście NIE zadziała!)


title: Jak określiłbyś jakość?

text: Jakie powinny być podstawowe funkcje gier, które reprezentują doskonałą grę? Jakie cele jakościowe powinien osiągnąć, aby odnieść sukces w grze? Każda zwięzła odpowiedź wprowadzi mnie na właściwe tory.


title: Czy OO, TDD i refaktoryzacja do mniejszych funkcji wpływają na szybkość kodu?

text: W dziedzinie informatyki zauważyłem wyraźną zmianę w myśleniu, jeśli chodzi o programowanie. Obecna rada jest następująca: * napisz mniejszy, bardziej testowalny kod * refaktoryzację istniejącego kodu na coraz mniejsze fragmenty kodu, aż większość twoich metod/funkcji będzie miała tylko kilka linii * pisz funkcje, które robią tylko jedną rzecz (co sprawia, że znowu mniejszy) Jest to zmiana w porównaniu do „starych” lub „złych” praktyk kodu, gdzie masz metody obejmujące 2500 wierszy, a duże klasy robią wszystko. Moje pytanie brzmi: kiedy wywołanie sprowadza się do kodu maszynowego, do jedynek i zer, do instrukcji asemblera, czy powinienem się w ogóle martwić, że mój kod z oddzieleniem klas z różnymi funkcjami od małych do małych generuje zbyt dużo dodatkowych kosztów? Chociaż nie jestem dokładnie zaznajomiony z tym, jak kod OO i wywołania funkcji są obsługiwane w ASM, mam pewien pomysł. Zakładam, że każde dodatkowe wywołanie funkcji, wywołanie obiektu lub wywołanie include (w niektórych językach) generuje dodatkowy zestaw instrukcji, tym samym zwiększając objętość kodu i dodając różne narzuty, _bez dodawania faktycznego "użytecznego" kodu_. Wyobrażam sobie również, że dobre optymalizacje można zrobić w ASM, zanim zostanie on faktycznie uruchomiony na sprzęcie, ale ta optymalizacja też może zdziałać tylko tyle. Stąd moje pytanie - ile narzutu (w przestrzeni i szybkości) faktycznie wprowadza dobrze oddzielony kod (podzielony na setki plików, klas i metod) w porównaniu z posiadaniem „jednej dużej metody, która zawiera wszystko”, z tego powodu nad głową? AKTUALIZACJA dla jasności: Zakładam, że dodawanie coraz większej liczby funkcji i coraz większej liczby obiektów i klas w kodzie spowoduje coraz więcej _przekazywania parametrów_ między mniejszymi fragmentami kodu. Powiedziano gdzieś (cytat TBD), że do 70% całego kodu składa się z instrukcji MOV ASM - ładowania rejestrów procesora odpowiednimi zmiennymi, a nie rzeczywistych obliczeń. W moim przypadku ładujesz czas procesora za pomocą instrukcji PUSH/POP, aby zapewnić połączenie i przekazywanie parametrów między różnymi fragmentami kodu. Im mniejsze tworzysz fragmenty kodu, tym bardziej wymagane jest „powiązanie”. Obawiam się, że to powiązanie powoduje rozdęcie i spowolnienie oprogramowania i zastanawiam się, czy powinienem się tym martwić i ile, jeśli w ogóle, ponieważ obecne i przyszłe pokolenia programistów, którzy budują oprogramowanie na następny wiek , będą musieli żyć i korzystać z oprogramowania stworzonego przy użyciu tych praktyk. **AKTUALIZACJA: Wiele plików** Piszę teraz nowy kod, który powoli zastępuje stary kod. W szczególności zauważyłem, że jedną ze starych klas był plik ~3000 linii (jak wspomniano wcześniej). Teraz staje się zestawem 15-20 plików znajdujących się w różnych katalogach, w tym plików testowych i nie zawierających frameworka PHP, którego używam do łączenia niektórych rzeczy. Więcej plików też się pojawi. Jeśli chodzi o we/wy dysku, ładowanie wielu plików jest wolniejsze niż ładowanie jednego dużego pliku. Oczywiście nie wszystkie pliki są ładowane, są one ładowane w razie potrzeby i istnieją opcje buforowania dysku i pamięci podręcznej, a mimo to uważam, że `ładowanie wielu plików` wymaga więcej przetwarzania niż `ładowanie pojedynczego pliku` do pamięci. Dodaję to do mojej troski.


title: Dlaczego w Bibliotece szablonów standardowych nie ma redukcji równoległej?

text: Aleksander Stiepanow stwierdził w rozmowach i wywiadach, że jego realizacja, która ostatecznie doprowadziła go do programowania generycznego i Standardowej Biblioteki Szablonów, pochodzi z przypadku algorytmu redukcji równoległej. Dlaczego w STL nie ma parallel_reduction(begin,end,associativeop)? Lub coś, co można łatwo przekształcić w niego z przeciążeniem operatora (inner_product wykonuje tylko jedno przejście i akumuluje operacje asymetrycznie). Nie mogłem tego nawet znaleźć w wersji SGI, ani w sekcji numerycznej. Przykłady tego, o czym myślę: równoległa redukcja [a,b,c,d,e,f,g,h] z operatorem binarnym ~ to ((a ~ b) ~ (c ~ d)) ~ ((e ~ f) ~ (g ~ h)) w przeciwieństwie do akumulacji (((((((a+b)+c)+d)+e)+f)+g)+h) a z internal_product możesz uzyskać tylko ( a*e)+(b*f)+(c*g)+(d*h) jeśli się nie mylę.


title: Czy istnieje coś takiego jak zarządzanie dokumentacją API?

text: Zacząłem się więc zastanawiać, jaka jest najlepsza praktyka publikowania wygenerowanej dokumentacji (np. Doxygen, NaturalDocs, itp.) w zakresie infrastruktury? Generowałbym go poprzez ciągłą integrację: * Czy powinien być umieszczony na zwykłym serwerze WWW?, czy powinienem użyć czegoś takiego jak Sharepoint lub innego oprogramowania do publikowania treści? * Czy dokumentacja powinna być dostępna dla każdej kompilacji?, czy tylko stabilne wydania * Czy powinienem umieścić pełną kopię każdej iteracji dokumentacji?, czy powinienem umieścić ją w kontroli wersji nadpisującej się? (oczywiście repozytorium oddzielne od kodu projektu) Z jakiegoś dziwnego powodu trudno mi pomyśleć, że powinienem po prostu umieścić go na serwerze z obsługą sieci, ale widzę, jak większość to robi: http://docs.spring .io/spring/docs/ Jednak co się dzieje, gdy Twoja firma pracuje nad dziesiątkami, jeśli nie setkami projektów?, większość narzędzi do generowania dokumentacji AFAIK po prostu daje Ci ostateczny wynik HTML, ale to od Ciebie zależy, czy nim zarządzasz. Więc co daje? Czy istnieje lepsza praktyka / rozwiązanie niż po prostu umieszczenie go w "serwerze dokumentów"?


title: Konieczność interfejsów dla małych projektów

text: Czy przy małych projektach konieczne jest stosowanie interfejsów? Pracuję w sklepie pisząc małe aplikacje dla klientów, głównie do manipulacji danymi. Jestem głównie samoukiem, ale na studiach brałem też udział w zajęciach z programowania. Próbowałem zastosować więcej koncepcji OO do moich praktyk kodowania, ale naprawdę nie widzę potrzeby korzystania z interfejsów w pracy, którą wykonuję. Mój największy dotychczasowy projekt miał w sobie około 10 zajęć. Czy interfejsy są niezbędne dla małych projektów/aplikacji, czy tylko dla systemów oprogramowania na dużą skalę? EDYCJA: To nie jest duplikat. Pytam o używanie interfejsów w ogóle do małych projektów, a nie używanie interfejsu, gdy jest tylko jedna implementacja...


title: Jakie są algorytmy, które mogą pomóc w planowaniu czasu rezerwacji?

text: Oto sedno problemu: istnieje wielu dostawców usług, z których każdy ma własne harmonogramy dostępności. Jest wielu klientów, którzy szukają ich usług. Klienci muszą mieć możliwość zarezerwowania czasu rezerwacji usługi, ale powinni mieć możliwość zarezerwowania tylko tych godzin, w których _jakiś_ dostawca usług jest dostępny (tj. tak naprawdę nie obchodzi ich, którego konkretnego dostawcę otrzymają, dopóki mają dostawcę) . Niestety, usługodawcy mogą zmieniać harmonogramy pomiędzy rejestracją klienta a wykonaniem usługi, co oznacza, że nawet przy wprowadzonych zabezpieczeniach rezerwacji nadal może być zbyt wiele rezerwacji na dany czas. Chciałbym wiedzieć, jaka praca została już wykonana nad tego rodzaju problemem, a dodatkowo: 1. Czy dostawcy faktycznie powinni być „przypisani” do klientów w sposób trwały, mimo że dostawcy są wymienni? 2. W zależności od odpowiedzi na poprzednie pytanie, jak mogę określić „następne zlecenie” dostawcy na podstawie aktualnego czasu, harmonogramów innych dostawców i planowanych rezerwacji? Dużo myślałem o tym problemie, ale jestem zakłopotany i mam niesatysfakcjonujące rozwiązania. Jako ktoś bez doświadczenia CS byłbym wdzięczny za jakiś wgląd i/lub lepszy sposób myślenia o problemie.


title: Jeśli widoki lub serwer frontonu wywołają warstwę RESTful API?

text: Potrzebuję zbudować nową aplikację internetową i szukam porady jak zarządzać komunikacją z moją warstwą API. Moim celem jest całkowite oddzielenie kodu front-endu od back-endu. Jak większość, planuję mieć serwer front-end do obsługi widoków, podczas gdy serwer back-end będzie eksponował moją warstwę API. Jestem trochę zdezorientowany, jak podejść do pobierania danych z API. 1. Czy serwer węzłów powinien obsługiwać wszystkie wywołania API i dostarczać te dane do widoków? 2. lub Czy widoki powinny być w stanie wywoływać interfejs API bezpośrednio i pozwalać serwerowi na zarządzanie magią OAuth? Jestem ciekaw, co zrobili inni, aby do tego podejść. Daj mi znać, co myślisz, a byłbym naprawdę zainteresowany, jeśli masz jakieś dobre materiały do przeczytania.


title: Ochrona kluczy API

text: Przeniosłem to z SO, ponieważ jest to bardziej pytanie projektowe niż kodowe. W wielu aplikacjach witryny/programy stron trzecich mogą uzyskać dostęp do witryny za pomocą klucza. Na przykład aplikacja internetowa obsługuje aplikacje, z których każda ma unikalny klucz API. Te klucze są wydawane różnym programistom, aby upewnić się, że nie wysyłają zbyt wielu żądań na podstawie ich umowy. Jednak aplikacje innych firm często wysyłają żądania w postaci: > http://www.thewebapplication.com/my.api?key=TheKey&parameter=SomeValue Można je zobaczyć za pomocą niezliczonych technologii (skrzypków, szpiegów ruchu). Co gorsza, żądania te mogą być umieszczane w Javascript i udostępniane wszystkim. Jak zaprojektować system API, który pomoże chronić klucze API Twoich klientów?


title: Czy licencja ma znaczenie, jeśli hostuję repozytorium maven?

text: * Jeśli udostępnię repozytorium maven innym do użytku, czy muszę uzyskać pozwolenie od autorów oprogramowania, które udostępniam w moim repozytorium, nawet jeśli jest to oprogramowanie wolne? * Czy mogę hostować biblioteki wolnego oprogramowania na dowolnej licencji, czy też powinny one mieć kompatybilne licencje?


title: Książki do nauki tworzenia wtyczek Rails

text: Używam Ruby on Rails 3.0.7 i chciałbym nauczyć się pisać "zaawansowane" wtyczki do aktualnej wersji frameworka. W tym celu chciałbym kupić kilka książek, ale to, co widziałem na stronie Amazon ma dwa lub trzy lata... Czy znasz i/lub radzisz jakieś książki w tej sprawie? P.S.: W odpowiedziach mile widziane są również linki do dobrych poradników on-line.


title: Pochodne w BNF

text: Rozumiem, jak zrobić wyprowadzenie BNF. Moje podręczniki dobrze to wyjaśniają (znacznie lepiej niż notatki z wykładów on-line wielu profesorów itp.). Przykład poniżej, a potem moje pytania: <program> => begin <stmt_list> end <stmt_list> => <stmt> | <oznaczenie>; <stmt_list> <stmt> => <zmienna> = <wyrażenie> <zmienna> => A | B | C; <wyrażenie> => <zmienna> + <zmienna> |<zmienna> - <zmienna> |<zmienna> Generuje: <proogam> => begin<stmt_list> end => begin<stmt_list>;<stmt_list> end => begin <zmienna> = <wyrażenie>;<stmt_list>end => begin a = <expression>;<stmt_list>end => begin a = <var> + <var>;<stmt_list>end => begin a = b + < var> ; <stmt_list>koniec => początek a = b + c ; <lista_stmt> koniec => początek a = b + c; <zmienna> = <wyrażenie>; <stmt_list>koniec => początek a = b + c; b = <wyrażenie>; koniec => początek a = b + c; b = <zmienna> + <zmienna>;<lista_stmt> koniec => początek a = b + c; b = c + <zmienna>; <lista_stmt> koniec => początek a = b + c; b = c + a; <lista_stmt> koniec => początek a = b + c; b = c + a; <zmienna> + <wyrażenie> => początek a = b + c; b = c + a; c = <wyrażenie>; => rozpocznij a = b + c; b = c + a; c = <zmienna>; => rozpocznij a = b + c; b = c + a; c = b; Rozumiem jak najwięcej i znam korzyści płynące z BNF. Ale jeśli chodzi o derywacje, dlaczego robimy je token po tokenie, kiedy jest całkiem oczywiste, jaki byłby wynikowy kod? Ponadto, w przypadku wyprowadzania BNF, kiedy w składni używane jest OR, jak to przetłumaczyć? Na przykład: <if_stmt>  if (<logic_expr>) <stmt>| if (<logic_expr>) <instrument> else <instrukcja>


title: Jak skutecznie GPL osiąga swoje cele?

text: Ogólnie rzecz biorąc, istnieją dwa rodzaje licencji FOSS, gdy odnosi się to do komercyjnego wykorzystania kodu - powiedzmy typu GPL i typu BSD. Pierwsza z nich jest ogólnie restrykcyjna w zakresie komercyjnego wykorzystania (przez użycie rozumiem również modyfikację i redystrybucję, a także tworzenie dzieł pochodnych itp.) kodu na licencji, a druga jest znacznie bardziej liberalna. Jak rozumiem, ideą stojącą za licencjami typu GPL jest zachęcenie ludzi do porzucenia zastrzeżonego modelu oprogramowania i zamiast tego konwersji na kod FOSS, a licencja jest instrumentem zachęcającym ich do tego – tj. „można użyć tego ładnego oprogramowania , ale tylko jeśli zgodzisz się przyjść do naszego obozu i grać według naszych zasad”. Chcę zapytać, czy ta strategia była dotychczas skuteczna? Tj. czy są jakieś większe osiągnięcia w postaci jakiegoś dużego projektu przechodzącego od zamkniętego do otwartego z powodu GPL lub jakiegoś oprogramowania tworzonego na otwartej przestrzeni tylko dlatego, że tak uczyniła GPL? Jak duży jest wpływ tej strategii - w porównaniu, powiedzmy, ze światem, w którym każdy miałby licencje typu BSD lub udostępniał cały kod open-source w domenie publicznej? Zwróć uwagę, że nie pytam, czy model FOSS się sprawdził - to nie ulega wątpliwości. Pytam tylko, czy specyficzny sposób nakłaniania ludzi do konwersji z prawnie zastrzeżonych na FOSS, używany przez licencje typu GPL i nieużywany przez licencje typu BSD, okazał się sukcesem. Nie pytam też o zalety samej GPL jako licencji - tylko o fakt jej skuteczności.


title: Projekt MVVM/API: kto odpowiada za co w przykładzie w środku?

text: Uwaga: to pytanie dotyczy ogólnie wzorca MVVM i nie jest związane z żadną konkretną strukturą MVVM. Zastanawiam się, jakie jest najlepsze podejście do projektowania dla poniższych wymagań (hipotetyczny przykład). Pominę również wszystkie interfejsy, wstrzykiwanie zależności itp., aby zachować prostotę. Wymagania: * Widok A: użytkownik wprowadza hasło i musi je potwierdzić. Wartość skrótu hasła jest następnie przechowywana w bazie danych. Hasło jest wymagane od użytkownika za każdym razem, gdy uruchamia aplikację. * Widok B: użytkownik musi wprowadzić swoją nazwę użytkownika. Nazwa użytkownika powinna być zaszyfrowana hasłem wprowadzonym w Widoku A. Jeśli chodzi o MVVM, stworzyłbym dwa modele widoków: **ViewModelA:** * `string Password` * `void SaveHash()` **ViewModelB:* * * `string Nazwa użytkownika` * `void SaveEncrypted()` Jednak aby zapisać nazwę użytkownika, **ViewModelB** musi znać hasło, aby móc uzyskać z niego klucz i wykonać szyfrowanie. I tu zaczynam zadawać sobie pytanie, czy "poprawnym" rozwiązaniem (jeśli coś takiego istnieje) jest: * Przekazanie **ViewModelA** w konstruktorze do **ViewModelB**, aby oszczędzanie mogło wykorzystać wymagane informacje? * Aby zmienić `void SaveEncrypted()` na `Void SaveEncrypted(string password)` i przekazać tylko odpowiednie informacje? * Aby zmienić `void SaveEncrypted()` na unieważnić `SaveEncrypted(ViewModelA passwordViewModel)` i przekazać kompletny model widoku zawierający wymagane informacje? Zapobiegnie to nadużywaniu metody przez zastosowanie innego hasła. * Aby usunąć metodę `void SaveEncrypted()` z ViewModelB i utworzyć inny interfejs odpowiedzialny za zapisywanie informacji, taki jak: Interfejs odpowiedzialny za zapisanie **ViewModelB** interface IViewModelBSaver { void SaveEncrypted(ViewModelB usernameViewModel, ViewModelA passwordViewModel); } Mógłbym zadać podobne pytania dla ViewModelA, ponieważ tam jest przechowywany hash hasła.


title: Jak zarządzasz konfiguracją za pomocą wstrzykiwania zależności?

text: Jestem wielkim fanem DI/IOC. Świetnie nadaje się do obsługi/abstrahowania twardych zależności i ułatwia życie. Mam jednak z tym mały problem, który nie wiem jak rozwiązać. Podstawową ideą w DI/IOC jest to, że gdy obiekt jest tworzony, wszystkie jego zależności są wstępnie wypełniane w konstruktorze. Jednak IMHO istnieje kilka rodzajów parametrów dla konstruktorów (zwłaszcza, gdy twoje obiekty są niezmienne). 1. Zależności (Obiekty wymagane do pracy Twojego obiektu) 2. Konfiguracja (informacje o środowisku wymaganym do wykonania pracy) 3. Parametry (Dane, na których wykonywana jest praca) Uważam, że IOC działa dobrze z zależnościami. Ale wciąż staram się wypracować najlepszy sposób radzenia sobie z pozostałymi dwoma. Jednak ponieważ konstruktor ma być uruchamiany przez kontener IOC, wydaje się, że muszę umieścić te elementy w kontenerze IOC. Chciałabym wiedzieć, jakie strategie/wzorce stosują ludzie i jakie znaleźli wady i zalety. NB. Zdaję sobie sprawę, że jest to bardzo subiektywne pytanie i starałem się uczynić je „dobrym” subiektywnym pytaniem zgodnie z wytycznymi SE.


title: Czy wzięcie dwóch lat wolnego na naukę w pokrewnej dziedzinie zniszczy karierę rozwojową na średnim poziomie?

text: Wiem, że niektórzy pytali o powrót do programowania po przerwie i jest to potencjalny duplikat. Po prostu jestem w sytuacji, w której mogę wrócić do szkoły na studia magisterskie z matematyki stosowanej/statystycznej. Ale bardzo martwię się o wpływ, jaki będzie to miało na moją karierę i możliwość późniejszego znalezienia pracy. Mam 3 lata doświadczenia w .NET i kilka lat w PHP. Obecnie jestem starszym inżynierem oprogramowania. Czy uważasz, że wzięcie dwóch lat wolnego na matematykę drastycznie zaszkodzi mojej zbywalności?


title: Jakie są najlepsze praktyki testowania programów z zachowaniem stochastycznym?

text: Wykonując prace badawczo-rozwojowe, często piszę programy, które mają pewien stopień losowości w ich zachowaniu. Na przykład, kiedy pracuję w Genetic Programming, często piszę programy, które generują i wykonują dowolny losowy kod źródłowy. Problem z testowaniem takiego kodu polega na tym, że błędy często występują sporadycznie i mogą być bardzo trudne do odtworzenia. Wykracza to poza ustawienie losowego ziarna na tę samą wartość i rozpoczęcie wykonywania od nowa. Na przykład kod może odczytać wiadomość z bufora pierścienia jądra, a następnie wykonać warunkowe skoki zawartości wiadomości. Oczywiście stan bufora pierścieniowego zmieni się, gdy później spróbujemy odtworzyć problem. Mimo że to zachowanie jest _cecha_, może wywołać inny kod w nieoczekiwany sposób, a zatem często ujawnia błędy, których testy jednostkowe (lub testerzy) nie znajdują. Czy istnieją ustalone najlepsze praktyki testowania systemów tego typu? Jeśli tak, niektóre referencje byłyby bardzo pomocne. Jeśli nie, wszelkie inne sugestie są mile widziane!


title: Czy istnieje przeciwieństwo terminu „Backporting”?

text: Jak rozumiem, termin "Backporting" jest używany do opisania poprawki, która zostanie zastosowana w przyszłej wersji, która jest również przeniesiona do poprzedniej wersji. Definicja Wikipedii jest następująca: > **Backportowanie** to działanie polegające na wykonaniu określonej modyfikacji oprogramowania > (łatki) i zastosowaniu jej do starszej wersji oprogramowania, niż została > pierwotnie stworzona. Stanowi część etapu konserwacji w procesie rozwoju oprogramowania >... Na przykład: * Problem został wykryty i naprawiony w wersji 2.0. Ta sama poprawka została przeniesiona i zastosowana w wersji 1.5. Jaki jest termin, gdy odbywa się to w przeciwnym kierunku? * Problem został wykryty i naprawiony w wersji 1.5. Ta sama poprawka została przeniesiona i zastosowana w wersji 2.0. Czy termin „Backporting” nadal będzie obowiązywał? A może istnieje termin taki jak „Przenoszenie” (co zabawnie brzmi jak „Przekierowanie portów”)?


title: Czy usługi biznesowe powinny wykraczać poza konteksty?

text: Po pierwsze, postępuję zgodnie z konwencją, że kontekst ograniczony jest synonimem działu lub ewentualnie jeden dział ma od 1 do wielu kontekstów ograniczonych. Posiadamy dział doradztwa dla klientów, który posiada Serwis Dokumentacyjny. Dokumenty są przechowywane w Usłudze Przechowywania Dokumentów (czyli tam przechowywane są wszystkie dokumenty w firmie - jest to usługa komunalna), a Usługa Dokumentacji przechowuje informacje o tym dokumencie (usługa biznesowa). Ponieważ został zaprojektowany z myślą o doradztwie dla klienta, jest to dla niego informacja istotna. Teraz zdrowie i bezpieczeństwo potrzebują miejsca do przechowywania informacji o dokumencie. To są inne informacje niż doradztwo dla klientów, ale poinstruowano mnie, aby rozszerzyć istniejącą usługę, aby uwzględnić te dodatkowe informacje. Czuję, że ta usługa przekracza teraz ograniczony kontekst. Martwię się, że wszystkie działy w końcu będą tam przechowywać informacje, a usługa stanie się rozdęta, próbując być wszystkim dla wszystkich działów. Każdy rekord dokumentu będzie przechowywać tylko podzbiór informacji, ponieważ będzie należeć tylko do jednego działu. Będzie gorzej, gdy różne działy będą chciały przechowywać te same informacje, ale odwołują się do nich w inny sposób, lub gdy dwa działy będą chciały przechowywać różne informacje, do których odwołują się w ten sam sposób. W moim rozumieniu jest to dokładnie powód ograniczonych kontekstów. Uważam, że każdy dział powinien mieć własną usługę biznesową do informacji o dokumencie, ale korzystać z tej samej usługi narzędziowej, aby faktycznie przechowywać dokument. Jakie byłoby właściwe podejście?


title: Przełącznik lub słownik podczas przypisywania do nowego obiektu

text: Ostatnio zacząłem preferować mapowanie relacji 1-1 za pomocą `Słowników` zamiast instrukcji `Switch`. Uważam, że pisanie jest trochę szybsze i łatwiejsze w przetwarzaniu mentalnym. Niestety podczas mapowania do nowej instancji obiektu nie chcę definiować jej w ten sposób: var fooDict = new Dictionary<int, IBigObject>() { { 0, new Foo() }, // Tworzy instancję of Foo { 1, new Bar() }, // Tworzy instancję Bar { 2, new Baz() } // Tworzy instancję Baz } var quux = fooDict[0]; // referencje quux Foo Biorąc pod uwagę tę konstrukcję, zmarnowałem cykle procesora i pamięć, tworząc 3 obiekty, robiąc wszystko, co ich konstruktor może zawierać, i skończyłem używając tylko jednego z nich. Uważam również, że mapowanie innych obiektów na `fooDict[0]` w tym przypadku spowoduje, że będą one odwoływać się do tej samej rzeczy, zamiast tworzyć nową instancję `Foo` zgodnie z zamierzeniami. Rozwiązaniem byłoby użycie lambda zamiast tego: var fooDict = new Dictionary<int, Func<IBigObject>>() { { 0, () => new Foo() }, // Zwraca nową instancję Foo po wywołaniu { 1, () => new Bar() }, // Podobnie jak słupek { 2, () => new Baz() } // Podobnie jak poprzednie } var quux = fooDict[0](); // równoważne powiedzeniu 'var quux = new Foo();' Czy dochodzi do punktu, w którym jest to zbyt mylące? Łatwo przeoczyć ten `()` na końcu. A może mapowanie do funkcji/wyrażenia jest dość powszechną praktyką? Alternatywą byłoby użycie przełącznika: IBigObject quux; switch(someInt) { przypadek 0: quux = new Foo(); przerwanie; przypadek 1: quux = new Bar(); przerwanie; przypadek 2: quux = new Baz(); przerwanie; } **Które wywołanie jest bardziej akceptowalne?** * Słownik, dla szybszego wyszukiwania i mniejszej liczby słów kluczowych (wielkość liter i podział) * Switch: Częściej spotykany w kodzie, nie wymaga użycia obiektu Func<> do niebezpośredniości.


title: Czego się uczyć i jak?

text: Jestem programistą Java (Web). Posiadanie wiedzy na temat c#, PHP i Ruby. Jestem zdezorientowany, jak być na bieżąco z bardzo szybką zmianą języka programowania i ich implementacją. Na przykład w telefonie komórkowym można zobaczyć około 7-8 systemów operacyjnych. Istnieje znacznie lepszy przykład programowania sterowanego zdarzeniami, który umożliwia tworzenie skalowalnych aplikacji, takich jak node.js, Ember, Require itp. Następnie WebSockets, Socket.io, HTML5. Python i C po raz kolejny wspinają się na szczyt. Scala i clojure stają się bardzo popularnymi językami. Haskell i Erlang też są świetnymi językami. Przy tak wielu językach programowania i platformach czasami czuję się bardzo źle, że brakuje mi dobrych rzeczy w mojej karierze. Jestem po prostu zdezorientowany, czego się nauczyć i jak współpracować z tym szybko zmieniającym się światem. Proszę zasugeruj.


title: Czy składnia wyłączania kodu powinna różnić się od składni zwykłych komentarzy?

text: Z kilku powodów podczas programowania czasami komentuję kod. Ponieważ jestem chaotyczny i czasami się spieszę, niektóre z nich docierają do kontroli źródeł. Używam również komentarzy do wyjaśnienia bloków kodu. Na przykład: MyClass MyFunction() { (...) // return null; // DO ZROBIENIA: na razie dummy return obj; } Mimo że to "działa" i wiele osób robi to w ten sposób, denerwuje mnie, że nie można automatycznie odróżnić zakomentowanego kodu od "prawdziwych" komentarzy wyjaśniających kod: * dodaje szum podczas próby odczytania kodu * nie można wyszukiwać dla zakomentowanego kodu, na przykład podpięcia po zatwierdzeniu w kontroli źródła. Niektóre języki obsługują wiele jednoliniowych stylów komentarza - na przykład w PHP można użyć `//` lub `#` dla jednoliniowego komentarza - a programiści mogą zgodzić się na użycie jednego z nich dla zakomentowanego kodu: # return zero; // DO ZROBIENIA: na razie dummy return obj; Inne języki - takie jak C#, którego używam dzisiaj - mają jeden styl dla komentarzy jednowierszowych (prawda? Chciałbym się mylić). Widziałem również przykłady kodu z „komentowaniem” przy użyciu dyrektyw kompilatora, co jest świetne w przypadku dużych bloków kodu, ale trochę przesada w przypadku pojedynczych wierszy, ponieważ dyrektywa wymaga dwóch nowych wierszy: #if compile_commented_out return null; // DO ZROBIENIA: na razie obojętne #endif return obj; Skoro więc komentowanie kodu zdarza się w każdym (?) języku, czy „wyłączony kod” nie powinien mieć własnej składni w specyfikacjach języka? Czy zalety (oddzielenie komentarzy / wyłączony kod, edytory / kontrola źródła działająca na nich) są wystarczająco dobre, a wady ("i tak nie powinno się komentować", nie jest funkcjonalną częścią języka, potencjalne opóźnienie IDE (dzięki Thomas )) warte poświęcenia? **Edytuj** Zdaję sobie sprawę, że przykład, którego użyłem, jest głupi; fikcyjny kod można łatwo usunąć, ponieważ zastępuje go rzeczywisty kod.


title: Jakie algorytmy stoją za niską pauzą GC?

text: Niektóre języki, na przykład java, wprowadziły GC z niską pauzą. Ci GC mogą wykonać większość pracy bez zatrzymywania całego świata. Jest to oczywiście dość trudny problem, ponieważ wymaga analizy pamięci, gdy wątek ją modyfikuje, co skutkuje danymi, które można wykorzystać na początku procesu, a nie po jego zakończeniu, lub danymi, które wydają się być śmieciami, ale ponieważ odniesienie zostało przeniesione w pamięci i nigdy nie pojawiło się tam, gdzie szukał GC. Więc w zasadzie, jaki jest algorytm(y) za tym? Artykuły naukowe lub naprawdę techniczny link do artykułu byłyby uważane za prawidłową odpowiedź, ponieważ ten temat jest naprawdę techniczny.


title: Jak sprawić, by programiści chcieli pisać dobry kod, z którego mogą być dumni?

text: W zespole programistów, jak sprawić, by programiści poczuli dumę ze swojego kodu i napisali dobry kod (zdaję sobie sprawę, że jest to subiektywne i każdy jest inny, ale jest taki moment, kiedy piszę kod, że mogę powiedzieć, że jest to dobry kawałek kodu, którym chętnie się pochwalam). Często słyszę, że nie mamy czasu na pisanie dobrego kodu, a jedyne, co się liczy, to usunięcie defektu. Jak zmienić tę perspektywę i sprawić, by programiści tworzyli kod, z którego mogą być dumni. Wydaje się, że jest to bardziej rozpowszechnione u młodszych programistów, nie u wszystkich, ale u większości.


title: Dlaczego stare nazwy metod w stylu C są nadal używane we współczesnych językach?

text: Rozumiem, że we wcześniejszych czasach informatyki krótsze nazwy metod, takie jak `printf`, miały sens, ponieważ pamięć była ograniczona. Ale dlaczego współczesne języki, takie jak Python i Go, nadal używają mniej czytelnych nazw z C API? Dlaczego nie przejdą na bardziej czytelną formę, taką jak print_format, to samo dotyczy innych nazw. Nie miałbym nic przeciwko pisaniu `make_directory` zamiast `mkdir` w go.


title: Jak mogę przetestować aplikację, która zależy od konkretnego sprzętu?

text: Napisałem aplikację na Androida. Aplikacja wymaga połączenia Bluetooth z bardzo specyficznym sprzętem, będącym obecnie prototypem. Jedynym sposobem, w jaki mogę obecnie przetestować aplikację, jest przejechanie setek mil, aby sprawdzić, czy działa. Jeśli skończę z ANR, może to być bardzo krępujące w oczach mojego klienta. Typ połączenia i mechanika tej aplikacji są bardzo ściśle dopasowane do tego sprzętu. Nie wolno mi przynosić laptopa, rootować telefonu ani łączyć się z jakimkolwiek innym urządzeniem na miejscu. Czy jest jakiś sposób, aby przetestować tę aplikację w domu lub przejść przez czynności, aby upewnić się, że nie mam kolejnego błędu ANR przy drugim działaniu, podczas gdy klient patrzy na mnie przerażony? Powinienem zaznaczyć, że nie jestem doświadczonym programistą i jest to nowy pomysł, w którym komuś pomagam, ponieważ zatrudnianie personelu nie jest obecnie rozważane, więc bez wątpienia brakuje mi niektórych podstawowych koncepcji tego rozwoju.


title: Czy powinienem usunąć kod bez odniesień?

text: Pracuję na średniej wielkości (100k linii) bazie kodu, jest to stosunkowo nowy kod (mniej niż rok) i ma dobre pokrycie testów jednostkowych. Ciągle natykam się na metody, które albo nie są już nigdzie używane, albo są przywoływane tylko w testach jednostkowych, które testują tylko tę konkretną metodę. Czy powinienem usunąć ten kod, jeśli mam pewność, że nie jest już potrzebny? **Powody, dla których warto go usunąć:** * Mniej kodu, mniej błędów * Mniej kodu jest łatwiejszy do przetrawienia dla innych * Nadal jest pod kontrolą źródła **Powody, dla których warto to zachować:** * Może służyć jako odniesienie * Może być przydatny kiedyś * Być może został napisany w celu „dopełnienia” funkcjonalności klasy


title: UIDocumentInteractionController w iOS do integracji z Whatsapp

text: Szukałem sposobu na udostępnienie plików stworzonych przez moją aplikację za pośrednictwem Whatsapp. Odkryłem, że możemy czatować za pomocą niestandardowego schematu adresu URL dostarczonego przez WhatsApp. Ale aby udostępniać pliki mojej aplikacji, przeczytałem, że muszę użyć `DocumentInteractionController`. Czy jest dostępna jakaś próbka? Ponadto, gdy czytam o tym w dokumentach Apple, jest napisane: > Utwórz instancję klasy UIDocumentInteractionController dla każdego > pliku, z którym chcesz wchodzić w interakcję. Czy konieczne jest utworzenie instancji dla każdego pliku? Chcę po prostu udostępniać pliki w mojej aplikacji, gdy otrzymam je za pośrednictwem mojej usługi.


title: Ile kontrolerów kątowych i/lub dyrektyw to za dużo?

text: Tworzę dużą, edytowalną tabelę danych z kątowymi i próbuję dowiedzieć się, jaka jest najlepsza praktyka. Tabela będzie miała kilkaset wierszy, kilkadziesiąt kolumn, czyli ponad 2000 komórek. Każda komórka musi być edytowalna w tekście. Moją pierwszą myślą było posiadanie dyrektyw na poziomie komórki, więc wyglądałoby to mniej więcej tak: <editablecell model="pewne wyrażenie modelu"></editablecell> Ale jestem zaniepokojony wydajnością tworzenia tysięcy wystąpień dyrektyw, każda z własny zakres, kontroler i detektory zdarzeń. Martwię się, że jeśli tabela będzie musiała zostać przerysowana (na przykład zmienisz sortowanie), wydajność ucierpi. Czy lepszym pomysłem jest posiadanie dyrektywy na wiersz, która ma bardziej rozbudowany kontroler i szablon do obsługi wszystkich powiązań danych i obsługi zdarzeń na wyższym poziomie, a tym samym tworzenia mniejszej liczby zakresów podrzędnych i detektorów zdarzeń?


title: Redis kontra Zookeeper

text: Porównywanie tych dwóch serwerów wydaje się głupie, biorąc pod uwagę, że są one przeznaczone do bardzo różnych rzeczy. Ale jeśli się nad tym zastanowisz, mogą robić wiele podobnych rzeczy: przechowywać dane konfiguracyjne, rozproszone blokowanie, kolejkowanie itp. Mam instancję Redis, której używam do pewnych rzeczy związanych z produkcją, ale chciałbym wykonaj prostą synchronizację między serwerami (głównie zmiany w konfiguracji, które nie wymagają wypychania kodu i prostego blokowania między serwerami). Co daje mi Zookeeper, czego nie zrobiłby Redis?


title: Jak mogę zastosować javascript, którego się uczę?

text: Jestem programistą frontendowym. Jestem dobry w projektowaniu, html, css i jquery, ale chcę nauczyć się javascriptu bardziej niż czegokolwiek. Uczestniczyłem w kilku kursach, czytałem książki i samouczki online i czuję, że dobrze rozumiem podstawowe zasady: zmienne, logikę itp. W tym miejscu widzę, że różni się od wszystkich innych „Jaki jest najlepszy sposób na naukę js” w internecie. To, czego nie mogę zrobić, to zastosować to w praktyce. Nie mogę przejść od poznania kawałków i kawałków do wymyślenia, jak działają razem, aby stać się programem. Jaki jest najlepszy sposób na uzyskanie rzeczywistej wiedzy stosowanej za pomocą js? Zakładam, że najlepiej byłoby zostać uczniem lub być szkolonym, ale rzadko słyszy się o tego rodzaju rzeczach.


title: Dlaczego szkoły nie obejmują debugerów?

text: Po kolejnym pytaniu domowym na SO. Wygląda na to, że ogromna większość uczniów nie ma pojęcia, czym jest debugger i jak go używać. Uważam, że umiejętność korzystania z debuggera jest prawie tak samo ważna, jak inne podstawy programowania. * Pytanie brzmi, czy nie powinno się debugować i jak korzystać z nowoczesnych narzędzi do debugowania wraz z podstawami programowania? Jeśli nie, dlaczego nie.


title: Konwencja nazewnictwa: czy to dobrze, że wszystkie podklasy mają ten sam prefiks lub sufiks, czy nie?

text: Mam problem z nazwaniem. Biorąc pod uwagę, że otrzymałem interfejs, który otrzymał nazwę Extension i będzie wiele implementacji, takich jak rozszerzenie Radio, rozszerzenie wideo, rozszerzenie muzyczne itp. Najpierw mam je wszystkie nazwane z tym samym przyrostkiem „ext”, np. RadioExt, VideoExt itd. Chwilę później zdałem sobie sprawę, że sufiks jest zbędny, ponieważ wszystkie one realizują to samo pojedyncze rozszerzenie interfejsu i powinienem je opisać w bardziej dosłowny sposób. Więc usunąłem wszystkie przyrostki. Jednak wśród moich kolegów toczyła się debata, niektórzy twierdzili, że sufiks jest wyraźniejszy i bardziej czytelny. Właściwie myślę, że w pewnym stopniu jest to słuszne. Więc jestem zdezorientowany, które nazewnictwo jest lepsze. Jakieś opinie? **AKTUALIZACJA** Kieruję reklamy na Androida i iOS. Jak powiedzieliście, wsparcie językowe byłoby lepsze. Fakt, że obj-c nie obsługuje przestrzeni nazw, jest naprawdę uciążliwy. Co więcej, wygląda na to, że prefiksy w programowaniu iOS są bardziej oficjalnym sposobem rozwiązywania kolizji nazw, i tak musiałbym zastosować ten przewodnik, aby spróbować zachować spójność dla wszystkich moich portów.


title: Dlaczego wiele osób uważa, że Mac stanie się zamkniętą platformą z powodu App Store?

text: Czy App Store to w zasadzie tylko Steam, ale do ogólnych zastosowań?


title: Czy masz metaforę opóźnień pamięci podręcznej/danych?

text: Z tej odpowiedzi na temat opóźnień mamy kilka liczb (tak, zastrzeżenie) dla opóźnień podczas kodowania (nieco edytowane): * Odwołanie do pamięci podręcznej L1 0,5 ns * Błędne przewidywanie rozgałęzień 5 ns * Odwołanie do pamięci podręcznej L2 7 ns * Odwołanie do pamięci głównej 100 ns * Wyślij 2K bajtów w sieci 1 Gbps 20 000 ns * Odczyt sekwencyjnie 1 MB z pamięci 250 000 ns * Wyszukiwanie dysku 10 000 000 ns * Odczyt sekwencyjnie 1 MB z sieci 10 000 000 ns * Odczyt sekwencyjny 1 MB z dysku 30 000 000 ns * Wyślij pakiet CA->Holandia->CA 150 000 000 ns Czy masz metaforę, która przedstawia to w kategoriach ludzkich? Na przykład człowiek może znaleźć wartość w tabeli na swoim biurku (L1) w 15 sekund, więc równoważny czas na znalezienie tej samej rzeczy, jeśli strona nadal znajduje się w książce na półce (L2), byłby 14 razy dłuższy, lub 3,5 minuty. Wiem, że wygląda to na ELI5, ale myślę, że większość programistów (w tym ja) nie ma prawdziwego zrozumienia, w jaki sposób zmieniają się rzędy wielkości, co utrudnia rozumowanie, czy należy zapamiętać jakąś funkcję, czy wstępnie buforować niektóre dane. Rozwinię ten przykład w odpowiedzi. Jeśli zamiast tego masz do czynienia z potokowaniem procesora i cyklami, byłoby to świetnym dobrodziejstwem dla zrozumienia procesorów. Również wydajność mutex, paralelizm SIMD, wielowątkowość, wielordzeniowość...


title: Czy baza danych jest wąskim gardłem, czy nie? Dyskusja o wysokiej skalowalności

text: Znalazłem ciekawy artykuł na stronie internetowej o wysokiej skalowalności, w którym mówi się o skalowalności w serwisie eBay, a szczególnie uderzył mnie konkretny fragment: > "(strategie eBay)... Przenieś pracę z bazy danych do aplikacji > ponieważ baza danych jest wąskim gardłem. Ebay robi to w sposób ekstremalny. Widzimy to > w innej architekturze używającej pamięci podręcznej i systemu plików, ale eBay > wykonuje nawet wiele tradycyjnych operacji na bazach danych w aplikacjach (takich jak > łączenia)." a powyższe nie jest pomyłką, bo znowu w tym samym artykule: > „Przenieś pracę intensywnie obciążającą procesor z warstwy bazy danych do warstwy aplikacji > warstwa aplikacji: integralność referencyjna, złączenia, sortowanie zrobione w warstwie aplikacji! Uzasadnienie: serwery aplikacji są tanie, > wąskim gardłem są bazy danych”. Jakieś wyjaśnienia na ten temat? Gdyby powyższe było prawdą, to powinienem używać bazy danych tylko do pobierania danych i wykonywać wszystkie inne operacje w logice programowania. Zawsze mówiono mi odwrotnie: „bazy danych są zoptymalizowane pod kątem operacji na danych i złożonych selekcji, więc używaj ich”. Jakiś wgląd?


title: Wydajny algorytm łączenia sit

text: Próbuję znaleźć wydajny algorytm dla poniższego algorytmu. Mam ciąg składający się z list indeksów oznaczających indeksy do usunięcia. Semantyka jest taka, że każda sekwencja musi być wykonana w kolejności. Chcę wziąć te sekwencje i spłaszczyć je w jeden ciąg indeksów bezwzględnych do usunięcia. Można to osiągnąć wykonując serię sit (trochę podobnych do sita Eratostenesa). Zastrzeżeniem jest to, że ta technika jest powolna (kwadratowa). Zatem ta grupa wskaźników względnych: R0: 0 3 10 15 R1: 2 7 20 R2: 1 11 12 14 17 R3: 0 1 2 Odpowiadałaby tej grupie wskaźników bezwzględnych: A0: 0 3 10 15 A1: 4 9 22 A2: 2 17 18 20 24 A3: 1 5 6 A po połączeniu w jeden ciąg indeksów bezwzględnych miałbym następującą postać: A': 0 1 2 3 4 5 6 9 10 15 17 18 20 22 24 Może być dowolny liczba względnych ciągów, z których każdy może zawierać dowolną liczbę elementów i może mieć duże odstępy między indeksami. Wejściowe sekwencje względne są posortowane w kolejności rosnącej i nie mogą zawierać duplikatów. Uzyskanie pośrednich list „A#” nie jest konieczne. Zależy mi tylko na liście `A'` z wejść `R#`. * * * Wyjaśnienie algorytmu Weźmy listę nieujemnych liczb całkowitych 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ... I usuń indeksy podane przez R0 Wtedy mamy 1 2 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ... Usunięte wartości dają A0 (`0 3 10 15`) Teraz usuń indeksy podane przez R1 1 2 5 6 7 8 10 11 12 13 14 16 17 18 19 20 21 23 24 25 26 27 28 29 30 ... Usunięte wartości dają A1 (`4 9 22` ) Teraz usuń indeksy podane przez R2 1 5 6 7 8 10 11 12 13 14 16 19 21 23 25 26 27 28 29 30 ... Usunięte wartości dają A2 (`2 17 18 20 24`) Teraz usuń podane indeksy przez R3 7 8 10 11 12 13 14 16 19 21 23 25 26 27 28 29 30 ... Usunięte wartości dają A3 (`1 5 6`)


title: Jak zarządzać osobistymi kluczami ssh?

text: Rozumiem, że klucze ssh są kryptograficznie zabezpieczonym sposobem uwierzytelnienia się w usłudze lub innej osobie, ale poza tym, szczerze mówiąc, jestem trochę zagubiony. To, co mnie dezorientuje, to fakt, że wielu programistów wspomina o swoim kluczu publicznym na swojej stronie, ale jak można mieć tylko jeden klucz? Mam kilka na różne rzeczy. A gdyby mój komputer się zawiesił, musiałbym wygenerować nowe. Oczywiście nie pamiętam klucza. Czy ludzie po prostu gdzieś to zapisują, ciąg cyfr/liter, jak w e-mailu? A potem używać tego jednego klucza do wszystkiego? Jak ktoś może otrzymać klucz _osobisty_? Po prostu czuję, że coś mi brakuje w tym całym teatrze operacji. Chodzi mi o to, że przeszliśmy przez RSA na uniwersytecie; Rozumiem zasadę, ale nigdy nie używałem jej w praktyce, dopóki nie zarejestrowałem się na github i heroku, a kilka miesięcy temu zmusili mnie do wygenerowania kluczy, z czego wcześniej nawet nie zdawałem sobie sprawy.


title: Jak radzić sobie z projektami programistycznymi, które kończą się niepowodzeniem?

text: Nierzadko zdarza się, że projekty kończą się niepowodzeniem. Jako programista, jak radzisz sobie z projektami, które kończą się niepowodzeniem? Niektóre definicje niepowodzenia: * Nie dotrzymuje terminu. * Kod i funkcjonalność nie działają tak, jak powinny. * Oprogramowanie staje się paroware lub nieskończoną liczbą faz, zasadniczo niemożliwych do dostarczenia. A może masz własną definicję porażki. Czy zaczynasz wskazywać palcami? Czy obwiniasz siebie, wymagania, technologię, kierownictwo, klienta itp.? Czy jako zespół przeprowadzacie sesję wyciąganą z lekcji?


title: Nowoczesne funkcje przeglądarki, które pozwalają aplikacji internetowej zachowywać się jak aplikacja lokalna?

text: Mam prawie trzy lata kariery jako programista aplikacji internetowych. To moja pierwsza „prawdziwa” praca programistyczna”. W moim sklepie używamy ASP.net, ale zawsze staram się opanować skrypty po stronie klienta. między tym, co dzieje się po stronie klienta, a tym, co dzieje się po stronie serwera.Oczywiście głównym problemem związanym z tworzeniem stron internetowych jest to, że przez ostatnie 20 lat budowaliśmy sieć na rozszerzeniach do tego, co zasadniczo jest przeglądarką plików tekstowych. mam bardziej doświadczonego współpracownika, który mówi mi, że kiedyś był programistą aplikacji innych niż web. Mówi, że przechodząc od tworzenia aplikacji do tworzenia aplikacji internetowych, jego troską jest, aby aplikacja internetowa zachowywała się tak bardzo, jak to możliwe, jakby była to aplikacja lokalna.Zgadzam się, że moim użytkownikom też się to spodoba.Często poznaję nowoczesne narzędzia, które mogę dodać do mojego zestawu narzędzi, aby to osiągnąć: na przykład jquery-ui.Dzisiaj rano dowiedziałem się o korzystaniu z nowego Pozycja CSS: stała wartość do tworzenia elementów ts pojawiają się statycznie na mojej stronie podczas przewijania przez użytkownika. Chciałbym zapytać, jakie są najlepsze narzędzia, których mogę użyć, aby moje aplikacje internetowe były bardziej responsywne i interaktywne; czego mogę użyć, aby moja aplikacja internetowa była postrzegana jako aplikacja działająca lokalnie.


title: Jaki jest dobry schemat synchronizacji bazy danych wielu użytkowników?

text: Pracuję nad systemem umożliwiającym wielu użytkownikom współpracę nad projektem online. Wszystko jest dość proste, z wyjątkiem utrzymywania synchronizacji użytkowników. Każdy użytkownik ma swoją lokalną kopię bazy danych projektu, co pozwala mu na wprowadzanie zmian i testowanie, a następnie wysyłanie aktualizacji do centralnego serwera. Ale to prowadzi do klasycznego pytania o synchronizację: jak powstrzymać dwóch użytkowników przed edycją tej samej rzeczy i wzajemnym tupotaniem pracy? Mam pomysł, który powinien zadziałać, ale zastanawiam się, czy jest na to prostszy sposób. Oto podstawowa koncepcja: * Wszystkie dane projektu są przechowywane w relacyjnej bazie danych. * Każdy wiersz w bazie danych ma właściciela. Jeśli bieżący użytkownik nie jest właścicielem, może czytać ten wiersz, ale nie może go zapisywać. (Jest to wymuszane po stronie klienta.) * Użytkownik może wysłać do serwera żądanie przejęcia prawa własności do wiersza, które zostanie przyznane, jeśli kopia serwera mówi, że bieżący właściciel to `NULL`, lub zwolnienia prawa własności, gdy skończone z tym. * Nie można zwolnić własności bez wprowadzania zmian na serwerze. * Nie jest możliwe zatwierdzenie zmian na serwerze bez uprzedniego pobrania wszystkich zaległych zmian na serwer. * Po wprowadzeniu jakichkolwiek zmian w wierszach, które posiadasz, wyzwalacz oznacza ten wiersz jako Brudny. Po zatwierdzeniu zmian baza danych jest skanowana pod kątem wszystkich wierszy Dirty we wszystkich tabelach, a dane są serializowane do pliku aktualizacji, który jest wysyłany na serwer, a wszystkie wiersze są oznaczane jako Clean. Serwer stosuje aktualizacje na swoim końcu i przechowuje plik. Gdy inni użytkownicy pobierają zmiany, serwer wysyła im pliki aktualizacji, których jeszcze nie otrzymali. Tak więc zasadniczo jest to ponowne wymyślenie kontroli wersji w relacyjnej bazie danych. (Poniekąd) Tak długo, jak przejęcie własności i zastosowanie aktualizacji do serwera są gwarantowane niepodzielnymi zmianami, a serwer sprawdza, czy jakiś użytkownik smartaleck nie edytował swojej lokalnej bazy danych, aby mógł wysłać aktualizację dla wiersza, którego nie Jeśli jest właścicielem, powinno być zagwarantowane, że jest poprawny i nie trzeba się martwić o scalanie i konflikty scalania. (Myślę.) Czy ktoś może wymyślić jakieś problemy z tym schematem, lub sposoby na zrobienie tego lepiej? (I nie, „zbuduj [wstaw VCS tutaj] do swojego projektu” nie jest tym, czego szukam. Już o tym pomyślałem. VCS dobrze współpracują z tekstem, a nie tak dobrze z innymi formatami plików, takimi jak relacyjne baz danych.)


title: Dlaczego branża IT nie może dostarczać dużych, bezbłędnych projektów tak szybko, jak w innych branżach?

text: Po obejrzeniu serii MegaStructures National Geographic byłem zaskoczony, jak szybko realizowane są duże projekty. Po wykonaniu prac wstępnych (projekt, specyfikacje itp.) na papierze **sama realizacja dużych projektów zajmuje zaledwie kilka lat, a czasem kilka miesięcy**. Na przykład Airbus A380 „oficjalnie zwodowany 19 grudnia 2000 r.” i „na początku marca 2005 r.”, samolot był już testowany. To samo dotyczy ogromnych tankowców, drapaczy chmur itp. Porównując to do opóźnień w branży oprogramowania, nie mogę przestać się zastanawiać, dlaczego większość projektów IT jest tak powolna, a dokładniej, dlaczego nie mogą być tak szybkie i bezbłędne na w tej samej skali, biorąc pod uwagę wystarczającą liczbę osób? * * * Projekty takie jak Airbus A380 niosą ze sobą oba: * Poważne nieprzewidziane zagrożenia: chociaż nie jest to pierwszy zbudowany samolot, nadal przesuwa granice, jeśli technologia i rzeczy, które działały dobrze w przypadku mniejszych samolotów, mogą nie działać w przypadku większego samolotu ze względu na do ograniczeń fizycznych; w ten sam sposób wykorzystywane są nowe technologie, których jeszcze nie używano, bo na przykład nie były one dostępne w 1969 roku, kiedy Boeing 747 był gotowy. * Ryzyko związane z zasobami ludzkimi i zarządzaniem w ogóle: ludzie rezygnują w trakcie projektu, niemożność dotarcia do osoby, ponieważ jest na wakacjach, zwykłe ludzkie błędy itp. Z tym ryzykiem, **ludzie wciąż realizują projekty takie jak te wielkie samoloty w bardzo krótkim czasie** i pomimo opóźnień w realizacji, projekty te nadal cieszą się ogromnym powodzeniem i wysoką jakością. Jeśli chodzi o rozwój oprogramowania, projekty nie są tak duże i skomplikowane jak samolot pasażerski (zarówno technicznie, jak i pod względem zarządzania) i wiążą się z nieco mniejszymi nieprzewidzianymi zagrożeniami ze świata rzeczywistego. Mimo to **większość projektów IT jest powolna i spóźniona** , a dodanie większej liczby programistów do projektu nie jest rozwiązaniem (przejście z dziesięcioosobowego zespołu do dwutysięcznego czasami pozwoli szybciej dostarczyć projekt, czasami nie, a czasami tylko zaszkodzi projektowi i zwiększy ryzyko, że w ogóle go nie ukończysz). Te, które nadal są dostarczane, mogą często **zawierać wiele błędów, wymagających kolejnych dodatków Service Pack i regularnych aktualizacji** (wyobraź sobie „instalowanie aktualizacji” na każdym Airbusie A380 dwa razy w tygodniu, aby naprawić błędy w oryginalnym produkcie i zapobiec upaść). Jak wyjaśnić takie różnice? Czy wynika to wyłącznie z faktu, że branża programistyczna jest zbyt młoda, aby móc zarządzać tysiącami ludzi w ramach jednego projektu, aby bardzo szybko dostarczać produkty na dużą skalę, niemal bezbłędne?


title: Komponowanie programów z małych, prostych kawałków: OOP a programowanie funkcjonalne

text: Zacząłem programować, gdy imperatywne języki programowania, takie jak C, były praktycznie jedyną grą w mieście na płatne koncerty. Nie jestem informatykiem z wykształcenia, więc w szkole miałem kontakt z Assemblerem i Pascalem, a nie z Lispem czy Prologiem. W latach 90. programowanie obiektowe (OOP) stało się bardziej popularne, ponieważ jednym z memów marketingowych dla OOP było to, że złożone programy mogą składać się z luźno powiązanych, ale dobrze zdefiniowanych, dobrze przetestowanych, spójnych i wielokrotnego użytku klas i obiektów. I w wielu przypadkach to prawda. Kiedy nauczyłem się programowania obiektowego, moje programy w C stały się lepsze, ponieważ ustrukturyzowałem je bardziej jak klasy i obiekty. W ostatnich latach (2008-2014) programowałem w Ruby, języku OOP. Jednak Ruby ma wiele funkcji programowania funkcjonalnego (FP), takich jak lambdy i procs, które umożliwiają inny styl programowania przy użyciu rekurencji, curryingu, leniwej oceny i tym podobnych. (Z powodu ignorancji nie potrafię wyjaśnić, dlaczego te techniki są tak wspaniałe). Niedawno napisałem kod do korzystania z metod z biblioteki Ruby Enumerable, takich jak map(), Reduce() i select(). Najwyraźniej jest to funkcjonalny styl programowania. Odkryłem, że użycie tych metod znacznie zmniejsza ilość kodu i ułatwia debugowanie mojego kodu. Po przeczytaniu więcej o FP, jednym z twierdzeń marketingowych wysuwanych przez zwolenników jest to, że FP umożliwia programistom komponowanie programów z małych, dobrze zdefiniowanych, dobrze przetestowanych i wielokrotnego użytku funkcji, co prowadzi do mniej błędnego kodu i małej ilości kodu. PYTANIA: 1. Czy kompozycja złożonego programu przy użyciu technik FP jest sprzeczna lub komplementarna z kompozycją złożonego programu przy użyciu technik OOP? 2. W jakich sytuacjach OOP jest bardziej efektywne, a kiedy FP? 3. Czy można zastosować obie techniki w tym samym złożonym programie? 4. Czy techniki nakładają się na siebie, czy są ze sobą sprzeczne?


title: Jednowymiarowy algorytm cięcia z minimalną ilością odpadów

text: Czy ktoś może wskazać mi jakieś zasoby dotyczące „algorytmu cięcia”? Problem: * posiadają pręty o długości `L` m np. 6 m * trzeba wyciąć mniejsze kawałki o różnej długości, np. potrzeba: * 4 x 1,2m * 8 x 0,9m * itd... (wiele innych długości i ilości) Jak określić optymalne cięcie, co przyniesie minimalną ilość zmarnowanego materiału? Potrafię napisać program w perlu, ale nie mam pojęcia o _algorytmie_. (jeśli jest tu już jakiś moduł CPAN co może pomóc, byłoby miło). Ewentualnie, jeśli ktoś może wskazać mi jakieś rozwiązanie typu „arkusz kalkulacyjny”, lub cokolwiek, co pomoże. Ps: dodatkowo trzeba też uważać na "szerokość linii cięcia", co oznacza, że z pręta o długości 6m nie da się wyciąć 6 x 1m, bo samo cięcie zajmuje szerokość "3mm", więc można ciąć tylko 5 x 1m a ostatni kawałek będzie miał tylko 98,5 cm (1m minus 5 x 3mm szerokości cięcia) ;(.


title: Czy autor aplikacji open source jest zobowiązany do uwidocznienia „open sourceness”?

text: Jakie są prawne obowiązki, aby udowodnić, że moja aplikacja (ja jestem autorem) jest open-source (zwłaszcza, gdy jest pochodną), jeśli chcę sprzedawać jej kopie? Chodzi mi o to, czy moja aplikacja open-source mogłaby zostać sprzedana, z wszystkimi materiałami licencyjnymi i kodem źródłowym w środku, a nie ukrytymi, ale bez tego w reklamie aplikacji w sklepie z aplikacjami?


title: Czy każdy obiekt jest zaokrąglany do tego samego rozmiaru w Javie?

text: Według tej odpowiedzi każdy obiekt w Javie ma ten sam rozmiar? Czy odpowiedź mówi o samym przedmiocie, czy o odwołaniu do przedmiotu? Oto stwierdzenie: > każdy rozmiar obiektu jest zaokrąglany do 16 bajtów w Hotspot, więc obiekt z > jednobajtowym polem zajmie dokładnie to samo miejsce, co pojedynczy obiekt > z długim lub podwójnym polem; Jestem całkowicie zbity z tropu twierdzeniem zawartym w tym oświadczeniu. Tak wiele głosów za tą odpowiedzią jeszcze bardziej mnie zdezorientowało. Czy ktoś może wyjaśnić, co oznacza powyższe stwierdzenie?


title: Czy ma sens zerwanie płynnego interfejsu, jeśli zostanie przekazany zły argument?

text: Jeśli połączę ze sobą kilka seterów i jeden z nich nie zwróci $this, otrzymam błąd krytyczny. Ale może to dobrze. $obiekt = nowy obiekt(); $object->set('name','foo')->set('number',12)->set('color'=>'brown'); obiekt klasy { chroniony $nazwa; chroniony numer $; chroniony $kolor; protected $allowed_to_set = array('nazwa','kolor'); public function set($property,$value) { if(!in_array((string)$property,$this->allowed_to_set)) { return false; } else { $to->$właściwość = $wartość; zwróć $to; } } }


title: Konwencje nazewnictwa, na przykład zmienne lokalne i parametryczne

text: Rozmawiałem ze starszymi programistami o konwencjach kodowania, które mają być stosowane w naszych projektach (głównie projekty Java/JEE). Nie zgodziłem się z jedną z zaproponowanych przez niego konwencji: > Nazwy zmiennych instancji powinny zaczynać się od "_", zmienne lokalne od "loc", > parametry metody od "par", aby łatwo było zidentyfikować zmienną > pochodzenie i zakres. Podczas gdy on przedstawiał argumenty na rzecz pamięci krótkotrwałej i czytelności, nie zgodziłem się, że raczej zmniejsza to czytelność, IDE w różny sposób lubią zmienne formatu Eclipse w zależności od ich typu, a tego problemu można by uniknąć dzięki dobremu zaprojektowaniu klas i metod. Czy masz jakieś opinie, argumenty lub badania, które popierają mój punkt widzenia (lub są mu przeciwne)?


title: Czy moim zdaniem można wywołać metodę modelu?

text:
Aby zachować szczupłą sylwetkę mojego kontrolera, umieściłem w modelu metodę „nagłówka”. # Moja klasa Model Property def headline "#{name} | #{address}" end end _(Wtedy, Property Controller for context...)_ # Moja klasa Controller PropertyController def show @property = Property.find(params[: id]) end end Pytanie: Jeśli chodzi o MVC, czy można wywoływać tę metodę Model z mojego widoku, tak jak to? # Mój widok
<%= @property.headline %>


title: Czy witryny pomocy technicznej, takie jak Stack Overflow, zakłócają model open source z płatnym wsparciem?

text: Aby pozostać aktualnym na rynku, szukam nowych modeli biznesowych dla mojej firmy programistycznej. Model open source z płatnym wsparciem wydaje się dobrze pasować do naszego produktu, ale mam obawy, czy płatny model wsparcia jest opłacalny w erze, w której najwyższej klasy pomoc jest łatwo dostępna za darmo na stronach takich jak te w Stack Sieć wymiany. Przykład - przeniosłem moich pracowników do Ubuntu w zeszłym roku, ponieważ nie chciałem płacić za licencje Win 7 i nowy sprzęt (plus, platforma mono była bardzo atrakcyjna). Mój personel nie miał doświadczenia z Linuksem, ale był w stanie osiągnąć względne kompetencje w około 120 dni z pomocą AskUbuntu, Stack Overflow i kilku książek „For Dummies”. Zatrudniliśmy konsultanta Ubuntu na 7 dni, aby zapewnić szkolenia i wsparcie, ale poza tym wydaliśmy 0,00 USD na wszelkiego rodzaju płatne ekspertyzy. Jeśli chodzi o moje badanie due diligence, uruchomiłem 3-miesięczną wersję beta modelu wsparcia płatnego za darmo z jednym z naszych mniejszych klientów i osiągnąłem przeciętne wyniki. Chciałbym myśleć, że tak jest, ponieważ nasze oprogramowanie jest tak stabilne i łatwe w użyciu, że klient nie potrzebował dużo płatnego wsparcia, ale podejrzewam, że obszedł warunki naszej umowy SLA w ten sam sposób, w jaki zrobiliśmy to przy przeprowadzce do Ubuntu. Czy ktoś ma jakieś przemyślenia, rady lub doświadczenia związane z przeprowadzką, którą rozważam? Co zadziałało, a co nie itd.?


title: Dodawanie właściwości obiektów za pomocą programowania funkcjonalnego

text: Obecnie uczę się programowania funkcjonalnego z wykorzystaniem Underscore.js. To, co chcę zrobić, to dodać razem dwie współrzędne. Niech P1 = (0, 0) i P2 = (1, 1). Dlatego P1 + P2 = (1, 1) Mam rozwiązanie, ale wydaje się tak zawiłe, że jestem pewien, że robię coś źle: // Bazowy punkt kartezjański 2D var Point = function(x, y) { this .x = x; to.y = y; } Point.prototype.add = function(delta) { return _.object(_.keys(this), _.map( _.zip( _.values(this), _.values(delta)), function(point ) { return _.reduce(punkt, function(memo, num) { return nota + num; }, 0; } ) ); } Czy jest to właściwa implementacja funkcji dodawania punktów przy użyciu Underscore.js, czy jest lepsze rozwiązanie?


title: Jak pracować w dwuosobowym zespole

text: Pracuję w zespole 2 programistów, mój partner jest założycielem firmy, na początku wszystko robił sam. Zatrudnił mnie około 3 lata temu, aby pomóc mu szybciej załatwić sprawy i zaspokoić potrzeby naszych klientów. Często dostaję mały projekt do zrobienia wszystkiego sam, o ile działa świetnie (i zwykle tak jest...) on nie dba o to, co zrobiłem i jak to zrobiłem. Ale jeśli klient zadzwoni do niego z pytaniem, dlaczego coś nie działa zgodnie z oczekiwaniami, a nie ma mnie w pobliżu, aby przekazać mi telefon, może się bardzo rozzłościć, dlaczego nie ma pojęcia, jak działa ten program. Nie trzymam niczego w sekrecie, jeśli mnie o coś zapyta, jak to zrobiłem, chętnie wyjaśnię, o ile chce słuchać (co nie trwa długo), ale nie wiem, po co mi Mówiąc o tym na pierwszym miejscu, w tworzeniu oprogramowania wszystko jest wyraźnie napisane. Przez większość czasu pracuję nad projektami, które napisał i nie muszę go o nic pytać (zdarza się, że raz w miesiącu pytam go, jak coś działa, tylko dlatego, że nie mam czasu, aby to sprawdzić). Dużo czytałem na tej wspaniałej stronie o małych zespołach, które zwykle oznaczają 7-12 osób. Nie mogłem znaleźć sposobu, w jaki 2 osoby pracują jako zespół; nie mamy kierowników projektów, recenzentów ani testerów. Czuję, że to, że nie ma czasu na samodzielne przeglądanie kodu, nie jest moim problemem, więc pytanie brzmi, czy robię coś złego? Czy muszę podejść do niego i wygłosić mu wykład na temat tego, co zrobiłem, nawet jeśli mnie o to nie pyta?


title: Skąd wzięło się T w wchar_t?

text: W wielu typach natywnych do oznaczenia typów niezależnych od platformy (takich jak `wchar_t`, `int32_t` itp.) używany jest wspólny sufiks (a czasem prefiks) „t” lub „_t”. `t` w przeciwieństwie do innych liter (lub wcale, zwłaszcza w przypadku `wchar_t`)? Czy to coś oznacza?


title: Czym jest przejrzystość referencyjna?

text: Widziałem, że w paradygmatach imperatywnych f(x)+f(x) może nie być tym samym co: 2*f(x) Ale w paradygmacie funkcjonalnym powinno być to samo. Próbowałem zaimplementować oba przypadki w Pythonie i Scheme, ale dla mnie wyglądają one całkiem prosto tak samo. Jaki byłby przykład, który mógłby wskazać różnicę z daną funkcją?


title: Krzywa uczenia się do tworzenia stron internetowych

text: W chwili, gdy nasz zespół ma ogromne wyzwanie, zostaliśmy poproszeni o dostarczenie nowego GUI dla wbudowanego kontrolera. Termin jest bardzo napięty i upływa w kwietniu 2013 roku. Nasz zespół jest bardzo zróżnicowany, niektórzy są na poziomie programowania proceduralnego/strukturalnego (głównie C), inni (w tym ja) opanowali programowanie obiektowe (C++, C#). Zbudowaliśmy prototyp dla Androida, chociaż ma on swoje dziwactwa, to w większości jest to po prostu OO. W przyszłości istnieje chęć obsługi wielu platform (Windows, Android, iOS). Moim zdaniem najlepszym rozwiązaniem jest aplikacja HTML5 z natywną powłoką aplikacji. Kiedy zbierałem więcej informacji na temat frameworków do wykorzystania itp., stało się dla mnie oczywiste, że potrzebna jest zmiana paradygmatu. Nikt z nas nie ma doświadczenia w sieci, więc musimy uczyć się od podstaw. Przejście z funkcjonalnego na OO zajęło nam około 6 miesięcy, zanim stało się produktywne (a niektóre z wczesnych podsystemów zostały przepisane, ponieważ były totalnym bałaganem). Czy możemy oczekiwać, że krzywa uczenia się będzie podobna? Czy można to zrobić za pomocą aplikacji internetowej? (Moje przeczucie mówi, że będzie już trudno działać jako natywna aplikacja, która znajduje się na skraju naszej strefy komfortu).


title: Czy kod, który kończy się w przypadku losowego warunku, gwarantuje zakończenie?

text: Gdybym miał kod, który zakończył się na podstawie tego, czy generator liczb losowych zwrócił wynik (jak poniżej), czy byłoby 100% pewne, że kod zakończy się, jeśli będzie mógł działać w nieskończoność. while (random(MAX_NUMBER) != 0): // random zwraca losową liczbę z przedziału od 0 do MAX_NUMBER print('Hello World') Interesują mnie również wszelkie rozróżnienia między czysto random i deterministycznymi losowymi, których zwykle używają komputery. Załóżmy, że nasienie nie może być poznane w przypadku deterministycznego losowania. Naiwnie można by zasugerować, że kod wyjdzie, przecież każda liczba ma jakąś możliwość i cały czas na to, żeby ta możliwość została zrealizowana. Z drugiej strony można by argumentować, że istnieje losowa szansa, że może nigdy nie spełnić warunku wyjścia – generator może generować 1 „losowo” aż do nieskończoności. (Przypuszczam, że można by kwestionować ważność generatora liczb losowych, gdyby był to generator deterministyczny zwracający tylko „losowo” jedynki)


title: szybka struktura danych dostępu n-gram

text: **TL;DR** Czy istnieje struktura danych, która pozwoliłaby mi szybko dopasować słowa w dowolnym momencie (np. „foo” pasuje do „foobar” i „zoofoo”) i, najlepiej, zwraca listę „znaków, które pojawiają się po igle” (np. 'foo' powinno zwrócić ['b', $]). * * * Wdrażam algorytm, który generuje losowe słowa z zestawu treningowego innych słów. W uproszczeniu wygląda to tak: 1. Wybierz dowolny punkt początkowy. 2. Wybierz najdłuższy sufiks bieżącego słowa, który jest zawarty w co najmniej 2 innych słowach. 3. Wybierz losowo jedno z tych słów i dołącz następny znak do bieżącego słowa. 4. GOTO 2 aż "następny znak" to EOW, np. jeśli bieżącym słowem jest 'tat', niektóre poprawne opcje to 'potato' i 'tattoo'; jeśli bieżącym słowem jest „oftalmi”, jedyną opcją jest „oftalmia”, więc szukamy, czy jakieś słowa zawierają „ftalmi”, „htalmi”, „talmi” i tak dalej. Wypróbowałem kilka implementacji: w jednej użyłem triady wypełnionej każdym sufiksem każdego słowa. Jest to bardzo szybkie w generowaniu słów, ale wypełnianie tri jest BARDZO wolne (~4 miliony słów nie zostało ukończonych w ciągu 10 godzin). W innym wygenerowałem hash: for word w słowach: for sufiks w ogonach(słowa): for prefix, sufiks in prefixs(words): # prefixes("foo") = [("f","oo "),("fo","o"),("foo","")] ngrams[prefiks].add(sufiks) # to jest zestaw i znacznie szybciej czyta zestaw uczący i bardzo szybko generowanie, ale zajmuje dużo pamięci RAM. I wreszcie, głupia opcja prostego wyszukiwania kandydatów = [słowo w słowo w słowach, jeśli ciąg w słowach], która zajmuje bardzo mało pamięci, ale jest znacznie wolniejsza. Czy istnieje struktura danych z zachowaniem, którego potrzebuję?


title: GPL i poufne reguły biznesowe w aplikacji jednostronicowej

text: Projektuję aplikację internetową dla klienta, który chce zachować niektóre ze swoich reguł biznesowych jako prywatne, mamy umowę NDA. Krótko mówiąc, klienci używają aplikacji do rezerwacji usługi, a pracownicy używają jej do śledzenia rezerwacji. Ponieważ fronton jest publiczny (i niewiarygodny), wszystkie decyzje, które są określone przez reguły biznesowe, muszą zachodzić na serwerze. Teraz, jeśli używam bardzo ładnego modułu na licencji GPLv3, to SPA musi być licencjonowane na kompatybilnej licencji, takiej jak MIT, ponieważ aplikacja (w tym moduł) jest dystrybuowana dla każdego, kto odwiedza witrynę. W porządku, i tak nie da się niczego ukryć na froncie. Nie wnoszę wystarczająco dużo z powrotem do społeczności i chciałbym opublikować przykład SPA klasy produkcyjnej jako open source. Byłby to świetny sposób na założenie bloga. Serwer implementowałby publicznie zdefiniowany interfejs API, a front-end działałby z dowolnym serwerem, który implementuje API. Dodałbym prosty serwer z aplikacją na licencji GPL, aby mógł go uruchomić każdy. Serwer nie jest zależny od klienta, bo można by go zastąpić curl. Zastanawiam się, czy w tym scenariuszu mogę zachować prywatność unikalnych reguł biznesowych mojego klienta w aplikacji serwera bez naruszania zasad lub intencji GPL?


title: Jak złamać linię w adresie e-mail?

text: Po krótkiej dyskusji natknąłem się na dość skomplikowaną sytuację. Powiedz, że zamierzam wyświetlić adres e-mail. Mam oczywiście ograniczoną przestrzeń dostępną na ekranie – czy to w przeglądarce, czy w interfejsie aplikacji. Adresy e-mail są jednak ograniczone do 64 + 1 + 255 = 320 znaków przez RFC5321, podczas gdy ten sam RFC również ogranicza ścieżkę do 256 (co prowadzi do rzeczywistych 254) znaków. To całkiem sporo w przypadku większości ekranów — wiersze, które teraz piszę, zawierają mniej niż sto znaków każda. Stanowi to więc pewien problem podczas próby wyświetlenia adresów e-mail. Przy tej liczbie znaków wystarczająco duże kontenery wydawałyby się ogromne dla adresu e-mail o „domyślnym rozmiarze” (moja średnia wynosi obecnie nieco poniżej 30 znaków), podczas gdy mniejszy kontener prowadziłby do przepełnienia. Na początku dobrym pomysłem wydaje się użycie mniejszego kontenera, ale wprowadzenie łamania linii w dłuższych adresach. Co prowadzi mnie do pierwszego ważnego pytania: **Gdzie mam przerwać?** Po zbiorze/względnej liczbie znaków? Przed czy po `@`? A zaraz potem pojawia się drugie pytanie: **Jak mogę złamać?** Spacja o zerowej szerokości? `<wbr>` w HTML? Wstawić myślnik czy nie? Wydaje się, że istnieją powody za i przeciw któremukolwiek z nich, ale nie mogę za życia znaleźć żadnych źródeł, z których mogłabym skorzystać w mojej decyzji. Wygląda na to, że nikt tak naprawdę nigdy nie miał do czynienia z tą sytuacją (to znaczy, że fizyczny limit majątku nigdy się nie wyczerpał). Najlepsze, jakie mogę znaleźć, to kilka przewodników po stylach publikowania online, które preferują adres e-mail w jednej linii i dostosowują otaczające elementy, aby to zadziałało. Cóż, w pewnych okolicznościach możemy po prostu nie mieć takiej opcji.


title: Czy Google może używać danych moich użytkowników?

text: Mam aplikację internetową, która korzysta z usług Google App Engine i Google Cloud Datastore. Jednak czytając nowe warunki korzystania z usług Google Cloud, zauważam tę część: > Ponadto Klient powiadomi swoich Użytkowników końcowych, że wszelkie Dane Klienta dostarczone > w ramach Usług zostaną udostępnione stronie trzeciej (tj. > Google) w ramach Google świadczące Usługi. i to: > „Dane Klienta” oznaczają treści dostarczane, przesyłane lub wyświetlane za pośrednictwem > Usług przez Klienta lub jego Użytkowników końcowych; ale z wyłączeniem wszelkich danych podanych jako > część Konta. Czy to oznacza, że Google może uzyskać dostęp do danych przechowywanych w Datastore moich Użytkowników Końcowych, aby na przykład ulepszyć ich system reklamowy? Czy warunki Amazon AWS też są takie? A co z Windows Azure?


title: Czy przeprowadzenie poważnej refaktoryzacji spodoba się starszemu programiście?

text: Moja firma dziedziczy dużą bazę kodu dla dwóch produktów, która jest podzielona na różne aplikacje przy użyciu różnych języków i technologii, ze znaczną częścią kodu spaghetti. Jestem jedynym wewnętrznym informatykiem i chociaż jestem przekonany, że mógłbym utrzymywać oprogramowanie dla bieżących operacji, nie mam doświadczenia, aby przekonwertować je do postaci łatwiejszej do utrzymania. Przy takim podejściu i wyborach programistycznych, które są całkowicie elastyczne, czy taka rola przemawia do starszego programisty, czy też „mamy sporo złego kodu” i mamy zamiar go ulepszyć poprawnie?


title: Gdzie mogę poprosić o sprawdzenie dostępności witryny?

text: Nie jestem _zbyt_ za daleko (mam nadzieję) od ukończenia strony. Chcę go przejrzeć pod kątem jego dostępności. Zadaniem witryny jest wyświetlanie strumieniowych danych dotyczących opcji na akcje z dokładnością do 10 sekund. Czy ktoś zna grupę lub forum, na którym mogę wysłać prośbę o sprawdzenie dostępności witryny? Dziękuję!


title: Właściwe obejście dla wielokrotnego dziedziczenia w Javie (Android)

text: Mam problem koncepcyjny z prawidłową implementacją kodu, który wydaje się wymagać wielokrotnego dziedziczenia, co nie byłoby problemem w wielu językach OO, ale ponieważ projekt jest przeznaczony dla Androida, nie ma czegoś takiego jak wielokrotne `rozszerzenia`. Mam kilka działań, wywodzących się z różnych klas bazowych, takich jak proste `Activity`, `TabActivity`, `ListActivity`, `ExpandableListActivity` itp. Mam też kilka fragmentów kodu, które muszę umieścić w `onStart`, `onStop`, `onSaveInstanceState`, `onRestoreInstanceState` i inne standardowe procedury obsługi zdarzeń we wszystkich działaniach. Jeśli mam jedną klasę bazową dla wszystkich działań, umieściłbym kod w specjalnej pośredniej klasie pochodnej, a następnie utworzyłbym wszystkie działania, które ją rozszerzają. Niestety tak nie jest, ponieważ istnieje wiele klas bazowych. Ale umieszczenie tych samych fragmentów kodu w kilku klasach pośrednich nie jest dobrym rozwiązaniem, imho. Innym podejściem może być utworzenie obiektu pomocnika i delegowanie wszystkich wywołań wyżej wymienionych zdarzeń do pomocnika. Wymaga to jednak uwzględnienia obiektu pomocniczego i przedefiniowania wszystkich procedur obsługi we wszystkich klasach pośrednich. Więc nie ma dużej różnicy w stosunku do pierwszego podejścia tutaj - wciąż dużo duplikatów kodu. Gdyby podobna sytuacja miała miejsce w systemie Windows, podklasę podklasę klasy bazowej (coś, co "odpowiada" klasie `Activity` w Androidzie) i pułapkę w niej (w jednym miejscu) odpowiednie komunikaty. Co można w tym celu zrobić w Javie/Androidzie? Wiem, że istnieją ciekawe narzędzia, takie jak instrumentacja Java (z kilkoma prawdziwymi przykładami), ale nie jestem guru Java i nie jestem pewien, czy warto spróbować w tym konkretnym przypadku. Jeśli brakowało mi innych przyzwoitych rozwiązań, proszę o ich wymienienie. **AKTUALIZACJA:** Dla tych, którzy mogą być zainteresowani rozwiązaniem tego samego problemu w Androidzie, znalazłem proste obejście. Istnieje klasa Application, która udostępnia między innymi interfejs ActivityLifecycleCallbacks. Robi dokładnie to, czego potrzebuję, pozwalając nam przechwycić i dodać wartość do ważnych wydarzeń we wszystkich działaniach. Jedyną wadą tej metody jest to, że jest ona dostępna od poziomu API 14, co w wielu przypadkach nie wystarcza (obsługa poziomu API 10 jest dziś typowym wymogiem).


title: Jakie są ciekawe, ale niezbyt trudne projekty dla początkującego hakera jądra?

text: Po ukończeniu kursu systemów operacyjnych jestem zainteresowany poszerzeniem mojej wiedzy na temat jądra Linuksa i praktyką pracy z dużym systemem. W jakich ciekawych, ale niezbyt trudnych projektach mogę spróbować swoich sił? EDYCJA: trochę tła na temat tego, co zrobiłem z jądrem. * Zaimplementowano nową politykę planowania * Zaimplementowano wątki użytkownika i odpowiednią bibliotekę mutex (nie tak naprawdę hakowanie jądra, ale zawierało teorię związaną z jądrem)


title: „Testowanie” tablicy podczas rozmowy kwalifikacyjnej: legalny sposób na wykonanie kopii zapasowej kodu (tablicy)?

text: Jak rozumiem, **pomyłka (nawet literówka lub brak „;”) w kodzie tablicy często będzie cię kosztować kilka punktów wywiadu**. Unikanie tego nieuchronnie spowoduje, że jeden kod będzie raz po raz sprawdzany (tracąc czas i prawdopodobnie nerwową energię / koncentrację) lub nawet używając prostszego (a przez to mniej efektywnego) algorytmu – i oba te sposoby są znowu „kosztowne”! Więc **dlaczego nie po prostu szybko napisać kodu** tak eleganckiego i efektywnego, jak miałbyś do dyspozycji (jednostkowy) framework testujący **a potem po prostu go przetestować (tylko na tablicy)** ? Czy ktoś próbował/widział takie podejście? Czy cały pomysł jest godny? **[dotyczy to oczywiście również piórnika]**