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!

Value & Time

Growth

When we think about value, we think about the cost we pay for something. However, that’s a very shortsighted definition. We probably only consider cost as defining value because most of the things we buy are defined this way. For instance, when we go to a grocery store, we look at two brands of cheese, and the cheaper one is the better value. It doesn’t matter much which is the better quality cheese, it simply matters which is the cheaper cheese. As consumers, we typically only consider the cost. To me, the definition of value is far more complicated.

Buying Vacuum Cleaners

Twenty years ago, when I would buy a vacuum cleaner, I only considered cost when purchasing. The cheapest vacuum was the best value and the one I would purchase. But time and time again, I found that my value vacuum cleaner would stop working after about a year. So, I’d go back to the store and buy another one. I was paying about $100 per year to purchase vacuum cleaners. Note that now my value definition has a time element. After several years, I considered buying a Dyson vacuum cleaner. It was four times as expensive, but I had hoped it would do a better job than the $100 vacuum cleaners and that it would last longer. And today, 15 years later, I still have that same Dyson vacuum cleaner. If it were to break today, I would have spent $400 over 15 years for my vacuum. That’s a substantially better value than before!

Value of Technology

The cost of computer technology is very similar. You can buy the $300 laptop and expect to replace it next year, or you can buy a MacBook and have it for 10 years. But custom software is a little more difficult to directly compare since the price tag isn’t as clearly defined. What I’ve found is that when customers purchase consulting services or software development services based solely on the cost of those services, they often find that the price tag explodes over the lifespan of the product due to poor development. When you find the developer with the lowest cost, he probably has the least experience. He will take longer to accomplish the work since he’s bound to run into more snags than an experienced developer. He’s also likely to overlook things that a senior developer wouldn’t. These issues will result in additional costs during the lifetime of the application to fix in addition to lost time and productivity from your software users.

Conclusion

Paying for custom technology services is more like buying a vacuum than it is purchasing a block of cheese from the grocery store. The true value of those technology services will be defined not by cost alone, but by how long those services solve your technology problems.

Samsung Galaxy Watch

Galaxy Watch

Over the last several years, I have owned several smart watches. Unfortunately, I was never impressed with any of them. Early smart watches had horrible battery life. At the end of the day, it was not uncommon for my watch to have less than 20% battery  remaining. Use your watch more heavily, and you could expect to recharge mid way through the day. While early smart watches were nice toys, they lacked any real use case beyond being able to read your text messages.

How things have changed. I bought a Samsung Galaxy Watch hoping to give smart watches another try. Not only is the battery life amazing, but so are the features. At the end of the day, I typically have 70% or more battery remaining. I can now go multiple days without charging! In addition to being able to send and receive text messages, I can use my watch to make calls! The Samsung Galaxy Watch includes WiFi, NFC, optional 4G, and is even waterproof!

The Samsung Galaxy Watch is also an amazing tool for runners, hikers, bikers, and anyone who wants to keep track of their exercise or heart rate. With GPS, altimeter, barometer, step counter, and heart rate monitor, the Samsung Galaxy Watch is the perfect tool for any fitness enthusiast.

The Samsung Galaxy Watch has rewritten the book on smart watch technology. Their watch is absolutely amazing and is the first smart watch I have ever really loved.

Remote Connections

Computer on a Tree Stump

As a techie, I often need to connect to a variety of computers to accomplish my work. But as a small business owner, I enjoy the freedom to do my work from wherever I choose. How can you accomplish both? Remote connections! Through a variety of technologies, I am able to access the resources necessary to do my job from anywhere around the globe.

SSH

The simplest means to remotely connect to a computer is through Secure Shell – better known as SSH. SSH is a secure replacement for the much older (and insecure) telnet protocol. SSH uses public-key cryptography, so you can setup keys to connect to your server instead of a password. This makes connecting easier and more secure. SSH is a text-only connection type and is particularly well-suited for Linux machines. However, while SSH is a great tool for controlling a Linux server remotely, it doesn’t allow you to use resources on that server (or network) from your local machine. For example, if the remote server runs a website, you won’t be able to access that site via SSH.

SSH Tunnel

