Czesc!
Niedawno zmienilem prace(to moja druga praca) i trafilem do firmy ktora potencjalnie miala byc lepsza od mojej poprzedniej. Tzn. opowiadali mi ze u nich idea software craftsmanship jest wazna i dbaja o kod i jest zajebiscie. W praktyce testow brak, caly kod na ifach(piramidy glebokie na 5 poziomow lub wiecej), brak jakiejkolwiek abstrakcji a CI jedyne co robi to buduje apke. Co najlepsze polecil mi ta firme kumpel z ktorym wspolpracuje i ktory jest autorem tego slabego kodu. Probowalem gadac z kumplem ale jedyne co mowi to ze trzeba robic szybko i nie ma czasu na stosowanie dobrych praktyk bo "gora" chce miec szybko i klient nie zaplaci za pisanie dobrego kodu. W dodatku i mi zaczal mowic zebym pisal slaby kod byle szybciej.
Wpadlem w bagno i teraz pytanie co zrobic?
Wyglada na to ze gadanie z kumplem nie ma zadnego sensu, natomiast zastanawiam sie czy moze pojsc do szefa i o tym pogadac z nim? Moze on nie wie co za gowno pisane jest? Z drugiej strony jak dojdzie do kumpla to bedzie ze go podpierdalam. Jestem w kropce
Generalnie prawie zawsze cudzy kod wydaje się brzydki.
W rzeczywistości if-y często wcale nie są takie złe, bo chociaż estetyka nienadzwyczajna, to często łatwiej się w nich połapać niż w kodzie będącym wynikiem tzw. dobrych praktyk.
Ja np. gdy po latach wracam do fragmentów, które sam pisałem - i które zdążyłem już zapomnieć - to te pisane na szybko często łatwiej mi poprawiać niż te, przy których miałem więcej czasu na rozmyślania.
Jak nie masz zależności cyklicznych pakietów, to nie masz tak źle.
Z tymi testami to mimo, że ich pisanie spowolni cię teraz, to jak coś się gdzieś wyjebie, to szybko znajdziesz powód, a inni będą debugować.
Ta drabinka ifów jakby nie patrzeć, to nie jest czasem takie głupie, jak zastosujesz binarne ifowe wyszukiwanie, z 10 ifów masz 1024 elementy przeszukane, pesymistyczne i optymistyczne przypadki wynoszą 10, przy 5 elementach można się w 3 warunkach zmieścić, lub w jednej operacji stosując lepsze rozwiązanie.
Ale wiadomo czystość kodu w tym miejscu nie będzie zbyt dobra, zwykle 0/10 w skali czystości.
Bo zwykle używanie ifów jest dobre do bardzo niewielkiej ilości elementów 1,2 góra 3, bo bo coś te ostatnie else if zrobili.
5 ifów pod rząd to trochę marnotrawstwo, bo w optymistycznym przypadku masz 1 sprawdzenie, a w pesymistycznym 5.
A jak już tam jesteś i dobrze płacą, to czemu nie, masz czas poeksperymentować z kodem.
- Zmień robotę.
- Zmień kupla na innego.
Ale jak chcesz białorycerzyć to postaw Sonara i ustaw zeby CI automatycznie odpalało sonara a potem wysyłało raport do szefa, niech sobie poczyta...
@offtop
co wy tam wiecie o ifach
na stronce to lepiej wygląda bo nie ma "dziury" http://codecrap.com/content/400/
if (player.hasPermission("se.block.smoke"))
if (block != Material.LEVER) {
if (block != Material.BED) {
if (block != Material.BED_BLOCK) {
if (block != Material.CACTUS) {
if (block != Material.BRICK_STAIRS) {
if (block != Material.BIRCH_WOOD_STAIRS) {
if (block != Material.BREWING_STAND) {
if (block != Material.CAKE) {
if (block != Material.CAKE_BLOCK) {
if (block != Material.CAULDRON) {
if (block != Material.CHEST) {
if (block != Material.CLAY) {
if (block != Material.SAND) {
if (block != Material.BURNING_FURNACE) {
if (block != Material.COBBLESTONE_STAIRS) {
if (block != Material.FENCE) {
if (block != Material.FENCE_GATE) {
if (block != Material.FIRE) {
if (block != Material.GRAVEL) {
if (block != Material.IRON_DOOR_BLOCK) {
if (block != Material.IRON_FENCE) {
if (block != Material.IRON_DOOR) {
if (block != Material.LADDER) {
if (block != Material.MELON) {
if (block != Material.LEAVES) {
if (block != Material.LOCKED_CHEST) {
if (block != Material.SANDSTONE_STAIRS) {
if (block != Material.SMOOTH_STAIRS) {
if (block != Material.SPRUCE_WOOD_STAIRS) {
if (block != Material.TNT) {
if (block != Material.WOOD_DOUBLE_STEP) {
if (block != Material.WOOD_DOOR) {
if (block != Material.WEB) {
if (block != Material.ICE) {
if (block != Material.SNOW_BLOCK) {
if (block != Material.SNOW) {
if (block != Material.WATER_LILY) {
if (block != Material.TORCH) {
if (block != Material.REDSTONE_WIRE) {
if (block != Material.YELLOW_FLOWER) {
if (block != Material.RED_ROSE) {
if (block != Material.PAINTING) {
if (block != Material.RAILS) {
if (block != Material.POWERED_RAIL) {
if (block != Material.DETECTOR_RAIL) {
if (block != Material.DEAD_BUSH) {
if (block != Material.GRASS) {
if (block != Material.NETHER_BRICK_STAIRS) {
if (block != Material.NETHER_FENCE) {
if (block != Material.NETHER_WARTS) {
if (block != Material.HUGE_MUSHROOM_1) {
if (block != Material.HUGE_MUSHROOM_2) {
if (block != Material.BROWN_MUSHROOM) {
if (block != Material.GLASS) {
if (block != Material.JUNGLE_WOOD_STAIRS) {
if (block != Material.WATER) {
if (block != Material.SUGAR_CANE_BLOCK) {
if (block != Material.WOOD_DOUBLE_STEP) {
if (block != Material.WALL_SIGN) {
if (block != Material.WOOD_PLATE) {
if (block != Material.STONE_PLATE) {
if (block != Material.STONE_BUTTON) {
if (block != Material.WOOD_STAIRS) {
if (block != Material.TRAP_DOOR) {
if (block != Material.TRIPWIRE) {
if (block != Material.TRIPWIRE_HOOK) {
if (block != Material.WOOD_STEP) {
if (block != Material.THIN_GLASS) {
if (block != Material.REDSTONE_TORCH_OFF) {
if (block != Material.REDSTONE_TORCH_ON) {
if (block != Material.SAPLING) {
String s = new SerializableLocation(loc).unpack().toString();
this.plugin.Blindeness.add(s);
this.plugin.Blindeness.save();
if (this.String1 == this.plugin.getConfig().getString("_Block_Blindeness")) {
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] You Created a" + ChatColor.DARK_RED + " BlindenessEffectBlock" + ChatColor.DARK_GREEN + " at " + ChatColor.RED + s);
}
else
{
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] You Created a" + ChatColor.DARK_RED + " BlindenessEffectBlock" + ChatColor.DARK_GREEN + " at " + ChatColor.RED + s);
}
} else {
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
else
player.sendMessage(ChatColor.DARK_GREEN + "[SpecialEffects] Can't" + ChatColor.DARK_RED + " create a EffectBlock" + ChatColor.DARK_GREEN + " Using this material");
}
}
Po pierwsze zmień znajomych.
Po drugie - o czym chcesz gadać z szefem? Jest programistą? Zna się na kodzie?
Ale na jakich ma zmienic? Chyba nie programistow bo ogolnie rzecz biorac to praktycznie wszyscy pisza c**** kod;)
Zmień robotę i kumpla.
Argument "bo góra naciska" i "bo nie ma czasu" jest chyba najsłabszy jaki można wymyślić.
Mogę zrozumieć "bo miałem kaca", "bo to był poniedziałek" albo "bo było gorąco" - bo to są przypadki jednostkowe.
Ale argument "bo nie ma czasu" wcale nie wymaga czynników zewnętrznych. Może wystąpić np. w miejscach gdzie programiści oglądają teledyski na YT.
Na odchodne powiedziałbym szefowi co myślę o tym sofcie.
Jest jedno ale: kolega może mieć rację, jeśli kod jest "jednorazowy". Czyli sprzedajecie kod klientowi, który do niego w życiu nie zajrzy i nie suportujecie tego kodu, a w przypadku potrzeby zmian klient zamawia całość od nowa u kogoś innego. Tak jest ponoć w niektórych "agencjach marketingowych", "domach medialnych" czy innych stajniach wordpressa. To muszą być smutne miejsca pracy, ale ponoć istnieją.
Zaprawdę powiadam wam, że g**no kod powróci z podwójną siłą, i będzie się mścił. I będzie już za późno,
A tak na poważnie to wiej do innej firmy. Jeśli firma ma takie podejście to kwestia czasu aby zaczęło się powoli wszystko sypać, a Ty będziesz musiał debugować g**no kod. W mojej poprzedniej firmie było dokładnie takie podejście. W każdym projekcie coś się sypie, pozwy od klientów, słaba atmosfera. Poza tym nie będziesz się tam rozwijał. Uciekaj z tej firmy :)
Jakie miasto ?
No, to w takim razie ja bym do niego poszedł i spytał, gdzie jest ten cudowny projekt i kod.