Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe

how!! posted:

I call it How!!'s rule of software complexity: As software complexity increases, bugs and features become indistinguishable.

Adbot
ADBOT LOVES YOU

MononcQc
May 29, 2007

how!! posted:

Hows that any different than a new manager coming on board and noticing that %0.13 is being shaved off all transactions. He asks the programmers why that is. None of the programmers have any idea. Three days later a programmer finds that on line 63463 theres a bit of code that subtracts %0.13 off all transactions. Manager asks why it is doing that. Programmer has no idea. No other manager has any idea. Manager tells programmer to remove that code. Company is then fined. I call it How!!'s rule of software complexity: As software complexity increases, bugs and features become indistinguishable.

If you believed in source control, you could use blame functionality to find out who wrote that code, when, associate it with a commit message that may explain things, or a way to contact the original programmer. But you don't believe in source control.

X-BUM-RAIDER-X
May 7, 2008
Every loving word he posts should be bold, you mean.

fritz
Jul 26, 2003

Did How!! get a job?

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe

how!! posted:

I've never understood the need people have to sperg out about commit. How often do you *really* have to go back over your history to find a particular commit?

The number of times a bad commit message has negatively effected me: 0.

I had a co-worker a while back who was one of those source control nazis. He'd freak out and yell at you if each commit message wasn't at least 2 sentences. I would always ask him "how does this effect you in any way" and never got an answer.

It seems it "negatively effected" you here. Since you didn't document your change and the rationale for it, you just delete code.

Jewel
May 2, 2009

fritz posted:

Did How!! get a job?

Better question is How!! did How!! get a job(!!)

ymgve
Jan 2, 2004


:dukedog:
Offensive Clock

Hamled posted:

I once threw out an entire authentication system because it was an undocumented, unreadable piece of poo poo and I suspected it was full of bugs and security holes and other nasty poo poo. It turned out that we did actually use that system to allow users to log in.

We lost an entire month of revenue while I rewrote the thing using clean, well-documented, understandable code that resembled none of that ugly spaghetti code we had previously. We still haven't gotten our user base back to what it had been. And to make things worse, two months later some rear end in a top hat hacker found a SQL injection exploit and ended up stealing our entire authentication database.





Just the cost of improving our business, I guess.

The fact that you threw out something without having the replacement ready is the coding horror, right?

And was that SQL injection in your "clean, well-documented, understandable" code?

senrath
Nov 4, 2009

Look Professor, a destruct switch!


ymgve posted:

The fact that you threw out something without having the replacement ready is the coding horror, right?

And was that SQL injection in your "clean, well-documented, understandable" code?

I think that was the point of that post, yeah.

No Safe Word
Feb 26, 2005

how!! posted:

The fine we had to pay is the price it costs to improve the business.

Holy poo poo.

hepatizon
Oct 27, 2010

how!! posted:

I call it How!!'s rule of software complexity: As software complexity increases, bugs and features become indistinguishable.

Indistinguishable to people who are too loving stupid to read the code.

X-BUM-RAIDER-X
May 7, 2008

Jewel posted:

Better question is How!! did How!! get a job(!!)

lol if you think he is employed.

1337JiveTurkey
Feb 17, 2005

Smugdog Millionaire posted:

Rewriting code because you don't understand it may not quite be as insane as it sounds. I read a Kent Beck blog post (I think, could've been some other notable person) wherein he claimed that refactoring was a useful technique he used to understand new codebases: he'd take a look at existing code and refactor it until he understood it. But of course he doesn't destroy 100% of the functionality in the process.

That's actually what I did to get a grip on the code posted. If you make two versions, one where test_availability is true and one where it isn't, you end up with two ~200 line methods with a lot of duplicated code. When test_availability is true, it's clear that data never gets used outside of the method. On further inspection, the only times it's read in the method are for values which wouldn't change from self.data. Replace all those with the self.data equivalents and the method's less than half the size of the original just from cutting out middlemen and removing dead code. The code that's remaining contains a large amount of obvious duplication and if I cared to go further, it should be no problem getting below 100 lines:

