Multi-Factor Authentication

Yesterday, after writing about the pain of added security when dealing with baking websites, I upgraded my Mac to High Sierra. When the upgrade was finished, my Mac asked me to enter the authentication code sent to another Mac machine I own. Fortunately, I had my another machine nearby, so I entered the code. Then, it asked me what the password was to unlock the other machine. That sounded strange to me, but my Apple keychain would have that password. Then, the final hurdle was to change my password since it was the same as my iCould password – and Apple doesn’t allow that anymore. Wow. Apple must think I’m storing nuclear launch codes on my laptop. Then, I went downstairs to run some updates on my wife’s Mac. Not an upgrade to High Sierra, but just updating Safari, iTunes, etc. When I clicked the install button, it asked for my iTunes credentials, then asked for a code sent to another machine. This time, I didn’t have another machine nearby. The other option was to send a code to my phone – which I also did not have near me. So, that upgrade did not happen. It is frustrating to me that I increasingly need my phone to log into a website or perform other online functions. Even more frustrating, is it really necessary for me to jump through so many security hoops just to upgrade my computer?

Accounting Woes

Since the dawn of banking, people have needed to balance their checkbooks. Business or personal, the need is the same. Then, with the advent of personal computers, accounting software like Quicken, QuickBooks, Microsoft Money, and various others simplified the process. No need to do math, just enter your receipts and verify with your bank statement at the end of the month. Then, during the last decade we saw the emergence of online tools such as Mint and QuickBooks Online for accounting. No longer do you need to manually enter any accounting data – just provide your bank account information and allow the website to sync your data. No need to balance your checkbook or do anything at all. Just sit back and take an autopilot approach to much of the accounting work. Now, during this past year, I have seen a huge surge in problems with this kind of software. Banking sites are increasing security, updating technology, and – in general – breaking compatibility with these services. What was previously a 30 second process to update your account now takes minutes, if it completes at all. Some accounts demand that you enter an access code sent to your phone. Even more annoying, some accounts ask you to identify all the street signs or cars or stores in a picture. In short, the solution is now becoming more painful than the problem it is intended to alleviate. I hope this trend soon reverses, I love the simplicity that integrating my accounting software with my bank offers, but I am getting tired of wondering if it will work today

Now on WordPress!

Today, I have upgraded my blog to use WordPress. Woohoo! Up till this point, I had been using the built-in blog plugin for RapidWeaver. It works nice, but WordPress will help me take my blogging to the next level. Most importantly, I can now blog from anywhere instead of just my home machine. The bad news? Links I have tweeted or posted on my LinkedIn page are now broken. So, I’ll be working to fix that and to make the style between my main site and my blog look more… well… consistent.

Visual Studio Code

Anyone who knows me knows well that I am not a huge Microsoft fan. I’ve been a Unix user for over 20 years, I’ve been using Linux for nearly as long, and my current laptop is a Mac. I prefer Google Docs to Microsoft office, I never run Internet Explorer (Or Edge), I don’t like IIS, and I would never run SQL Server. So, it comes as a shock to most of my tech friends that I am a huge fan of Visual Studio Code. In fact, I would have to say that it’s probably one of the best general purpose development environments ever created. What makes it so great that I, a Unix user would endorse it? I think there are two main factors that made me fall in love with Visual Studio Code. First, it’s cross platform – Visual Studio Code runs on Windows, Mac, and Linux. This is a big deal for me. I prefer tools that I can run on a variety of platforms. While I typically work on a Mac, I do have a Windows machine too. Having an environment that runs on both means that I can easily transition from one machine to another without having to adopt different tools. Second, and probably even more important, is the wide variety of plugins available. Whether you need to create or edit HTML, C# .NET applications, JavaScript, Python, XML, there’s a plugin available for you. There are also plugins for Docker, git, and a REST client. Furthermore, the IDE is pretty simple and easy to work with. Where I used to use text editors such as UltraEdit or TextWrangler, I have now come to rely on Visual Studio Code as my default choice for editing code when I don’t have a more specific IDE installed. Kudos to Microsoft for a creating such an amazing cross-platform code editor!

Why Custom Software Development?

Development

