konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Jedna zasadnicza sprawa. Usługa jest tyle warta ile jest w stanie zapłacić klient. Kto tego nie rozumie może sobie uzasadniać tworzenie projektów profesjonalizmem ale prawda jest taka, że jeżeli klient daje X za określony projekt a kwota ta nie wystarcza na pokrycie wyceny ustalonej na podstawie kosztorysu to jest dwa wyjścia:

1. freelancer wykonuje część pracy za darmo, więc sumarycznie tylko dokłada do interesu
2. freelancer powinien podjąć takie działania, by (o ile projekt na to pozwala) ograniczyć czas pracy do minimum, inaczej jest to nieopłacalne

Klient nie musi znać technologii, dla niego ma to wszystko działać poprawnie zgodnie ze specyfikacją (o ile taka jest bo czasami to nawet freelancer sam może sobie ustalić co i jak ma działać), zatem takie testy jednostkowe czy dokumentację techniczną faktycznie może potraktować jako obrzydliwe naciąganie. Tu już nawet nie chodzi o profesjonalizm. To już problem z rynkiem.

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Usługa jest warta tyle, ile jest warta. Jeżeli klient nie jest w stanie zapłacić, to albo szuka środków, albo nie dostaje usługi.

Ja jestem w stanie zapłacić 10 złotych, proszę wybudować mi wieżowiec.

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Jarosław F.:
Usługa jest warta tyle, ile jest warta. Jeżeli klient nie jest w stanie zapłacić, to albo szuka środków, albo nie dostaje usługi.

Ja jestem w stanie zapłacić 10 złotych, proszę wybudować mi wieżowiec.

Tak można sobie argumentować o ile ma się dobrze prosperującą firmę i klientów, którzy nie targują się o ceny tylko płacą tyle ile firma sobie zażyczy. Rzeczywistość nie jest jednak tak różowa a widać to na portalach aukcyjnych, choć nie tylko gdzie dość duży odsetek freelancerów godzi się na obniżenie ceny byle by tylko dostać jakieś zlecenie bo wiadomo że czasem to lepiej coś zarobić niż nic. Przykre ale prawdziwe.

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Postanowiłem się nieco zabawić i pokusiłem się o napisanie własnego symulatora dużego lotka.

http://pastebin.com/rp6567WX

Założenia:
1. Losowanie 6 liczb z 49.
2. Można ustawiać dowolną ilość kuponów i dowolną ilość losowań
3. Każdy kupon jest tylko na jedno losowanie
4. Liczby skreślane w każdym kuponie będą później powtarzać się w następnych seriach losowań. Dla przykładu jest 5 kuponów na 5 kolejnych losowań, na każde następne 5 będą te same liczby co w tych 5 kuponach
5. Można dowolnie definiować wygrane za trafienie trójki, czwórki, piątki i szóstki
6. Liczbę kuponów i losowań definiuje się w parametrach linii poleceń

Brak testów jednostkowych, formalnie nie mogę również niczego zagwarantować, ze względu na licencję tego kodu a jest to GNU GPL v.2.

Program oparty jest na klasie, można to też rozbudowywać. Program pokazuje brutalną prawdę o grach losowych. Testowałem to na Python 2.6 pod Windows. Nie sprawdzałem tego pod Linux ponieważ nie używam tego systemu.

Wszelkie uwagi mile widziane :)

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Dariusz R.:
Tak można sobie argumentować o ile ma się dobrze prosperującą firmę i klientów, którzy nie targują się o ceny tylko płacą tyle ile firma sobie zażyczy. Rzeczywistość nie jest jednak tak różowa a widać to na portalach aukcyjnych, choć nie tylko gdzie dość duży odsetek freelancerów godzi się na obniżenie ceny byle by tylko dostać jakieś zlecenie bo wiadomo że czasem to lepiej coś zarobić niż nic. Przykre ale prawdziwe.

A bo nie ma co psuć najpierw rynek, a potem narzekać, że wszyscy chcą wszystko za wpółdarmo lub za free.

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Jarosław F.:
Dariusz R.:
Tak można sobie argumentować o ile ma się dobrze prosperującą firmę i klientów, którzy nie targują się o ceny tylko płacą tyle ile firma sobie zażyczy. Rzeczywistość nie jest jednak tak różowa a widać to na portalach aukcyjnych, choć nie tylko gdzie dość duży odsetek freelancerów godzi się na obniżenie ceny byle by tylko dostać jakieś zlecenie bo wiadomo że czasem to lepiej coś zarobić niż nic. Przykre ale prawdziwe.

