Progress, Reflection, and Refocus

Over a year has passed since I started working with Talixa. When I look at how far the company has come, I feel a need to take a step back and reflect on the progress and positive change taking place. From the outset, I have maintained a bold confidence in Tom’s ability, both as owner and chief engineer, to consistently deliver top-notch service and capitalize on key relationships. These have helped to build a foundation upon which the company will develop and grow, though we only continue to grow after helping our clients do the same.

At the beginning of this year, I transitioned to take on a new role as business strategist for the company. While I won’t get into the specifics regarding our goals and ambitions, we quickly realized that Talixa was growing much faster than anticipated. I can’t stress enough how Tom’s hard work and dedication to the Talixa team contributed to the company’s continued success. With work pouring in, the company went from part-time to full-time, and “Team Talixa” has since tripled.

With that being said, we did suspect that businesses in our community had an unmet demand for quality software (and other tech-related) services. One of the challenges, however, has been keeping up with all of the opportunities that arise. I am personally blown away by how often I hear about good news and new projects when getting company updates from Tom. With exciting week after exciting week, the need to refocus and set the bar higher became apparent much earlier than expected. This resulted in redefining roles and goals, since along with meeting goals come new challenges for new endeavors.

A year has come and gone along with its challenges, and a new year is approaching with a new set of mountains to climb. For those of you who read these articles through the end, thanks for being a part of our journey. As you look back, refocus, and look forward, please don’t forget to think of us. After all, we’ll be thinking of you.

Exponential Growth

For entrepreneurs and business owners, trying to build something bigger than the individual poses one of the most challenging initial struggles a company can face. A brand is often represented by a figurehead, whether that be the owner, CEO, or majority shareholder. When the growth of the company is contingent on the amount of time an individual in this capacity can offer at an hourly rate, growth will by nature follow a specific linear pattern, before ultimately reaching a plateau.

In an effort to scale beyond this point, businesses can plan ahead to position and prepare themselves for the anticipated changes and challenges. Structuring the business model in such a way that money naturally flows into the business through multiple streams can create an ecosystem where each specific element supports other elements in different ways. In doing so, the business network can expand well beyond the individual, and the company can scale up to meet the goals necessary to attain sustainable growth and success.

While all of this sounds fantastic generally speaking, the task of specifically applying these principles to a business could seem daunting. Often, small business owners can fairly easily grasp the linear aspects of business growth. However, the road block often comes when the businesses are forced to think differently and realign their goals and focus. Sometimes the solution is both simple and effective. If your business has been struggling through a similar situation, I would strongly encourage you to take a look at your people. The people who are passionate about the work and mission of your company are the strongest agent of change for scalability. Take some time and consider their interests and skills, and invest in helping them find their best work!

What’s My Why?

A few weeks ago, I read Simon Sinek’s Start With Why. As I was reading, I was forced to ponder what my company’s purpose is. The simple answer is that my company exists to make money so that I can pay my bills. But that’s hardly very motivational – for me or for customers. No, I want my company to have a bigger purpose – I want my company to be transformational! What is my why? My company’s why is pretty simple – to make the world a better place. That’s a pretty lofty goal for a small software company. How can I possibly accomplish that? I can make the world a better place by accomplishing three things. First, Talixa will empower and enable customers to solve their business problems. This will enable them to better capitalize on their market which will, in turn, generate revenue and jobs. This improves the lives of people not only directly (through jobs) but also indirectly (through taxes generated for local government). Second, Talixa will work to improve the local community through creating jobs and developing tech leaders. Talixa is committed to hiring local resources and striving to develop the pool of local technology experts. We will work to support, grow, and train the next generation of technology leaders in the area. Third, Talixa is committed to improving the world through philanthropy. Talixa will work to support charitable organizations not only through financial donations, but also through serving and volunteering both locally and throughout the globe. We will encourage all those working with us to do the same.

So there you have it – the why for Talixa. Empower businesses, hire locally, serve globally. If we can achieve these three things, we can have a small part in making the world a better place!

Transactional Friction

If you have ever considered where money originated or why we use it, then join the club.

Long before the day of the dollar, civilizations operated under a system of barter where goods were directly exchanged for other goods. While there are a few benefits with this system, people quickly realized the obvious flaws. For example, if a farmer had a cow to trade, they would need to find someone with goods of equal value. Further, there is often an expiration date associated with certain goods, such as a farmer’s milk or a baker’s bread. Therefore, even if a baker had enough bread to buy a cow, the farmer would have no use for that much bread.

These days, most of the world uses government issued currency that acts as a standardized means of exchange. While currencies address many of the issues of the barter systems, they are still often limited by some factors. For instance, if a person wants to spend money online or while vacationing in a foreign country, that spending creates transactional friction. In other words, customers pay fees to a middle man, whether it’s to exchange currencies or process transactions.

As a result, many have turned to cryptocurrencies as a solution to transactional friction, though  cryptocurrencies have not been able to handle scalability for the time being. As a result, using cryptocurrencies for their intended purpose is virtually impossible. For cryptocurrencies such as Bitcoin or Ethereum, consumers spend several dollars in fees to make a transaction, rather than the fraction of a penny that they initially boasted.

Consumers around the globe are losing billions of dollars each year to various fees. So what can we do to avoid transactional friction? One piece of advice is to avoid using money where possible. Try to exchange your marketable skills for something more valuable than money. Programmers are continuing to work on some of the scalability issues behind blockchain technologies. In the meantime, everyone else can have a bit of patience and remain on the lookout for the progress taking place.

Multilingual Programmers

One of the biggest difficulties in the computer programming world today is the sheer number of languages out there to use for application development. Which language should you learn? The reality is, that’s the wrong question. I recently spoke with a developer who indicated that he only knew C# – he was not comfortable with Python or any other language. For the professional developer, this it not an acceptable answer. In today’s world of programming, you can no longer get by knowing only a single language. For example, while the bulk of the code in a Java web application will be in Java, the front-end will require JavaScript and HTML. Build scripts may be written in Groovy or XML, and Shell scripts may be required for build automation. This is not unique to Java applications – just about any application will require some knowledge of other languages.

How do you pick which languages to learn? At a minimum, every professional engineer should know at least one compiled language such as Java, C, C++, or C# in addition to JavaScript, Python, and SQL. Additionally, he or she should be comfortable with another language such as Ruby, PHP, Go or Rust.

If you’re an application developer, do you only know one language? If so, I would strongly urge you to learn additional languages. Mastery of every language isn’t necessary, but any decent developer should feel capable of writing code in several languages.

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.