Friday, May 25, 2012

Bob Martin: NO DB. Me: Any Sane DB.

The venerable OOP guru Bob Martin has weighed in on SQL, and NoSQL. He admits candidly to disliking SQL databases, and the way they just jumped in and dislodged non-database centric developer's lives. Their ubiquity, at one point, and the belief that any kind of persistence layer other than an SQL database persistence layer was somehow "not good enough" lasted nearly 25 years in our industry. I started out, and remained until recently, an SQL-database hater, conditioned to hate SQL by the bitter experience of many projects where it seems that SQL and the concerns around it, destroyed the project, and the company. I especially learned to loathe IBM DB2, on OS/2, and a series of misbegotten attempts at multi-tier database application architectures. I learned quite recently that SQL is actually not too bad. I don't love it. But I don't hate it either. I have however, learned that proprietary data-stores that are home-brewed can have quite a lot of glitches, and are generally not to be trusted. If there's two things I hate more than SQL databases they are:
  • Private binary-repository stores used as the primary repository for critical customer data.
  • Any persistence system that is not trustworthy.

    A trustworthy system must have at least three of these four characteristics:
  • Be fully unit tested. (SQLite=Yes)
  • Be widely used by respected/large products (SQLite=Yes)
  • Not have lots of people ranting about why it sucks (MongoDB,CouchDB, etc).
  • Open source to prevent vendor lockin.

    I have one non-negotiable, too:
  • Not have misfeatures, that cause data loss, that make me hate it. (Remember subversion's early BSDDB back end? I still haven't forgiven BSDDB or Subversion for that.)

    Having said that, my current job, and my previous job have involved working with Microsoft SQL Server, and as commercial databases go, it's actually pretty nice. And if your database is small, it's free, with the "Express" edition. Nevertheless, it's hardly painless. It seems very easy to make mistakes that you will only realize are mistakes after years of work. That's why the "DBA" and the "Database developer" roles were born; Because doing SQL databases is hard work, and screwing them up is easy.

    Lately, I have become very interested PostgreSQL, which is a hybrid database, offering classic SQL features, and a lot of great stuff that the NoSQL crowd has come to offer as well. I also have a lot of respect for SQLite, and for desktop-only zero-configuration cases, I have come to prefer it. However that stance is new for me. I actually had a very loud argument, where I was completely (irrationally, and wrongly) against ever using SQLite in any Delphi application written by any team involving me. Hey Steve, if you're reading me; I was wrong. SQLite is actually kind of awesome.

    I realize that the DB world and the persistence-layer of programming, are hotbeds of opinions. ORMs are great. ORMs suck. Automatic OOP persistence layers are a current area where debate is raging loudly. The classic "SQL for everything" people tend to value hand-crafted SQL and queries, and so any layer that tries to map (via an ORM) objects to SQL is going to suck, in some cases. However, if you want a non-relational persistence model (which is actually ideal for many classes of problems), you're always going to be wondering if you went the wrong way, when you get yourself into the sorts of troubles that SQL-based solutions don't suffer from. How about the debate between the "Scalability Über-Alles" crew and the "Data Integrity Über-Alles" crew. It's a holy war, and it's on.

    There are no silver-bullets. But there are some lead-balloons out there.
  • Thursday, May 24, 2012

    MadExcept 4.0 is here!

    MadExcept 4 is out! It's my favorite exception-catching email-sending bug-squashing tool for Delphi. Now with the following new features:

  • 64 bit Windows support for Delphi XE2
  • Full unicode support
  • SSL and TLS SMTP client mailing
  • SSL HTTP uploads
  • Bug Tracker integration: added FogBugz, BugZilla and Mantis reporting
  • option to conform to Windows Logo requirements
  • extensive memory and resource leak reporting
  • added debug memory manager
  • added support for nested exceptions
  • added new "madExceptViewer" tool
  • lots of smaller improvements

    In my opinion, this is the biggest single release in MadExcept history! Basically everything I've ever wanted added to MadExcept, is now in MadExcept. Go check it out here, download "madCollection" to install. Don't forget to click the "MadExcept 4" button when installing, or you won't actually get MadExcept installed.
  • Sunday, May 20, 2012

    Hotfix for for Firemonkey in Delphi/C++Builder/RAD update4

    Embarcadero CodeCentral has now made available the awaited hotfix for Update#4, which solves the "blurry font" issue in Firemonkey, and other issues.

    It's available here: CodeCentral 28881

    A side note is that you have to scroll past 150 lines of "Products" that you must own one of, in order to read what is in it. You thought there were a lot of Editions of Windows 7? That's nothing, I believe that Delphi/RAD/C++Builder has them beat. I've done a quick breakdown and here are the numbers:

  • There are 8 editions of AllAccess that contain RAD/Delphi/C++, which is Embarcadero's way of bundling both Database and Developer applications. So your license-key would be an all-access license key, of a particular level (named by metals like silver, gold, etc)
  • There are 5 SKU levels of the primary products, and two products (Delphi and C++ Builder) and then a third product name (RAD Studio) that indicates the bundle of Delphi plus C++ Builder, and when you expand these out, you end up with 142 different "products" that you could have purchased. Some are multi-license packs, some are upgrade editions, and some are special pricing levels like Academic pricing. At some point, if it was my job, I'd keep that list to myself (150 editions in total), and simply replace all the editions in CodeCentral's "customer-facing" document to "You must own an edition of Delphi, or C++ Builder XE2 to download this file". I thought about this, as I scrolled down through three-screens full of editions of RAD Studio. It would amuse me if some of those editions represent combinations that zero customers have actually purchased (The 5 pack of Academic upgrades from Professional to Ultimate, for instance.) Just because I'm in the mood, I'm posting the full list here:
    All-Access Bronze
    All-Access Gold
    All-Access Platinum
    All-Access Silver
    All-Access XE Bronze
    All-Access XE Gold
    All-Access XE Platinum
    All-Access XE Silver
    C++Builder XE2 Architect
    C++Builder XE2 Architect - Network License
    C++Builder XE2 Architect 10 pack
    C++Builder XE2 Architect 10 pack Upgrade
    C++Builder XE2 Architect 5 pack
    C++Builder XE2 Architect 5 pack Upgrade
    C++Builder XE2 Architect Academic
    C++Builder XE2 Architect Academic - Network License
    C++Builder XE2 Architect DevRel
    C++Builder XE2 Architect Upgrade
    C++Builder XE2 Architect Upgrade - Network License
    C++Builder XE2 Architect Upgrade from Starter
    C++Builder XE2 Enterprise
    C++Builder XE2 Enterprise - Network License
    C++Builder XE2 Enterprise 10 pack
    C++Builder XE2 Enterprise 10 pack Upgrade
    C++Builder XE2 Enterprise 5 pack
    C++Builder XE2 Enterprise 5 pack Upgrade
    C++Builder XE2 Enterprise Academic
    C++Builder XE2 Enterprise Academic - Network License
    C++Builder XE2 Enterprise Upgrade
    C++Builder XE2 Enterprise Upgrade - Network License
    C++Builder XE2 Enterprise Upgrade from Starter
    C++Builder XE2 Professional
    C++Builder XE2 Professional - Network License
    C++Builder XE2 Professional 10 pack
    C++Builder XE2 Professional 10 pack Upgrade
    C++Builder XE2 Professional 5 pack
    C++Builder XE2 Professional 5 pack Upgrade
    C++Builder XE2 Professional Academic
    C++Builder XE2 Professional Academic - Network License
    C++Builder XE2 Professional Upgrade
    C++Builder XE2 Professional Upgrade - Network License
    C++Builder XE2 Professional Upgrade from Starter
    C++Builder XE2 Starter
    C++Builder XE2 Starter DevRel Edition
    C++Builder XE2 Starter Upgrade
    C++Builder XE2 Ultimate
    C++Builder XE2 Ultimate - Network License
    C++Builder XE2 Ultimate 10 pack
    C++Builder XE2 Ultimate 10 pack Upgrade
    C++Builder XE2 Ultimate 5 pack
    C++Builder XE2 Ultimate 5 pack Upgrade
    C++Builder XE2 Ultimate Upgrade
    C++Builder XE2 Ultimate Upgrade - Network License
    C++Builder XE2 Ultimate Upgrade from Starter
    Delphi XE2 Architect
    Delphi XE2 Architect - Network License
    Delphi XE2 Architect 10 pack
    Delphi XE2 Architect 10 pack Upgrade
    Delphi XE2 Architect 5 pack
    Delphi XE2 Architect 5 pack Upgrade
    Delphi XE2 Architect Academic
    Delphi XE2 Architect Academic - Network License
    Delphi XE2 Architect DevRel
    Delphi XE2 Architect Upgrade
    Delphi XE2 Architect Upgrade - Network License
    Delphi XE2 Architect Upgrade from Starter
    Delphi XE2 Enterprise
    Delphi XE2 Enterprise - Network License
    Delphi XE2 Enterprise 10 pack
    Delphi XE2 Enterprise 10 pack Upgrade
    Delphi XE2 Enterprise 5 pack
    Delphi XE2 Enterprise 5 pack Upgrade
    Delphi XE2 Enterprise Academic
    Delphi XE2 Enterprise Academic - Network License
    Delphi XE2 Enterprise Upgrade
    Delphi XE2 Enterprise Upgrade - Network License
    Delphi XE2 Enterprise Upgrade from Starter
    Delphi XE2 Professional
    Delphi XE2 Professional - Network License
    Delphi XE2 Professional 10 pack
    Delphi XE2 Professional 10 pack Upgrade
    Delphi XE2 Professional 5 pack
    Delphi XE2 Professional 5 pack Upgrade
    Delphi XE2 Professional Academic
    Delphi XE2 Professional Academic - Network License
    Delphi XE2 Professional Upgrade
    Delphi XE2 Professional Upgrade - Network License
    Delphi XE2 Professional Upgrade from Starter
    Delphi XE2 Starter
    Delphi XE2 Starter DevRel Edition
    Delphi XE2 Starter Upgrade
    Delphi XE2 Ultimate
    Delphi XE2 Ultimate - Network License
    Delphi XE2 Ultimate 10 pack
    Delphi XE2 Ultimate 10 pack Upgrade
    Delphi XE2 Ultimate 5 pack
    Delphi XE2 Ultimate 5 pack Upgrade
    Delphi XE2 Ultimate Upgrade
    Delphi XE2 Ultimate Upgrade - Network License
    Delphi XE2 Ultimate Upgrade from Starter
    Embarcadero RAD Studio Architect for ToolCloud
    Embarcadero RAD Studio Enterprise for ToolCloud
    Embarcadero RAD Studio Professional for ToolCloud
    RAD Studio XE2 Architect
    RAD Studio XE2 Architect - Network License
    RAD Studio XE2 Architect 10 pack
    RAD Studio XE2 Architect 10 pack Upgrade
    RAD Studio XE2 Architect 5 pack
    RAD Studio XE2 Architect 5 pack Upgrade
    RAD Studio XE2 Architect Academic
    RAD Studio XE2 Architect Academic - Network License
    RAD Studio XE2 Architect DevRel
    RAD Studio XE2 Architect Upgrade
    RAD Studio XE2 Architect Upgrade - Network License
    RAD Studio XE2 Architect Upgrade from Delphi/C++Builder XE2 Arch
    RAD Studio XE2 Architect Upgrade from Starters or RadPHP
    RAD Studio XE2 Enterprise
    RAD Studio XE2 Enterprise - Network License
    RAD Studio XE2 Enterprise 10 pack
    RAD Studio XE2 Enterprise 10 pack Upgrade
    RAD Studio XE2 Enterprise 5 pack
    RAD Studio XE2 Enterprise 5 pack Upgrade
    RAD Studio XE2 Enterprise Academic
    RAD Studio XE2 Enterprise Academic - Network License
    RAD Studio XE2 Enterprise Upgrade
    RAD Studio XE2 Enterprise Upgrade - Network License
    RAD Studio XE2 Enterprise Upgrade from Delphi/C++Builder XE2 Ent
    RAD Studio XE2 Enterprise Upgrade from Starters or RadPHP
    RAD Studio XE2 Professional
    RAD Studio XE2 Professional - Network License
    RAD Studio XE2 Professional 10 pack
    RAD Studio XE2 Professional 10 pack Upgrade
    RAD Studio XE2 Professional 5 pack
    RAD Studio XE2 Professional 5 pack Upgrade
    RAD Studio XE2 Professional Academic
    RAD Studio XE2 Professional Academic - Network License
    RAD Studio XE2 Professional Named User Upgrade from Delphi/C++Builder XE2 Pro
    RAD Studio XE2 Professional Upgrade
    RAD Studio XE2 Professional Upgrade - Network License
    RAD Studio XE2 Professional Upgrade from Starters or RadPHP
    RAD Studio XE2 Ultimate
    RAD Studio XE2 Ultimate - Network License
    RAD Studio XE2 Ultimate 10 pack
    RAD Studio XE2 Ultimate 10 pack Upgrade
    RAD Studio XE2 Ultimate 5 pack
    RAD Studio XE2 Ultimate 5 pack Upgrade
    RAD Studio XE2 Ultimate Upgrade
    RAD Studio XE2 Ultimate Upgrade - Network License
    RAD Studio XE2 Ultimate Upgrade from Delphi/C++Builder XE2 Ult
    RAD Studio XE2 Ultimate Upgrade from Starters or RadPHP
    
  • Friday, May 11, 2012

    Metro UI in Visual Studio 2011

    A recent blog post on MS's blogs, here shows the differences between the beta and release candidate gui:
    I was looking at their UI and thinking about it, and you know what it reminds me of? This:
    That's GEOS on a Commodore 64, in about 1988. So, Metro is GEOS 2012. What do you guys think? Is it time to go back to monochrome? Sick of high color photo-quality icons and long for monochrome high-contrast user interfaces? Not me. But it seems all the cool UI designers are doing it. Mac OS X 10.7 LION is the least colorful version of Mac OS X yet, and it all seems to be fading into gray on silver on carbon, whether its the removal of color from the icons in the finder's quick-icon bar, or the complete disappearance of the scrollbar, the themes for this year's cool UI designers are "chromeless", "monochrome" and "minimalist". Color me unimpressed.

    Thursday, May 10, 2012

    The world needs more Debug Tools

    The world needs more debug tools. Well, Developers in this world do, anyways. Lately I've been learning Cocoa and ObjectiveC -- still the best way to write native iOS applications, if you don't mind the learning curve, and a lot more mature than Firemonkey is, yet -- and besides the beauty of the Cocoa frameworks and CocoaTouch (the iOS version of desktop Cocoa), one of the other things that is impressing me, is the tools that come with XCode, including "Instruments".
    For a quick tour, read this link for an example of some of the things that you can do with it. Since reference counting is used everywhere in ObjectiveC, you need to know about things like retain cycles, for instance. Memory leaks in Delphi applications are more often because the "owner" didn't free an object when the owner was destroyed or no longer needed the object, although of course, reference counting does happen wherever you've got Interfaced objects. AQTime is the closest tool to Instruments, if you want to compare. But most Delphi developers don't own the full AQTime product, and Instruments comes with XCode. In fact, perhaps the most amazing thing about XCode is that it's free. Why is it free? Because Apple wants people to make iOS apps and Mac apps, and because until they took over making their own SDK, one of the big barriers to development on Apple devices, a long long time ago, was buying MetroWerks CodeWarrior, which was the Apple C/C++ IDE back in the bad-old-days prior to Mac OS X, and the iPhone, and every other cool thing.
    Even though I have AQTime "Embarcadero Edition" that comes with XE2, and even though I've had AQTime Professional at various places where I've worked, I still feel that I don't have enough tools to find the difficult bugs.
    I want a tool that will:
  • Help me step back in time to what happened right before the mess I'm in right now.
  • Slow down time but not stop it, giving me a way to run my code at not-exactly-full-speed, but at a usable enough speed, that I can operate the application, while seeing the mechanics of the app run, or fly by me on the screen.
  • Show a call stack, like a debugger, but also a call history, that goes back in time, until the beginning of each thread or a certain limit (say, 10000 entries per thread) is reached. Obviously the art here is knowing how much to hide and how much to show, and not only deleting the oldest entries, but also providing ways to creatively "fold" the history so that repetitive details that you don't care about could be ignored.
  • Log things without writing logging code. The current debugger can do this if you don't mind spending a lot of time doing the creation of breakpoints that don't break, but just log stuff. I also like to write logging via code, for production use, and I'm a big fan of CodeSite, or of just roll-your-own trace logging. But I want to profile code and trace its running,way beyond even what AQTime's function tracing can do. I think that AQTime is amazing, but I am sure more can be done. For example, I typed in FRED into an input box. I want to see the parts of the call tree, that have to do with the button I clicked, and the Edit box I typed fred into. I want to follow Fred, through my program. I want mouse clicks to initiate tracing just until I get back into the TApplication process-message-loop.
    Like many things, I know I'll have to write it myself if I want it done right. The thing I don't know is how to start it. If I had the starter-codebase for a simple Application Profiler written in Delphi, I am sure I could extend it and try some of my ideas. Anybody know how to write a profiler for Delphi?

    Update: Visual Studio people have something called Debugger Canvas. If you have Visual Studio 2010 ULTIMATE edition, check this free add-on out. And even if you don't do Visual Studio you should watch this video.
  • Tuesday, April 17, 2012

    Software Development Culture: Art and Science

    I have now been a professional software developer for 25 years. My first software development job was only part-time software development. I wrote and improved an application written using dBase III for DOS, at a surplus-electronics and surplus-military-gear (think parachutes, and backpacks, and camping gear, not weapons) store in my hometown. As an aside, it was the coolest job I've ever had, in addition to being the most poorly paid.
    As a software job it lacked most of what professionals would consider "minimum standards" these days; The product had to be functional at all times, and there was no such thing as "release management". We were working on a live production system, at all times. The version control system was called "making a backup", and involved keeping around enough backup copies of the database image, on floppy disk, which included both the data and the code. There were no code reviews, there were no unit tests, there was no bug tracking database, and there were no development team meetings. For simpler single developer projects in a small non-networked application for DOS, it worked fine. But what happened between 1984 and 1994 is that the software development world fell apart, over and over again, and each time, something new was supposed to save it. Object oriented programming will save us. Blobbygrams (OOA/OOD) will save us. Metaprogramming will save us. Patterns will save us. Formal methodologies will save us. Each of these software tools has its place, or had a place at some time, but nothing has ever been a panacea.
    Figure 1: dBase for DOS: Documentation and installation floppy disks


    Why do we have so much procedure and process now, and so many tools that we never needed or didn't know we needed, back in the 1980s? Because we can't just fly by the seat of our pants. At a certain level of complexity, ad hoc approaches stop working at all, and lead to almost certain project failure.

    Software projects often fail, even when there is a formal process, and the reason we most often pinpoint is that projects are "out of control", and that even though many or most people on the project know that the process is out of control, they can't agree on how to bring it back under control.

    I love version control systems, because they are time-machines for code. And they are a part of keeping a software process under control, and knowing what code went to what customer, in what version of your project. And they're great. You should never work without one. One of the other things that version control was supposed to do was prevent things from changing that we want to keep frozen. Some version control systems even require you to "check out files" before you can work on them, and that "check out" action changes the files from "read only" to editable. (Visual Source Safe, and Perforce, are the two most commonly encountered version control systems that require you to first get a read only copy of the whole file set, then execute a "check out" command to make the individual source files writable before you can edit a file.) Part of the reason for that "read only" flag was that in the early days version control systems lacked real merge capabilities, or that merging was difficult, perhaps considered "risky" or "scary". Most projects that I have worked on, try to achieve such a "frozen" state or 'stable branch' for all major projects. Stability is part of a project being under control.

    The other half of a project being under control, paradoxically, seems to be that everybody wants to keep cramming features into the product. This schizophrenia (stable, yet with new features) seems to be the proximal cause of projects going out of control, in my experience. Rapid uncontrolled progress on a project leads to one kind of diagnosis of project failure (it's unstable, and unusable) and yet, that rarely happens anymore at most places, projects are seen to be out of control for the reverse reason; Nobody can explain or justify how slow the progress on new features is going.

    The most successful software projects I have ever worked on, and all of my favorite jobs, have had one thing in common; the projects that I worked on were "under control", that is, bad stuff was minimized, but also, expectations of developer productivity were reasonably in sync with what was realistically possible.

    My best-ever bosses have all been people who knew what a PID loop was, and most of them could even tune one if they were asked to. A PID loop has at least one sensor-input that reads something from the real world, like temperature, or RPM, or air pressure, or perhaps a virtual input such as a price of a stock on the NYSE. It then has an output, which is something which can hopefully be used to affect the thing we're trying to control. If the input was a temperature sensor, measuring the temperature of a liquid, the output might be a relay on/off control attached to a heater, or it might be a variable output controlling a valve, which can change the pressure or flow of a gas or liquid, or perhaps the output might be the commands to a stock-market-buying-and-selling system. What a PID loop does is take three coefficient terms in an equation, a Proportional term, an Integral Term, and a Derivative term, and use those coefficients to do realtime control of a process. When a process is "under control" it behaves in a predictable way, even when it's disturbed. If the sun came in the window, and heated up the liquid that we're trying to control, a PID controller would handle that disturbance, if tuned properly and the process would not be out of control.

    Software processes are not as simple to control as "one single input", but they do respond to logical analysis, and this logical analysis is conducted at a glacial pace. Once or twice within 20 years, someone comes up with something like the "SDLC" or "Waterfall" or "Scrum" or "Agile" approach to software development. These are promoted as a software panacea. Inevitably, certifications and formal processes take over informal insights into project management, and turn whatever good ideas were at the core of these software development "control" practices, and take all the effectiveness, and certainly, all of the fun, out of being a software professional. It's particularly sad to see "Agile" and "Scrum" get twisted, since the original ideal behind "Scrum" was exactly the insight that software processes are not universally equal and that practices that work in one context might not be workable in other contexts. So, while "Scrum" should have been resistant to such perverse misuse, It has been widely noted that what killed Waterfall could kill Agile, and scrum.

    So given all that, you'd think that I would argue that developer should just be left alone to do what they do, and take as long as they're going to take, and all that. That would be a spoiled, unreasonable, and ultimately self-destructive viewpoint. The best projects I have worked with, and the best managers I have ever worked for, did not give developers enough autonomy that they could derail a business plan, and imperil a company's future. That would have been rediculous. But what they did do, was figure out what sorts of controls, and measurements of the software process were effective, and apply at least those methods and measurements that could be shown to be useful. They were agile without using the word agile. They didn't have code reviews. They didn't have scrums. But they had something which is perhaps the foundational principle behind Scrum:

    Managers, stakeholders, and developers, co-operated, and worked together. Developers were respected, but not allowed to run the show. Managers were technically competent, and understood business requirements, and could ascertain whether or not developers were effective, and were making sufficient headway. Nobody got together for daily standup meetings and said "I'm blocked" or "No blockers", as if that would help. But when a developer needed a tool, he would go to his boss, and he'd get questions, intelligent ones about whether it was needed or not, and if the need seemed real, he would get his tool bought. When a developer was not making good progress, the approach was to see what could be done, pragmatically, to get something done, at a reasonable time, even if it wasn't the full spec that everybody would have dreamed off. That kind of rational change of scope, and attempt to protect project milestones, was as effective (whether we call it timeboxing, or sprints, or milestones) as it could have been, given that what really often held us back, and delayed projects, was the same thing that always delays projects; Inexact, incomplete, incoherent, mutually contradictory or vague requirements, due to a lack of real understanding of the underlying business requirements, or a misunderstanding about the real useful nature of the software product.

    Pragmatism should be the primary value in every development organization,and on every project. Pragmatism stays focused on business. The business of writing software. It doesn't go down blind alleys, it doesn't play blame games, and it doesn't wonder about water that's gone under the bridge, but it sticks to the question; What do we do now, what do we do next, and how do we prevent issues that have affected our ability to do great work from hurting us all again? Pragmatism takes collective responsibility for success, and doesn't blame individuals. It doesn't play political games, and it doesn't stab people in the back. Pragmatic professional software development is not a buzzword, or an approach that replaces human judgement. In fact it relies on human judgement, and only works when you're sane, sensible, and centered in reality. It's just recognizing that there's a lot of superstition and magical thinking out there in the software development world, that needs to be replaced with careful, rational, friendly, collegial, scientific realism.

    Tuesday, April 10, 2012

    Jack Tramiel

    Jack Tramiel, died this past Sunday. A Jewish man of Polish descent, survived the Nazi-holocaust including being imprisoned in a concentration camp, and went on to become one of the most important figures in the microcomputer revolution that is still changing the world. After the war, he lived in the US, and briefly in Canada. He started Commodore in Toronto, Canada (where I live right now) in 1955. Commodore Business Machines made calculators, typewriters, filing cabinets, and other office equipment, until the day they purchased MOS, a semiconductor company that made the 8-bit 6502 processor. Commodore/MOS's first microcomputer product was not even a "complete computer system". The KIM-1 was a single-board that needed a power supply, and some additional circuitry added, not to mention a case, and some kind of display or terminal. Then, Jack brought us the Commodore PET, which was a ground-breaking computer. Early Commodore PET hobbyists were among the first in the home computer craze. The Commodore PET had a black-and-white display, and depending on the model, either a 40 column screen or an 80 column text screen. The PET did not have any kind of "bit map" graphics capability, unless you count the creative use of character shapes in the "PETSCII" custom ASCII-like character set. The Vic-20 was the first computer to sell in mass-market quantities, that could be attached to a color TV set. With only 22 columns across on the screen, I didn't really much like the Vic-20. Here's a screen-shot of a BASIC program on a Vic-20 emulator that gives you an idea of how limited a 22 column screen might feel:
    The next computer was the Commodore 64, the most important computer in the 1980s, in my opinion, because it was the first computer I ever owned. Okay, it's still the best selling computer of all time. I had played around with Atari 400/800 XL computers, the Vic-20 and the PET, the TRS-80, and the Apple II. But no other machine in 1982 could touch the Commodore 64. It had amazing sound capabilities, graphic capabilities including bitmapped graphics and sprites much more advanced than early IBM PC XT and IBM PC AT computers. It could be used with a TV, but a lot of people bought the Commodore 1702 monitor. Very few people ever purchased hard drives for their Commodore 64s, but almost all US/Canadian owners of Commodore 64 bought the 1541 Disk Drive, which stored 170K on a 5.25" floppy disk. I wish I had a picture of me on my commodore 64, but here is a picture of a system much like the one I spent thousands of hours learning to program, playing games, and using Bulletin Board Systems, which we did a lot of the same things with that you might use the Internet to do today:
    Jack Tramiel, and his employees, at Commodore brought a computer to the masses. After leaving Commodore, Jack purchased the personal-systems division of Atari, and masterminded the Atari ST, another amazing computer that was years ahead of its time, and which had a loyal following of its own. My uncle had an Atari ST, and it was a beautiful machine. But no computer has ever been as amazing to me as the Commodore 64. My first "geek love". Thank you Jack. You changed my life. You changed the world. Writing programs on my commodore 64, I felt like I was doing magic. I still feel the same way about coding. When you build something on a computer, you're not just creating a work of art, you're making a little virtual machine, that can seem to have a life of its own. It could be something beautiful and elegant as a wristwatch, a space shuttle, an autonomous robot, or a jetfighter, that lives in a little virtual world called 'your computer'. Even leaving aside the early attempts at "Artificial intelligence" in the 1980s, like "Eliza", writing games was like being the creator of your own tiny universe. You wrote the rules. Watching all the rules turn into a working game felt like you were in control of a tiny universe.