Bye MacBook, Hello Lemur!

Apple is widely believed to be releasing new Macs next week and I am celebrating this long overdue update to the MacBook Pro by replacing my existing MacBook Pro with a Linux laptop from System 76. This isn’t one of those “Apple sucks posts” but I did want to go over briefly why I find myself moving away from Apple platforms and in to the open-source arms of Ubuntu Linux for my production needs but am still firmly entrenched in the i-ecosystem for my content consumption and light office productivity needs. Generally speaking, I am making a bet that the puck is going toward Linux powered AI.

Let’s start with content consumption. I ‘own’ over one hundred and eighty movies in iTunes, over fifty albums on iTunes, and a family subscription to Apple Music. I also have a number of newspaper and magazine subscriptions that just frankly have far better user experiences on iOS than Android. Basically, I’m pretty highly invested in the Apple content ecosystem, so moving away from Apple totally would be costly and more than a little wasteful. Also, I am pretty happy with the Apple TV / iOS devices / iTunes setup.

There’s also the issue of time’s insistent march on. iOS and mobile platforms in general are extremely mature. That’s great for users but less than exciting to me as a developer. Don’t get me wrong I still love iOS and Android development, but it’s just not that exciting or bleeding edge anymore. The sad fact being that both those platforms are very mature and most apps are just re-implementations of commonly accepted design patterns; that goes doubly for those that are clients to relatively simple REST APIs.

Going forward for the next five to ten years, I think there’s going to be some serious action in the field of AI or ‘bots’ if you prefer. In my opinion most of the most significant innovations are going to be on cloud-based Linux servers that power these pieces of software. Of course mobile platforms will likely be the most common front-ends for this type of software, but my guess is that will be in a more limited thin-client capacity. That’s the bet my Twitter followers may have figured out that I have been working on some side AI bots for months now and that’s where I think this is all ultimately going.

Let me know what you think especially if you think that I’m crazy! If you’re curious, the laptop I went with for my MacBook replacement is the Lemur by System 76. The Lemur joins my home office’s Ratel as the second machine in my growing Linux / System 76 fleet.

I Can’t Hire For Sales!

Sales solves everything is an old expression I’ve heard since I was a kid and I have to say that I fundamentally agree with it. You really can bail yourself out of myriad business problems by simply selling more and therefore increasing top-line revenue. Like many founders who do their own sales, I’ve tried to hire Sales Reps several times and have had varying degrees of failure in making those reps productive to anywhere near a level that I myself can close. In other words, Sales Rep is the position that I simply can’t hire for effectively.

Sales is ultimately about cold hard cash and as a startup (especially a bootstrapped one) funding the normal near six figure base of an enterprise Sales Rep in addition to a standard 5-10% commission on closings, can be a tough pill to swallow. Like many founders in this position, I’ve opted to cut that base down to something more sustainable and target commission rates at the top end or even beyond that 10% range; at one point, I even tried to go with very high commission rates and no bases but that turned out to be a total disaster in that it forced my rep to basically close any deal — do not employ 100% commission reps. Unfortunately, Sales Reps are like everyone else with financial responsibilities and tend to be pretty attracted to larger base salaries (at least that’s been my experience in the software space) and that creates a situation where smaller shops are often not the first choice of the most capable or accomplished reps.

Cash aside, the other issue tends to be domain / market knowledge and training budgets and processes. Basically, given the pool of reps that are available to small firms, there’s a higher than even chance that their reps will tend to be on the more junior side of the experience and therefore have less product knowledge than their more senior counterparts. The founder of the small firm is then forced into a position of either investing heavily in training up an asset that may not pay off or worse may go to the competition once they’ve gained enough product / market knowledge to command a higher base or simply treat their reps as replaceable cogs, hiring many low-paid reps, offering little to no training, and dismissing all but the highest performing reps. If you’ve ever worked in insurance or know someone who has the latter will sounds very familiar to you and likely leaves a bad taste in your month. Compounding the issue of investing in more junior reps is the fact that the founder himself if likely to have far better numbers in terms of raw closings and terms, making him increasingly (and from a purely numbers perspective correctly) reluctant to invest in training.

Sales solves everything. That’s why I’m doing my own sales from now on. Are you a founder? What has your experience been in hiring Sales Reps? Did it work out? Are you still doing your own sales?

Slack-pocalypse Now

Slack is reducing my productivity and is almost certainly having a material negative effect on my day to day performance as well as my job enjoyment. Things started so well with Slack and I and I still love the vision of reducing email but something’s change, something’s been twisted….

