Ian Smith, Worcester, Yet Another Freelance Software Engineer/Programmer

Sometimes A Luddite's Perspective Is Interesting

me in the garden

I advise on and develop computer software for third parties for internal use or resale as well as developing products which are marketed under my own name, or in the past the name IS Associates.

Why You Might Want To Come To Me

In recent years some areas of programming have been deskilled , other areas haven't changed much and unfortunately some academia inspired nonsense has crept into a lot of business systems development and made development slower and harder to maintain.

I am an older programmer who started his working life writing assembler on a 1MHz 8 bit microprocessor with 256 bytes of RAM.

At the other end of the technology scale recently I wrote a C#, WinForms, ASP.Net, Web Forms, WCF system creating and fronting an SQL Server databases with 500 million plus rows, which was used to manage email marketing campaigns of millions of emails per month.

People who needed the power and flexibility had a desktop app, others who only wanted to see “results on an iPad” had a web app and some people who needed to access to the raw data has WCF web REST services (APIs).

In the middle size wise, I wrote a full cycle EDI administration and quotation system for household and motor insurance using MS Access/VBA to provide a front end to an SQL Server database and a C++ quotation engine.

The important point of mentioning these systems is that they show that a lot can be achieved using a variety of tools and that I am happy to go with the ones that you want.

There is of course the caveat that the choice must make a reasonable amount of sense.

The assembler background is important as it teaches a programmer an awful lot about what has to go on to achieve anything even vaguely useful.

So when you write a high level command you have an understanding of the computing resources that you are asking for and it makes you think. Should I really use that library function or write some code that will achieve the same thing using far fewer resources but take a lot longer write?

The modern trend is the opposite off this, trust the programmers less and force them to uses design patterns, things like MVC (model/view/controllers), blindly follow SOLID principles and use javascript libraries (Angular, React etc) to form the basis of a system.

The problem with these patterns and libraries is that although they have sensible roots all to often they have taken good ideas too far.

It's only once you get deep into your project they you realise that they leave you restricted in how you develop your applications and often result in fragmented and difficult to maintain source code as well as being resource hungry.

Even worse than all of the above is that all to often they also leave the project owner stuck 10 years down the line when they are abandoned by their creators in favour of another new "best way" of doing things.

And whilst neither PerBI or IPL have been commercial successes they are complete standalone Visual C++ applications that exist in the market place. One where users can send in emails saying that It doesn't work, please fix it.

Sometimes You Need MS Access, VBA And C++

An MS Access form used as a programming language screen
Print #i16FileNum, "typedef CMap< unsigned int, unsigned int, " & Format(rs("BaseName_char").Value, ">") & _
"_STRUCT, " & Format(rs("BaseName_char").Value, ">") & "_STRUCT& > " & Format(rs("BaseName_char").Value, ">") & "MAP;"

An MS Access form that looks like a programming language screen and generates C++ code.

Programming Is More About Experience Than A Specific Language

This is an example of where thinking as much as the programming language, if you know enough of them.

C++ is an evolution of the C language, for some tasks it is an improvement and for other tasks the new features are off no benefit.

Most people who are familiar with C/C++ are also familiar with VB/VBA/C# but many people familiar with VB/VBA/C# are not familiar with C/C++.

The principle advantage of C/C++ is that the language doesn't attempt to interfere with what the programmer has asked to do, or to provide slow generic solutions to problems.

This tends to mean that C/C++ programs run faster and are much smaller than programs written in other languages, depending upon the task these are still important factors

The really big downside of C/C++ is that they are the hardest languages to learn and the easiest language in which to write buggy programs, the programmer has to think of everything that might go wrong and remember to return to the Operating System any resources, such as memory, that it has asked for.

In this case the objective was to deskill the maintenance of motor insurance quotation engines which were initially written in C++ using COM to interact with an administration system created in MS Access/VBA.

A list of the commands that make up a stepThe first step is a break the processing up into steps, here calculate the base premium.

A single command's optionsEach step is composed of commands each of which have a dialog box ensuring that a well formed command is created.

