Software as an Iterative Process

The world can broadly be divided into the physical world and the digital world.

In the physical world, products are manufactured and deployed. Those products never again see the manufacturer. If there is a problem, a new process may be implemented to solve the problem; but customers with the existing product will not likely see the benefit of the new process.

In the digital world, products are created and deployed just like in the physical world. However, everything that follows is different. When software problems are identified, patches are created or new versions are deployed. When the customer accesses the patches or upgrades their software, they see the benefit of the new changes.

This difference allows for a vastly different approach to creating and deploying products in the digital world. Unlike physical products, software can benefit from an iterative process. Software can be modified today, tested tomorrow, and deployed the following day. What if it doesn’t work? The changes can be rolled back or a new patch can be deployed. Unlike a physical product, a digital product is never complete.

This huge paradigm difference means that software companies can be far more nimble than manufacturing companies. Since changes can be made at any time, software companies enjoy far less risk than manufacturing companies.

As a developer of custom software, I often work with customers that are uncomfortable with this process. These customers want to wait until all functionality is present or until everything is fully polished and tested. This makes sense in the physical world, but can actually be detrimental in the software world.

Why is it important to use an iterative approach to software development? Since deploying software can be done quickly and changes can be rapidly fixed if necessary, frequent software releases allow customers to receive updates more quickly than if they waited for a major release. This allows customers to provide feedback if the features are not useful or if they work improperly. This feedback creates a loop that allows developers to go back and ‘get it right’ if they need to in a more controlled environment. Without this loop, it’s possible to spend months developing features that don’t actually meet user requirements or to create bugs that require substantial cost to find and rectify. This means wasted development time as well as missed opportunity costs. Additionally, small frequent software updates means that each individual update can be tested independent of other changes and issues are kept much smaller than in large updates. Frequent software updates also means a decreased time-to-market with new features.

Iterative approaches to software improve user experience, improve time-to-market, decrease difficult to find bugs, and shorten and simplify test cycles. Are you frequently releasing software updates, or are you treating software like it’s a physical commodity?

Business Ownership

I started my own business about 5 years ago just to make Android apps for the play store. It was never really intended to become a full-time thing, just a hobby. Then, over the next few years, I started being asked to develop Android software for local businesses. Working full-time while running a growing business on the side was a challenge. Then, as my business continued to grow, I realized that I could no longer do both. I had to quit my day job if I wanted my business to continue growing. Of all the things I’ve ever done, that may have been one of the scariest and most difficult decisions I’ve ever made.

Now, after running my business full-time for the past three months, I wonder what took me so long. Every single day I wake up excited for the day. I get to choose what I’m working on today, when I go to work, where I will work from, and how long my lunch break is. I have the freedom to take complete control of my life. Sure, it’s scary at times, but it’s absolutely worth it. My friends look to me with awe – as though I’ve done something special. The truth is, I haven’t – I just did what millions of other Americans have done and said goodbye to the traditional job.

Have you ever considered starting your own business? If not, what’s holding you back? In another decade, will you look back and wonder ‘what if’? For me, I know that even if my business were to ultimately fail, I will never regret the choice I made to give it a try!

Read the Fine Print

Yesterday, I was contacted by a customer who wanted to add push notifications to their mobile application. This is a common desire from customers, but they generally don’t have the infrastructure to support push notifications. Push notifications require a server to generate the notifications as well as some type of software to allow the user to create and send those notifications. Without any server infrastructure, smaller businesses are left without the ability to implement push notifications. Of course, there are a variety of services available for users to overcome this problem. One such service is OneSignal. OneSignal allows for very rapid implementation of push notifications using their servers and infrastructure. A developer can have everything setup and ready to demo in less than 15 minutes. Before suggesting this solution to the customer, I wanted to see pricing options and terms of service. But when I looked for pricing, I found it was completely free – there were no pay options. That sounded great, but I knew there had to be a catch – after all, businesses have to make money somewhere! As I read the Terms of Service, I was shocked to see:

