Life’s Not Fair

When my daughter was young, she once complained to me about how one of my decisions wasn’t fair. I don’t remember what she asked for anymore, but I do remember my response. I told my daughter she should be thankful that life isn’t fair. Look around the world today and you see children starving in underdeveloped parts of the world, people being oppressed by cruel leaders, people suffering from lifelong disabilities, and all kinds of other suffering. Yet here, in America, we enjoy an incredibly high standard of living. Few of us die of starvation, we have a democratically elected system of government, and we have some of the best healthcare services in the world. I am thankful every single day that I have been blessed so greatly.

How does this apply to technology and business? As I run my business, I see how fortunate I am. I see that I am well paid, that I have freedom to enjoy life, and that I am the master of my own destiny. As I look around, I see that few others have that freedom. Even among the greatest nation on earth, I am among the most fortunate of people. As such, I have a moral obligation to make the world around me a better place. I am compelled to improve the community I live in, to better the lives of those around me, and to work to empower those I work with. I’m thankful life isn’t fair because it gives me an opportunity to make the world a better place. It gives my life purpose and meaning.

Making the world a better place should be part of the mission of every company out there. Is your business empowering employees? Are you making your community a better place to live? Are you serving more than your own pecuniary interest? Can you sleep at night with the decisions that you and your business make on a daily basis?

When we all work together, we can make the world a fairer place for all. We can work to ameliorate suffering and starvation. We can improve healthcare around the globe. Maybe, someday, the world will be a fairer place. Until then, each one of us – business and individual alike – has work to do.

Great Minds

It’s often said that “great minds think alike.” It sounds great, in theory. But is it really true? Just because I’m thinking the same thing someone else is, does that really mean we’re both great minds? I hardly think so. It’s not the employee who thinks the same as everyone else that brings value to the team, it’s the free thinker who has a different perspective. In the boardroom, when everyone thinks the same, we call it groupthink. Psychology Today says “In a groupthink situation, group members refrain from expressing doubts, judgments or disagreement with the consensus and ignore any ethical or moral consequences of any group decision that furthers their cause.” This hardly seems beneficial to the team. When I think of great minds, I think of the men and women who engaged in thought well outside the mainstream – brilliant men like Isaac Newton, Albert Einstein, Stephen Hawking, and Benjamin Franklin. If you want to be a great mind, think for yourself! Don’t let the people around you define your thought. Be willing to take risks and think outside the box. It’s those people who history remembers – not the people who think like everyone else.

Language Popularity

A subject that repeatedly comes up on websites, blogs, and conversations is which language is the most popular and which ones are the best to learn for future job opportunities. I keep an eye on this list myself as it’s important to understand trends within the software industry. However, people seem to ignore the most important aspect of language popularity – the context.

What do I mean by context? I mean we have to look deeper to understand why a language is as popular as it is. We also need to understand the market for a language and how that impacts popularity. For example, JavaScript is always near the top on any language popularity chart. Is it any coincidence that JavaScript is also the only front-end scripting language in use today? Whether or not you like JavaScript is utterly inconsequential. If you want a website with any manner of front-end scripting, you will use JavaScript. Likewise, if you want to interact with a database you use SQL and if you want a web page, it will be HTML. As such, these technologies will always rank more highly than those with a smaller market.

So what about Python? Everywhere you look, you see that Python is at the top of the list. Should we all switch to Python? Not really. What all those rankings fail to point out is the user base for Python. Certainly there are all kinds of production projects out there running Python. But if you look around, you see that Python’s popularity is largely caused by people outside the traditional developer community. AI researchers, academics, data scientists, system administrators, makers, etc. For non-programmers, Python is easy and incredibly powerful. But that hardly makes Python superior to other languages nor does it suggest that professional programmers should start porting their eCommerce sites.

Remember, while rankings of popularity may help you see trends, look to the underlying reasons. Why is it popular? Who is it popular with? Does this language look poised to overtake in other realms? When picking a language for a problem, the most important question is which language solves the problem best – not which language is the most popular.

Angular & MaterializeCSS

