Since the last post, our staff has worked on the Layouts panel. It’s the successor to the Custom Layouts command in the current Goldenseal.
Last week, it took a day to get fields to move around when you click and drag, and to move in groups after shift-clicks.
Getting fields to show little black resizing squares took a few days. Then, two more days to draw the black squares in the right places during a move. The code has to check the mouse position many times a second, and redraw all the boxes in slightly different places. A lot of CPU just to move some dots around.
It took a day to figure how to right-align text, then a couple more days to get drags to resize the boxes properly. Drags were doing some crazy stuff until we fixed all the bad logic.
Spending a week on little dots may sound like excruciatingly slow progress, but actually it’s going quite well. Custom Layouts in the original Goldenseal consumed about two programmer-years. So far the pace is much faster with Qt. It probably only needs another month or two.
I think we can get Layouts functional by the first release. That’s a good thing, because most of the current windows will need tweaking to look good on bigger screens.
Different types of programming work seem to burn out different brain areas. It’s probably time to get away from Layouts, and move on to something else for a while. There are plenty of choices.
Meanwhile, active Covid-19 cases in the county suddenly jumped from 3 last week, to 57 yesterday. That’s worse than anything during summer 2020. It’s a junior version of what’s happening in many other parts of the US. Alas.
As you run Goldenseal accounting software, the app creates all sorts of things that sit around in RAM. Some last a long time, and some are just temporary.
If we don’t delete temporary items when they are done, the app will gradually consume more and more RAM. It’s called a memory leak. Eventually the computer will get low on memory, and slow down. It may run out entirely, and crash.
If we delete too soon, the app may try to use something that doesn’t exist. That causes an instant crash.
Our code sends thousands of little things flying around on your CPU every second. Keeping them from leaking or crashing is one of the biggest challenges for programmers.
The C++ language does not manage memory automatically. Fortunately, there are ways to do it without much fuss. Thanks to careful programming, the current Goldenseal rarely crashes. It does leak 40 bytes of memory whenever you open a new window, but it will take months of constant use for that to become a problem. That’s an old PowerPlant bug that we’ll lose in Goldenseal Pro.
Qt manages memory by giving a parent to everything but top-level windows. When you quit or close the window, the parent deletes all its children. Those delete their children, and so on down the chain. The system works well. If we forget to give something a parent, it floats all by itself on the screen. Hard to miss.
Newer languages like Java, Python, Swift and Objective-C manage memory automatically. The problem is, there is no guaranteed way to do that unbreakably.
Most languages use some form of reference counting. When something else links to an object, it adds 1 to the count. When they are finished, the count decreases by 1. When there are zero references, it’s time to delete the object. Most languages wait for a while then delete everything at once: it’s called garbage collection. When an app suddenly stalls out for a second or two, it’s probably emptying its trash.
The biggest problem with reference counting is that it can’t handle circles. If two objects reference each other, deleting one of them will leave a dangling reference in the other. It won’t die when it should, which causes a leak.
In Python, you are just supposed to never make circular references. That’s not easy, because often it helps to have a two-way link. We use them all the time.
Cocoa has strong and weak references to handle the problem. We found it to be hard to set up, and even harder to debug. We spent several months tracking down weird memory problems when we used Cocoa, 2016 to 2019. Sometimes ‘easy’ really isn’t any easier.
Qt is completely C++. It’s kind of like going from an automatic transmission back to manual. No need to guess what the gearbox will decide to do.
Meanwhile, our staff took a break from breakdown tables this week, and switched over to Custom Layouts for a while. It’s a nice change of pace. There are plenty of tasks left to do, and no reason to finish them in any specific order.
From 1989 until 2007, I taught classes for our estimating and accounting software. It was a good excuse to visit most parts of the US and Canada. The classes covered the Excel-based MacNail, then the current Goldenseal. Over 1000 users attended, and learned how to improve their businesses. I also learned first-hand what people found most confusing.
One problem area in Goldenseal was the two different ways you can itemize things in estimate and expense breakdowns. There are category breakdowns, where you just type stuff in. Also item breakdowns, where each line pops up a list of unit costs (Assemblies or Cost Items).
With hindsight, the split isn’t as useful as we first thought it would be. There still has to be a way to type unlisted things into a item breakdown. And category breakdowns still have to reference items like Bids and Allowances. They really aren’t different enough to be worth the extra fuss. Even worse, the names are rather confusing.
With Goldenseal Pro, we have a chance to fix some of the design flaws in the original Goldenseal. The category/item split is one of the worst. Goldenseal Pro will have just one type of breakdowns for estimates, expenses and sales. That’s one less thing to think about. One less thing to explain.
In Goldenseal Pro, if you want to pop up a material cost item, you’ll use a Material Item. If you want to type in a material, it’s Material Text. Ditto for labor, subcontractors, equipment or other costs. The names are revised from the current version, but they act the same otherwise.
This week we finished the code that converts old-style breakdowns to the new format. That way old data will still be usable. It probably will take a few more weeks to get all the little quirks working for breakdown tables. We can link into existing code for some of them, but some will be easier to just redo in Qt.
At first, testing showed weird errors. Eventually our staff discovered that for expenses, the menu doesn’t include the option to type in materials. For 20 years our testers never noticed it, and nobody ever reported it as a bug. I suspect it was because the whole category/item thing is so confusing. Nobody ever realized it was just a bug with an easy fix. Anyhow, it works properly now for Goldenseal Pro.
Breakdown tables are already further along than we ever got in our previous efforts with Cocoa and MFC. Progress is looking good. It’s just a matter of time.
BTW right now is the perfect time for users to tell us about any other frustrations with Goldenseal. It’s not too late for us to make design changes to improve it.
Running a business is complicated. A construction business is more complicated than most, with plenty of quirks. Because of that, writing construction accounting and estimating software is a challenge. There’s always one more weird thing that needs to be handled.
To help keep the programmers sane amidst all that complexity, Goldenseal uses OOP: object-oriented programming. It uses code that looks more or less like the real world. With luck, OOP makes everything a bit more logical and easier to understand.
For example, to handle change orders, there’s a CChangeOrder class. It stores data for change orders, and does math and other tricks for them.
Object classes can have parents and siblings. The parent of a CChangeOrder is a CBreakdownTransaction (also the parent for all other transactions that have a breakdown table). Allowances have change orders as their parent. They inherit most of the same behavior as change orders, but tweak a few things that are different.
Our staff spends plenty of time designing objects and their contents. If it’s done well, coming back years later isn’t be too painful. Stuff still makes sense. If OOP is done poorly, then it turns out to be a confusing mess.
As we hook up Qt with our existing code, we find some of each.
All the data classes like CChangeOrder are great. No need to touch them at all. So far the database code is also working well.
Breakdown tables are more challenging. We had to write them from scratch in the original Goldenseal, so they have thousands of code lines for screen drawing, mouse clicks, and other interface details. Most of that is handled automatically by Qt table classes. Our staff is still figuring out what can be deleted from our old code, and what has to stay. Fortunately, we don’t need to clear out all the clutter right now. Sometimes it’s better to wait and be sure it really can be tossed. Sorta like cleaning the garage.
The hardest kind of OOP in Goldenseal is the link between what you see on the screen, and what’s stored on disk. We have a DB_RecordViewer class that handles that: record loading, saving, and everything in between. Its children are specialized to manage specific types of records: for example, CChangeOrderViewer for change orders.
As with tables, there is plenty of excess code in there. Newer frameworks already handle much of the nitty-gritty of screen display. We still need record viewers to handle the quirks, but they talk with a Qt object for most things.
Last winter we got records loading from disk onto the screen, and last week we got data saving from the screen back to disk. It’s coming along.
What amazes me most about the recent real estate sale efforts is how little time some folks spent on a such a big purchase decision.
One buyer sent her sister to look at houses. She viewed by phone, liked the first house they visited, and made an immediate offer. The contract was signed and accepted the same morning. My house was third on their list so they never got that far.
There is a saying: “don’t marry someone until you’ve summered and wintered with them”. That may be a general rule that can apply to all decisions. If so, it probably needs to be adjusted for decision size. That rule of thumb calculates out to between 1.75% and 5% of the final cost or investment, depending on how you figure seasons and marriage length.
If the logic is right, you should spend 30 to 90 seconds deciding where to eat lunch. A $100 tool deserves 4 to 10 minutes of thought. It’s worth 35 minutes to 1.5 hours of research for a $1000 computer setup, and 23 to 70 hours for a $40K truck. A $300K house purchase ought to get 170 to 500 hours of planning.
You can plug in your own numbers: the spreadsheet is at this link. My guess is that most people over-think small decisions, and under-think the big ones.
I’m still looking at Zillow and Realtor.com daily, in prep for a sale/purchase in March 2022. It will be a more educated decision then. The past few months I was busy finishing up construction work, and didn’t spend 170 hours on buying research. Maybe I can summer and winter with some of the fixer-uppers that are still unsold, and get a better sense of their flaws. Kinda like dating, with hunks of wood and masonry.
Meanwhile, our staff is back to making progress on Goldenseal Pro. Last week we hit a big milestone: smart fields now pop up a list of items when in a breakdown table. It’s a small bit of interface, but we never were able to make it work in Cocoa for Macintosh. MFC for Windows was even worse: we never got tables to work there at all.
Doing it in Qt took a few days of futzing, but that’s not bad. Most likely, everything that we need to do will be possible with Qt. Just a matter of time.
During the pandemic year I stayed home a lot, and fixed up my house: new roof, paint outside and in, floor sanding, minor repairs. Power tools have improved greatly since my last big construction projects in the 1980s and 90s. It made the work very satisfying. Lithium ion rocks!
I thought seriously about moving on to another fixer-upper. So I listed the house as a FSBO (for sale by owner), with plans to use a regular real estate agent if that didn’t work out. Besides the potential to save on commissions, doing it all was educational. Also, easier to coordinate buying, selling, final construction work and clutter removal.
The house went onto Craigslist March 31. That listing was a dud: two agents called, plus one possible buyer who never followed through. In past years I’ve listed raw land a couple of times, and those were much more successful. Not sure why the difference.
Houzeo promises MLS listings for about $400. I signed up, but soon canceled and got a refund. For this area they use a state-wide agency based in New York City. Their contact number on the listings never reached a human. There was no way to reach the owner, or get information about the properties. The phone system seemed mostly designed to sell cheap listing services to other FSBOs. Maybe Houzeo is a viable option in some areas, but definitely not here.
Zillow is probably the most popular website for buying houses, so I put a FSBO listing there on April 15. The process was free, and very easy: just upload text and pictures. It even allowed a website link to the house description website.
Zillow was much more successful. The initial traffic report looked like this:
In comparision, MLS listings around here usually get 1500 hits on the first day, and 3000 after a week. It’s necessary to click through to see the FSBOs, and apparently 80% of people never do that.
One buyer stopped the day after it was listed, but decided no after viewing the outside. Eleven others booked visits. 3 came with buyer’s agents, 6 were solo, 2 no-showed. All were pre-qualified with cash or a bank letter. None submitted offers.
ListWithClever.com offers MLS listings for $3000, promising much better service than Houzeo. For this area, they use an agent in Syracuse (more than an hour drive from here). I didn’t discover them until late in the process, and decided not to go that route. Maybe in the future.
I talked to a few Ithaca agents. One seemed great, but she ghosted me for 2 weeks. The main selling season is short around here, and mid-May is already near the end. Waiting until 2022 seemed more and more attractive. So I canceled the Zillow listing and planted the vegetable garden.
The next day, that first buyer emailed to express renewed interest. They toured the insides twice, and really liked the chestnut trim. A week later they submitted an offer for $12K over my list price.
Meanwhile, on the buying end, there was nothing plausible in Ithaca. A few nearby villages and cities had interesting properties at lower prices. I looked at a few and made a contingent offer on one. However, when they turned on the water, the kitchen floor became a pond, and most of the fixtures didn’t work. No insulation, so plumbing probably froze regularly. The basement looked like the old Windows screen saver with random pipes everywhere.
After canceling that one, I looked at a few others. Unfortunately, it was late in the season and the good ones were all sold. It narrowed down to just one late entry, which had zoning problems.
So, it’s back to the pre-Covid routine at least until Spring 2022. Goldenseal Pro will be finished a few months faster.
Is a real estate FSBO worth doing? I’ve had two prior successes with less expensive properties, so it’s a definite maybe. However, selling a nice residence may work out better with an agent.
For one thing, the agent can honestly not mention flaws, because they don’t know about them. I removed almost all the old lead paint, and was proud to mention it during the tours. But I suspect that people just heard “blah blah blah LEAD blah blah” and were scared off. Better to have an agent who side-steps the issues.
There may also be boundary problems. The house may feel less used when you don’t meet the person who previously lived there. Or maybe it’s just that MLS is needed to bring in bigger crowds. Ultimately I had an 8% conversion rate, which may be reasonable for such an expensive transaction. There was a buyer, but having more viewers increases the chances of a bidding war and a better price.
I checked Zillow to see percentages of listings that are FSBO. Across the US it averages about 20%. The high is 40% around New York City, ranging down to 6% in Houston. There aren’t any obvious geographic trends. No easy way to find the success rates for each method.
As for real estate in general, here’s a Zillow map of houses listed at over $20 million:
A long-time user of our accounting software called in recently with a problem in their change order billing. There was a mystery retainage amount that showed up when they billed for the project.
It turned out to be a bug in the printed form. Goldenseal does not track retainage on change orders, but it’s on the printed bill layout. The amount comes from the main project: that works fine for regular project billing, but it is just confusing for change orders. The solution is to use Custom Layouts, and remove that field from the form. Here are instructions to remove it.
This bug has been around for almost 20 years. It’s only a problem for users who create change orders, and also do projects with retainage. Otherwise it just shows zero. That may be why nobody has reported it until now.
For some reason, Change Orders have always been difficult.
Our C++ source code uses object-oriented programming (OOP). Everything is an object, usually inheriting code from parent objects. Allowances, Change Orders, Sales and Rental Transactions all generate income, so they have the same parent. The problem is that some people want change orders to act like miniature projects. Those are job accounts, which have very different parents. There’s no good place to put code that both can use.
For a while, we addressed user requests by duplicating Project code into Change Orders. It became more and more difficult. We finally backed off and decided that Change Orders just need to be their own thing. If you withhold retainage on one, it’s complicated enough to be a separate project. Likewise, if you want a detailed change estimate, create an Estimate record. Those have fancier breakdowns that handle all sorts of estimating quirks. You can link the Change Order to it.
There are some deeper reasons for the bug.
Our estimating and accounting software started out as simple spreadsheets created to run Turtle Creek Carpentry. It was a small remodeling company that didn’t need much paperwork. After computerizing, we took on bigger projects that sometimes involved change orders, retainage, and other fancy stuff. But that only lasted a couple years before the software business took over from construction contracting.
Many of the features in Goldenseal come from user requests, rather than our own needs. Sometimes the programmers must guess how the code should be set up. Sometimes the guesses are wrong. Most programmers do not have in-depth knowledge of estimating, accounting or whatever. There’s a certain amount of faking involved.
We listen to tech calls and user feedback, then fix the bugs to get everything working properly in the next update. It’s something that every software company must do.
Even worse, there is a huge range of construction business types and sizes. They all have different needs. When we add new features, it’s important to not make things more confusing for the users who don’t need them. That takes some judgement and design skill. Sometimes we need to back-track or remove features that are too confusing.
Meanwhile, the past couple months I’ve been wrapped up in real estate selling and buying. It has been interesting, but it’s winding down. More details in the next post.
Back in 1994 I made detailed blueprints for my current house: enough to get a building permit for the rehab work. Now that it’s for sale, I wanted to show the plans as a selling aid. All the construction project files were still there in an old backup, but nothing would open the drawings.
I don’t even remember which app created the plans. Maybe MacDraw II, maybe MiniCAD. Definitely nothing that runs on current Macs. There is still one laptop here from the early 2000s, but nothing on it would open the files. All the older hardware died years ago.
As developers, Turtlesoft has had a hard time keeping up with changes on the Macintosh. It’s also a problem for plain old users. When an app dies, so does all the data that it knows how to unlock.
I’ve tried out a few simple CAD programs to whip out plans, both for the current house and the probable next one. FloorDesign2 seems like the best so far. However, it uses its own file format. You can print and then save as pdf, but the details won’t transfer to any other CAD apps.
Some types of data do have universal formats. For text, there is plain text (.txt) and rich text (.rtf), which many apps can read. Spreadsheet data translates well as either tabbed text, or comma separated values (.csv). Page layouts can use either .pdf or .html. Databases often uses SQL.
In addition, some apps are so dominant that other software is forced to support their file format. Excel and MS Word are that way. QuickBooks aspires to that role, at least for add-ons. AutoCAD may do it for higher-end CAD. Unfortunately, many apps have their own unique data formats, and it’s difficult or impossible to move it elsewhere.
I don’t know if there is any good solution for this, except for keeping old computers around. They seem to last longer if used regularly.
These struggles also apply to our Goldenseal software. You can export any data to a text file and then open it in Excel. However, there’s no easy way to move all the accounting details to some other app in a single step.
The transfer problem works both ways. We wrote code to import from QuickBooks, but it can only translate some of the data from their export file. The translator brings in all the account setup details, but not purchases, bank transactions or job costing. The two formats are too different. Importing from any other accounting software would be even harder.
One issue for accounting software like ours is security. Having the file format be too accessible is not a good idea. Too much risk that data will be changed or stolen. The Goldenseal file format is not encrypted, but viewing the raw file data is not very useful. Even if someone clever had access to your computer, it would take many hours for them to figure out how to, say, find and change a paycheck amount.
If you are really worried about that risk, you can encrypt the whole hard drive, and protect everything on it. All of the fraud problems we’ve heard about from users have come from employees who could just sign on and enter stuff the usual way. Preventing that kind of fraud requires careful use of password access, and occasional audits by the owner or their accountant.
An employee who enters data should not also be reconciling bank statements. Having a second set of eyeballs on the money adds a ton of security.
This chart shows the local experience with Covid-19 over the past 13 months. Blue is number of active cases, yellow is number in hospital, red is cumulative deaths. The last two are 10x to make them more visible.
There was a bump after every major holiday. Even Halloween. The most recent was mostly Cornell students after Spring Break.
That first blue bump in March/April 2020 now seems downright puny. Of course, NYC and a few other places had a terrible time then. The spare capacity here saved lives. Local medical staff took a bus down to help. Some patients transferred here.
I got the J&J vaccine more than a month ago, but haven’t changed behavior much. The chart explains why. Almost 30% of local residents are fully vaccinated, and over 50% have taken one jab. But active cases and hospitalizations are still worse than anything before November. It’s not over yet.
In the rest of the US, the situation is similar. New confirmed cases are off the winter peak, but still higher than last summer. Most regions are showing a small fourth surge.
Deaths have fallen off faster, probably because older people were vaccinated first. It’s already better than last summer. These days, Covid-19 is mostly a young people disease.
BTW the green bump is because Ohio changed the way they classified Covid deaths, and suddenly added 5,000.
Covid-19 probably is winding down. Unless something dramatic happens, this will be my last post on the subject. It has been an interesting ride. I sure hope we are better prepared for the next one.
My house is getting ready for sale. I’ve also started looking at places to buy. The goal is to make both happen at the same time, and not be homeless in between.
For buying, Zillow and Realtor.com are fantastic. Put in the right filters, and you can see a map with everything that matches. I wish it existed for the three other times I bought property. Real estate agents are still doing business as usual, but I think it’s an industry that soon will be disrupted by technology.
As a remodeler, I always talked directly with clients. We negotiated prices and talked out the details. It worked well. A few bigger jobs had an architect involved, but they were not much different than subcontractors: another expert handling their part of the project.
Real estate is very different. Around here, there is a listing agent working for a 3% commission. They are supposed to look out for the seller’s interest. Then a separate buyer’s agent getting their own 3%. It’s more like a lawsuit than a sale.
Usually I try to look at properties with the listing agent, since they know more about the property and the seller. However there’s a fixer-upper Victorian in Waverly NY that had to be done via buyer’s agent. Questions take about a week. I ask the buyer’s agent, who asks the listing agent, who asks the seller. Then it comes back the chain. Often so garbled that it’s not even useful. Three people eager to make a sale, who might be lying.
Aside from the communication issues, those 3% cuts are big chunks of money. They fall from the sky and land on agents almost randomly. That creates all sorts of perverse incentives. It turns some people into assholes.
Last weekend I booked to see a different Waverly Victorian at 2 PM Sunday. The listing agent planned to be out of town, so someone else was going to show it. An agent called me Saturday night. I incorrectly assumed he was the replacement, even though he mentioned the wrong address. Rather than clarify, he got the appointment details from me and said he’d show it. Then he called the listing agent and booked for 1 PM. Then texted me to say the time had changed. He also did some web stalking: looked up my house in the tax rolls, prepared a detailed sale analysis, and spent most of the visit trying to sell me on having him list it. The scam fell apart when I got a call at 2:15 from the original agent, wondering why I didn’t show. Yuch.
Having agents involved doesn’t seem to add 6% of value to real estate selling. So, I’m going to try a FSBO (for sale by owner). I’ll probably have to pay a buyer’s agent. Zillow is very aggressive about pushing them. But maybe I can talk directly with buyers and, you know, figure something out. I’ve sold 2 properties out of 3 that way, and the sales went much more smoothly than the one with an agent.
This is kind of an experiment. I’ll handle the sale the way I think it should be done, and see what happens. There’s already a web page. House for sale in Ithaca NY. Pix, videos, lots of detail. For the next 2 or 3 weeks it will be a work in progress. The house is on Craigslist now. It will list on MLS and the realty sites when there are more photos and videos, probably via Houzeo.
There’s a little construction work still undone, but mostly what’s left is sorting and boxing 27 years of accumulation. Feels good to get everything into better order. There’s already a Home Depot bin full of assorted door and shelf hardware. Another with plumbing. Electrical will need two of them. One bin is nothing but hammers.
Meanwhile, I kinda won’t mind when technology disrupts the real estate biz.