New Language Shortcomings

During the last 20 years, a huge number of new programming languages have been developed. In general, new languages have evolved to address the perceived shortcomings of older languages. Unfortunately, these languages may not always live up to the hype. Furthermore, new language ‘features’ may actually end up creating more complicated and unreadable code. I have previously written about the importance of simple code as well as the trap of “time saving” frameworks. However, not all new languages follow these ideals.

Recently, I have started learning Kotlin. Kotlin is a JVM language which is increasingly used for Android development. Thanks to a variety of improvements, Kotlin code can do more work with less code. However, this isn’t always a good thing. For example, Kotlin generates a significant amount of code behind the scenes. While this does reduce the burden to developers, it does not guarantee that the desired code will actually perform the necessary function. In fact, I have often found that the most difficult bugs to find are those generated by code under the hood. For example, I remember using Hibernate in the 2000’s to connect Java to the database. In 99% of my use cases, Hibernate performed incredibly well and saved significant time. However, the 1% of cases where the SQL generated by Hibernate didn’t perform properly required enough research and work to remove any possible time savings to the developer.

Another example with Kotlin, and a large number of newer languages, is the lack of requirements to actually define variables and return types for functions. While this may save time, it means that future developers will be forced to read the code more closely to determine its meaning. Likewise, the growing use of lambda functions – while incredibly useful in a broad assortment of situations – is beginning to create code that is nothing but extended sequences of lambda functions with no obvious intent. In both instances, I prefer verbose code that can be easily understood by future developers with far less chance for misunderstandings.

While many of these newer languages have some amazing features, few have actually captured much market share. Maybe it’s because of the glut of languages on the market now, or maybe it’s because developers have found these ‘improved’ languages actually cause more problems than they solve. For me, I will continue to write code with the hope that junior developers will not be wowed by my wizardry, but rather that they will be able to understand my code without any ambiguity.

Mature Frameworks

As a seasoned software developer, one of the things I most value is mature frameworks. By mature, I don’t necessarily mean old. Rather, I mean a framework that will still be useful tomorrow. Furthermore, that framework should have documentation that will help me today and still be relevant in the future.

Languages like C, C++, and Java provide these frameworks. While Java has had a number of revisions since it was created, code from the 20 years ago will run just as well as modern code. While it may not take advantage of newer features, it is no less viable. Furthermore, books on Java development from 15 years ago can still provide new developers with instruction on programming. In fact, the only part of Java that has really been significantly obsoleted is the windowing frameworks. Likewise, C and C++ code from the 90’s will still run well today, with some minor tweaking.

On the flip side of the spectrum lie the various Javascript frameworks. While Javascript has been around since the beginning of the internet, it seems that frameworks are constantly evolving. Consider the Angular framework. I recently was asked to update an application written in Angular just a few years ago. However, I quickly learned that all of the APIs were now obsolete. For example, the HTTP client had been obsoleted and other libraries wanted to use Observables instead of Promises. To make matters worse, the entire Firebase API was virtually scrapped in favor of an entirely new API.

What makes these changes even more difficult for developers is that the documentation is often poor or non-existent. For example, I attempted to run the newest Firebase API tutorial from Google only to learn that none of the code would compile with the newest libraries. I had to spend an hour looking for a more recent code sample. Try to find a current book on the Angular framework and you will quickly see the challenge.

Unfortunately, this seems to be the status par for Javascript frameworks. Each one has numerous changes and little documentation or training materials for developers. Yet, we continue to use these frameworks. Why? Because Javascript is the defect standard for web development. You have no other choice! If you did, you would certainly use a mature framework that would still compile tomorrow!

Custom Software – A Case Study

Custom Software

I recently contracted the services of a company to help me become a GSA contractor. While the company is working on submitting my paperwork, they have encouraged me to start reaching out to potential government clients. To help me find those clients, the company offered me thirty days of access to their website that shows all federal and state opportunities as well as providing search functionality and email notifications. However, after the thirty day trial, the price of accessing their site is $200 / month or $2,000 / year.

The Problem

While the company strongly encouraged me to purchase their services, I am always skeptical of paying for things I don’t need. As a business owner, wasted money comes directly out of my pocket. So, instead of paying for their services, I decided to examine alternatives. First, I found that much of the functionality was already available on the governments System for Awards Management (SAM). Second, I found that registered users of SAM can request an API key to develop their own software.

Developing a Custom Solution