During the last year, I’ve developed numerous websites and mobile applications using the Angular framework. I’ve used numerous CSS frameworks as well such as Bootstrap, Ratchet, and Topcoat. But recently, a customer asked me to use MaterializeCSS. MaterializeCSS is a library of CSS and JavaScript code to easily create a material design experience for web applications. It’s quick, easy, and visually appealing. Unfortunately, getting some of the components to work with Angular proved difficult as the online documentation does not show how to setup Materialize for Angular. While most of the components do not require any JavaScript interaction by the developer, some components (such as select option lists or tabs) require initialization. The documentation says that tabs can be initialized by using:

var instance = M.Tabs.init(el, options);

Unfortunately, this won’t work in Angular as you’ll get numerous errors regarding undeclared variables. How can you hook this up properly?

First, declare the ‘M’ variable inside the page component below the imports. This will allow you to use the ‘M’ interface to MaterializeCSS from within your Angular code.

declare var M: any;

Next, get a reference to the object you are trying to interact with. This can be obtained by using a querySelector for the class of object you’re trying to initialize. For instance, tabs will be declared in HTML by assigning a class=”tabs” attribute to object. Once you have the object, you can initialize it by calling the appropriate method. This should all happen on the init method of your page object.

ngOnInit() {
  const elem = document.querySelector('.tabs');
  const options= {};
  M.Tabs.init(elem, options);
}

This is identical for any other object that requires MaterializeCSS initialization and can also be used to call any other functions in the MaterializeCSS framework.

With this information, you should be able to enjoy the benefits of Angular as well as the awesome UI elements of MaterializeCSS to their fullest!

AI Resources

Today, there are countless AI products and resources available for the developer. I’d like to review a few of the resources I’ve used.

AIFH

The first resource on my list is AI For Humans (AIFH) by Jeff Heaton. Of all the books on programming artificial intelligence, his books are by far the best. Written without any heavy math, Jeff’s books explain just about everything you could want to know about artificial intelligence. Additionally, Jeff has his own framework called ENCOG which can be used in Java, or can be run as a standalone GUI for development. Of all the resources I’ve used to date, this is without hesitation the best.

AWS DeepLens

I was recently sent an AWS DeepLens by a client for an artificial intelligence project. It’s always exciting to receive hardware from a client, so I was certainly looking forward to this! Unfortunately, my experience with it has been a bit less exciting. For starters, I’m stuck trying to figure out what exactly the purpose of this box is. Am I to use this to learn artificial intelligence? Is this box intended to be embedded within a product? I have absolutely no idea. While the DeepLens is a neat toy, the setup is far from simple. An internet connection to AWS is needed, certificates need installed on your machine, and everything is configured through your Amazon account. Even worse, the service does not appear to be free. (Note, you do get one free year on AWS, but after that you pay for the service. After that, I have no idea what it costs to run the DeepLens, but I’ve noticed warnings about costs associated with some actions). I applaud Amazon for trying to bring deep learning to the masses, but I think this product is a dud.

DL4J

DeepLearning4Java (DL4J) is a Java library for deep learning AI. Written by SkyMind, DL4J is one of the most well-known AI libraries for Java. With the earlier versions of DL4J, the user would have to install various native libraries such as ND4J (N-Dimensional Arrays 4 Java). This proved to be more difficult than it sounds as various libraries were dependent on other libraries, documentation was scarce, and error messages were cryptic at best. Fortunately, with the 1.X version of DL4J, the install process is streamlined to sampling cloning a repository and running a maven build. Native libraries are managed within the maven build, saving users the trouble from earlier versions. With these changes, DL4J is an excellent framework I would recommend for any AI project.

Killer Robots

During the last year, countless tech leaders have talked about the danger that artificial intelligence could pose in the future. Like most people, I laughed at them. After all, do I really think that The Terminator or The Matrix were prophetic? Hardly. But the more I read and the more I pondered it myself, the more concerned I became. Now, I wonder if there’s any way to prevent it from happening at all.

Is it really reasonable to think AI could take over the world? Do we really think code will be so poorly written and that software testers will be so incompetent as to let AI robots kill humanity? Unfortunately, I do. Not intentionally, of course, but bad code that wasn’t properly tested will make it into the wild on robots. Consider all the system updates that have been performed on your computer or your cell phone. Think about all the app updates that happen every single day. Consider all the one star reviews for apps on the mobile stores. AI will be no different.