While SSH won’t allow you to access remote resources directly, you can turn options for tunneling. Tunneling will map local ports to remote ports so that your local computer can access resources on a remote computer. For example, if your remote server runs a MySQL server, you can setup an SSH tunnel to forward localhost:3306 to remotehost:3306. Then, you can setup your MySQL client to connect via your local machine. The SSH tunnel will then forward your requests to the local machine. I heavily use this technology for web sites on my development build server. For example, I run a Jenkins server on port 8080. I can SSH into my machine and create a tunnel to port 8080. This allows me to view my Jenkins web server from anywhere. I even have an Android application (JuiceSSH) that allows me to setup SSH tunneling from my phone. So, when I need to control a Jenkins build on the road, I connect via JuiceSSH and make the necessary changes.

VPN

Sometimes, a tunnel just isn’t enough. Maybe you need your computer appear to be on another network. Running my own business, I have some clients who allow me to access their systems – but they require me to connect from my office IP address. Since I like to travel – or work from home – I need a way to remotely connect to my network. A VPN is the perfect solution. I can access everything on my network, and I appear to be on that network by other systems. Unfortunately, a VPN is a little more complicated to setup. OpenVPN software is available to setup a server, but I have found it more difficult to setup than I would like. (When I did get it setup, I found it frequently locked up on my Linux server too.) So, I decided to buy a Netgear Nighthawk router. Their embedded VPN works great from Android, Mac, iOS, and Windows.

An added bonus of a VPN is that it can be used to secure your connection when you are using a public WiFi connection. Additionally, since you will appear to be at a particular IP address, you can access services that are only available from your geographical area. For example, web-based TV programs only available to users within a specific geographical area.

Conclusion

The ability to remotely access resources means you can work from any location in the world. You don’t need to be at your office. You can even access your home computer from work or from your phone. If you’re looking for an easy way to connect, look at SSH – it’s a simple and very effective way to access remote computers!

Development Environments

Workbench

As a developer, it’s a great time to be alive. We have countless options for development languages and frameworks. But, sadly, many of them leave much to be desired in terms of tools and environments.

The Model Environment

As a veteran Java developer, I’ve been spoiled with excellent tools. We have numerous IDEs including Eclipse, NetBeans, and IntelliJ. Everyone has their preference, but all three are excellent. Likewise, we have numerous build and dependency management packages such as Maven and Gradle. We have test frameworks, automation frameworks, debuggers, profilers, and anything else you could want to engineer even the most complex of application. In short, Java provides the best development environment there is. Seriously. Few languages have IDEs as good as what Java has. Even fewer have tools that can complete with Maven or Gradle.

When Will Other Languages Catch Up?

I continue to see how Python is displacing other languages. But when will it catch up to Java in terms of development environment? Are there any IDEs that complete with Eclipse for Python? (NOTE: Eclipse can actually be used for Python, but it always seemed to me more of a hack than a real Python IDE) How about debuggers? Go ahead and try debugging Python or JavaScript code and you’ll quickly see how far behind Java they are. Not to mention dealing with libraries and environments!

A Call to Action

As we continue to shift to newer languages, I’m concerned that the next generation of developers will actually have a more difficult time than we do today. Why, as a development community, are we only focused on creating new languages but not on creating solid environments? How are Go, Python, Rust, and the myriad of other languages ever supposed to achieve the same widespread adoption of Java if we never had the rest of the tools we need to get the job done? I want to enjoy the benefits of some of the newer languages to come along. But, until they can complete with Java, I’m unable to stake the success of my customers on them.

Fit for Sale

Sales

As an app developer, I am often approached by friends and acquaintances with “great” app ideas. They believe their idea is worth millions and that I should drop everything and develop their app. Businesses too fall prey to the idea that “I need an app“. Either way, it’s imperative that adequate market research be performed prior to developing any piece of software. 

A Great Idea

A few years ago, I was approached by an individual who had a “great idea” for a software application that was going to revolutionize the industry. He had some startup money to develop the application, and was in a hurry to get started. He contacted me to write him a mobile application, cloud-based management system, and REST services for integration points. It was an ambitious project for the client, and I was excited to start developing. He provided the requirements to me, and I wrote the software. I provided feedback to improve the application, but it was ultimately the customer’s decision what he wanted to include or not include.

Poor Market Research

Unfortunately, as the project moved forward, I learned that the client had very little money for development. None-the-less, we worked to create a working product which we achieved on his budget. But, as he would learn during the next month, he was creating an application that nobody actually wanted. Not only did his application lack features that would be necessary for adoption, it served only a very small niche market. The customer assumed he knew what people wanted, and had never bothered to reach out to any prospective clients for feedback.

Consequences