code:
def test_recurring_jobs_availability(self):
        contractlength = 4#months
    
        #if testing availability, need to retrieve mastercalendar for address/num_hours/team_size/city, and if sbusinesskey exists, need to retrieve calendar for specific cleaner
        gen_hits,gen_misses,specific_hits,specific_misses = [0,0,0,0]
        if not self.gen_avails:
            self.gen_avails = get_available_dates(self.data["address_postal_code"],self.data["address_city"],self.data["num_hours"],self.data["team_size"])
        if not self.specific_avails:
            if len(data["sbusinesskeys"])>0:
                tmp_avails = []
                for sbusinesskey in self.data["sbusinesskeys"]:
                    tmp_avails += [get_available_dates(self.data["address_postal_code"],self.data["address_city"],self.data["num_hours"],self.data["team_size"],businesskey=sbusinesskey)] 
                if len(tmp_avails)>0:
                    specific_avails=tmp_avails[0]
                    final_specific_avails = tmp_avails[0]
                    for i in range(1,len(tmp_avails)):
                        compare_avails = tmp_avails[i]
                        for start_date in specific_avails.keys():
                            for start_time in specific_avails[start_date]:
                                if start_date not in compare_avails.keys() or start_time not in compare_avails[start_date]:
                                    final_specific_avails[start_date] = [ele for ele in final_specific_avails[start_date] if ele != start_time]
                    specific_avails = final_specific_avails
                else:
                    specific_avails = tmp_avails[0]
            else:
                specific_avails = gen_avails
            self.specific_avails = specific_avails
    
        if self.data["recurring_frequency"] == "onetime":
            start = datetime.datetime.strptime("%s %s" % (self.data["recurring_start_date"], self.data["recurring_start_time"].upper()), '%m/%d/%Y %I:%M %p')
            start = pytz.timezone(self.data["timezone"]).localize(start)
            if self.data["recurring_start_date"] in self.gen_avails.keys() and self.data["recurring_start_time"].upper() in self.gen_avails[self.data["recurring_start_date"]]:
                gen_hits += 1
            else:
                gen_misses += 1
            if self.data["recurring_start_date"] in self.specific_avails.keys() and self.data["recurring_start_time"].upper() in self.specific_avails[self.data["recurring_start_date"]]:
                specific_hits += 1
            else:
                specific_misses += 1
            recurring_expiration = start
        elif self.data["recurring_frequency"] == "list":
            starts = []
            for i in range(0,len(self.data["recurring_start_dates"])):
                start_date = self.data["recurring_start_dates"][i]
                start_time = self.data["recurring_start_times"][i]
                start = datetime.datetime.strptime("%s %s" % (start_date, start_time.upper()), '%m/%d/%Y %I:%M %p')
                start = pytz.timezone(self.data["timezone"]).localize(start)
                starts += [start]
                if start_date in self.gen_avails.keys() and start_time.upper() in self.gen_avails[start_date]:
                    gen_hits += 1
                else:
                    gen_misses += 1
                if start_date in self.specific_avails.keys() and start_time.upper() in self.specific_avails[start_date]:
                    specific_hits += 1
                else:
                    specific_misses += 1
    
            min_start = starts[0]
            max_start = starts[0]
            for start in starts:
                if start<min_start:
                    min_start = start
                if start > max_start:
                    max_start = start
            recurring_expiration = max_start
    
        elif self.data["recurring_frequency"] == "weekly":
            start = datetime.datetime.strptime("%s %s" % (self.data["recurring_start_date"], self.data["recurring_start_time"].upper()), '%m/%d/%Y %I:%M %p')
            start = pytz.timezone(self.data["timezone"]).localize(start)
    
            for i in range(0,contractlength*5):
                new_start = start+datetime.timedelta(days=7*i)
                #manually setting hour due to daylight savings time possible bug
                new_start_date = "%s/%s/%s" % (new_start.month,new_start.day,new_start.year)
                new_start_time = self.data["recurring_start_time"]
                if new_start_date in self.gen_avails.keys() and new_start_time.upper() in self.gen_avails[new_start_date]:
                    gen_hits += 1
                else:
                    gen_misses += 1
                if new_start_date in self.specific_avails.keys() and new_start_time.upper() in self.specific_avails[new_start_date]:
                    specific_hits += 1
                else:
                    specific_misses += 1
                recurring_expiration = new_start
        elif self.data["recurring_frequency"] == "biweekly":
            start = datetime.datetime.strptime("%s %s" % (self.data["recurring_start_date"], self.data["recurring_start_time"].upper()), '%m/%d/%Y %I:%M %p')
            start = pytz.timezone(self.data["timezone"]).localize(start)
            for i in range(0,contractlength*30):
                new_start = start+datetime.timedelta(days=1*i)
                weekday = util.get_weekday(new_start)
                nth_weekday = util.get_nthdayofweek(new_start)
    
                logging.info(str(self.data))
                passed = False
                if self.data["recurring_biweekly_weeks"] == "1and3" and weekday == self.data["recurring_weekday"] and (nth_weekday ==1 or nth_weekday==3):
                    passed = True
                if self.data["recurring_biweekly_weeks"] == "2and4" and weekday == self.data["recurring_weekday"] and (nth_weekday ==2 or nth_weekday==4):
                    passed = True
                if not passed:
                    continue
                new_start_date = "%s/%s/%s" % (new_start.month,new_start.day,new_start.year)
                new_start_time = self.data["recurring_start_time"]
                if new_start_date in self.gen_avails.keys() and new_start_time.upper() in self.gen_avails[new_start_date]:
                    gen_hits += 1
                else:
                    gen_misses += 1
                if new_start_date in self.specific_avails.keys() and new_start_time.upper() in self.specific_avails[new_start_date]:
                    specific_hits += 1
                else:
                    specific_misses += 1
                recurring_expiration = new_start
    
        elif self.data["recurring_frequency"] == "monthly":
            start = datetime.datetime.strptime("%s %s" % (self.data["recurring_start_date"], self.data["recurring_start_time"].upper()), '%m/%d/%Y %I:%M %p')
            start = pytz.timezone(self.data["timezone"]).localize(start)
    
            for i in range(0,contractlength*30):
                new_start = start+datetime.timedelta(days=1*i)
                weekday = util.get_weekday(new_start)
                nth_weekday = util.get_nthdayofweek(new_start)
    
                passed = False
                if self.data["recurring_monthly_nth_weekday"] == str(nth_weekday) and weekday == self.data["recurring_weekday"]:
                    passed = True
                if not passed:
                    continue
                new_start_date = "%s/%s/%s" % (new_start.month,new_start.day,new_start.year)
                new_start_time = self.data["recurring_start_time"]
                if new_start_date in self.gen_avails.keys() and new_start_time.upper() in self.gen_avails[new_start_date]:
                    gen_hits += 1
                else:
                    gen_misses += 1
                if new_start_date in self.specific_avails.keys() and new_start_time.upper() in self.specific_avails[new_start_date]:
                    specific_hits += 1
                else:
                    specific_misses += 1
                recurring_expiration = new_start
        general_availability = float(gen_hits)/(gen_hits+gen_misses)
        specific_availability = float(specific_hits)/(specific_hits+specific_misses)
        return [general_availability,specific_availability]

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe
Python code:
                if len(tmp_avails)>0:
                    specific_avails=tmp_avails[0]
                    final_specific_avails = tmp_avails[0]
                    for i in range(1,len(tmp_avails)):
                        compare_avails = tmp_avails[i]
                        for start_date in specific_avails.keys():
                            for start_time in specific_avails[start_date]:
                                if start_date not in compare_avails.keys() or start_time not in compare_avails[start_date]:
                                    final_specific_avails[start_date] = [ele for ele in final_specific_avails[start_date] if ele != start_time]
                    specific_avails = final_specific_avails
                else:
                    specific_avails = tmp_avails[0]