At a recent chamber of commerce meeting, a fellow member asked me what my company does. I replied that I create custom software solutions for businesses. He was incredulous that people actually paid for custom software. Sadly, this wasn’t a small business that might struggle to see the benefit of custom software — this was a large, well-established local business. Exactly the kind of customer that has much to gain from custom software development. But what do businesses stand to gain from custom software development? First and foremost, custom software allows the organization to have tailor-made solutions to their problems. Software is not a one-size-fits-all solution. The application that works great for a small business may not be flexible enough for a large business. Conversely, an application that works great for a large business may be needlessly complex for a smaller business. Even more importantly, off-the-shelf solutions don’t take into account the things that make a business unique. After all, doesn’t every business have something that makes them special? Maybe your organization makes custom products — how do you quote the product? Maybe your organization is an innovator in your market space — how do you implement process to aid in that innovation? Whatever it may be, your company is like no other — and custom software solutions can aid you in exploiting the things that set you apart from the competition. Second, off-the-shelf software may be updated or changed in the future in ways that break functionality you depend on. Remember the last time you updated Windows? Did everything go smoothly? Off-the-shelf software is the same thing — maybe it works great, maybe not. But as a business, is that a risk you’re willing to take? Custom software can mitigate that risk since you — the customer — are in control of any new features in the application. Furthermore, you can have the software modified to ensure compliance with new laws, new processes, or new requirements of any kind. Try having off-the-shelf software updated to meet your new requirements. Third, custom software can be written to integrate with your other systems. Integration of systems can ensure that data is not required to be entered multiple times, it can enable faster processing of information, and it can greatly improve operational efficiency. Custom software can be written to read inventory from your existing inventory control system, update employee data in your employee management systems, integrate with your customer management systems, or interface with any other systems your company depends on. Off-the-shelf software simply can’t compete with that. Fourth, custom software can be supported by the developers who wrote it — developers you have interfaced with, developers who understand your business and what makes it unique. Off-the-shelf support may or (more likely) may not meet your needs as an organization. Late on a Friday night, do you want to call a foreign call center for your software and hope someone can help or would you rather call the local software company and have them stop by tonight to diagnose and solve the problem?

As a software engineer for nearly 20 years, I can site countless samples of work I’ve done that has improved an organizations revenue, improved workflows, aided in reporting data to senior management, and ultimately aided the organization in increasing market share. And isn’t that exactly what businesses want? To increase market share? Why a company would not want custom software is a better question!

Developer Certification

The IT world is full of certifications. When I started in the tech world, CompTIA’s A+ certification was the standard for computer techs and the Microsoft’s MCSE certification showed you were a master of the Windows system admin world. Today, the IT world has numerous certifications available to indicate proficiency in networking, system administration, hardware, security, application proficiency, and so forth. The world also has numerous programming certifications now too. Two of the more well known certifications include Microsoft’s MCSD and Oracle’s Java certifications. But are they as useful A+, MCSE, CEH, or other certifications? I personally don’t think so. In all my days as a software engineer I have never once interviewed a single developer who had any programming certification. I have never had a fellow developer tell me about passing the newest version of a developer certification. I have never been asked by anyone if I’m certified in a programming language. It has literally never once mattered. In the past, I had considered seeking certification as a Java developer. Then I saw the sample test questions. My first thought? If I ever saw this kind of code in real life I would do everything in my power to ensure that the author was immediately fired. The questions test your ability to remember esoteric language rules — not things I want to ever see used in production systems. Many of the questions ask “what is the output of the below code” and provide a code snippet. If you have to ask what the output of a complex code fragment is, you probably wrote it poorly. If I really needed to know, I’d copy the code and run it. None of this is really of any value. So, your brain is a human code compiler — that’s great. But the real questions remain unanswered — do you understand design patterns? Can you decompose complex problems in to proper object models? Can you write maintainable code? Do you have good coding style? Do you document your code? Do you understand networks and databases? When I interview a developer, these are the questions I need answered — not what the output of a horribly convoluted nested loop is.

Social Media?

Friends

This past week, I vacationed with my family in Disney World. It’s a favorite vacation spot for my family. While I was there, I constantly saw people looking at Facebook, Instagram, and other social media forums. The problem? They were completely ignoring the very people they were vacationing with. I assume most people go on vacation with their family or friends because they enjoy spending time with them. Sadly, that was not demonstrated by the people I saw. In one example, I saw a couple both looking at Facebook while their young children pleaded to be lifted up so they could ring the bell that was just overhead. Their parents never heard them. The children tried lifting each other up to no avail. Then, the line moved forward and the opportunity was lost. Over and over again, while at dinner or in line for a ride, I saw entire families too interested in what people they barely know were doing to pay attention to the people they love. I once heard it said that social media should be renamed anti-social media. Sadly, I agree. All to often our social media habits actually prevent us from engaging in real social behavior and instead we focus on a virtual world – a highly curated reality where everyone’s life is picture perfect and utterly fake. We take selfies to show everyone our life is awesome too. Yet, the reality is, it’s all hollow and meaningless. While we’re trying to impress someone we knew in high school, the people we actually love are sitting on the sidelines of our life. Shut off the phone — spend actual time with the people that matter instead of wasting your watching what everyone else is doing.