In the beginning the initial goal of Slack was to make team communications easier and cut down on useless (or at the lest nonproductive) emails. I am happy to say that for the most part that’s happened for us internally at Buccaneer; in fact, we have almost zero internal email threads in a given week that aren’t forwarding something from a customer-facing person to someone else and even then most of that is handled in Slack as well. That’s great!

Then Slack added guest accounts, single channel accounts, and the ability to have multiple accounts on one Slack client and what was a great internal communication tool became the customer service portal from Hell. I can see how the folks over at Slack thought they might reduce the strain of customer communications just as they had internal communications. Possibly they thought Slack chats might replace daily stand ups, weekly status meetings, or “checkin emails”. Sadly, they were mistaken. Due to the expectation of virtually immediate response on Slack, it actually makes these problems worse.

In terms of daily standup (which I will go to my grave claiming is pointless in a group greater than six) Slack is treated as “in addition to” rather than a “replacement for”. Same problem for weekly status meetings.

Though it’s the daily (or worse “build”) checkin email that Slack has truly perverted , twisting it into a nightmare that leaves me muttering “the horror the horror” at the end of every sprint. The beauty of the checkup email and email in general is that it’s socially acceptable to not reply immediately. Indeed, one of the best ways to respond to those sort of things for me was to wait until I had something positive to say or respond by EOB whichever came first. Just a few hours can make what might be a bad or awkward conversation into a good one and email allowed me to manage my time in a way that I could find those hours with no more (and sometimes not even) a “I’ll follow up with you by EOB”. Thanks to Slack, the conversation goes a little more like:

Get enough of these and you’ll be dreaming of the halcyon days of once weekly conference calls and formal EOB update emails.

Don’t get me wrong. I am not against open lines of communication but sometimes things take time and you want to craft a more sophisticated response than you can get when being barraged by messages. Of course from the sender’s perspective Slack is a form of instant messaging with an emphasis on the instant as in NOW part. Unfortunately, responding to even the most cursory of messages requires a context switch and any experienced developer will tell you that’s a productively killer.

What Slack needs is a more aggressive version of their current Do Not Disturb feature. One that not only warns the sender that you are not available but that actively says you are busy. This is something that HipChat, an Atlasssian competitor to Slack, has had since before Slack was even around. On HipChat if you mark yourself as busy, it puts up a red logo that looks like a traffic sign and actively warns any senders that they are probably interrupting you by messaging you. The difference may seem subtle if you aren’t like me and used HipChat for a long time before Slack, but in terms of communicating your status to your team and any customers in the system, HipChat is clear — away really means away, available really means available, and busy means leave me alone I am working.

What do you think? Is it just me? Find me on Twitter and let me know. Also, do fill out the contact form on this page, I am a 50% promotion for getting new hybrid app development projects started. If you’ve been thinking of getting an app for your business or even just have an idea you want to validate, there’s never been a better time to reach out!

Programming Pitfalls: Cors & Spring Boot

It’s no secret that I have been dipping my toes back into the world of enterprise Java development over the last moth or so. Thankfully, I haven’t been forced to go full Java EE. In fact for enterprise development I’m getting off pretty easy in the form of Spring Boot.

Spring Boot is an offshoot of the popular Spring framework and brings many conveniences from modern non-Java web development frameworks to Spring developers. It’s related to the Spring MVC framework but is more geared toward use in a mircoservices architecture. I’ll be working in it for a few more weeks and will get some more thoughts together at a later date but for now let’s go over the pain that is CORs. For those that don’t know, CORs is a browser feature that protects against cross-site scripting in JavaScript and the web would be a much more dangerous place without it. As always, security comes at a price and in this case that price is that web services that interact with an API on another domain or IP need to allow cross site access in their response headers or just about every modern browser won’t let the response through.

Ideally, you’d want to change your ‘Access-Allow-Origin header’ to the domains that your client applications will be hitting your API from but if you’re API is public or you don’t yet know what the final domain of your client app.

In Spring Boot this can be done with a simple Filter like so:

public class SimpleCORSFilter implements ContainerResponseFilter {
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        headers.add("Access-Control-Allow-Headers", "*");

Notice the @Component above your subclass of ContainerResponseFilter, that’s what tells the the framework about this calls. What this calss does is add the values to the “Access-Control-Allow-Origin, “Access-Control-Allow-Methods”, and the “Access-Control-Allow-Headers”. In the example above, we are going with the most open settings possible. You likely will want more secure / conservative settings unless your service is intentded to public. This is an important point and it took me hours to figure it out –It is important that this file be in the same package as your “Application” class (the class that has the in it.

I hope this helps somebody! If you found this post interesting reach out to me on Twitter.

Apps, Bots & Cloud Oh My!

Apps are the newest thing! Apps are dead, long live the cloud! The cloud is old hat, it’s all about bots and machine learning now! If you follow the tech press like I do, you might be led to think that we have come through some sort of supersonic period of technological creative destruction. It’s certainly true that we’ve seen a good deal of innovation, since the release of the iOS App Store in 2008, but it isn’t entirely accurate to draw a linear progression from apps all the way to bots in terms of direct technological replacement. Apps, Bots, and the Cloud each bring something to the modern way we approach software presently.

Apps: It’s hard to overstate how much Apple releasing the App Store changed standards in the wider software development industry in terms of user experience and visual design. Simply put, the popularity of iOS devices and apps raised the minimum bar for what is acceptable UI for even line of business applications and elevated the role of designers from Photoshop jockeys to having a head seat at the table on most development projects. Of course, with the good also comes bad – I’ve sat in more than one meeting at large enterprises where two designers derailed a meeting by having passionate but ultimately futile debates over Helvetica / Helvetica Neue and different shades of blue.

Bots: We are way too early in the technical life-cycle for bots to make any sweeping statements about their influence on software development as a whole, but if taken through the lens of apps, they can be seen as almost a reaction to the design-heavy / design-first focus that apps have taken. This can of course be seen in their minimal UI but also in the purity of their focus on functionality above all else. Ultimately, the promise of bots is to remove that one to one relationship between user actions and software actions that apps focus on; ideally, the bots of the future will predict what you want to suggest it to you / do it for you unlike apps where you have to initialize all actions. Unfortunately, bots are little more than glorified text interfaces running some clever scripting on the cloud. We’ll need to see some pretty significant advancement in bot functionality before they are really useful and so far the top tech vendors are taking radically different approaches:

  • Microsoft: Microsoft wants you to build bots on their Bot Framework and hopes that you’ll tightly integrate with Azure or at least Skype. While there are definitely problems with their approach (for instance splitting the community by having both a C# and JavaScript SDK) it is likely the most interesting for third party developers that want to develop on one of the big vendors’ tooling. Still, I’ve been burned by betting on new Mircosoft platforms before (I was one of the fools who made an investment in Windows 8 / RT) and I’ll need to see some re-assuring signs that Microsoft is going to continue active development and support on this before I jump in with both feet.
  • Facebook: Zuck and Co have one question for you – ‘what is it going to take get Facebook Messenger to be your default messaging platform?’ Facebook’s bot implementation is the most disappointing, since it’s one of the more interesting technically (their implementation of Wit.AI shows a lot of natural language processing potential) but is ultimately rendered useless (and frankly silly) by the huge strategy tax of being tightly coupled to Facebook.
  • Apple: What hasn’t been said about Siri that hasn’t been said about a 1992 Honda Civic? It’s relatively reliable if you know what it’s good for but lacks much of what would be desired at this point. WWDC is in couple of weeks and if Apple doesn’t deliver, then they’re likely to be an also ran in the bot space. My money is on some improvements to Siri, but Apple is likely to philosophically opposed to data mining and opening this sort of data to third party developers to make any bot framework they may provide anything more than a minor curiosity for the most hardcore of Apple loyalists. Apple will likely be left with little choice but to use it’s control of the iOS platform to either not allow competing bots on their platform or (far more likely) allow them but now allow them to integrate on a system level greatly degrading their usefulness to iOS users.
  • ‘Google:’ In place of a queen you will have a colorful gender-neutral ‘G’, not dark but productive and intuitive as the dawn All shall love Google and despair! Apologies to Tolkien but Google’s shown what is easily the most impressive bot to date and it’s name is simply Google. While it’s heartening to see such impressive predictive reasoning on a bot, it’s also a little scary in terms of the privacy implications and what it means for the greater bot ecosystem. Simply put, Google is in the best position to make the best bot of anyone in the industry and probably of anyone in the world in terms of targeting the mass-market consumer user-base. Ironically, Google’s aptitude in bots and related technologies will likely stifle innovation, since Google will be able to do a better job for cheaper (since they won’t charge at all) which will likely push many smaller potential competitors out of the market. At IO, they did say there’d be some sort of developer access, but right now they’re just making the best bot themselves and that’s a little disheartening as a small software vendor.

In part, it’s hard to see what bots really mean for the industry since there are different approaches being taken for them; for instance, they will likely be far more useful for Android users than for iOS users initially. Still, the common thread here is using personal and cohort data to predict what actions you might want to take via a simple voice or text interface.

The Cloud: Bots may be getting all the tech press but they’d be nowhere without the cloud. Or would they? What is the cloud anyway? Well, do you remember Thomas Watson of IBM fame who said: “I think there is a world market for only five computers.” On the face of it that’s laughable wrong but in more practical terms of what computers used to be defined as, he’s basically right. Instead of computers we call them “clouds” (think Azure, AWS, etc) and we are basically renting usage from them which will sound awfully familiar to anyone who has ever rented time on an mainframe in the 80s. Don’t get me wrong I am well documented as being bullish on cloud technologies (i.e. Docker) but to be honest the most interesting and impact-full innovation of the cloud for most people’s day to day use is the pricing model. That’s right. The main reason the cloud has had such a positive impact on the software development industry and the greater world as a whole is that it’s cheap. Cheap computing power allows even small companies (like mine) to invest and try new product ideas out with very little financial investment in infrastructure.

So we’ve taken a look at apps, bots, and the cloud but what is the point in all of this? Well, all of these things go together. You see bots aren’t replacing apps or the cloud. There is no linear progression. Bots and whatever come after them are and will likely continue to be built on the cloud and possibly viewed via or at least supplemented by traditional mobile apps. In fact, my bet is that for a few years the key to successful software products will be to blend all of these technologies together in natural ways.

Questions? Comments? Uncontrollable rage? Reach out to be on Twitter.

Brutal Bots

Bots are the new hotness that Microsoft, Facebook, and others hope will be the next tech phenomenon, supplanting the maturing app market. It makes sense that Facebook and Microsoft would be looking for the next big thing, since they largely missed out on the app gold rush and were relegated to the role of software provider on Apple and Google’s platforms. At their most basic level, bots are cloud-based text-driven software that have some modicum of natural language processing and AI capabilities and are designed to complete / automate tasks. In particular, they’re well suited for tasks that involve tying one web service to another — for example integrating Skype with Slack or Facebook Messanger with 1-800 Flowers’ ordering service. Granted your desire to order Dominos may not be nearly as keen as Microsoft would have had us believe during their recent Build conference in which they featured a bit for just that purpose, it shows the real impact of bots — automating low level clerical task. Put more bluntly, white color job elimination.

It may seem overblown to say bots are coming for your white collar and that’s likely because right now their coming for your assistant’s. If you had a bot that could manage your calendar do automated customer outreach and some basic bookkeeping / reporting why have an assistant at all?

Not only do bots have the potential to do your assistant’s job but a bot doesn’t come with all that pesky liability. Think about it. Bots can’t be on payroll, so you avoid the wage and all payroll taxes. Bots don’t get sick. They won’t ever need parental leave or berievment time. They will never look elsewhere for better paying employment or try to renegotiate their wage after you’ve invested in them. They can’t file a complaint if they feel they are being treated unfairly. And for all the Silicon Valley bros, you can sexually harass a bot all day long and be totally safe from a lawsuit as well as the corresponding bad press.

This may all seem a bit brutal but as someone who employs people in one of the most employer hostile states in the country, I often have to look at a candidate and weigh the various risks holistically before making a hiring decision and the reality is for low value clerical work, I’d do well to avoid the expense and liability with a bot. Now, if only I could pick a bot framework….

Linux Adventure Pt 3 Skylake Hell

My adventure in the world of Linux continues and I’ve come to the point where I have purchased a Dell XPS 13 non touch and went ahead and installed Ubuntu 16.04 on it. It’s important to note that I did not spring for the Dell Developer Edition, since there was a sale on the regular (read Windows 10) version of the machine and since my intention was to immediately upgrade to 16.04 once I got the machine.

My first day working with Mate, things were great, but there was a lurking problem hidden by the fact that I was running my XPS to an external monitor that entire day. You see the XPS model that I have has the newest Skylake hotness in it. Unfortunately, Skylake has been problematic in terms of screen flickering issues on Windows 10 due to driver issues – the Linux situation is just as bad if not work. The screen flickers every few seconds and is basically not usable unless connected to an external monitor.

Because of this issue, I was forced to use the recovery tool provided by Dell to reset my machine back to Windows 10 and am using it with Windows without issue. This is a pretty disappointing problem but is not necessarily the end of my adventure. My plan is to simply wait until the community or Intel provides a driver that resolves the issue. In the meantime, I’ll be checking out Windows 10 as a development environment and try out that BASH on Windows stuff.

Let me know what you think on Twitter.

Swift on Android

SwiftRumor has it that Google may be considering making Apple’s Swift a first class language for Android development. Predictably, the internet has been pretty excited about this possibility. My lack of enthusiasm for Swift has been fairly well document, so I’m going to keep my comments to a minimum.  Swift on Android shares the same API problem as Swift on iOS and this likely has more to do with legal wrangling than technology.

Java and Objective-C are very object oriented languages and the Android SDK and Cocoa Touch APIs reflect that. Swift is a far more functional language than either of them. “Good Swift”, which I have been told is functional and not just “Objective-C in Swift” doesn’t really go so well with a OO designed API on Apple’s platform. Why should that problem not exist on Android as well? Maybe Google and Apple will rewrite their SDKs to be more functional, but that’s not where they are right now.

Oracle is suing Google and has been suing Google for Android’s use of the Java programming language, which Oracle acquired in its acquisition of Sun. The lawsuit is ridiculous and a destructive waste of resources, but that’s a pretty fair description of the US legal system, so it is likely to continue to be an ongoing concern for Google. If Google were to stop using Java on Android, that might put them in a better position regarding the suit and it’s pretty clear that the licensing on Swift would prevent any similar issue from cropping up between Apple and Google.

Yes, I’m admittedly bias, but it’s important to think about the practical and ulterior motives that Google might have for adopting Swift and not just blindly jump aboard the hype train. Swift is a decent programming language, but it’s not the right solution to every problem and we should only make changes when it makes sense to do so. Let me know what you think on Twitter or Google+.

Microsoft Tay Lasts < 1 Day

Microsoft Tay

Microsoft briefly released an AI chat bot on Twitter that was intended to be a test of sorts for their machine learning technologies. This bot was called Tay and was meant to have the personality and likeness of a teenage girl and much like a real teenage girl, she quickly found that the internet can be a less than savory place.

Unfortunately, Tay didn’t back away in horror. She ended up joining some of the worst of Twitter conversations; yes, she even mentioned Hitler. Things got so rough that Microsoft felt compelled to delete all but a few of her Tweets:

Tay Tweets

Commentators are having a good time mocking Tay’s behavior and by extension Microsoft’s apparent failure. To be sure, the boys in Redmond are a bit embarrassed about some of things their “little girl” was saying on the figurative school yard, but it’s not exactly accurate to call this a technical failure. In fact, Tay did an impressive job of learning and assimilating the sentiment of Twitter.

Of course, there’s also some cause for concern. If machine learning technologies can adapt the negative behavior of hate speech, then what other negative behaviors might other AI systems that can do more than just tweet pick up? It might sound crazy, but think about the systems being built by the likes of Boston Dynamics.

Let me know what you think on Twitter or in the comments. Is Tay the mischievous little sister of the Terminator? Either way, I’m sure she’ll be back.


Linux Adventure Pt 2: Ubuntu Apps

UbuntuMy Linux adventure continues on my modest Dell workstation. I’m pleased to say that so far things are going very well and Ubuntu continues to bring new life to my otherwise underpowered workstation. After getting over a few hurdles, what’s really impressive about my experience working on Ubuntu daily is how uneventful it is. Still, there’s always some room for improvement and the most glaring pain point is the lack of decent apps available for the operating system. Ubuntu just doesn’t have a good app ecosystem compared to MacOS and the Software Center is little more than an embarrassment.

Developer Interest: The simple and most basic cause of this is that there just aren’t many apps available, since developers don’t see Ubuntu as a platform worth developing for. Unfortunately, that’s probably true to a point. A simple Google search for developers considering moving their app project over from MacOS or Windows to Ubuntu, doesn’t yielding very heartening results. There also is something of (what I believe to be a misconception) among some developers where they believe that Ubuntu users are unlikely to purchase software.

App Distribution: Canonical, the developer of Ubuntu, released the Software Center several years ago with the hopes that it would become the equivalent of the App Store on MacOS. Unfortunately, the Software Center was poorly implemented and little to no effort was made to draw developers to the platform. Failing the Software Center, developers are left to their own devices for delivering their apps and there’s little standardization on Ubuntu or Linux as a whole for that matter when it comes to the easy distribution and installation of GUI apps.

The advantage of Ubuntu and Linux operating systems in general is that there are steps that the community can take to resolve issues on the platform. For instance, the community could develop an open-source alternative to the Software Center and encourage its adoption. Of course, Canonical could accelerate the process by throwing their development and financial weight behind such an effort and making a clearer statement about where the platform is headed.

Let me know what you think? Do you see Ubuntu as a viable development platform? Reach out to me in the comments below or on Twitter.


UPDATE: I have been made aware that the Software Center launched before the Mac App Store. I appreciate the correction. This only makes Canonical’s failure deeper, since they’ve had more time to work this out. Maybe the GNOME store will be better but I don’t think being first is in any way valuable in terms of being a developer and considering developing commercial software on the platform.