Due to the customer’s poor market research, he was unable to find clients interested in his software application. Months went by with very few interested parties, and nobody ultimately purchased the software service. Consequently, the customer blamed me for writing an application that nobody wanted. He even fought me on payment because he was unable to make his money back through sales.

Lessons Learned

There are several important lessons to be learned from this experience. First, if you’re paying someone to write you software or create any other work for you, make sure it’s worth the cost. It’s your job as the customer to know what you are purchasing and to ensure that it will meet your business objectives. As a software consulting firm, I can provide you with information and develop software. However, I can’t tell you wether or not your application will be a success. Second, market research is of paramount importance for any project. If you don’t know the target market, the demographics, the estimated number of consumers, and other key data; you can’t determine financial viability of the project. Before you go into any project, do your part first and ensure that the work you are paying for will take you where you’re trying to go!

Classic Hacking

Security

I’ve been involved with technology since the mid 90’s. During the late 90’s, I worked on Unix systems. It was those experiences that lead me to love Linux, taught me to program in C, and helped me learn to automate tasks using various scripting languages. But the 90’s were a much different time for security. Nobody really worried much about hackers or social engineering. And now, over 20 years later, I see people in the workforce that have been robbed of some of the fun I had in the past due to increased security on machines. Of course, increased security is good, I’m not going to argue otherwise. But it has also made a lot of the ‘fun’ from the past no longer possible.

Remote Display

When I was working on old Unix systems, one of my favorite hacks was to set my display to another computer. Since Unix display works as a client/server model, you can actually set your app to appear on any computer monitor you want. So, it was common where I worked to find the most horrible graphic you could and display it on someone else’s machine. Always a good laugh. Other tricks would allow you to play audio on their speakers (great when the individual has fallen asleep at their desk) or turn their keyboard buttons on and off.

Password Files

Long before the /etc/shadow file, passwords were stored in the /etc/password file. And, since the file was readable by anyone, you could easily grab the entire password list and run it through a tool like John the Ripper. Even more fun, commands like ‘ypcat’ would allow you to get the passwords of all users on the network even if they weren’t on the local machine.

Email Overflow

My sister’s first experience with the internet was through a device called “WebTV”. This device was a small terminal that would turn your TV into an internet terminal. It was a cheap, easy alternative to a computer. It also suffered from a pretty simple flaw – you could only have a limited number of emails. (200, I believe.) I found an unsecured email relay – pretty common in the 90’s – and spammed my sister with enough messages to flush out all her email. As you might guess, she was mad.

A New World

How things have changed. Unsecured email servers are much more difficult to find, and Unix is now much harder to hack out-of-the-box. While most of the hacks of twenty years ago were mischievous in nature, today’s hackers are far more sinister. And, thankfully, the world has adapted to become a safer place. Nonetheless, I still look back to the simpler days of computing and the fun we had.

Payment Terms

Money

Recently, a fellow small business owner asked me how I handle billing. For a small business, money is often one of the biggest concerns. Without a steady flow of cash, you can’t meet your business objectives or your personal financial requirements. As a small business, you have to determine when to bill and how to bill. Even worse, you have to define how you deal with delinquent payments – which can kill your business.

When To Start Billing?

The first question to answer is when do you start billing? This is particularly true if you’re billing by the hour. Does the clock start ticking at your first meeting? After the project requirements are defined? After the project is complete? For my business, anything after the initial project meeting is billed to the customer. I think it’s important for a customer to understand that project planning, requirements gathering, and any other tasks completed before any actual code is developed is an integral part of the development lifecycle. I typically bill the first of the month after any billable hours have accrued. I’ve found that the longer you wait, the more the bill increases. Then, you risk the customer suffering from sticker shock when you finally send the bill after months of work.

Late Payments?

When I started my business, I was so pleased to have customers that I didn’t worry about late payments. I assumed that my customers respected me enough to pay me on time. I was incredibly wrong. What I’ve found instead is that many companies will put me at the bottom of the list of payees. Why is that? Well, I think it’s pretty simple. The customer knows they have to pay their lease on time or risk eviction. They know when they fail to pay their internet bill, they won’t be able to perform their mission. What happens when they don’t pay you? Likely nothing. Additionally, they know you don’t have a collections branch and are unlikely to use a collections agent. Thus, they have absolutely no reason to worry about when they pay you. I have learned to include verbiage in my contracts defining payment terms. I give customers a 5 day grace period, and after that the customer is charged a late fee. Additionally, all the customer’s projects are paused until payment is received. If you continue to work, you end up months behind on payment and continuing to work for free.