As far as I can tell, this can be replaced with:

Python code:
if tmp_avails:
    do_nothing()
else:
    crash_because_hows_code_is_broken()

raminasi
Jan 25, 2005

a last drink with no ice
how!!, do you have a blog? If not, you should start one. I'd love to read it.

New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug

how!! posted:

Hows that any different than a new manager coming on board and noticing that %0.13 is being shaved off all transactions. He asks the programmers why that is. None of the programmers have any idea. Three days later a programmer finds that on line 63463 theres a bit of code that subtracts %0.13 off all transactions. Manager asks why it is doing that. Programmer has no idea. No other manager has any idea. Manager tells programmer to remove that code. Company is then fined. I call it How!!'s rule of software complexity: As software complexity increases, bugs and features become indistinguishable.

The manager in your example is an idiot for asking for a change without first understanding why the change is being made. If the code is doing something, you don't know why it's doing it, no one else has any idea why it's doing what it's doing, and nothing is broken, you leave it the gently caress alone.

how!!
Nov 19, 2011

by angerbot

Ithaqua posted:

The manager in your example is an idiot for asking for a change without first understanding why the change is being made. If the code is doing something, you don't know why it's doing it, no one else has any idea why it's doing what it's doing, and nothing is broken, you leave it the gently caress alone.