Consider all the potential causes of AI issues. Developer errors, inadequate testing, corporate release requirements, poorly defined ethics, unforeseen events, etc. Each one of these issues could cause AI to perform in ways it was not intended with potentially catastrophic consequences. Consider government AI being developed by the lowest bidder – wow, that’s scary.

The more I think about that, the more certain I become that AI will eventually cause huge problems to the world. As such, it’s imperative that we – the tech community – consider the limits of AI – not in regards to technology, but rather in regards to safety and security. Do we want AI police officers or soldiers? That sounds dangerous. Could Russian hackers embed “Order 66” into our own robot army? Do we trust robots with firearms to make the appropriate decision in a life-or-death situation?

My intent is not to sound like an alarmist, but rather to begin thinking about the issues now. If not, we may find it’s too late to do so later.

How I Got Here

During the last decade, I have been asked countless times how I would recommend someone get into the programming world without going to college. Many people don’t want to spend the time or money getting a computer science degree, and since I did it people generally assume I can tell them the shortcut to achieve the same in their life. Unfortunately, few people really realize the amount of time and effort it took for me to get where I am or the difficulties I’ve encountered by not having a degree in a field where a degree is expected.

I didn’t start working with computers until around 1997. I was in the US Army at the time, and worked exclusively with Unix machines. Unlike the Windows world, the Unix world has always had tools for developers. The machines I worked on had C, C++, Perl, Tcl/TK, Fortran, Bourne Shell, and numerous other programming tools. During the course of my work, I often used scripts written by others, and soon learned to modify them to do what I wanted them to do. I purchased programming books from Amazon and decided to learn more. At home, I setup an old computer to run Linux so I could have a similar development environment to the machines at work. As time went on, I decided to take courses through the National Cryptologic School on Perl, Unix Administration, C Programming, and other tech subjects. After becoming pretty comfortable with C, I decided to further my education through a correspondence school (the now defunct National Radio Institute) where I earned a diploma in Visual Basic Programming (as I was already pretty comfortable in C, I figured it best to branch out and learn a new language). A few years later, I took a few courses from the University of Maryland in C++ programming. Throughout this time, I spent countless hours at home learning everything I could about programming. I wrote programs to do all kinds of things – from GUI development to command line scripts. This was a difficult time in my life – working a full time job while spending all my free time learning to write computer software took a heavy toll on my marriage. But it would all be worth it when I got out of the Army and found a job in the software realm.

Then, in 2001, it was finally time to step out and find a programming job. Of course, I had no real experience as a programmer. I had written some code and scripts in the Army, but hardly anything that would really be considered production code. None-the-less, I managed to find a local company that needed an entry level programmer. And, thanks to a friend who knew the owner, I was offered a position. In my hubris, I assumed I knew everything at that point in my career. It would take years to fill the gaps in my knowledge to become a good programmer. With project after project under my belt, I would finally become a respected developer around a decade later.

What has my lack of degree caused me? During my entire career, I have found countless companies that wouldn’t even talk to me because I didn’t have a degree – they were unwavering on their requirements for a BS in Comp Sci even though I had been working in the field for years. At various companies I worked at, it became obvious that I would never be promoted simply because I didn’t have a piece of paper. Even though I could code better than my peers, my lack of degree held me back.

At no point has my path been easy. It’s involved an incredible amount of work and sacrifice. And if you’re thinking of teaching yourself to program and find a job, I wish you the best of luck as you are about to find out that it takes far more than watching a few online videos and making a webpage.

If you do choose this path, how can you make it successful? Passion – you must have an unwavering passion to write code. You need to spend every waking hour writing code, reading books, watching videos, and doing everything you can to become a good programmer. Expect to put in substantial time and effort. Expect to struggle finding your first job. Expect difficulty advancing in your career. Don’t think for a minute that it’ll be easy – I can promise you, it won’t.

Change is Good

Yesterday, I took the Myers–Briggs personality test online. I’ve done this many times in the past, and I always come up INTJ – “The Architect”. This is a great personality type to be – listed as being imaginative and strategic, independent and decisive, hard working and determined, and having high self confidence. But as I began my journey into entrepreneurship, I realized that being an introvert wasn’t such a great idea. So, I decided to work to change myself to be more extraverted. After all, if I can’t comfortably talk to people and sell my services to clients, it’s going to be difficult to run my own small business selling software services. To make this change, I started reading books a year ago on small talk, communicating in social settings, and similar skills needed to be an extravert. I also read books on sales and leadership. After all, being an extravert isn’t going to get me far if I can’t sell myself or if I can’t project myself as being a leader in both business and software development. So, when I took the personality test yesterday, I was pleased to see that I have changed to ENFJ. Not only have I become more extraverted, but I have learned to rely more on my feelings instead of just logic. As a software engineer, that’s tough, but the world of people is rarely a world of logic – it’s a world of feelings. If you can’t relate to someone on that level, logic won’t get you very far.  Now, instead of being “The Architect” I’m “The Protagonist”.

