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!

Enthusiastic Indies

Several times each month, someone gives me an idea for an app. Usually, it’s an app they would love to have, and so they assume there must be a market for it. These apps typically fall in niche markets. For example, I have been asked to write apps to help firefighters identify symbols on chemical trucks, to aid frequent travelers in finding radio stations matching their musical taste, or apps to help off-roaders find their way and map new trails. Each of these ideas are great, but none of them would ever generate enough money to pay for development. The problem is that developing good mobile applications typically requires a fair amount of time for any non-trivial problem. And, since most users will look for free apps instead of paying for them, there’s little income generated from an app. Of course, there are some apps that make a substantial sum of money. Well known games, for instance, can generate massive amounts of revenue for their developers – but this is an incredibly small percentage of the apps out there.

So how do all the niche market apps get out there? Often, they are done by a devoted indie developer who is passionate about solving some problem. So, they develop an app. They may spend months learning how to write an app, or they may be a programmer writing an app for one of their own hobbies. Either way, they spend countless hours writing software that will likely never generate enough money to even pay for the electricity they used to write the app.  These developers are really an unsung hero of the tech age. Developers writing code for hobby projects create not only apps we use on our phones, but also countless free applications we use online, or on our desktop machines.

It’s amazing to me the amount of free software and applications that we have available to us because of passionate indie developers out there writing code for free. Few other professions give so much back to the community!

The Cryptocurrency Elephant

For the last 6+ months, cryptocurrencies have been the news over and over again. Ranging from the highs of Bitcoin at the end of last year through hacking of cryptocurrencies during the last week; cryptocurrency news has been everywhere. But with all the buzz about cryptocurrencies, the elephant in the room seems to be completely ignored: the huge waste of energy.

During the last several decades, there have been growing concerns about climate change, global warming, green technologies, etc. Al Gore insisted that we lower our green house gasses (ironically while traveling around the world in a private jet creating more green house gasses in a year than many of us will in our lifetime). Car companies want us to use electric cars to lesson our usage of fossil fuels. Wind and solar farms are showing up all over the place to decrease the nation’s carbon footprint. We’re asked to heat our houses to 66 at night and cool them to 75 or 80 in the summer. Turn lights off when not in use, ride a bike to work, shut off your computer when not in use, don’t idle your car in the winter to warm it up, on and on the list goes. But that’s not enough – the environmentalists say – we need to stop using all the earth’s natural resources on cell phone components, batteries, etc. Use rechargeable batteries, recycle your cell phones, don’t throw computers in the trash because they contain hazardous parts.

Then, cryptocurrency hits the market. No longer do we care about energy consumption. Cryptocurrency is intentionally designed to use as much power as possible – increase the difficulty of a block and the power consumption goes up. Mining generates huge amounts of heat, and then air handling systems need to be installed to keep machines cool. Cryptocurrency is both directly and indirectly causing global warming! To make matters worse, miners spend huge sums of money buying special chips (whether video chips or specialized ASIC chips) which require more mining to retrieve the necessary minerals. From an environmental perspective, cryptocurrency may be one of the biggest disasters of the 21st century. Yet, nobody wants to talk about it. A few years ago, it was suggested that I get rid of my Dodge Ram truck because it used too much gas. Now, the world is on fire for crypto mining.

Let me be clear, I think blockchain is an amazing technology. The potential is mind boggling. However, if it continues to grow like it currently is, how will we handle the energy requirements? How will we reduce green house gasses? How will we achieve any goals that involve using less energy when cryptocurrency is based on wasting energy? I think this is a problem the cryptocurrency community needs to resolve. The technology is great, but I doubt the global community is willing to sell out the entire planet for a few bitcoin.

I’d really love to hear thoughts from the blockchain community on how this can be resolved!

GameMaker Studio 2