What makes you think nothing is broken. A bit of undocumented code that seems to subtract %0.13 from all transactions seems to be broken to me. Maybe it was added by a programmer many years ago for debugging purposes and was left in by accident. Maybe it was put there to solve a problem that has since been solved some other way. You could be throwing money down the drain for no reason. This is why lovely, complex, undocumented code is bad and should be eliminated at all costs.

MononcQc
May 29, 2007

Maybe trying to understand it or document it could be a better investment than dropping it and waiting for the bad consequences to come up.

nielsm
Jun 1, 2009



And the first step to documenting the code is finding some actual data in the production system that's affected by the strange code. Then when you've found it you run the input and output past the appropriate departments who should know about the business procedures and they should be able to tell whether it's correct or not, and why. If you can't find any data that seem to be affected by it then you instrument the gently caress out of the code and have it log stuff, then come back a month or two later and see what it caught. If still nothing, then it might really just be dead code.
Of course that's only after checking the source control system and bug tracker you naturally have the the thing.
At this point you've probably spent some 100 man-hours adding zero value. Congratulations on being useless.

E: gently caress why did I even bite on this poo poo discussion. Please just shut up how!! and go flip burgers or something.

Null Pointer
May 20, 2004

Oh no!

GrumpyDoctor posted:

how!!, do you have a blog? If not, you should start one. I'd love to read it.

Subject: Not updating for a while

I broke the Kwijybo Act of 1873 code during a rewrite, and as it turns out that the Kwijybo Act of 1873 is an important part of Kwijybian environmental conservation law. Long story short, I'm now being prosecuted under the Lacey Act and I will probably go to prison.

- how!!

Current mood: apprehensive
Current music: ~ One Winged Angel ~ Nobuo Uematsu

No Safe Word
Feb 26, 2005

I'm going to go ahead and register freehow.com right now

fake edit: gently caress it's already something else

ultramiraculous
Nov 12, 2003

"No..."
Grimey Drawer

how!! posted:

What makes you think nothing is broken. A bit of undocumented code that seems to subtract %0.13 from all transactions seems to be broken to me. Maybe it was added by a programmer many years ago for debugging purposes and was left in by accident. Maybe it was put there to solve a problem that has since been solved some other way. You could be throwing money down the drain for no reason. This is why lovely, complex, undocumented code is bad and should be eliminated at all costs.

So is your solution to just stop subtracting the .13% in your unsolicited Django rewrite? It sounds like you're not at all interested in even asking anyone at all why a decision in that "massive" code base was made. I'm sure if you actually started asking questions, someone would have a reason. Making the assumption that it's a mistake, or even/especially someone's test/correction code, is bold as poo poo, and your belief that the company is at fault because you didn't ask why something existed is just insane. Even the best of the best developers/anyone will make mistakes, and it unfortunately means you basically have to be them to know why they made them. Don't assume you're smarter than those 50k+ lines.

Edit: Maybe How!! should become my first ignore on SA ever.

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
Maybe if you used real commit messages in your version control you'd be able to find out why that code was added.

But then it's not like anyone would ever have a need to look at their commit history, right? :allears:

Polio Vax Scene
Apr 5, 2009



No Safe Word posted:

I'm going to go ahead and register freehow.com right now

fake edit: gently caress it's already something else

It's...a search engine...that removes spaces and puts in dashes instead :psyboom:

edit: nevermind apparently it doesn't do anything. It is a php page though, so it's still apropos.

ultramiraculous
Nov 12, 2003

"No..."
Grimey Drawer

Manslaughter posted:

It's...a search engine...that removes spaces and puts in dashes instead :psyboom:

Something deep inside me is telling me this is as the universe indented.