Licensee acknowledges and agrees that the SDK enables Licensee to collect certain information from end users (“End Users”) of the SDK’s functionality (collectively, “SDK Information”), which generally helps provide developers with functionality to target and personalize the notifications they send to end users. This data collected includes: End Users’ mobile advertising identifiers, such as Apple IDFAs and Android Advertising identifiers; End Users’ email addresses End Users’ IP address, device push token, precise location (e.g., GPS-level) data, network information, language, time zone, product preferences, and privacy preferences.

So, this free service is collecting just about every piece of information possible about the user. While this may be ok for some apps, for many apps this would constitute a pretty substantial privacy invasion. Now, for my application, I would have to craft my own Terms of Service and ensure the user was aware that I was collecting the above information. In the tech community, do we read the terms of service, particularly when they will impact our end users, or do we just ignore them? In this instance, I am very glad I dug further. While I found OneSignal to be an awesome product, the terms of service are simply incompatible with the application I’m working to deploy.

Language Overload

As a technology enthusiast, I live in a great time. Computing devices are everywhere, artificial intelligence is advancing by leaps and bounds, and hardware platforms such as Arduino and Raspberry Pi have made it easier for people to tinker with new technologies without spending a lot of money. But with all the great advances in technology, there is one advance I do not enjoy – the endless list of new programming languages released every single year. I’m not opposed to new languages, they are a necessary part of the march of progress. But don’t we have enough already? One example is the proliferation of languages that operate on the Java Virtual Machine. Originally just Java, now we have Scala, Groovy, and Kotlin too. And, each one has their own group of advocates saying their language is the best.

When Apple announced a few years back that they were replacing Objective-C, I was originally optimistic. Objective-C is pretty much unused outside the Mac world. If you wanted to write iOS applications, you had to learn an otherwise useless language. Was Mac going to lower the bar for new developers and allow them to use a language that was already widely used? Nope – they invented another language – Swift. I’ve heard lots of great things about Swift, but I’m not really interested in learning another niche language to develop for a single platform. (Instead, I’ve chosen to use hybrid tools such as Cordova and Ionic).

What’s the harm in all these languages? While different languages do bring different things to the table, there has to come a point where the market is over saturated. With all the languages out there, developers have to pick which ones to learn and which to skip. While every developer should be competent in more than one language, it’s certainly not realistic to expect a developer to be an expert in a dozen different languages. And since every language needs their own libraries of code, scores of developers are wasting their time writing standard functions for another language. Solving a problem that has already been solved a dozen times in the past – with a new language – is not particularly useful.

Where do we go from here? I suspect that we will continue to see the proliferation of languages. Long term, we will see languages transition to legacy code far sooner than previously. This will make it increasingly difficult for companies to maintain their codebase and will mean more frequent rewrites of software applications just to stay current. For companies, I would suggest ensuring that the languages you choose are solid, stable, mature, and likely to be around long term. You can go for the newest language out there, but you’ll struggle to find developers now and you’ll likely end up having an ever more difficult time maintaining the application long-term.

Loosely Coupled Systems

One of the principles of modern engineering is to create loosely coupled systems. But what does that mean and why is it so important?

In the past, it was common to create huge systems that included code for a wide variety of different functions. For example, an eCommerce system may include code for accessing the database, processing credit card payments, and interacting with an inventory management system. While having all the code in one place may sound great, it has some serious drawbacks. For example, maintenance becomes increasingly difficult the larger an application becomes. Additionally, testing must include the entire system, and deployment is an all or nothing deal. Upgrades are also more difficult as the entire system must be upgraded at once and opportunities for regression errors multiply.

Today, systems strive to be modular and loosely coupled. One piece may do credit card processing, another service may provide database access, and still another service may provide email support. While there are more pieces, these pieces can be assembled into a wide variety of configurations across different applications and these modules can be more easily tested. Once the credit card service is deployed, for example, it does not need to be changed or tested again until new features are required or bugs are found. Each piece can use the best technology for the task, and upgrades can happen on a per-service basis.

Currently, these services are often deployed as JSON-based REST services. These types of services are now becoming ubiquitous. A large variety of publicly available services are available for things like weather data, stock quotes, ISO country codes, etc.  This modular approach not only decreases development effort, it improves application stability as well.

