Archive for 2015

The Real Estate Market does not Reflect Global Warming

Whether or not you believe the phenomenon of global warming* is man-made, there's no doubt the Earth has been getting warmer over the past century. Naturally, a warmer Earth leads to melting ice which as a consequence creates higher sea levels. The only point of contention is how fast sea levels will rise. There are many models.

The most extreme of these models expect major devastation in rich and highly populated areas in the United States like Miami by as soon as 2050. Yet Miami seems almost oblivious to the threat. The real estate market in Miami continues to boom.

How can respected scientists' prediction that an area will be under water not change the value of its real estate? There are three possibilities:

  • The players in the market do not believe in sea level rise/global warming.
  • The chronologic window for the devastation is still too great to affect prices. Perhaps when predicted calamity is within the window of a 30 year mortgage, banks will think twice.
  • Market actors do believe in sea level rise, but act irrationally through some sort of group think.

Markets are not always great predictors of long term trends.

*I use the term "global warming" because I feel "climate change" is a kind of doublespeak. Global warming describes the Earth on average getting warmer, whilst the now more politically correct climate change can be deemed an accurate prediction regardless of what happens to the Earth's average global temperature. Yes I understand its defense is that global warming will not be a universal trend - some areas will get colder. I still think of it as doublespeak though.

Posted in , , , , , , , | 1 Comment

American Customer Service Downfall

I'm not an expert on customer service. On some level, though, we're all experts on customer service because we all interact with hundreds of different service workers in our regular day-to-day errands. Anecdotally, I believe customer service generally used to be better here in the States. When I was growing up, I feel like service with a smile was the norm, not the exception.

I worked retail at music & movie chain Sam Goody when I was 17 for 7 months for $6/hour (I got a raise to $6.24 near the end). As soon as the holiday season started and I needed to quit for tennis season anyway, I did. Even though Sam Goody's prices were a rip off and the management sucked, the floor people there genuinely cared about the customer experience. Everyone worked hard to make customers happy and "the customer is always right" was nearly true.

I've had an incredibly bad customer service experience amongst six different organizations during the past 24 hours. Again these are just anecdotes, but I believe them to be part of a larger pattern. It all started when I decided I need a new Windows PC. Most of my work is on the Mac, but I have a little bit that crosses over onto Windows. TigerDirect was having an incredible Black Friday sale on DIY bundles, so I purchased one that included the AMD A10-7870K APU.

The shipment email (as you can see in this screenshot)
shows I ordered a bundle with the A10-7870K a part worth about ~$130. The shipment arrived yesterday by UPS with the wrong microprocessor (A8-7670K instead). It turns out the email for the shipment already showed them sending me a different CPU .
What's nefarious is not the mistake, but that TigerDirect changed the bundle (without changing the bundle's item number) and then shipped me the new bundle, even though my order email proves I bought the original bundle. The customer service agent that I waited 65 minutes on the phone to talk to (TigerDirect does not accept returns by chat/email for this part) acknowledged the mistake. The entire conversation was 98 minutes.

She acknowledged that they changed the bundle after I had already ordered. It's a true bait-and-switch! They said they had no more A10-7870K's in stock and wouldn't for a while. So they offered me to send it back and they would refund me for the cost of the A8. The A8 is $25 cheaper and that's not what I paid for! $25 is not going to make or break me, but it's the principle. I contacted Google Trusted Stores and someone higher up at TigerDirect is supposedly going to contact me according to the original customer service rep. I'm not holding my breath.

So to go with this new computer I also ordered several items from Amazon. USPS claims they were delivered yesterday at 6:49 PM (strange because that's after when the mail comes). I told Amazon they haven't been delivered even though USPS has marked them as delivered and they told me to wait a couple more days. So when they say "Thursday delivery guaranteed" they don't mean it.

I went to the UPS Store today to ship back the A8 to TigerDirect. The first customer service rep barked at me "need a receipt"? But I couldn't understand what he was saying. When I  asked for clarification, he didn't reply. The second scanned it in and seemed friendly enough, but as I was leaving I distinctly heard him toss my A8 package across the room.

I then went to the Apple Store to return an item. There are no lines at the Apple Store, you just walk up to someone and ask for help. I asked someone who turned out to be a manager and he found the most disinterested employee you can imagine. The guy was playing on his phone and the manager actually had to chastise him for being spaced out. The guy hardly communicated with me/made eye contact as he returned my item.

I went to T-Mobile on the way out of the mall to change a cell phone plan. Not only did the service representative assume I wasn't a T-Mobile customer, he also told me their cheapest plan for my configuration was $120 (he was hoping to up-sell me it seems), and I had to correct him that it was indeed $90, but he also then acted almost with disdain that I was bothering him to do this switch for me. Then he espoused more misinformation about the plan I had switched to not including Binge-On, even though it does, to again try to up-sell me to a higher priced plan.

I went to MicroCenter to get the right A10 APU. I went to the notoriously commission driven "Build Your Own PC" center. I was obviously lost looking for their poorly marked "processors" section. Nobody came to my aid. Maybe I don't look like the typical nerd, or maybe they were all too busy chatting and on their cell phones. I found a guy and asked him for help. I think he was on his cell phone too. He told me to wait for him at a glass case he pointed in the direction of. I waited quite a bit even though he didn't seem to be helping any other customer. Then he walked with me to the checkout (security procedure there for high price items) and took another call on his cell phone.

I understand being a service worker in retail is a low-paid job with few benefits. But having these kind of experiences is certainly another incentive to shop online. The TigerDirect bait-and-switch, changing the components of the bundle after I had already ordered and paid, is completely unacceptable. That they further refused to refund me for the value of the original item is so ridiculous it's hard to believe. If this post got at least one person to not shop there, that's justice.

Posted in , , , , , , , , , , , , | 1 Comment

Open Source Plagiarism

It seems the world cares less and less about intellectual property rights. Many people don't blink when mention of stealing music and movies comes up in conversation - an action that was taboo just a decade ago when the newspapers still covered music industry lawsuits against individuals. Today, students download PDFs of textbooks with nary a worry. And many of them don't even see such practice as dishonest. How does this attitude apply to open source software?

I care about intellectual property rights, because I think they help the world economy by encouraging the pursuit of art and innovation (I'm a little biased as an author and software developer). I think some of those rights go too far (excessively long copyright terms, patentable genetics, etc). But what we can all agree on is that there's a line to be drawn between taking someone else's work, and claiming someone else's work as your own. Where is that line in open source software?

Students who have grown up in this permissive, anti-intellectual property rights era not only don't care about the rights themselves, they don't care about that line either. Plagiarism is a rampant plague in the school system. I am very disappointed to see this disease of dishonesty infecting the open source world as well.

By its nature, open source software has a unique relationship with intellectual property rights. Whether it's the battle between copyleft (GPL) and permissive (BSD/MIT) style licenses, or concerns about corporations leveraging the work of individuals without contributing back to their respective projects, there are interesting and legitimate issues to debate. One thing that's not up for debate in most circles is that it's dishonest and disingenuous to take someone else's project, modify it slightly, and call it your own.

Technically, that's a derivative work. But spiritually, there is a line between a truly new project and a rip-off of the original. And you know it when you see it. Further, regardless of whether or not a project crosses that line, it must (by the terms of most open source licenses) acknowledge the original work/author.

I was very disappointed to see the appearance of RunKit on GitHub (Update: GitHub has now removed the repository due to a DMCA takedown notice by @duemunk) a Swift project by @khoiln. RunKit is a rip-off of Async by @duemunk. The first version of RunKit posted to GitHub didn't even acknowledge Async or @duemunk despite the entire project being a line-for-line copy of Async with a few name changes, comments removed, and very slight data structure changes (I inspected the two myself side-by-side). Despite this rip-off, @khoiln marketed RunKit with a banner image, a rewritten README and postings to public places.

Developers noticed this disingenuousness and posted issues on GitHub specifically calling out the plagiarism of Async (with no acknowledgement). @khoiln closed the issues. Then @duemunk himself opened an issue on RunKit specifically highlighting the MIT license's requirement that @khoiln acknowledge him and Async. He subsequently did. He went on to claim that he "...created this for internal projects since Async keyword is being used in our other framework." (Update: this quote was removed shortly after this blog post was published). That makes no sense - why then publish it publicly with a banner graphic and rewritten README? Why close the earlier issues? Now @khoiln has closed the project to issues on GitHub all together (yet RunKit continues to trend on GitHub).

Writing most open source software is not glamorous. One of the few things open source authors get is acknowledgement of their authorship (for resume, glory, or reputation purposes). It's sad to see even that challenged by plagiarism. One can imagine a very realistic scenario, where a developer writes an open source project, it gets little notice, and then another rips it off, gets a lot of notice, and lands a job based upon it.

Ultimately, unless you're a lawyer or a big corporation that can hire one, there's very little one can do against the limits of monetary resources and across borders to enforce an open source license. Yet, it would be nice if in the world of open source, we as a community enforced an honor code. I don't know how to instill such an honor code into young developers. I fear given their generation's widespread anti-intellectual property attitude, it may already be too late.

Addendum: For an example of this in a big company setting - checkout this GitHub issue in which Microsoft is called out for stripping the MIT license/acknowledgement from several files in their first release of WinObjC.

Posted in , , , , , , , , , , | 7 Comments

Starting a Podcast

Over the summer, I started the podcast Consult. It mainly consists of interviews I conduct with fellow consultants on Apple platforms (those that build apps for others on a contract basis). I've loved podcasts since they first came on the scene a decade ago. I very much wanted to do my own show. Consult is about a niche that A) I know about and B) was not covered by an existing podcast. It's also a great bit of professional development for me (both meeting other iOS/Mac consultants and learning about their businesses).

As a new podcaster, I'm still learning the ropes, but frankly podcasting is pretty straightforward: You need to record good content applicable to your audience at decent sound quality and do so regularly. I originally was ambitious and thought the podcast would be bi-weekly, but now at episode 5, it's turned out to be a monthly schedule.

On the sound quality front, I did struggle at first, even though I've invested in good software and have a great microphone. Manton Reece (my guest on episode 3) gave me a great tip in the form of recommending The Levelator. This abandoned (but still functioning through a hack) program has been a lifesaver for a non-audiophile like me with regards to automatically adjusting episode volume to make it consistent throughout.

How much of an investment has Consult been? Roughly ~$200:


All of these tools make life a lot easier. There are free alternatives, but I find these costs very reasonable, the products better than the free alternatives, and I get support if I need it. I got a high quality free-standing (Larry King style) microphone for free as part of an instructional video series I did before. That would run another $100 I believe.

So how has the reception been? The feedback I've received has been really great. A few people I don't know have reached out to me on Twitter and email to tell me how much they enjoy the show. The majority of listeners are using Overcast (which makes sense given the community), so I haven't received any iTunes Podcast directory reviews yet. If you want to help the podcast, leaving a review in the iTunes Podcast directory is the number one way to help.

The number of listeners has been in the hundreds (~600), not thousands yet, but that makes sense given that I'm an unknown, have no marketing, and that the podcast is about a niche within a niche. I would even call it a success. I remember Saul Mora saying that the first couple episodes of NSBrief had only about 20 listeners each, so I feel really good about the numbers at this early stage. Part of that success has been the fact that I've had some really great guests on the show. A couple of them would even be considered "well known" in the Apple platforms programming community.

Here's a quick rundown of the five episodes thus far in reverse chronological order:

  • Michael Fellows - Michael is a fast rising star in the iOS/Android consulting world. He's the founder of Broadway Lab which he's grown from working solo to being a six person team in just three years. In my opinion he shared an incredible amount of wisdom in this episode that was hard earned through his rapid rise. 
  • Marcus Zarra - Marcus is a true software development and Apple platform veteran who is venerated for his wide ranging knowledge. Whether as a well known blogger, leader of a large consulting firm, or author of popular books, Marcus has truly made his mark on the community. It was an honor to interview him.
  • Manton Reece - Thus far this is the most listened to episode, probably because of Manton's celebrity in the community and his mention of the episode on his popular blog. I captured Manton at a very interesting time - just as he was transitioning into being full time indie (including doing quite a bit of consulting work). I'm a big fan of Manton and his must-listen-to in the indie community podcast Core Intuition.
  • Tobias Due Munk - Tobias was brave enough to be the first real guest on the show and I'm grateful to him for taking the leap. We had a wide ranging and very interesting discussion covering everything from his interesting path into consulting, to business differences between USA and his native Denmark. Tobias piqued listeners' interest and really set a great precedent for future episodes of the show.
  • David Kopec - How do you start an interview podcast as a relative unknown? Interview yourself! In retrospect this sounded like a much better idea than it actually was. Listening to it now, it does come off as a little eccentric, but you have to start somewhere.

I hope to continue having great interview episodes with great guests moving forward on the show. I also plan to experiment with topical episodes. I encourage any and all feedback - reach out to me on Twitter @davekopec.

I truly think Consult is a fantastic podcast, and not just because I created it. You can find the show notes, a link to the RSS feed, and iTunes directory link at ConsultPodcast.com


Posted in , , , , , , , , | 1 Comment

Why I Write in Pure Swift

I have had the pleasure of working on several Swift data structure and algorithm libraries over the past year, including SwiftGraph, SwiftPriorityQueue, and SwiftCSP. I wrote all of them in what I call "Pure Swift" (and maybe others are calling it that too). By Pure Swift, I mean Swift code that utilizes only the Swift standard library with no external dependencies and no use of Cocoa or Cocoa Touch (including Foundation).

Why write in Pure Swift? Swift has a small standard library, so sometimes being Pure Swift can seem somewhat limiting. Apple has already told us that they will be open sourcing Swift and releasing a version for Linux. It's a near certainty that the release will not include a version of Cocoa for Linux (although there is GNUStep and they say they will have bindings). So, if you're working on a project in Swift that doesn't need to make use of Cocoa and you want it to be portable to future incarnations of Swift (including those on other platforms), then you should write it in Pure Swift.

There's also the possibility that the future will bring a new UI framework from Apple that is written in Swift to begin with to supersede Cocoa, but I wouldn't hold my breath after its near thirty year history. But, if that remote possibility is to come true, then once again you will want your existing projects as much as possible to be in Pure Swift. For the present, by writing in Pure Swift you get automatic cross-platform compatibility between OS X and iOS.

Finally, there's something that just seems hobbled when you rely on too many Objective-C classes in your Swift code. It's hard to make value types work well with them, and there are several other incompatibilities like tuples.  I love Objective-C, but I want to keep my non-UI Swift code pure.

Posted in , , , , , , , , | 1 Comment

Dart for Absolute Beginners One Year Later

It's been about one year since the release of Dart for Absolute Beginners. The book was very well received by readers around the world. One review on Amazon even called it “…one of the best introductory texts on computer programming in general; bar none.” That's high praise indeed. The exclusively positive reviews in its first year have been very gratifying.

On the flip-side, Dart adoption has not reached the level that I hoped it would and that certainly has affected the book’s sales. The Dart team has been very supportive of the book – highlighting it on social media and participating in its foreword and an interview chapter (chapter 18). But that can't make up for the language’s lack of adoption. I don't think Google's announcement that the Dart VM will not be included in chrome has helped things. Whatever the case, you don't write a book like Dart for Absolute Beginners to make money.

I also created a video series that can be thought of as an accompaniment to the book, for my publisher, Apress. That series is yet to be released although I completed it some time ago. Truthfully, I have not received many updates on its status and I don't know when it will be released.

Dart Language Changes

The source code in the book, despite being written in the early days of Dart when the language was still evolving, is still valid for the current version of the language. However, the language has added some features that are not covered by the book. The most notable of these is async/await (which I anticipated in a note about likely future additions in the concurrency chapter). The Dart team also announced that a future version of the language will include null-aware operators and generalized tear-offs.

I don’t think these are a particularly huge issue given the intended audience of the book (absolute beginners), but it is an annoyance. If the book were written today, async/await would play a significant role in at least a couple of the book's eighteen chapters.

Dart Ecosystem Changes

This is where the larger changes have happened since the publication of the book. The most relevant to the book, is the elimination of Dart Editor (the IDE originally included with one’s download of the Dart SDK). I purposely didn't make the book a tutorial on using Dart Editor. I thought that was a good decision at the time, and its removal has proven me right.

None the less, the book does make mention of Dart Editor enough (especially in the first couple of chapters), that the Dart team's decision to eliminate it will prove confusing for readers. Unfortunately, I feel the alternatives available today are either too simple (DartPad) or too complicated (WebStorm with a Dart plugin) for the type of projects I designed for the book. I’m not sure which I would choose if I rewrote the book today.

Another ecosystem change, the aforementioned end of planning to put the Dart VM into Chrome, make some of the forward-looking statements in the book no longer true. The ecosystem has not yet coalesced around a single server-side solution or GUI toolkit. Therefore I’m glad that I did not “pick a winner” when addressing (or not addressing) these topics.

Is the Book Obsolete?

With the changes mentioned, the book is certainly no longer current. I think it’s still a fantastic introductory programming book and all of the topics covered are still completely valid. The source code is still valid. I think it still offers a ton of value, but I can see how the elimination of Dart Editor in particular, despite being a small part of the book, may confuse new programmers.

I don’t look forward to the inevitable “out of date” bad reviews. If Apress contacted me to do a second edition, I’d certainly be up for it. Will I contact them about it? Maybe – it depends how much free time I have in the next year.

Posted in , , , , , | 6 Comments

Swift Standard Library Signaling

The Swift standard library is small at best. Apple's documentation provides a starting point for understanding it. However, it does not cover the standard library in its entirety. For the curious, a more comprehensive look can be had over at SwiftDoc.org.

Popular programming languages of the past 20 years have tended to incorporate a large standard library. Consider, for example, Java and Python. Both have a batteries-included philosophy. On the other hand, older languages that made it big, like C and Fortran, tend to have small standard libraries. This distinction may be attributed more to the time when they were developed (in terms of hardware capability, especially memory & disk capacity) than anything else. It should also be stated that Java (with the JVM) is more than a programming language; it is a platform unto itself.

So, why in 2014 did Apple decide on such a limited standard library for Swift? Is it a function of the youth of the language? The standard library has evolved and slightly expanded over the past (nearly) year since Swift was released. It may very well expand in the future. There is a more obvious rationale for explaining Swift's anemic standard library than its youth though.

Let's consider other modern languages with tiny standard libraries. JavaScript was purpose designed to run within the confines of a web browser.  Since it piggybacks off of an existing platform with an extensive API (albeit retroactively designed for it), its standard library can remain relatively slim. In a similar vein, languages that run on the JVM, like Clojure and Ceylon, can take advantage of Java's extensive libraries and don't need large standard libraries of their own.

Swift was designed to work with Cocoa and Cocoa-Touch, also therefore piggybacking off of an existing comprehensive platform. By not including a large standard library, Apple is indicating to developers that Swift is expressly designed for its platforms. "Well duh," you might say. But sometimes corporations develop new languages that they hope to eventually have adopted by the wider world beyond the gates of their platform. Wasn't that Sun's hope for Java? Isn't that Google's hope for Go and Dart? They figure being in control of a language widely adopted across the entire computing world is only to their benefit and will lead to additional developers on their platforms.

Perhaps Apple is so large and influential that it has no such concerns. Or, perhaps Apple's need to work within the confines of its existing software technology trumped these pursuits. Or, most likely, perhaps Apple simply prefers to keep its language technology proprietary as a competitive advantage.

In some sense, Swift is to Cocoa as Clojure is to the JVM and JavaScript is to the web browser (as we know, it eventually broke free). Yes, it may be open sourced in the future, and there may be alternative implementations (see Silver for example); but Swift's small standard library is Apple signaling that it was not made for the world, but instead the enclaves of iOS and OS X. As developers, we have to fill in the gaps. If you head over to GitHub, you'll find projects that do just that – provide fundamental functionality in pure Swift (without utilizing Cocoa) that is usually provided by a standard library. I have two such projects in the data structure space: SwiftGraph and SwiftPriorityQueue.

Posted in , , , , , , , , , , , | 1 Comment
Copyright 2012-2016 David Kopec. Powered by Blogger.

Search

Swedish Greys - a WordPress theme from Nordic Themepark. Converted by LiteThemes.com.