What Language to Learn?

Library

I frequently talk to parents as well as people in the educational community about what language kids should learn. Maybe they remember their uncle talking about Fortran, or they have a relative that uses Python – but they want to know what their children or students should be learning today. It’s a great question as the world of computer programming is always changing. The last 20 years has seen countless languages gain widespread usage — and I’m sure that’s not going to change anytime soon. Unfortunately, not everyone is up-to-date with their computer programs. Just a few years ago, a child where I was attending church asked if he could job shadow me for an assignment in his computer programming class. Always wanting to encourage young people to pursue technology, I was happy to oblige. When he came go my office, the first question I asked was what language he was learning. He gleefully responded: “COBOL!”. This was just a few years ago, and a student was being taught COBOL? I asked what else he was learning, and he said they were learning RPG and SQL. Wow. The only thing useful there is SQL – COBOL and RPG are long dead. But even SQL isn’t necessarily useful on its own as it’s not really a programming language, but a language for accessing data. So, what would I recommend people learn today? Well, a friend showed me a great website to help someone pick a language based on their interests – Best Programming Language For Me. The languages provided are modern, useful languages and their selections reflect the best choices for someone new to the art. Another great resource is the IEEE 2017 Top Programming Languages. Either of these sites can help you pick a language with a future – unlike learning COBOL today.

Developer Maturity

Today, I was onsite at a customer location. This particular customer has an interest in programming, and showed me a site he was checking out that asked a variety of questions to determine what language he should learn. Do you want to write games, web apps, desktop apps, etc. For nearly every sequence of answers, I could predict what language they would pick. Why? Because I have used countless languages over the years and know where each one excels. Another customer recently asked me to create a very trivial service that would consume JSON messages sent from a server. You could write a Java app for this, but why? My suggestion was either a simple PHP script or a Python app running a REST service with Flask. Either option is far simpler than writing Java code to handle the processing. One of the key indicators of a developer’s maturity is their ability to pick the proper technology for the problem at hand. For the customer, the technologies selected can make a huge difference not only in the price of the software, but in it’s success as well. This extends beyond programming languages. Mature developers understand build systems, revision control systems, project management methods, design patterns, and so much more. For customers, picking an inexperienced developer can mean substantially higher development cost, increased long-term cost of ownership, increased development times, and numerous other problems. An experienced developer can help you navigate the technology map and select the best options in order to provide the best user experience at the best cost.

(Fr)agile Development

Agile development seems to be the ‘in’ thing for software development firms today. Everyone has their daily standup meeting, scrum masters, sprints, and so forth. But does it really bring any true value to software development? I don’t think so. In fact, I have taken to calling it fragile development. Why would I say that about such a beloved idea? Because my experience is that it creates horrible software. Sprint after sprint, developers work to output code often without knowing the big picture. Day after day, short-sighted development goals are pushed so you get enough points done and complete everything for the sprint. Managers now have even more ability to micromanage since everything has to be done at the end of the sprint and everyone has to report in with their daily progress. Time is wasted in meeting after meeting that brings little if any actual value to the team. What does all this mean? It means that developers are always under the gun to output code quickly so it’s done for this sprint. This causes developers to take the short path instead of analyzing things more thoroughly since such analysis would take more than the allotted points and may push things off schedule. Developers are never able to try new things because failure is not an option — points must get done and software must be pushed. Software engineers never have an opportunity to practice engineering skills or architect larger systems because everything is broken down into bite-sized pieces without any real worry about how it all fits together. To make it worse, important technological changes and refactoring get pushed to the bottom of the list since they do not have an immediately visible benefit for the organization. In the end, developers never grow or develop, code stagnates, and poor software becomes the norm. Sprint after sprint turns into a death march for features, bugs never get fixed (unless they bring immediate business value), and the expertise of senior developers is ignored in favor of short-sighted business objectives. If you want quality software, leave engineers do what they do, give them the latitude to make the necessary decisions to create the product you want. Qualified engineers are more than capable of creating awesome software — why hinder them?