Given that all I wanted was a simple app to display matching opportunities, I requested an API key and started development. To begin, I had a junior developer create an Angular web app. In order to access the SAM API, I created simple Node-based REST service. Next, I updated the Angular app to function as a PWA so that I can install it on my phone.

Outcome

Now, after less than 4 hours of development, I have an app on my cell phone to display opportunities matching my criteria. Or, I can access the site from my computer and go directly to SAM if I want more information. While there are many upgrades I could make in the future, the cost of developing my own custom software was substantially less than paying a third-party to use their service and delivered exactly what I needed.

Advice to Businesses

Today, a significant number of businesses offer Software-as-a-Service. While this model is great for the software provider, it may be less optimal for the consumer. Over time, the total cost of SaaS continues to rise for the consumer while the benefit remains largely the same. However, custom software allows for ownership of the application without a growing price tag. Furthermore custom software can address issues unique to the customer which may not be addressed by a Commercial Off-the-Shelf system.

In order to make the best decision for your business, consider the monthly cost of the application over a several year period. Then, consider the cost of lost productivity due to missing functionality. Once those costs are totaled, find out the cost of developing custom software to meet what you actually need. If the cost of custom development is less than the commercial solution, consider creating your own application.

Apple vs Android – A Developer’s Perspective

While most applications are developed for both iPhone and Android systems, new developers are faced with the choice of which platform to learn. While both Android and iPhone systems offer excellent apps as well as a variety of sizes, they differ considerably from a developer perspective.

Android Development

For the novice, Android development is probably the easier entry point. For starters, low end Android phones are cheaper to purchase than iPhones. But more importantly, Android developers can use Windows, Linux, or Mac machines for development. So, if you have a computer and an Android phone, you can get started right away.

The language used on Android phones is Java or Kotlin. While Kotlin is the newer language, more resources on Java development are available to get started. Furthermore, once you learn Java, you will find other development opportunities open up to you – such as backend services using frameworks such as Spring Boot.

Once you have learned how to program Android phones, you will find that other devices use Android as well. This includes Virtual Reality hardware such as Oculus, Augmented Reality glasses from vendors like Vuzix, and smart watches.

Publishing to Google is relatively simple too. Once you pay a one-time fee, you are a licensed developer and can create and deploy applications to the Google Play store. While there is some over sight from Google, it is less burdensome than Apple’s requirements.

iPhone Development

iPhone development is a little more complicated. For starters, you will need a Mac machine as the tools for iPhone development do not run under Windows or Linux. Furthermore, both Apple computers and iPhones tend to be more expensive for a small development setup.

While Android’s Java language is used everywhere, the iPhone’s Swift language is far more limited. In fact, Swift isn’t used outside of the Apple ecosystem. So, if you chose to develop other services to integrate with your phone, you will need to learn an additional language.

Unlike Android, few devices run iOS. Thus, your skills on iPhone development will not translate to the ability to program other devices aside from the Apple Watch.

Finally, Apple’s App Store is far more expensive and burdensome than the Google Play Store. For starters, Apple requires developers to pay an annual license fee – which is more expensive than Google’s one-time license cost. Furthermore, the Apple Store is much more strict with requirements for apps and provides significantly more oversight on the app market.

Conclusion

While I think both the Apple and Android phones are excellent, I personally find the Android developer experience to be more positive. This is particularly true for the indie developer or individual looking to learn mobile development.

MATLAB

Code

Running my own software company, I run into people trying to solve all kinds of different problems with software. As such, I end up using a variety of different technologies, languages, platforms, and frameworks. Recently, a client project required me to download MATLAB in order to experiment with several existing toolkits needed for the R&D phase of the project. The first thing I noticed was the price tag. Today, the overwhelming majority of development environments are free. However, MATLAB carries a hefty price tag of $800/year for commercial customers. After installing the application, I found out that the plugins (called toolboxes) averaged an additional $500/year. All told, this development environment was going to cost me around $3000/year after all necessary plugins were purchased.

Is It Worth It?

Seeing that MATLAB is so expensive, and so highly regarded by many in the research and academic community, I assumed that the MATLAB user experience was going to be epic! How wrong I was. The code I was examining contained dozens of files across numerous folders. Of course, this isn’t abnormal for any large project and I expect any decent IDE to be able to handle it. Any IDE except MATLAB. Need to find where a function is defined? Don’t expect any tools in MATLAB to accomplish that! Of course, you can do a find in files for all references of a string, but that’s not particularly helpful when a function is called dozens of times or has a short name. How about displaying a call hierarchy so that you can see where functions are being called? Nope – that’s not possible either. Ever aspect of the IDE proved to be well below what was commonly available in other IDEs.