For the last decade, I’ve been tinkering with game development. I’ve played around with DirectX and OpenGL, and written games for Android, as well as desktop games using Java and Unity. I’ve taught students to use Scratch and to write scripts in C# for Unity. Through the years, I’ve come to really like Unity. Unity is free, can create awesome 3D games, and has a wide variety of resources available through their resource store. However, I’ve found that there are some things that Unity just doesn’t work as well for. For instance, while Unity does have 2D support, it seems like a hack to their 3D world. Platformers can be especially painful since floating platforms, for example, violate the rules of physics. And while their animation tools work very well, they can be overwhelming for the novice to use. Overall, Unity has a steep learning curve and, too many times, things that would seem simple become painfully difficult. I remember the attempts I made at creating a simple 3D racing game – wow, dealing with their car controller was a lesson in frustration. This isn’t to say that Unity isn’t a great tool, it most certainly is. It just isn’t the best fit for all games. If I wanted to create a first-person, explorable, realistic, 3D world to explore – Unity would be my first choice. But for many other games, Unity just isn’t your optimal choice.

Enter GameMaker Studio 2. I was recently contacted by a non-programmer who had been tinkering with GameMaker Studio and wanted to know if I would help him make a game. Having worked so much with Unity, I was initially hesitant to switch platforms. To make matters worse, GameMaker Studio isn’t free. So, I reluctantly downloaded the demo version and played around. Wow! What an amazing development platform! I quickly upgraded to the full version ($100) and have been loving what I can do! One of my favorite aspects of GMS2 is the ability to create and edit sprites inside the app. This may seem trivial, but I don’t always want to use Photoshop or Illustrator to create simple pieces of graphics content. Another great feature is how the project resources are automatically broken down into types – objects, sprites, audio, etc. For many junior developers, project organization is never considered. Long term, that means projects become unmanageable. The simple aspect of automatically organizing resources by type helps to keep the project clean. The GMS scripting language is based on C++, but all the ‘hard stuff’ is hidden from the programmer. No need to worry about imports, constructors, or any of the stuff that would make programming daunting to the junior developer. Individual micro-scripts are created for startup, step (each new frame of the game), or events such as button or keyboard actions. These small scripts keep code small and more easily understood. (I would image that as a project gets larger, this could be problematic. But for smaller projects, this is nice.) GMS has built-in functions to change the angle of an object, play a sound, or create labels on the screen. Built-in variables exist for an object x/y position as well as the screen dimensions. Everywhere I look, I see that the makers of GMS worked to create a platform for non-developers to create games with as little technical knowhow as possible. For me, this is particularly exciting. Why? Because many of the people who want to work on a game don’t have the technical expertise to use a more complicated development environment. But with GMS, the bar has been lowered to allow everyone the fun of developing games!

If you’re interested in trying game development, I would highly recommend Game Maker Studio 2.

Angular is Awesome

Over the last six months, I have started doing a lot of Angular development. Initially, I was less than enthusiastic about the experience, but today it is probably my favorite technology. So, what makes Angular so great?

Angular provides a clean breakup of code, HTML, and CSS. Like MVC models for desktop or web applications, the Angular model ensures a clean separation of concerns allowing web designers to write HTML code while programmers handle the underlying logic.

Angular components are modular. I love this aspect of Angular development. I can create a cool widget in one application and easily use it in another application. This kind of modular approach reduces development times and allows for plug-and-play development of applications.

Angular applications run on the client side. As servers get more and more traffic, dealing with all the page requests can become burdensome for a web server. Running as much as possible on the client side not only improves user experience by improving speed, but also reduces load on your servers.

Angular applications use AJAX. This prevents full page reloads and just changes portions of the webpage based on user interaction. It looks slicker, feels better, and allows for all kinds of cool web experiences such as filtering and sorting data in a way that feels like a desktop application.

Angular applications easily consume REST services. This makes it easy to interact with countless services – whether homegrown or provided by a third party. Typically, REST services provide data in the form of JSON objects which need no manipulation to use in an Angular app. No parsing – just consume the data. It’s easy and convenient. Likewise, when sending data to JSON-based REST services, no translation is needed – just send the native JavaScript object to the server.

Angular can be used to create mobile applications. Ionic is a commonly used framework for creating hybrid mobile applications for both iOS and Android. Ionic provides an Angular framework as well as components to create awesome mobile applications.