What About Equity?

I’ve had many ‘customers’ offer to pay me in equity. I do the work and they will give me a percentage of the revenue generated by the software. I have a very simple answer for this kind of relationship. No. While an individual may think that their idea will generate millions, they rarely do. Even worse, you’ve now wasted time developing software that you will never be paid for. The original ‘customer’ lost nothing. You lost countless billable hours to a project that will never be profitable.

Conclusion

Money is the lifeblood of any business. What I’ve learned is that it’s imperative to have clearly defined payment terms and procedures for your business. When you fail to make those terms clear to customers, you will quickly find that your business struggles to get by and that you are spending more time nagging customers to pay than you do performing your business’s objectives.

Surface Pro 6

As a developer, I tend to need a lot of hard drive space for projects and tools. As such, my MacBook Pro was starting to run out of drive space. This was only exacerbated by the fact that I was also running Windows 10 on the same machine for .NET projects. I decided it was time to replace my MacBook Pro, and looked at the newest product line. Unfortunately, I was very disappointed by the lack of ports on the new MacBook Pro. With a sticker price of nearly $4,000 for a machine with all the bells and whistles, the lack of ports is simply unacceptable.

What to Do?

After much deliberation, I decided to get a separate Windows machine and reclaim the space on my MacBook Pro for MacOS. I had been looking at the Surface Pro for a while as it looks like a great machine. So I went to the store and purchased the computer, a keyboard, and the pen for around $1000. Given a price tag one fourth that of a new MacBook Pro, how does it compare? So far, I am very impressed. The Surface Pro includes numerous features that the MacBook Pro can’t touch including: facial recognition for login, touch screen, functionality as both a tablet and a laptop, and he use of an optional pen for drawing.

Conclusion

While the Surface Pro does not compete with a top-of-the-line MacBook Pro in terms of raw horsepower, it is lightweight, multipurpose, and more than adequate for the occasional .NET project I need to support. Even more exciting, it will work far better than my MacBook Pro for taking onsite to gather customer requirements or take quick notes.

Note to Apple

Apple, your decision to remove standard USB from your laptop cost you $4,000 I would have gladly paid. Instead, I paid $1,000 to buy a laptop from your competitor. While you may think you’re a trendsetter, a large number of developers I’ve spoken with are less excited by your choice. For us, computers are a tool to solve a problem – not a trendy accessory. You managed to capture a growing portion of developers, but focusing on trends instead of solutions will negatively impact that growth in the future.

MacBook Pro?

I’ve been a Mac user for several years now. I have a MacBook Pro (2015) and a MacBook Air. I love them both. They are amazing machines. From battery live to performance and every aspect in between, Mac laptops are awesome. What makes the MacBook Pro so great for me is how well it’s positioned as a development machine. Lots of ram, high-quality graphics, fast, Linux compatible backend (BSD), and ports for everything I need. When I visit a client who wants to see what I’ve been working on, I connect a HDMI cable to my MacBook Pro and walk through the progress. If a customer asks me to add new photos to their website, I insert their SD card into my computer and grab the images. When I want to connect with a peripheral – such as a barcode scanner or a mouse – I use my USB. If I am working with Arduino, MicroBit, or a PyBoard, I connect a standard MicroUSB cable to my machine.

Time To Upgrade!

Now, after years on my current MacBook Pro, it’s time to upgrade. I need more hard drive space for all my projects, and I’d like more memory for using virtual machines. Of course, I want another MacBook Pro. Unfortunately the new machines seem far less developer friendly. Why? Because they ONLY have USB-C ports. No HDMI, no headphone jack, no Thunderbolt, no USB-A, no SD Card reader. If I want any of the above, I need to by a converter to connect to my USB-C port. So, when I go onsite, I will now need a laptop and a bag of spare cables to connect to what I need to use. What a horrible user experience! As a laptop user, my objective is to carry around as little as possible. Apple, why did you do this? Why did you destroy a machine that was excellent for development by removing all the ports that made it so useful?

What to Do?

I’ve been pondering for the last few weeks what to do. Do I buy the MacBook Pro along with all necessary accessories to achieve what I need, or do I buy a Windows laptop (for half the cost) that already contains all the things I want? Unfortunately, I like MacOS (specifically the command prompt and dev tools) too much to go back to Windows. So, I’m stuck paying top dollar for a machine that is severely lacking in its ability to perform many of the very things I buy a laptop to do.