On any project you’re involved in, whether it’s in writing the code or managing the project, modularity and loose coupling should be one of the most important guiding principles.

Getting Started with Artificial Intelligence

It seems that artificial intelligence is in the news more and more. Most larger companies use AI for something within their business, and more and more businesses are finding ways to improve their organization with AI. Purchase recommendation systems, self driving cars, video games, language translation apps, and route mapping software are just a few examples of artificial intelligence we see every day.

But where does someone interested in AI get started?  AI can be very complicated, but that doesn’t mean you can’t get involved too! One of my favorite resources for learning AI is the series Artificial Intelligence for Humans by Jeff Heaton. In his books, he covers a variety of topics including genetic algorithms, machine learning, clustering, linear regression, swarm algorithms, and so much more. While these topics can be complicated, Jeff presents them without all the math in a way that is far more readable than most texts on the topic.

If you are interested in AI, one of the first questions to answer is what programming language you want to use. While any language can be used for AI, the bulk of the tools and frameworks available exist for Java, C++, Python, and R. If you’re big into number crunching and Big Data, R may be the obvious choice. If you’re not a programmer, Python may be easier. For existing developers, Java or C++ may be best.

What type of AI do you start with? Try genetic algorithms or swarming algorithms. Genetic AI assumes the answer to be like a genetic genome and, through a series of mutations and genetic splicing, attempts to find an answer.  Swarming algorithms look at groups of objects and attempts to have them behave like a cohesive team. Swarming algorithms are great for games with AI controlled enemy armies and are commonly used by game developers. Other common, and simple, AI algorithms include K-Means clustering (used to group objects by similarity),  linear regression (used to predict unknown values using relatively simple algebra), or path finding algorithms such as Dijkstra’s Algorithm.

Once you understand the basics of AI, you can move onto frameworks like DeepLearning4J or TensorFlow to help create Neural Networks (a far more advanced type of AI) or look into libraries like OpenCV for tinkering with Computer Vision.

Whether it’s creating an emulation of a fish tank using swarming algorithms, solving the Traveling Salesman Problem using genetic algorithms, or calculating a path through a maze using Dijkstra’s Algorithm, artificial intelligence is loads of fun.

Carpe Diem!

Today, my daughter and I ran the first of three 5K runs this summer. We decided to participate in the Disney Virtual 5K this spring, and have spent the last few months training. Today’s race wasn’t great. We didn’t break any records, but we accomplished our goal for this month. Next month, and again in August, my daughter and I will run another virtual race.

As I was running today, I remembered something I read this spring. “Today I will do what others will not so that tomorrow I can do what others cannot.” This simple idea applies to just about everything in life. Today, I will show my wife that I love her so that tomorrow I have a marriage others look to as an example. Today, I will study Spanish for 30 minutes so that when I travel to Mexico later this year I can get around. Today, I will learn a new technology so that tomorrow I will be more marketable.

To achieve any goal in life, effort must be exerted day after day. I see people everyday who want to own their own business, or write a book, or run a marathon. Yet, rarely do these same people have any plan to get there nor are they exerting any energy toward their goals today. They are hoping that, by some miracle, they will wake up one day and it will have happened. But it never will. My business, my profession, my 5K run today, and everything else I have ever accomplished have taken untold amounts of effort and energy. But never once have I looked back on those efforts and regretted my decisions. Can you say the same about the things you have put effort into?

A leadership conference I attended this spring talked about the importance of self-leadership. About how we can never lead others if we can’t lead ourself. How do we lead ourself? By setting goals and working toward them. The leaders we wish to follow are those who have a record of achievement. They are people we aspire to be like. Are you putting in the effort today to be the leader that others will look to tomorrow? If not, are you willing to put in the effort today so that tomorrow you can do what others can’t?

Sieze the day! Make something awesome happen!

Gaming Addiction Disorder?