Angular can use countless CSS frameworks. While not specific to Angular, I feel I would be negligent to not mention the amazing variety of CSS frameworks out there that can be used by Angular to create visually appealing web apps. Materialize CSS and Bootstrap are two of my favorites, but countless other libraries can be used allowing developers to create a beautiful experience for users.

If you’re not using Angular, you’re definitely missing out!

Successful Software Projects

Throughout my career as a software engineer, I have seen projects succeed while other projects failed. Some projects are delivered on time and under-budget, others are delivered late with costs substantially more than anticipated. What determines the success or failure of a project? Two simple things make all the difference in the world: requirements gathering and feedback.

During the early phase of a project, the requirements gathered will be used to determine a project’s timeline and the corresponding budget. However, rarely are initial requirements adequate to determine much more than a high-level understanding of the application. Often, things like user management requirements, reporting requirements, security requirements, and similar tasks are glossed over even though they are essential elements. Likewise, core pieces of functionality may not be well thought out by project management. A lack of consideration for all the permutations of options that may be present and how they impact each other or the application in general serve as an example of this. In an eagerness to get the project moving forward, holes are left that must be filled in later. Unfortunately, with such incomplete data it’s impossible to determine a budget or a timeline. Nonetheless, timelines are provided based on guesses that turn out later to be way off. As the deadline approaches, developers are forced to take shortcuts that create long-term problems. This can be resolved by spending a little extra time gathering requirements early so that the true scope of an application can be determined and more accurate timeframes can be provided.

The second key to a successful project is frequent feedback.  As a project progresses, it is imperative for managers, users, and other stakeholders to have visibility into the application so that they can verify functionality, critique the user experience, and provide other necessary feedback to ensure that development teams aren’t headed in the wrong direction. While requirements gathering goes a long way to ensuring that developers go down the right path, feedback throughout the process enable problems to be addressed quickly before substantial development effort is wasted. This kind of visibility has the added benefit of allowing management to see where a project is and to begin developing advertising material or documentation.

If you want your projects to be successful, put in a little extra effort upfront to provide adequate documentation and ensure that you provide feedback to development teams throughout the process. Not only will you appreciate the effort, but your developers will too!

 

Solidity

Recently, I was contacted by a company that does cryptocurrency to write smart contracts. I’ve never done this before, but I have no problem learning a new language – particularly for a blockchain technology. So what is a smart contract? Smart contracts are an amazing technology that allows you to run code on the blockchain.  Code is written in a language called Solidity, which is similar to Java or JavaScript. Once the code is written, it’s deployed to the blockchain where it can be called by others later. It’s similar to a cloud application, except the cloud is the blockchain instead. It’s always available because there are always machines mining cryptocurrency. Many sources are exclaiming how this kind of technology will change the world, and it’s easy to see why. The ability to write contracts in code that will later be triggered will be hugely impactful to banking, insurance, and countless other fields.

So what does Solidity code look line anyway? Here’s a simple Hello World app in solidity:

pragma solidity ^0.4.24;

contract HelloWorld {
    event log_string(bytes32 log);
    
    function() public {
        emit log_string("Hello World!");
    }
}

If you’re interested in learning more about Solidity, check out the MetaMask plugin for Chrome as well as the Remix IDE and find yourself a good online video for Solidity development. I feel confident that the future holds countless opportunities for developers who master this technology!

I Need an App!

Increasingly, every organization wants their own app. For many businesses, this can be a source of increased visibility for their organization or even a channel to generate more revenue. A great example is apps by large and small businesses alike allowing users to order and pay for food and then stop by to pick it up. The business gains increased visibility with their corporate logo on the users phone, the user gains an improved user experience, and everyone wins.

Conversely, many organizations create apps just so they can say they have an app. They want increased visibility for their brand, and they imagine a benefit for the user that causes them to create an app. But does the user really benefit, or is it just a business trying to look like they’re relevant? I’ve seen some apps for businesses that aren’t worth downloading as they provide no tangible benefit. Rather than enhancing the company’s relevance, the app only creates a cheap or cheesy brand image. The organization can also appear to lack tech know-how and damage their brand.