A bo nie ma co psuć najpierw rynek, a potem narzekać, że wszyscy chcą wszystko za wpółdarmo lub za free.

Nawet gdyby takie psucie rynku nie istniało to nie wyobrażam sobie żeby ktoś nie próbował schodzić z cen, w końcu na tym rynku jest i tak duża konkurencja, niezależnie od tego w czym specjalizował się freelancer. Mówię o IT. Na podstawie wypowiedzi wielu freelancerów wyczuwam tu jakiś bunt wobec tego żałosnego zaniżania stawek, ewentualnie jakieś nieformalne zmowy cenowe, jednak prawda jest taka, że pewne rzeczy są nieuniknione. Jeśli freelancer nie potrafi poradzić sobie z "psuciem rynku", powinien chyba rozważyć zmianę branży lub modelu biznesowego. Nie wyobrażam sobie sytuacji w której każdy kto ma trochę oleju w głowie decyduje się wejść na ten rynek (mówię o założeniu własnej firmy) na podstawie ogólnie panującej mody czy zapewnień kolegów o tym jak to dużo można zarobić. Bo to jest jak rosyjska ruletka.

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

(i + 1, coupon[0], coupon[1], coupon[2], coupon[3], coupon[4], coupon[5], \
draw[0], draw[1], draw[2], draw[3], draw[4], draw[5], occurence, win)
trochę dziwnie to wygląda i mało DRY. I nie skalowalne. Jak liczb do losowania będzie 20 (w multilotku się chyba tyle losuje?) to będziesz dopisywał coupon[6], coupon[7], coupon[8]...?
elif occurence == 4:
win = self.WinOnFour
elif occurence == 5:
win = self.WinOnFive
elif occurence == 6:
win = self.WinOnSix
to w sumie taka sama kasza i tak samo nieskalowalne, jak kod z linka z pierwszego pytania....

No poza tym DelphiCase (czy jak to się tam nazywa) w nazwach funkcji,
podczas gdy cały Python jedzie na underscorach, to też w sumie nie jest zbyt dobry pomysł...

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Łukasz L.:
(i + 1, coupon[0], coupon[1], coupon[2], coupon[3], coupon[4], coupon[5], \
draw[0], draw[1], draw[2], draw[3], draw[4], draw[5], occurence, win)
trochę dziwnie to wygląda i mało DRY. I nie skalowalne. Jak liczb do losowania będzie 20 (w multilotku się chyba tyle losuje?) to będziesz dopisywał coupon[6], coupon[7], coupon[8]...?

Tak, sprawa się w tym przypadku skomplikuje. Generalnie chodziło mi o wyświetlenie sformatowanego tekstu obrazującego jakie liczby zostały wytypowane i wylosowane. A losuje się 6 z 49. W przypadku symulacji 5 z 42, gdyby to jeszcze uwzględnić w tej klasie, jeszcze bardziej skomplikuje sprawę. Widzę że to problem związany z zastosowaniem wzorców/antywzorców.
elif occurence == 4:
win = self.WinOnFour
elif occurence == 5:
win = self.WinOnFive
elif occurence == 6:
win = self.WinOnSix
to w sumie taka sama kasza i tak samo nieskalowalne, jak kod z linka z pierwszego pytania....

No poza tym DelphiCase (czy jak to się tam nazywa) w nazwach funkcji,
podczas gdy cały Python jedzie na underscorach, to też w sumie nie jest zbyt dobry pomysł...

Teraz zrobiłem tak:


win = {
0: 0.00,
1: 0.00,
2: 0.00,
3: self.WinOnThree,
4: self.WinOnFour,
5: self.WinOnFive,
6: self.WinOnSix
}[occurence]


zamiast tych if - elif.

A konkretniej tu jest coś o zastosowaniu case w pythonie:
http://stackoverflow.com/questions/60208/replacements-...

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

zamiast tych if - elif.
Ale mnie akurat nie chodziło if - elif, tylko o to, że są 4 zmienne WinOnThree, .WinOnFour, WinOnFive, WinOnSix zamiast jednej listy czy krotki z wygranymi np. (0, 0, 10.00, 100.00, 3500.00, 1000000.00)