Bruegels Fuckbooks
Sep 14, 2004

Now, listen - I know the two of you are very different from each other in a lot of ways, but you have to understand that as far as Grandpa's concerned, you're both pieces of shit! Yeah. I can prove it mathematically.

how!! posted:

What makes you think nothing is broken. A bit of undocumented code that seems to subtract %0.13 from all transactions seems to be broken to me. Maybe it was added by a programmer many years ago for debugging purposes and was left in by accident. Maybe it was put there to solve a problem that has since been solved some other way. You could be throwing money down the drain for no reason. This is why lovely, complex, undocumented code is bad and should be eliminated at all costs.

Well that's not the only thing that can go wrong.

I work on software that displays medical images. Long story short, a complaint comes in from another country that they can't use a navigation feature that tries to scroll together images that are parallel if you have images that have multiple orientations linked together. They bitch it's a safety issue, lots of smoke is blown. We sit down, we think about it, we're like "I know, let's not scroll together images that have different orientations."

So we roll that out and suddenly a whole new set of doctors start bitching because they're trying to view two copies of the same stack of images in two different views and linking them together, and the scrolling is hosed up because we're excluding images with different orientations.

The point is that sufficiently software can have unintended use cases. Like, we never designed the navigation aid feature to be used to link together images that weren't parallel, people just decided they were going to do that and decided that the current behavior is a safety risk! Then we tried to fix that, and we broke a completely unanticipated use case that we hadn't even imagined when we designed the goddamn feature!

I work on a project that is six million LOC. It's so complicated that no single person has it in their own head just from a code standpoint, let alone requirements, and I just spend all day in meetings being like "oh, I think we put that patch in 2004 to make it so powerpoint would work if you copy pasted an image in because of some bullshit with the clipboard formats. Of course you don't need the option if you have an updated version of powerpoint because ms changed the way clipboard formats are handled but there's this one hospital that wouldn't update past that service pack and it's still in code because people would complain." It kind of sucks but we have enough trouble fixing the actual problems without putting ones in ourselves by mucking with stuff we don't need to muck with.

Hughlander
May 11, 2005

how!! posted:

What makes you think nothing is broken. A bit of undocumented code that seems to subtract %0.13 from all transactions seems to be broken to me. Maybe it was added by a programmer many years ago for debugging purposes and was left in by accident. Maybe it was put there to solve a problem that has since been solved some other way. You could be throwing money down the drain for no reason. This is why lovely, complex, undocumented code is bad and should be eliminated at all costs.

Then you type <sourcecontrol> blame or hit the blame button the IDE and you see:
"Added for Kwijybo Act of 1873 compliance" and are illuminated. But then again you'd probably just feel it should be eliminated anyway even if the cost is a fine equal to a month revenue because gently caress the business there's code to be eliminated.

Factor Mystic
Mar 20, 2006

Baby's First Post-Apocalyptic Fiction
The next time that "everyone should learn to code" meme sweeps through hacker news, remember how!! exists and shudder.

ToxicFrog
Apr 26, 2008


Hughlander posted:

Then you type <sourcecontrol> blame or hit the blame button the IDE and you see:
"Added for Kwijybo Act of 1873 compliance" and are illuminated. But then again you'd probably just feel it should be eliminated anyway even if the cost is a fine equal to a month revenue because gently caress the business there's code to be eliminated.