If you’re not intersected in the user experience, I guess MATLAB is great. Apparently, its ability to perform all kinds of mathematical wizardry is beyond compare. It’s great for solving linear algebra problems and other advanced math tasks. Unfortunately, I wasn’t interested in that.

Open Source Code

I managed to find several open source projects and toolboxes for MATLAB. I was interested in understanding how these particular toolboxes work, so I started examining the code. MATLAB, like so many other languages, is a weakly-typed language. While weakly-typed languages do offer many benefits, readability is rarely one of them. MATLAB also does not require variables to be defined before use. This can be very difficult to follow particularly when the bulk of the code I saw contained neither useful variable names nor adequate comments to understand what’s going on. Very typical of people without a development background.

Conclusion

I was very disappointed with everything I saw in the MATLAB community. I assume most of the users are mathematicians and have no idea the kinds of features that are available in modern environments, so they have no idea what they’re missing. Likewise, I assume they’re used to digging through poorly documented code with variable names like g, f, c, and y. For me as a developer, this is neither acceptable nor maintainable long-term. For number crunching, I much prefer R. It may not have the most advanced IDE, but it doesn’t set me back anything either!

Debugging & Maintenance

Debugging

Long after the initial fun of developing an application comes years of debugging and maintenance. Yet, many languages and developers fail to make choices that will ensure that future maintenance will be possible. Then, when problems occur, substantial time and effort is spent trying to resolve the issue.

Current Trends

It seems that right now, a growing number of developers and development teams are transitioning to languages like Python and Javascript. Both of these languages can do great things. Unfortunately, they both suffer from the same problem – they are incredibly hard to debug and maintain. Why is that? Python and Javascript are both weakly typed scripting languages. What does that mean? In short, it means that the programmer can be lazy about how they define things and let the computer do all the work. Unfortunately, it also means an increased risk of runtime errors and greater difficulty in finding problems.

Magic Frameworks

This is exacerbated by magic frameworks. Everyone loves Ruby on Rails and Django. But both become a nightmare to debug very quickly. Need to change something from the framework? Great – your hack will be the source of nightmares when you leave. While these frameworks may simplify our lives in the short term by providing a quicker time-to-market, in the long-term they are more difficult to maintain.

How Can We Fix This?

Unfortunately, I have rarely seen well documented Python or JavaScript code. Typically, users write code and forget about it. Online videos and tutorials rarely stress the importance of comments and documentation. Thus, we end up with fragile code nobody understands. As a developer community, we need to do a better job of passing on our knowledge of code to the next developer. This means comments, readme files, and other documentation. If you write software using weakly-typed scripting languages, you owe it to those who will debug your code later to put in the extra effort!

Agile Pricing?

Today, agile software development is the standard project management model. In many ways, it’s an excellent model. It allows for rapid changes to meet business needs, helps ensure quality throughout the process, and ensures that stakeholders have maximum visibility. But there’s one big problem…

How Do You Price Agile Projects?

Since Agile projects requirements are continually refined during the project, how do we know the amount of work to be done? How can we define a timeframe for development if we don’t have a clear picture of requirements? How can I tell you the cost when I don’t even know exactly what you want to do? Certainly I can provide an estimate based on the high-level definition of the project. But agile makes scope creep easy. New requirements can be added or old requirements removed. This means my best estimate may be wildly inaccurate.

How Can Developers Learn to Estimate Projects?

Making things more difficult, developers who have only ever worked in an agile environment will have difficulty estimating project workload. Why? Because they have never had to. Agile is so focused on the now that no attention is ever paid to the larger work of the project.

Future of Agile

The more agile work I do, the more I have mixed feelings about the process. While it allows greater management input throughout development, it suffers from a variety of problems. Sometimes, I even refer to it as (Fr)agile Development. This is just another issue to add to the list. My hope is that the software industry finds a better way to manage development that solves the problems with Agile while still providing all the positive aspects.

A Programmer’s Purpose

Today, it’s becoming increasingly popular for programers to be ‘opinionated’. In the software world, to be ‘opinionated’ means to believe your way is the right way. Other ways are wrong, and your way is right. There’s nothing wrong with having a preference, but the truth is that there is little room for opinion in software engineering. Software projects need to meet requirements such as budget, programmers available for maintenance, stability, etc. Championing a new language or framework may be fun, but when you leave, are there other developers available to support the project? Even if your preferred framework is better, it’s of no concern to a client when the language dies for lack of users and they have to pay to have the application rewritten.