coś jak (pseudokod):

self.wins = (0, 0, 10.00, 100.00, 3500.00, 1000000.00)
........
win = self.wins[occurence - 1]

Generalnie chodziło mi o wyświetlenie sformatowanego tekstu obrazującego jakie
liczby zostały wytypowane i wylosowane. A losuje się 6 z 49. W przypadku symulacji
5 z 42, gdyby to jeszcze uwzględnić w tej klasie, jeszcze bardziej skomplikuje
sprawę.
czemu niby komplikuje? Przecież to tylko inne parametry k i n do symulacji.

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

encapsulatedMethod() {
anotherEncapsulatedMethod() {
yetAnotherEncapsulatedMethod() {
return "Dafuq did I just see?";
}
}
}

Ja jak coś robię dla klienta i mam to wspierać, to staram się pisać kod na tyle zwięzły, na ile on pozostaje jeszcze czytelny.

Gdybym był na Twoim projekcie menadżerem, to pierwsza rzecz, którą bym Ci powiedział, było by:
— Zobaczę jeszcze raz if (xxxxxx == true), to dam Ci po gębie.

Druga rzecz, albo to jest aplikacja, albo to jest biblioteka. Jeżeli to "Library", to nie ma prawa mieć main().

Trzecia rzecz, to to, że metoda doesUserDecideToStart(), zamiast odpowiedzieć true/false, odpala aplikację.

Czwarta, żeby się dowiedzieć, czy użytkownik wcisnął "yes" lub "no", wykorzystuje się taki łańcuh:
ApplicationRunner.doesUserDecideToStart() -> getUserDecisionToStart() -> UserDecisionToStart.whatIsTheDecision()

Albo to jest przepisane na amen, póki małe, albo z programistą staje się przykry wypadek.

Oddzielnie za nazewnictwo w stylu doesUserDecideToStart() dałbym kopa, ale to już kwestia gustu.

No i pierwsze polecenie, to byłoby zrealizować potencjał klasy do uproszczenia, przynajmniej w dwa razy.Ten post został edytowany przez Autora dnia 16.05.13 o godzinie 21:07

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

No jak już każdy tak kombinuję to też usiadłem i coś wymodziłem.
from random import sample

coupon_count = 3
coupon_cost = 1.25
bet_numbers = 6

draw_count = 5
k = 6
n = 49

wins = (0, 0, 0, 10, 100, 3500, 1000000)

balance = - coupon_cost * draw_count
draws = [(sample(xrange(n),k)) for a in xrange(draw_count)]
coupons = [(sample(xrange(n),bet_numbers)) for a in xrange(coupon_count)]

checked_coupons = [len(set(coupon) & set(draw)) for coupon in coupons for draw in draws]

for win, c in [(wins[c], c) for c in checked_coupons]:
balance += win
print "%d liczb trafionych, wygrana: %.2f" % (c, win)

print "losowania: "
for d in draws: print sorted(d)
print "kupony: "
for c in coupons: print sorted(d)
print "bilans: ", balance

wybaczcie tę mocno konsolową logikę, ale jednak - działa. I można ustawić dowolnie wygraną, liczbę losowań, kuponów, cen kuponów.

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

doesUserDecideToStart() nazewnictwo jest zajebiste ma miec zapis algorytmiczny i tyle.

hasUserDecidedToStart() wtedy. po wtóre, odpowiedź na to proste zapytanie jest niepotrzebnie rzucana pomiędzy trzema metodami w dwóch klasach, coś podobnego z initializeSoftware. I nie trzeba się usprawiedliwiać, że to 7 rewizja, w poście, w którym gadasz o rzekomej przewadze programisty komercyjnego nad freelancerem. Ja jestem i tym i innym, wiesz, postrzegłbym różnicę, a to, że kod tak wygląda na siódmym podejściu, mówi o tym, że normalnie on będzie u tego konkretnego programisty wyglądał dopiero na 40-tym.

To ja jeszcze nic nie mówiłem o tym, że sprawdzać, który przycisk był kliknięty, poprzez sprawdzanie tekstu na tym przycisku dolicza jeszcze parę punktów karnych.