Are you growing and changing? Is You 2.0 going to be better than you are today? What are you doing to get where you’re going? Are you willing to work to change the most basic elements of your own self to move your life in the direction you want?

Social Networking

On Tuesday, my daughter and I embarked on an epic rail journey from Anaheim, California to Altoona, Pennsylvania. As I write this, I’m sitting in the lounge at the Chicago Amtrak station. Tomorrow, after another two trains, I’ll finally arrive home.

Anybody who knows me knows I love to travel by rail. While air travel is fast, it’s rarely fun. Rail is the opposite – much slower, but generally an enjoyable experience. One of the best parts of the train is the dining car. Not only is the food good, but due to the limited seating, you end up sitting with strangers. This is always a great way for real social networking. Tuesday night, my daughter and I sat with a couple retired from John Deere. He worked in the factory, and she spent years working in HR and in training other divisions. She was also a frequent traveler to Europe. The next day, I shared a meal with an outspoken Trump supporter and handwriting analysis export, a rail advocate and teacher, and a man who inherited land in the deserts of California. This morning, I shared breakfast with a pastor and his wife from Minnesota who work with troubled inner-city kids.

Unlike Facebook, Twitter, and other so-called ‘social network’ sites, riding the rails gives me an opportunity to share a meal with people across the country. People who are from different states, with different political views, different religious views, and every other difference imaginable. And, unlike social networking sites, discussions are typically cordial and enjoyable. I get to interact with people as people – not as a digital persona. I get to see them as a human – not as a highly curated avatar. These experiences are what real social networking should be about – not an anti-social experience behind a computer screen.

Today, instead of interacting with people on a computer, why not invite a friend for coffee, have dinner with your neighbor, or invite a coworker over for a burger. You’ll find the social interaction far more rewarding than Facebook.

Picking a Server Platform

Many small businesses want websites or mobile applications that require server-side functionality. Often, this functionality includes a database to store user information. What options exist for a user? What are the pros and cons for each one? I will examine three different frameworks – Node and SQLite3, PHP and MySQL, and Tomcat. These represent just a small number of options available to a business – from small scale applications to enterprise solutions.

For small applications, I like Node and SQLite. Node is a simple platform to run server-side programming. Since it requires virtually no infrastructure, Node services can be installed and deployed in minutes.  Likewise, SQLite requires no installation. SQLite databases are a simple file that can be easily backed up or restored by copying the database file. While this framework is great for small applications, enterprise applications would benefit from more robust environments. Node and SQLite can work really well for small internal applications or to implement a small number of services using a small database.

Next up, PHP and MySQL. This combo is widely deployed on a variety of platforms. In fact, that’s one of the reasons I like it. Typically, service providers like GoDaddy have support for PHP and MySQL out of the box, so applications and services can be deployed without much effort.  PHP/MySQL is also more robust than Node/SQLite. On the negative side, PHP has a variety of versions that are substantially different and PHP code can easily become unmanageable if developers aren’t careful.  I like this solution for smaller customers needing a small number of services on an existing PHP server.

Finally, there’s Tomcat. This option is an excellent Java-based server bringing all the advantages of the Java programming language into a robust server environment. Tomcat can integrate with any database, but MySQL is a common solution. Tomcat is an excellent option for Java web applications or services, but suffers from one big problem – it’s the most complicated option to setup.  This option is best when a large number of users or a large database must be supported. This is the option I like to recommend for enterprise customers.

Numerous other databases and server platforms exist. Microsoft’s .NET platform can work great for customers who prefer Microsoft products and Ruby may be a desirable option for some customers too. As with all technology choices, server platforms must be selected based on customer requirements. Small customers appreciate rapid, low cost development while larger customers will want more robust solutions while being less price sensitive.