The conversion of the above step to c codeOnce all of the steps are completed each of these steps are then converted to C++ code and merged with boiler plate code to makes up a full quoter.

Finally An NMAKE project is automatically created and invoked to end up with a dll that can be passed to the live systems.

C++ code generated from the above formsThis is the final C++ program.

You can see that some of the C++ code directly maps to the commands in the Access form but aso that some doesn't. The code that doesn't is necessary for the quoter to work but never changes and the person maintaining the quoter doesn't need to know about it.

For example the assignment to q_FactorSave makes the result of this step available via a COM method
DllExport double __cdecl StepFactor(int);

And Sometimes You Need C++ And Assembler

The optimiser missed a trick and a bit of assembler dramatically improved performance.

The risk of course is that it is compiler version dependent and who wants to maintain it?

But You Still Need To Know What Language Is Best For The Task

It is very tempting to think that modern computers are so powerful that they are effectively almost unlimited in their capacity, but this is not true or even close to it.

Indeed some programming languages use this increase in power to increase programmer productivity at the expense of slower running programs.

After all if the program produces a result in 1/1,000 of a second rather than 1/1,000,000 of second who cares?

The problem is that as the amount of data that needs to be processed increases this becomes 1 second or 1,000 seconds and then everyone cares.

The reality is usually not this extreme, the time increases to almost a second, then a second or two and then even more. During this period the users gets fed up with the system but the delay is not so great that the time to fix the issue can be justified.

And this is not as farfetched as it might sound, but all it means is that that you should change the programming language that you use for this resource intensive step. Or possibly discard a built in library function of that language and replace it with one written for your specific case

Quite often this slow down was predictable if the programmers had understood exactly what they were doing, but It worked fine with our test data of 10 customers.

However this "simple" replacement is often impossible in reality as many programmers will not have the necessary skills.

The explosion of the internet has created a huge pool of people who have learnt a little bit of PHP/ASP.Net and don't realise how much they don't know.

Equally their managers also don't realise how much they don't know and make decisions based on their advice.

Web Design, WebSite Design, Web Developer

I am better suited to sites that are mostly C# with either minimal markup (HTML and CSS) or where someone else is doing the markup.

This Is Probably One For Someone Else

Generally I am not the place to go to for simple web sites and as an example of a more complex site I have put up a simulated car insurance price comparison site.

There are already many people specializing in brochure or e-commerce sites.

Nowadays most websites are a commodity product, your site creator will pull elements from their "stock" and customise them to your requirements.

This means that the best prices with the most choice will usually come from people who specialise in web sites and have a very large library to draw on.

As I don't have that library I would have to charge you the full cost of originating the work, rather than spreading it over say 20 clients.

So if what you want is pretty much a copy of something that has already be done then the best place to get it from is from the people who created the original.

If however what you want is technically complex and visually simple then we may be a good match.

For example a site that needs a unique and complex database design with say 100,000,000 rows or one that does complex calculations but gives relatively simple answers.

Many web sites involve little or no programming at all, so a company that can set you up with a site that has a comments section and a CMS that allows you to post articles may be at their limits programming wise.

To try and explain this difference I put up the car insurance price comparison site example. The more complicated programming bit is the process that calculates the premiums, something that you don't really see, only the results.

Do You Want A Successful Project?

Ten pound note in a sink by the drain

I think that I have only ever had one big failure.

Finally I am going to do something odd and talk about failure, let's face it failed IT projects are very common.

We often see on the news that a big government IT project has failed and may think that I could have done that along with a few people that I know and in a few months.

The assumption is nearly always that it is the programmers or the system's designer that got it wrong, this is convenient but is it fair?

Or was it the case that the project would have been a failure even if were 100% complete and fully met the specification?

My worst project was one that should have been 6 month's work but it got bogged down because the commissioner of the project wanted a new system and the rest of the company wanted to keep the old one.

Another project used SSIS/SSRS when a C#/VB application was more appropriate because the project commissioner understood SSIS/SSRS and not C#/VB and had only gone to an outside supplier because he was being pressured internally to get the project completed.

So it is very important to agree not only what the objectives are but even if they are achieved will the project be a success?