The lesson? If your organization is creating an app, be sure to identify a tangible benefit to the user. Give the user a compelling reason to keep the app installed on their phone. Convince the user not to uninstall the app or tell others how lame it is. Don’t create an app just to say you have one. Determine how it adds value for the user – first and foremost. After all, the end-user doesn’t care how the app improves your brand or your revenue. They put it on their phone so it could benefit them!

Technologies for Kids

I am often asked by parents what tools they can put in their children’s hands to get them learning technology. Here are some of my favorites:

Scratch: Scratch is a programming tool from MIT. It’s intended to teach young people the basics of programming. Everything is done by dragging and dropping code blocks into place to create games. Scratch is so easy that I’ve even used it to teach 4-6th graders how to make simple games. One of my favorite features of Scratch is that you can see the code behind others’ games and even ‘remix’ the game to make your own variant. You can find Scratch online at scratch.mit.edu.

Raspberry Pi: The Raspberry Pi is an amazing tool. A small computer roughly the size of a credit card, it’s cheap and fun to play with. More advanced tech students can learn Linux, Python, or interact with their own custom electronics hardware. A Raspberry Pi can be purchased from Amazon or countless other vendors. Excellent kits exist for less than $100 that include the Pi, a case, a beginners guide, power supply, and electronic parts to tinker with. This is an excellent kit for a tech nerd or electronics enthusiast.

Micro:Bit: The Micro:Bit is an amazing sub-$20 hardware board that is easy to program and fun to tinker with. This platform is one of my favorites because it’s easy to work with – including a simple graphical interface to program the chip.  Not only that, it’s the only platform I’ve worked with that didn’t require any special software or drivers to get up and running. The Micro:Bit includes lights, buttons, various sensors, and even a bluetooth radio. This is a must-have for young makers.

Arduino: The Arduino board has been around for some time now. Widely used in robotics and maker projects, it is quickly becoming ubiquitous. While it’s not as easy to work with as the Micro:Bit, it’s a more appropriate for bigger projects. Arduino boards are programmed with C++, which is heavily used in lower-level hardware projects. Not only are there a variety of different Arduino boards available, but there are also Arduino clones that add additional features. One such example is the Make:Block which aims to make things simpler by creating various components that integrate with a Make:Block board through a typical phone cable.

Learning any of the above will enable your child (or you) to both have fun and learn technology!

Minimum Viable Product

An important, but often ignored, concept in the realm of software development is the notion of Minimum Viable Product. Defining a Minimum Viable Product (or MVP) provides several benefits for software development teams and companies. First, let’s define Minimum Viable Product. The MVP is simply the absolute minimum requirements for a working product. For instance, if you’re writing a calculator application for a mobile device, the MVP would simply add, subtract, multiply, and divide numbers. It would not, however, need to perform more complicated functions such as square root, exponents, trig functions, averaging, etc. These features would be added to future versions if necessary.

What makes this idea so important?  When we define the Minimum Viable Product, we can easily accomplish several things. First, when we eliminate all the fluff, we can focus on core functionality and release a product quickly. This reduces time to market and increases revenue generation from the application. Second, creating a functional application more quickly allows decision makers within the organization to rapidly determine if the software meets the necessary requirements that the product was intended to solve. This ability for management to be involved earlier in the process ensures that development resources don’t end up heading down the wrong path. Third, deploying the MVP early ensures that customers and end users can interact and provide feedback early in the process when it’s far easier (and cheaper) to change direction instead of waiting for a months or years long process.

Unfortunately, many organizations insist that every feature is essential to the application which ensures long development cycles and dramatically longer time-to-market. Meanwhile, more agile teams are capturing marketshare before you.

When thinking of a new product, software application, tool, or mobile application, the first objective is to define the MVP so that you can quickly create a prototype, verify functionality, ensure essential functionality is present, and then get your software in the hands of users. Only then do you circle back for round two where you begin to add new features by starting with the most important tasks. This process will not only improve your marketshare, but it will also help ensure that the products and services being created actually bring value instead of spending years on software projects that bring no measurable value.