A computer science student I know is all about Julia. Honestly, I’ve never met a single Julia developer or even seen a line of code in that language. On the list of popular languages, it’s not even a blip on the radar. However, this student insists that Julia is the way of the future. I’m not sure where he’s hoping to find work, but it won’t be in the local area. I remember the same thing when Scala came out. Every video I saw spent half their time attacking Java development. As above, I know absolutely no projects written Scala nor do I know any local companies either using it or planning to.

How should we select frameworks and languages?

The answer is actually pretty simple. Commercial software development has one purpose – to support some business use case. As such, frameworks must be chosen to support commercial business. What things make a language or framework commercially viable? It should be stable, have tools available to support commercial usage, and be widely used such that new developers can easily be found in the future. Additionally, it should have adequate resources available to help when you get stuck.

Commercial application development is no place for experimenting with new frameworks or basing your decision on an opinion about what is better. Find commercially viable frameworks and save yourself the hassle of supporting your new framework that may be dead in a year.  A programmer’s purpose it to write commercially viable software – period.

Microsoft AppCenter

Several years ago, I needed to find a way to distribute mobile applications to test users. Ideally, the solution should allow for anyone to access the test application. This would include internal users as well as key stakeholders within the client organization. The distribution channel should support Android apps as well as iOS and, optimally, any other application type I would like to deploy. After searching, I found HockeyApp. What an amazing tool HockeyApp was. Not only did it meet those requirements, but it also allowed for integration of their API to include advanced features. For years, I used HockeyApp without issue. Apps are built by my automated build platform, pushed to HockeyApp, and users are notified of new test versions.

Fast forward to today, and HockeyApp is now owned by Microsoft and being moved to AppCenter. To be honest, I’ve never been much of a Microsoft fan. I could point to countless reasons such as lack of good native development tools, poor support for scripting or automation, their hatred of Linux (even calling a cancer), Internet Explorer which worked differently from every other browser for developers, and now I can add their horrible transition to AppCenter to the list.

Today, I received a notification from Google that one of my apps was removed from the store. It appears to be a mistake on their end, but I need to verify and respond to Google. So, I uninstall the copy of the app from my phone and go to AppCenter to download the app onto my phone. The first thing I notice is that I have multiple copies of the app but none of them are tagged with the appropriate build type. I can’t tell free version from paid version or beta version or anything else – just a bunch of apps with the same name. After clicking on the individual versions, I find out that none of them are available for me to download. After digging around, it appears I need to release the app to a distribution group. It had been setup properly for years, but now it’s broken. So, I go to the website to check the distribution groups. Guess what? There is no way to change them in AppCenter. I can see that I have a few groups, but I can’t even tell who is in them. So, to fix the problem, I will need to go to every single app I have (a total of 28), add them to a new distribution group (with unknown members), and rerelease them (generating 28 emails to each member of an unknown distribution group). What a horrible experience for both me and my team members. As a small business owner, I don’t have the time to waste to make all the necessary changes, updates, reconfiguration of continuous development pipelines, etc. What an absolute nightmare.

Maybe my experience will be better once I get everything transitioned to AppCenter. Perhaps these are just short-term growing pains. Regardless, this is just another example of why developers have always been skeptical of Microsoft – and another reason I’m glad I use Bitbucket instead of GitHub.

Definition of Done

A few years ago, when the company I worked for at the time switched to agile development, I remember my boss saying how important it was to define ‘done’. I thought that sounded silly. Don’t we all know what done means? Do we really have to define it for the team? But as we discussed the idea, I realized it wasn’t as strange a question as it sounds. For instance, if I ask my wife if she’s done with the laundry, she might say she is. So, I assume that I can go to the closet and grab my favorite shirt. However, when I get there and don’t see it, I’m frustrated. Why did my wife tell me the laundry was done when it clearly wasn’t? Obviously, she and I had defined ‘done’ differently. To me, it means washed, folded, and put away. To my wife, it simply meant washed. We had both defined ‘done’ using a different criteria.

This same thing happens in software development. When we talk about software being done, we may mean that the development has been completed or that it’s been tested. Or, maybe we mean that it’s been deployed to a staging server or that it’s been through User Acceptance Testing. Maybe we mean that the source has been checked in to a branch or that it’s been merged to master. All of these things represent a drastically different definition of done.

As a customer of software services, you need to be able to define what you mean by done. If you don’t, you run the risk that your development team does not perform to your expectations since you were both defining the endgame differently.