Sorry, I just couldn't miss the opportunity to mis-appropriate the title of the book...
For the past few months, I've been playing with 3 AI tools: Co-Pilot, Grok, and Claude. My reactions are mixed. I've used Co-Pilot the most, then Grok, and just a little bit of Claude. I'm using the "free" versions of all three. I've used them in my web browser, Visual Studio, and VS Code.
I find Co-Pilot the most "interactive" in the sense that it seems like a real conversation. Grok is a bit more to the point. And Claude has been too stingy w/ it's "free" tokens. I decided not to bother with it any longer.
I've used Co-Pilot for more than just coding. I've used it for more "general knowledge" purposes, like show me a graph/table of <put your statistics request here>. Grok & Claude have been strictly for coding questions.
Co-Pilot does very well with the "general knowledge" questions. All three do very well with very limited coding questions, such as "show me a method that does <your method requirements here>. But they all fail in a major fashion when you ask them to create a fully functioning app.
For instance, I wanted to create a sample Blazor app. I wanted it to follow a "clean architecture" approach, using CQRS, and using LiteBus as the mediator, as MediatR is no longer free for the newest version. So Co-Pilot tried to execute my instructions. The application looked fine, but it simply wouldn't build. Every time I'd submit an error to Co-Pilot, it would come up w/ reasonable answers why it was occurring and suggest a fix. I'd apply the fix. More errors. More and more rounds of "here's the error" and "here's the fix". Still no joy. After about a day of struggling w/ this, the real reason for the failures became clear. Co-Pilot had used the latest versions of packages to install, but was using documentation that was from earlier versions. Some of the packages had breaking changes. When I pointed this out to Co-Pilot, it acknowledged the issue, tried a fix for the "current" documentation, but things just didn't get any better. In fact, after a while, it simply fell back to using method calls from the previous versions. In addition, even though it added the packages I asked for, the generated code using methods from the packages didn't have the requisite "using" statements.
I found similar issues w/ Grok on a different app I wanted to generate. Documentation from non-current package versions, missing "using" statements, etc. Other than those similar issues, it seemed that Grok produced better quality code, than Co-Pilot.
So why so many "mismatch" problems w/ large requests? I'm not an expert, but I think it has to do how all these engines are trained. I'll use an example from literature. If I wanted my AI to know about English Literature, I'd have it ingest and digest everything it can possibly find. That's a LOT of literature. I can then make it capable of creating more literature using everything it's learned. The problem is a lot of what has been ingested is mediocre or just plain bunk. There just aren't a lot of books written by people on the level of Shakespeare, Dickens, Hardy, or Austen. So it seems unlikely that AI is going to produce anything of that level, because it's been trained on a large universe of stuff, only a small percentage of which is actually outstanding.
I think there's a similar issue w/ coding. Grok, Co-Pilot, etc, can read all the code it wants in GitHub, BitBucket, etc. But how much of it is really good?
How much do these tools intake of errors that are pointed out to them to self-correct contemporaneously to re-train themselves? Another instance I encounteedr: I asked a question of Co-Pilot today, and it generated some markdown that included some code-snippets. But the code-snippet section, which started with the correct "```" fence, didn't have a terminating "```" fence. When I pointed that out, Co-Pilot acknowledged the error and produced a corrected markdown. So then I asked "why don't you always produce the terminating sequence for all code-snippets in markdown". It's response was "You have to have 'memory' turned on for me to do that all the time for you". But shouldn't it be done all the time regardless of who is asking the question? Shouldn't the AI recognize that it made an error and correct it for everyone for every code-snippet it produces in the future for markdown? That just doesn't seem to be part of the paradigm.
Contemporaneous, persistent error correction needs to happen...
Wednesday, October 29, 2025
Co-Pilot is my... Co-Pilot
Friday, August 29, 2025
Cut / Slash /Burn – The Ruthless Art of Perfecting Your Code...
I'm .NET developer with a long history of team leadership and mentoring. My fundamental belief about software development is best expressed by a quote from Antoine de Saint-Exupery (1900 - 1944):
"Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away."
Basically, get rid of everything that is unnecessary. This is a good design maxim for code. Every line of code is a potential bug. Get rid of unnecessary lines of code and reduce potential bugs in your application. The best way to do this is aggressive refactoring using the combined paradigms of SOLID and DRY.
Fortunately, Visual Studio makes this pretty easy. Even before Copilot came along, you could get VS to refactor large chunks of code. I will refactor in small steps, with lots of total solution re-builds after each step. If some refactors seem very complicated or risky, I'll due an interim local commit of my branch before I begin.
Of course, automated testing makes this less risky. You should have them...
Wednesday, April 19, 2017
Oh! The Irony ...
There are several things wrong with this. First, as a property, it is incorrectly cased. It should have been "HasManufactured". In a more egregious fashion the other "state" properties in the class WERE properly cased. Was there a reason this one was not?
Second of all, the meaning of "hasManufactured" was completely confusing to me. "Has" as a word, generally means possession of something, or else a state of being. "He has a goat" is an example of possession. "He has been hired" would be a state. But notice that when "has" represents a state, it's usually associated with a verb of some tense. A reasonable interpretation of the meaning of "hasManufactured" was probably "has been manufactured". Of course, everything that was in the manufacturing process was being manufactured, so ...
Finally, after digging around in the code, it appeared that "hasManufactured" was being changed from false to true when someone clicked the "Finalize" button on a particular dialog window. As it turns out, this button was clicked as the final step in the manufacturing process. So a good assumption is that "hasManufactured" really meant "has been through the entire manufacturing process and is ready for sale". A far better name would have been "IsFinalized". (And yes, I did refactor this.)
Which gets me to the real point of this post. "Object Oriented Design" and "Object Oriented Programming" are both lousy names.
I've been doing .NET Framework programming for over 15 years at the time of this post. Not once have I ever coded an object. In fact, Visual Studio doesn't create object files, it creates class files.
The following code is syntactically correct and declares a class:
public class MyClass() {}
However, this next statement is syntactically incorrect and it has a completely different meaning and result in c#:
public object MyObject() {}
In the first case, an empty class (no members) is being defined. In the second case, the only reasonable meaning is someone mis-coded a method in a class that was supposed to return an instance of the object class.Note the distinction here identified by the difference in syntax. We developers are NOT doing Object Oriented Programming. We are doing Class Oriented Programming. And we are doing Class Oriented Design. We don't use diagramming tools that provide "object" diagrams - they provide "class" diagrams. Unfortunately, I don't anticipate a successful #hashtag campaign to change the name of the paradigm ...
So here we have an entire industry that recommends naming things properly that has incorrectly named its industry.
Paraphrasing Colonel Kurtz: "Oh! The Irony..."
Sunday, April 16, 2017
My first Xamarin app ...
I've certainly had my issues with Xamarin. I have an earlier post that's quite a rant. It turns out that if you want to create a "library" assembly to use in a Xamarin PCL, you seem to need to create a .NET Standard 1.4 (or less?) library. Then you can reference it in a PCL assembly. Who'd a thunk it...
Nevertheless, the emulator I selected worked quite well, and didn't require any configuration - though granted my app is very tiny. This app is just a proof-of-concept app to prove the feasibility of a bigger app I'll be working on to commit to the stores.
Hopefully, my experiences with Xamarin will improve. While it's been uncomfortable, it's still a lot more successful than my even more painful experiences with Cordova and NativeScript.
Saturday, April 15, 2017
Why sitting at your desk all day is bad for your heart...
Thursday, April 13, 2017
Edge is finally worth using ...
They've also added a "book reader' capability, and I've downloaded most of my favorite free books from their catalog (What can I say? I'm a cheap SOB...). However, their Store still sucks for searching for just books. It keeps showing games. I have no interest in games ...
I've always like Windows 10 since I started using it many months ago. The only issue for me was the lousy performance of the Edge browser. While I've seen some issues today regarding Edge integration with Outlook (which may be a config issue on my part) I'm pleased enough I've set it back to my default browser.
If I live to regret that, I'll be posting about it again...
Most of it is dreck ...
Recently, I applied to a position that asked about contributions I've made to GitHub. I've purposely avoided doing any for the longest time. But the job posting also asked for a Cover Letter that was not a "standard" Cover Letter. So here's what I had to say about GitHub contributions in my "non-standard" Cover Letter:
I finally gave up and contributed one of my small libraries to GitHub and the NuGet gallery. Links are:
https://github.com/silverfox1948/SACC.OperationResult https://www.nuget.org/packages/SACC.OperationResult/
Why do I say “I finally gave up …”? For the most part, stuff on GitHub (and incidentally NuGet) is dreck. A lot of it seems as if the developer just wanted to point at something they’d put up there in order to say “See! I did this!”.(Possibly because some employers are asking about what their contributions to GitHub are…)
The other reasons are:
My employers want to use libraries that are and will be continued to be supported for a long time. The reason they are using a library is because they don’t want to have to write & support it themselves. If it’s a one person library, it won’t have adequate support. I’ll be supporting my little library because I use it myself on all my projects.
A lot of the contributions have absolutely no documentation at all. It’s just “read the unit tests to figure out how to use it.” If the developer is too lazy to document his product and is unwilling to:
v Convince me of the benefits of their product
v Show me how to use it in my non-unit test code
Then I treat their actual code with a very high level of suspicion …
Saturday, February 11, 2017
VS Is Becoming Worse & Worse...
Recently, I tried, using VS 2015 Community, to create a simple Xamarin Forms app. All I did was select the standard template, and then tried to run the Android program. Didn't work ...
I don't remember the details, but rather than go through the tedious repair/uninstall process with VS 2015, I thought I'd try to install the VS 2017 Community Beta. I selected the standard template for Xamarin and then got this:
Error CS0012 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'. DemoXamarinForms.Droid C:\repos\DemoCode\DemoXamarinForms\DemoXamarinForms\DemoXamarinForms.Droid\MainActivity.cs 7 Active
Does anyone do any testing at Microsoft anymore? It seems that since they went to this "open source" model, all they do is post s**t with the attitude "Well, this ought to work. If it doesn't the users will let us know ..."
As DJT might tweet: "SO SAD"...
Monday, May 30, 2016
Living Far From the Edge ...
The Edge browser, on the other hand, is still just one more piece of crap from what is turning into a longer and longer line of crap from Microsoft. My complaints about Edge basically come down to two:
- I can't change the "new tab" page to be my own home page.
- I can't block all the fracking ads and trackers from loading that turn the browser into a dog-shit slow lump of lead.
Similarly, I use Ghostery to block useless intrusive ads and trackers - my other browsers load MUCH faster than Edge.
While I like the Edge interface, the lack of control about what I am presented is just too big a disappointment.
Good luck with all that "We are in control" bullshit, Microsoft. It might work in China ...
Saturday, December 5, 2015
Typescript Turmoil in VS Code!
Unfortunately, with great complexity, comes great confusion...
At first, I simply added the Nodejs tools to Visual Studio 2013. That seemed to work ok, but at work we're using WebStorm. Visual Studio with Node simply seems to make projects and applications in a different enough way that it wasn't helping me with work. So I installed VS Code. I tried for weeks (part time at home on the weekends while managing family obligations) to get VS Code to do something as simple as build a one file .ts application. Finally, after banging my head against the wall (figuratively), I have gotten it to work. Hopefully, I can save some people some bruising ...
There were two salient factors that made my life so miserable for so long.
- If you have installed Node Tools for Visual Studio, and then subsequently run (as suggested) "npm install typescript -g" to install typescript for VS Code, you now have TWO (count them, two!) potentially different versions of the typescript compiler in TWO different places.
- Running "npm install typescript -g" puts typescript in a location that is not reflected in your PATH system variable. Yet all of the "examples" of how to configure your tasks.json file seem to assume that the npm-installed typescript compiler will be found automagically. Oddly enough, this did not happen for me.
So the corrective actions that I took to get things to work are actually quite simple.
- Remove the path to the Node Tools installed version of typescript from your PATH system variable. If you don't know how to do that instructions are here.
- In a command or powershell window enter "npm list -g". This will show you all the globally installed npm packages. Here's what mine looks like:
c:\>npm list -g
C:\Users\Steven Archibald\AppData\Roaming\npm
└── typescript@1.7.3
What's important is that first line of the response:
"C:\Users\Steven Archibald\AppData\Roaming\npm"Copy that from your machine and save it in a text file for the moment.
When you create your first tasks.json file in VS Code, it will look like this:
// A task runner that calls the Typescript compiler (tsc) and
// Compiles a HelloWorld.ts program
{
"version": "0.1.0",
// The command is tsc. Assumes that tsc has been installed using npm install -g typescript
"command": "tsc",
// The command is a shell script
"isShellCommand": true,
The line, "command" : "tsc", is why my .ts files were not being compiled. The root of the problem is, VS Code is just going to look in your local directory (apparently) to find the typescript compiler. It won't find it there - you installed it globally, remember? And you don't have a path statement to point to where it really is.
So, you could add the "...\npm" path to your PATH system variable (I haven't tried that yet), or you could change your tasks.json file to have:
"command": "C:\\Users\\Steven Archibald\\AppData\\Roaming\\npm\\tsc",
It now works as expected!
Note that your path will be different based on what your "npm list -g" returns, and that the "\\" are required to escape the "\" character.
Hope this helps save people some time, and Happy Typescripting!
Sunday, August 23, 2015
More Crap From Microsoft?
It just keeps getting worse.
First, let me preface this with the disclosure that I have been developing on Windows (Desktop and Web) exclusively since 1994. For the most part, I think Microsoft's Developer Tools are the best available. While I will be commenting about Visual Studio Code in a subsequent post, this is about something else. I also happen to like the Windows Desktop interface (have to clarify that now since there is a "tablet" interface as well). I find it highly intuitive, and better than the Apple desktop interface. I even prefer to use IE over the other browsers. I do use the other browsers, I've just like IE better than the others.
Recently, I upgraded from Windows 7 to Windows 10. Along with the new OS came the latest instantiation of IE, Microsoft Edge. I do like the cleaner interface.
But I detest the fact that I cannot set my New Tab options to open with my home page. I use bing.com as my homepage. I like the daily pictures, I've signed up for Bing rewards, and I find the Bing search engine to be just as useful as the Google search engine. But with Edge, I can no longer set my new tab properties to open with the same address as my home page. I can't tell you in words (or Word) how much that pisses me off.
I'm assuming it's because they want to force you to look at their "top sites" for marketing, advertising, whatever, dumb-ass revenue gathering reason.
It's counter productive.
I hated the recent versions of Firefox and Google and refuse to use Opera for the same reason - on my computer, I don't like being forced to do things the way someone else thinks I should.
It's a PERSONAL computer. It's MY computer. I'll use your software if you let me use MY computer the way I want to use my computer.
At this point, Microsoft has given me no reason to prefer Edge over Firefox or Chrome. Great marketing move, Microsoft - make sure there's no real UX experience between yourself and the other guys. You don't keep or gain marketing share if you aren't any different from the other guys. And speedier rendering on the order of microseconds is not a sufficient discriminator - everyone always makes their browser a little bit faster with every round.
It's back to IE 11 for me...
Sunday, July 13, 2014
Facebook Is No Longer Trustworthy ...
Sunday, June 29, 2014
The Best Development Quote Ever?
By the way, Antoine de Saint-Expury was not only the author of "The Little Prince", but also a renowned aviator and aviation designer. Given the state of aviation at the time he was flying, less was definitely more.
So why is this important for Software Development as well? Basically it encapsulates and summarizes multiple themes we use; DRY, Minimally Viable Product, Re-factor, etc.
I've seen many projects get in trouble and even fail because this simple maxim was ignored; building more than the customer asked for; building stuff the customer asked for, but didn't really need; not planning out code libraries in advance; not taking advantage of abstract base classes and/or generics.
It's difficult to follow this maxim. It requires some careful planning up front, and some vicious code refactoring AS YOU'RE GOING ALONG. You must be re-factoring, and following DRY principles every single day. Why is this important?
Every single line of code you write is a potential bug. The fewer lines of code, the fewer potential bugs.
The fewer lines of code, presumably, the fewer unit-tests have to be written (which are subject to having their own bugs).
The fewer lines of code, the easier it is for someone else (or you six months later) to read and understand the code.
The fewer lines of code, the easier it will be to extend the application. When you think you are done coding, ask yourself "How much more code can I remove?"
Finally, I mentioned above that this quote applies to more than just software development. Another favorite quote is one I use with #2 child when #2 has a writing project in school. The quote comes from a famous author, whose name escapes me at the moment. It's an apology for a long letter written to a friend. "I would have written a shorter letter, but I didn't have enough time." In other words, I didn't have enough time to remove all the unnecessary words.
Edit, slash, cut & burn; your code will be better for it...
Friday, June 20, 2014
Proud of Your Ignorance?
Granted, I’m a curmudgeon, and take umbrage at things that other’s might easily overlook or forgive. But making simple spelling mistakes on an email blast that represents your company to the world does not strike me as a way to make a great impression. I received this email today:
I’m sure whatever tool was used to create the original email had some spell check capability.
Is this company too proud to use a spell checker? If they’re not willing, or not smart enough, to use spell checking on a public document, what confidence do you have they will be careful with the work they do for you?
Thursday, June 12, 2014
When is done, done?
This is a question that comes up a lot during planning meetings for Agile projects. Each product, story, feature, etc. ought to have a definition of when it’s “done”.
Recently, we’ve seen an excellent example in our industry. The end of XP…
It’s done. No more work will be done on it. No more support efforts will be provided. It’s dead. Finito. Walked the plank. Entered the great unknown from which none ever returns.
This is actually very useful for us in planning. Ask yourself, when the issue of “done” arises: at what point will I stop working on this.
Sunday, April 6, 2014
Boycott Mozilla?
As a Libertarian, I believe any consulting adult should be allowed to enroll into a civil union with as many other consenting adults as they choose. Sanctifying a civil union through a church, temple, or synagogue should be strictly a religious matter. And that religious organization should be free to accept or refuse to sanctify any union they choose. That's what freedom of association, and freedom of religion are about.
However, the tactics of the loud mouthed, self-righteous, intolerant employees of Mozilla, and that stupid OKCupid web-site, are too much for me.
Their behavior smacks of the tactics and goals of every modern totalitarian, fascist regime that has existed since the beginning of the 20th century. I want nothing to do with them.
So, I am going to boycott Mozilla because of the intolerance of their company, for their punishing of someone who exercised his Constitutional rights in a manner that they deemed inappropriate, and for their absolute ignorance and hypocrisy of what free discourse means.
I hope others will join me, and eventually the company devolves into bankruptcy, and the loud-mouthed peons with their silent supporters are out on the street without a job. Nothing would be a more fitting result.
Tuesday, September 18, 2012
Using RavenDB (Part 01 of x)
Monday, February 20, 2012
What Tools Do I Use? (Part 02–Visual Studio Plug-ins)
You used to have to really hunt around to find useful anything useful to use as an add-in. About the two best that I could find in the past were a “Clean Solution” add-in, and a tool to display your solution, collapse the folders, and filter on what folders would be displayed. I don’t even remember their names. Everything has changed with VS 2010, NuGet, and the Extensions Manager. Most of the afore-mentioned utilities are now subsumed into goodies you download through the Extension Manager, or some NuGet package. Everything here can be found using the “Tools\Extension Manager” menu item. Search the online gallery. Here’s my list:
- NuGet: (http://docs.nuget.org/) This is a package manager. When you install a NuGet package (of something else such as AutoMapper, or NLog), NuGet downloads the package (DLL’s etc) to a folder at the same level as your solution file. A manager allows you to check off which projects require the package, and NuGet adds the references automagically to your selected projects. Make a mistake? No problem, uncheck the project in the Package Manager, and bingo-bango! It removes the references for you. Just remember to check in your package folder as well.
- Productivity Power Tools: This is the real work horse. Install this next.
- Editor Guidelines: This draws lines of various types (your choice) in your editor to help you see where statement begin/end (“{“ / “}” pairs should be lining up.
- Italic Comments: Uses an italic font for your comments
- JScript Brace Matching Extension: Highlight a brace in your JScript, and see where the matching brace is (highlighted)
- JScript Outlining Extension: Nice to tool to add collapse/expand capability to JScript editing
- Solution Explorer Tools: Adds new collapsing/expanding capabilities to your Solution Explorer view. Very useful if you have a solution with many projects.
- Visual Studio Color Theme Editor: A fun little toy …
- WoVS Default Browser Switcher: For web development, this is the bomb! Puts a toolbar in VS that let’s you switch to whichever default browser you want without having to go through the “Tools” menu. Also adds a context menu item that allows you to launch a particular web-site project or just a page with any browser. It extends your “View in browser” menu item.
- SlowCheetah - XML Transforms: Provides an online ability to preview your XML transforms of web.config files; but more importantly, provides the same same transform capabilities for App.Config files - something that MS doesn't provide. If you work in an environment that does both web and windows applications, this tool can save you a lot of headache.
Install these! Let me know if you find them as useful as I do.
Sunday, October 30, 2011
What Tools Do I Use? (Part 01 - Repository Tools)
When using Open Source tools, my first criteria is: does it do what I want or need? Then I look at whether there is a "stable" release. I've learned not to use "alpha" or "beta" releases. Next I look at how recently it has been updated. If no one has touched it for a year or more, I generally won't use it. Third, I try to see how many users there currently are. A product with 12 users, regardless of it's stability rating or frequency of update, just doesn't have much of a future. Finally, after I've installed it, do I keep using it? Does it play well with other related tools? Does it actually make my development life easier? If I have to open a Command window to use the tool, I throw it out. If I have to have multiple windows open to move information around, I throw it out. With that set of criteria in mind, here are my favorites that I deem "good":
- Project Locker (https://projectlocker.com/): Everyone needs a repository. I could do this at home, but then I have a bunch of stuff to back up, have to install server updates, etc. Project Locker offers free repository services for small projects. Since most of my projects done at home are smaller, they fit in this category. They also have paid services for larger repository requirements. They offer SubVersion and Git repositories, and a wealth of project management software as well. Having a repository for even small projects has saved my a** more than once. Never start a project without one...
- TortoiseSVN (http://tortoisesvn.net/): Once you have a repository, you need a client tool to access the repository. This one has a GUI interface, and adds menu items to the Explorer context menu that allow you to interface to your repository right from Explorer. In addition it has a set of folder icons to use in Explorer, that show you graphically the state of your files and folders vis-a-vis the repository state. This tool is absolutely wonderful!
- AnkhSVN (http://ankhsvn.open.collab.net/): It was a bit of a toss-up deciding in which category to put this: in the "Plug-in" section, or "Repository Tools" section? I finally decided to put it here, because its main purpose is to interface with a SubVersion repository. This is a plug-in to Visual Studio that (as does TortoiseSVN in Explorer), shows you the status of your files in your solution/projects. If you are using Visual Source Safe (AAAARRRRRGGGGHHHH!), or TFS on other projects (like at work), this has a similar interface - except for a SubVersion repository.
Wednesday, May 18, 2011
Signs Of A Project In Trouble
- I was a new resource being brought on less than two months away from the scheduled delivery date of the first release.
- The primary developers on the project were all working 10, 12, 14 hours per day 6-7 days a week - for the last several months, and the whole short time I was on the project.
- They claimed to be doing "Agile", but our standup meetings were lasting 45 - 60 minutes each day.
- Their "burn down" chart was an Excel spreadsheet (a very clever one) with a worksheet for each sprint that only the Scrum master could update, and was updated during the standup by everyone giving their hours worked rather than the number of hours remaining.
- Reviewing past sprints I realized that their initial estimates of effort compared to the actual effort recorded was off by 30% - 150% over the various sprints. Yet they kept making the same sorts of estimates at the beginning of each sprint.
- Their concept of velocity was based on how many effort hours they achieved, rather than how much work was completed.
So, after two months of being on the project, one day it was announced that they had failed to receive further funding from the internal customer to complete the deliverable that was due a month earlier...
Fortunately, I had anticipated this, and already had another contract lined up. A happier place to work, at a higher rate of pay, with more control over the product deliverable.
O frabjous day! Callooh! Callay!