I read a recent article indicating that the World Health Organization had recognized gaming addiction as a disorder. Decisions like this should bring fear  to all tech organizations. As we strive to create compelling content, we run the risk that someone may become ‘addicted’ to our content in a way that negatively impacts their life. Websites like Facebook, Pinterest, Thingiverse, and others can easily become a time blackhole with an afternoon gone before you even realize it. Isn’t that what we want though? We want to attract users and keep their interest. But what happens when courts rule that the addiction that we caused created a negative financial impact on the user? Will content providers like Netflix be sued in class action lawsuits because people couldn’t stop binge watching the newest TV show? How far will this go? Will we have a future where employees who watch TV all day can’t be fired because they suffer a recognized disorder? Must we, as employers, provide reasonable accommodations for their disorder? How about social programs – will we be required to provide welfare because someone has become so ‘disabled’ that they can’t work?

When I was younger, I played a lot of games too. Hours spent playing The Legend of Zelda, Super Mario Brothers, and other Nintendo games; and even today I enjoy playing classic NES games. But gaming is only one part of my life. I enjoy reading, learning foreign languages, studying astronomy, playing board games, and so many other things. Gaming has never become an all consuming obsession in my life.

I am concerned to see how this will play out and what the ramifications may be, but I do know this – the future will be filled with people suffering from carpal tunnel and vision problems looking back on their life filled with the regret of having sold their dreams for a digital fantasy world that left them empty in the end. And we, as taxpayers and businesses will be left with the financial burden.

The Value of Open Standards

One of the most frustrating aspects of working in the tech world is dealing with proprietary systems, protocols, standards, and languages . Countless technologies do things their own way, even when standards exist for the technology. Some vendors like to avoid open standards simply so they can hold a segment of the tech population hostage. Unfortunately, many of the biggest offenders are also among the largest tech companies out there. Because of their influence, they ignore standards and create their own. These vendors may argue that they created their own way of doing things because the standard isn’t robust enough to do what they want. While this may occasionally be true, it’s often an excuse. A shining example of this problem is the Swift language created by Apple. Did we really need a new language for iOS? Certainly it was time to retire Objective-C (another Apple only language), but did Apple really need to create a new language? Were there no other languages that would have worked to achieve your objective? I doubt Swift was really necessary. Microsoft has done the same thing with their C# language. While I personally like the language, did they really need to create their own clone of Java?  How about Microsoft’s Active Directory? If you’ve ever tried to integrate a non-Windows machine, you quickly see how painful it is. These are just a few examples, but I am sure everyone reading this has experienced issues where things weren’t compatible that should have been if the vendors simply followed existing standards.

Why does this really matter? Because incompatibility negatively impacts consumers. When vendors create proprietary protocols, the consumer often loses. Time is wasted trying to connect a Mac to a Windows network. Programmers spend time learning another language that is useless outside of a specific niche. Money is wasted for additional software to convert between file standards. Users waste time fixing an OpenOffice document that doesn’t import nicely into Microsoft Office.

As new technologies continue to come out, this problem is only going to get worse unless we start working today to create open standards and to follow existing standards.

Lifelong Learning

I’m a nerd – it’s hardly a secret. My favorite hobby is learning. From math to foreign languages to astronomy to theology – I read and learn all the time. That’s one of the things that makes being a programmer such an amazing job. For most people, work is the same today, tomorrow, next week, next year. Over and over again, the same tasks, the same problems. Software engineering is completely different. Rarely are the problems the same from project to project. Every single day, a new problem appears for development teams to tackle. A new user experience to create. A new bug to find. But it doesn’t stop there. Technology never stands still. Technologies that appear cutting edge today will seem antiquated in a year. The libraries that make everything seem so easy this week will be cumbersome this time next year. For twenty years, I have watched new languages spawn, new paradigms of programming become popular, new technology stacks gain prominence, and new tools take the limelight. As I was writing some JavaScript code today, I learned a new way to solve a problem that repeatedly comes up in my projects. Next week, I’ll learn another novel way to solve another problem. That’s the life of a programmer – an inexorable march forward toward the ever elusive notion of being an expert. Indeed, what makes programming so fun is that, no matter how much you learn, it’s an intractable problem that beckons you back for more every single day!