Jednym słowem, jeżeli chcesz popisać się przykładem kodu, to wyprodukuj refaktoryzowaną wersję. Póki co — nie zatrudniłbym, miałem pod sobą jednego programistę, co rodził takie perełki, potem jeden błąd był ścigany przez pół dnia.
runner to coś w formie mocka tak samo jak main

Mylisz się, kolego, runner jest do trochę innych rzeczy niezbędny.

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Dyskusja uświadomiła mi jedną rzecz. Nie ma co chwalić się przed rekruterem/pracodawcą jakim to jest się zajebistym programistą bo zawsze może być tak, że ta druga strona która może być bardziej doświadczona może bez problemu sprowadzić takiego który na siłę próbuje coś udowodnić z powrotem do miejsca w którym taki się znajduje.

Teraz zrobiłem coś takiego:


class ConsoleApplication(object):

def __init__(self):
pass

def Usage(self):
print "SKLADNIA: python lottosim.py liczba_kuponow liczba_losowan"

def Run(self):
if len(sys.argv) == 1:
self.Usage()
sys.exit(1)

try:
lotto = LottoSimulator()
lotto.NumberOfCoupons = int(sys.argv[1])
lotto.NumberOfDraws = int(sys.argv[2])
lotto.CouponCost = 1.25
lotto.Run()

for draw in lotto.Draws:
print draw
except:
print "Symulacja nie powiodla sie. Sprawdz liczbe parametrow."
print "Liczba losowan nie moze byc rowna zero"

def main():
Application = ConsoleApplication()
Application.Run()

if __name__ == "__main__":
main()



Czy o taki loader chodziło Adrianowi?

Dalej. Jeśli użyłbym Boa Construktor to w głównym pliku lottosim.py byłoby tak:


#!/usr/bin/env python
#Boa:App:BoaApp

import wx

import Frame1

modules ={u'Frame1': [1, 'Main frame of Application', u'Frame1.py']}

class BoaApp(wx.App):
def OnInit(self):
self.main = Frame1.create(None)
self.main.Show()
self.SetTopWindow(self.main)
return True

def main():
application = BoaApp(0)
application.MainLoop()

if __name__ == '__main__':
main()


Czyli widać że jest tu określona konstrukcja.

Adrian Stolarski

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: Próbka kodu a możliwość zatrudnienia

Co do testów to jedyne czego dotąd używałem to unittest.Testcase i związane z tym funkcje AssertEqual. Nie znam innych frameworków. Nie wiem, może istnieją jeszcze jakieś środowiska umożliwiające testowanie aplikacji na bardziej zaawansowanym poziomie. Ale generalnie to przyjąłem taką praktykę, że w przypadku potencjalnie występujących zagrożeń jeśli chodzi o błędy, to akurat może nie w python ale w języku pascal, w którym programuję najwięcej to przyjmuję takie postępowanie:



try
//wstaw dowolne instrukcje
except
on E: exception do
begin
//tutaj jakiś message dialog, który oprócz informacji "Operacja nie powiodła się"
//wyświetla opcjonalnie np. E.ClassName + ' : ' + E.Message
//i opcjonalnie:
Logger.Error(E.ClassName + ' : ' E.Message);
end;
end;



Logger zapisuje informacje o błędach do jakiegoś pliku tekstowego i w tym przypadku dobrze wiem co spowoduje błąd. Tego typu zabiegi zastosowałem np. w menedżerze freelance, który jest jednym z moich najważniejszych własnych projektów. Powiedzmy sobie szczerze. W przypadku bardziej złożonych projektów nie obejdzie się bez tego typu działań, ponieważ nie ma szans żeby nawet doświadczony (albo grupa) programista nie popełnił jakiegoś błędu. Sposób który tu przedstawiłem pozwala mi na wykrycie wielu błędów związanych akurat z tym, że gdzieś tam przypadkiem popełniłem błąd.

Jeśli chodzi o Python to mógłbym pokusić się o tworzenie aplikacji i serwisów w oparciu o Django, może też np. Google App Engine + bazy danych PostgreSQL. Nie wiem jak to wygląda za granicą. Przede wszystkim zasadnicza kwestia. Jak wygląda ten rynek? Czy nie jest przypadkiem nasycony? W Polsce programistów Pythona chyba nie jest tak wielu, u nas wygląda na to że króluje JAVA i C#. Ale Python jest bardzo dobry ze względu na prostotę i obszerny support.



Wyślij zaproszenie do