Remember, this is How!!, he thinks that using commmit messages is an unconscionable waste of time that could be better spent removing code (because no-one can figure out what it's for because there are no commit messages).

Jewel
May 2, 2009

*Deletes entire codebase*

See perfectly clean look at that line count 0 lines 0 bugs and I didn't even have to check the specs

UxP
Aug 27, 2007
It's not exactly code itself, but as much a horror as anything else. I saw it come up on the WordPress mailing list yesterday, and the How!!-chat reminded me of it.

otto posted:

Call me "ad-hoc" if you like, but when you say "structure", what I see
is "bureaucracy". I've been in enough programming shops to see this
sort of thing, and frankly I prefer the wild and sometimes messy world
of Open-Source.

[..snip..]

Hell, sometimes I write code in a Putty shell window using vim on a
remote server without even the benefit of syntax highlighting. Why?
Because I don't always need all those bells and whistles all the time.
Works fine for me.


No version control and Cowboy coding at it's finest from a core WP dev. The entire thread is pretty terrible.

http://lists.automattic.com/pipermail/wp-hackers/2013-January/045129.html

fritz
Jul 26, 2003

ultramiraculous posted:

Edit: Maybe How!! should become my first ignore on SA ever.

You'll get more wisdom reading a single How!! post than a dozen from anybody else on these forums.

Zhentar
Sep 28, 2003

Brilliant Master Genius

hepatizon posted:

Indistinguishable to people who are too loving stupid to read the code.


To be fair, I know of a couple cases (including one that was my fault) where we've had numerous customer complaints because we fixed a bug.

The Gripper
Sep 14, 2004
i am winner

Zhentar posted:

To be fair, I know of a couple cases (including one that was my fault) where we've had numerous customer complaints because we fixed a bug.
We had a good bug-as-feature issue with an application where if it was placed in the middle of the desktop with a multi-monitor spanned setup (so it was partially on both screens) the alignment of buttons and labels would shift to the right and leave the left-hand side of the window blank.

We fixed it and immediately received bug reports "Hey, a feature we were using stopped working, can you fix it? I used to be able to drag the window off the left hand side of the screen and still use it but now I can't!".

1337JiveTurkey
Feb 17, 2005

That reminds me of a feature-as-bug where the product stored certain client state such as the window position on the server based on their account. For development purposes many developers just used the same account rather than creating new ones, so that meant everyone would get the window position as set by someone else. There was one guy who both thought that this was stupid and had the only multi-monitor setup so when they refused to change the behavior every night before he went home, he'd open the client, drag the window onto the right hand monitor and then close it. They fixed it shortly later.

The Gripper
Sep 14, 2004
i am winner
I've never understood applications that do that, or what thought-process happens to think it's a good feature. If you're storing that value server-side (maybe it's software used on a machine that doesn't keep any permanent state) then as soon as the resolution changes the settings should be invalidated.

You wouldn't believe the number of support calls I got at a small business because of that "feature". Someone would log in and the window would be slightly larger than their resolution, making some buttons inaccessible. The software vendor basically told us that the best solution was to never resize the window to larger than our lowest resolution, which happened to be less than 640x480 on some touchscreen PCs used on the factory floor.

rotor
Jun 11, 2001

classic case of pineapple derangement syndrome

how!! posted:

I call it How!!'s rule of software complexity: As software complexity increases, bugs and features become indistinguishable.

i found this thread from the lepers colony. this is probably the funniest thing i've read all day. THINGS ARE HARD. YOU CANT JUST NOT BREAK THINGS. NO ONE KNOWS ANYTHING.

awesmoe
Nov 30, 2005

Pillbug
Please don't ban how!! he's the funniest horror in this entire thread (or any other) and his title gives fair warning to anyone reading his posts :shobon:

pigdog
Apr 23, 2004

by Smythe

how!! posted:

Python code:
    def create_recurring_jobs(self, test_availability=False):
...
Yes it looks terrible, but instead of the stupid idea of rewriting the whole thing, why not just consider it a fun refactoring exercise?

It has a ton of identical or nearly identical copy-pasted code, and the whole thing is a switch statement. It's as if this monster method already has tear lines ready for you. I'd wager it would take a good Python coder a hour to make this code readable/testable while keeping the behavior identical.

ultramiraculous
Nov 12, 2003

"No..."
Grimey Drawer

fritz posted:

You'll get more wisdom reading a single How!! post than a dozen from anybody else on these forums.

Maybe you're right... Not that I was ever the worst committer in the world, but I've been way more vigilant about making sure my commits and their messages since How!! started posting. I think long and hard before typing "git commit -am" and I'm way better at making sure the commit messages match up to the lines that got changed. Maybe How!! is really just here as a lesson to all of us.

pigdog posted:

I'd wager it would take a good Python coder a hour to make this code readable/testable while keeping the behavior identical.

No, you're wrong, it's clearly a problem with the web framework/ORM they're using. Just trash it and start over.

Adbot
ADBOT LOVES YOU

X-BUM-RAIDER-X
May 7, 2008
I've honestly learned a lot by watching people make fun of how!!, putting him on ignore would be a monumentally poor decision on my part.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply