Tuesday, February 4, 2014

"I'd Like To Learn To Code!"

So, you'd like to learn to code.

First things first: that's great news!

Making software is one of the more meritocratic pursuits we have going right now and, if your goal is to make it into a career, you can do it as a self-taught coder without a formal degree. Better yet, many of the tools and learning resources are free... and amazing.

What Do I Need?

You need to be smart, although not necessarily scary-smart.

You need to enjoy this stuff. And you need to enjoy staying on top of it because things change really, really quickly... usually in fun and awesome ways, but usually at a relentless pace. We are a young industry; just a few decades old.

If you don't want to constantly change and adapt, consider something like furniture making. I do not mean that as an insult. Making furniture is awesome and takes a lifetime to master. Your children are more likely to fight over a piece of furniture you made than some code you wrote. What I mean is that the basic practices of furniture making haven't changed much in centuries.

I am serious: for anything other thing doing this on a hobby basis, you really need to enjoy the "constant change" part!

You Don't Need To Be Good At Math

It helps, of course! There are coding jobs that require it. If you're doing number-crunching for scientists, you'll need to know statistics. If you're doing 3D game programming you'll need to know matrix math and such. And so forth. And in general there are quite a few parallels between the thinking one needs for math and programming.

But generally speaking, there's usually not any math involved.

The Thing Nobody Tells You

If you plan on making this into a career, you probably need to be good with people. I know -- nobody ever says this, right? I truly believe this, though. You will be working with others and your job is to understand what they want and translate the needs of non-coders into code.

What Language Should I Learn?

Practically speaking, you'll need a few.

The good news is that most programming languages follow the same basic principles. Programmers move between them fairly easily... and we generally find this process pretty fun!

The reason why we have lots of programming languages is because different languages are suited to different tasks. Just like in the real world where we have a "language" to describe music (sheet music) and another "language" to describe math and so forth.

For example, web application developers are at least conversant in...

  • HTML, CSS, and JavaScript+jQuery to describe web pages.
  • A language like Java, PHP, Ruby, Python, Javascript, or C# that runs on the server and talks to the web browser
  • Some tools to store data have their own language like SQL, though often you can do this right from Java/PHP/Ruby/Python/C#/etc.

There are plenty of other paths one can take. For example, complex games are usually written in a mix of a nitty-gritty language like C or C++ and a "scripting" language like Lua. Web games are usually JavaScript. iOS applications are written in Objective-C. Android applications are written in Java.

Where Do I Start Learning?

There are so many possible answers here!

I'm not going to pretend to have a comprehensive knowledge of every resource, because nobody does.

I'd recommend the following as a first step. These online courses run in your browser; you don't have to buy or install anything on your computer. These are good for discovering if you're good at this stuff and find it fun.

http://tryruby.org/
http://try.jquery.com/
http://www.trypython.org/
http://railsforzombies.org/

One that I personally use and recommend is: https://www.codeschool.com

They offer a lot of free resources and if you enjoy them, you can access all of their material for $29 a month. Their "courses" are split into short, fun videos. You watch a few minutes of video, do a coding exercise in your browser, and then move on to the next lesson.

I also recommend Code School because their courses are organized into various "paths" - they have a Ruby Path, a Javascript Path, an HTML/CSS path, and so forth. If you complete all or most of them, you'll be pretty darn ready to develop web applications.

How Do I Actually Get a Job?

Coding is great hobby, obviously... doesn't need to be a job. But if you are trying to get paid for it...

Well, you could make a great application and sell it.

If you want somebody to hire you to write code the best way to get your foot into the door (when you have no prior experience) is to write some sample applications. Put them online and then put the code on GitHub, which is kind of like Facebook for writing code. Or contribute code to others' open-source applications... most of which are on GitHub these days.

One other thing to keep in mind is that your choice of languages will influence your employability a bit. For example, Microsoft's C# and Sun/Oracle's Java tend to be used in corporations. Open-source languages like Ruby and Python are more likely to be used at smaller companies and start-ups. Don't take my word for it; check the local job listings on Craigslist and see what's in demand in your area.

Tuesday, September 17, 2013

Technology: It's About Empathy, Dummy

In the real world, technology and software development are about empathy as much as they're about engineering chops.

Writing successful software, even if you're just writing an API or component for another coder, requires an understanding of your users' wants and needs.

The typical real world IT project goes something like this: something is going wrong, and you're asked to fix it with software. The people asking you for these solutions frequently have no idea what they want, and wouldn't have the technical vocabulary to describe it to you even if they knew. Worse, sometimes they think they know exactly what they want, and you need the finesse to tell them why their idea is wrong and suggest a better one ...all while helping them to feel as though they're playing an important role in the process, which they actually are, just not in the ways they're intending to.

And that's fine, actually, because if they know how to describe and write their own code they wouldn't need you. That's why you have a job.

There are certainly engineering jobs where empathy plays less of a direct role. If you're designing processors at Intel, or writing software to sift through telescope data to discover asteroids, you will perhaps be less concerned with others' needs.

Know, however, that those kinds of jobs represent a very small portion of the opportunities out there in this amazing field.

Also remember this: if you're just a "good coder" your job can be fairly easily outsourced. What they can't outsource so easily is your empathy and your understanding of intangibles.

Tuesday, March 26, 2013

Hey, Men! Let's Be Awesome.

There's been much talk about the role and treatment of women in the tech industry lately.

Let's step away from the cesspit of online debate and focus on some positive things we can do. There is a time and place for pointing out what others have done wrong. Since the rest of the Internet has that covered already, let's focus on awesome things we can do.

As men, let's:

  • Recognize that we have a position of privilege and power in the overwhelmingly male technology industry. "Privilege" doesn't mean you haven't worked hard and earned your achievements. I believe you when you say you've worked your butt off.
  • Recognize that, particularly if you're a white male, you may have never experienced what it's like to be in the minority. Let's not tell women or anybody else how they should feel about it. This does not mean you are bad because you are a white male! I'm a white male; I think I'm pretty alright.
  • Realize that a lot of women don't appreciate sexual jokes and conversation from men they don't know. Some enjoy it, some don't care, and many dislike it. They may even find it threatening. Even if you think this is dumb (it's not) then simply accept that a lot of women feel that way. We would not want our mothers, sisters or wives subjected to unwanted sexual conversations from strangers.
  • Realize we can still make jokes about boobs and penises. Nobody is taking that away from us. Let's save it for our friends (of any gender) who enjoy those kinds of jokes.
  • Realize that engineering is the art of creative problem-solving, and we benefit from others' perspectives. Solving problems involves understanding them. Often, this means understanding people. We need more perspectives, not less.
  • Realize that accepting women into our industry means accepting women. Not just accepting women as long as they "think like men."

This industry is important; I really believe in it. If you're reading this, I think you believe in it. We really hurt this industry when we exclude bright minds and new perspectives from our field.

So, let's be awesome.

Thursday, March 21, 2013

What Would A "Computer For Developers" Look Like?

"Workstation" computers typically seem designed for graphics/video professionals, or users who run scientific software.

Why have there been so few systems designed for software developers? The only example that really comes to mind is the Developer Edition of Dell's XPS 13 laptop. In this case, "Developer Edition" means that it comes preloaded with Ubuntu and Dell has sorted out any possible driver issues for you. (Dell, are you listening? I'll take one. Thanks.)

Software developers certainly seem like a market worth pursuing. There are over 1.25 million Americans who identify as software engineers or computer programmers. This is a well-paid profession full of people who use their computers in a demanding fashion for at least eight hours a day, nearly every day. Why aren't computer manufacturers falling over themselves to serve this market?

One reason is because it's hard to define exactly what a software developer would want out of computer hardware, other than "fast, has a nice keyboard, and is hopefully portable."

Virtualization might be an answer. Software developers (and QA professionals) love to run multiple operating systems on a single computer, to test their software and take advantage of tools that only work under a particular operating system. Even the most diehard of Linux developers often needs multiple Windows installs around, if she's making web applications and needs to test them on Internet Explorer.

Existing desktop virtualization software like VMWare and Parallels works well, but can be clunky. You can't boot a guest operating system without booting the host, and guest operating systema have limited access to hardware resources like GPU acceleration. Full hypervisors like Xen or VMWare vSphere get around this issue, but are complex to configure and administrate.

I'd love to see a company take Dell's "Developer Edition" approach a step farther and sell a machine with something like Xen preinstalled, so that we could install/migrate/clone/snapshot multiple operating systems as easily as we copy around .txt files today.

Dell, are you listening?

Apple, Mac Pros, and the "Halo Effect"

John Sircacusa makes a case for Apple to re-invest in the Mac Pro line.

In the automobile industry, there’s what’s known as a “halo car.” Though you may not know the term, you surely know a few examples. The Corvette is GM’s halo car. Chrysler has the Viper. ...Let’s talk about the Lexus LFA, a halo car developed by Toyota over the course of ten years. (Lexus is Toyota’s luxury nameplate.) When the LFA was finally released in 2010, it sold for around $400,000. A year later, only 90 LFAs had been sold. At the end of 2012, production stopped, as planned, after 500 cars. Those numbers should make any bean counter weak in the knees. The LFA is a failure in nearly every objective measure—including, I might add, absolute performance, where it’s only about mid-pack among modern supercars. The explanation for the apparent insanity of this product is actually very simple. Akio Toyoda, the CEO of Toyota, loves fast cars. He fucking loves them! That’s it.

I'm a big believer in the halo effect, but I question whether it can be achieved in today's computer market. Apple, of course, is limited to using the same Intel chips that the rest of the industry uses, and just about anybody computer-savvy enough to crave a faster computer knows this.

Imagine a slightly parallel universe where the entire car industry had standardized on engines and power trains from General Motors. You'd never get excited about the new Ferrari or the new Mercedes because, at best, it'd be powered by the same Corvette engine that every other high-end car is using. It might have nicer seats and a better stereo, but those are nice-to-haves, not things you lust over.

Additionally, computers have been "fast enough" for most users for years now. I'm a software developer and I push my CPU pretty hard, and the fact is that the CPU in my 2011 MacBook Pro is almost never a limiting factor.

Are there any other ways Apple could build a "halo product" in today's computer industry? (Their crown jewel, of course, is OSX but you already get that with every Mac.)

Possibility #1: The "GPU Beast Mac Pro." Suppose Apple sells a Mac Pro that's stuffed to the gills with the biggest, best professional-grade GPUs that nVidia offers. That wouldn't be a bad idea but unlike a faster CPU, very few users would benefit from extra GPU compute power. The vast majority of applications simply can't benefit from the speedup offered by GPU acceleration. Perhaps Apple could somehow make automatic utilization of GPU compute power more pervasive in OSX 10.9, but that's doubtful - Mail.app isn't going to fetch your emails any faster with the GPUs helping it out.

Possibility #2: The "4K Retina Display iMac Pro." Apple's shown an inclination to differentiate its high-end notebook lineup by introducing displays with densities approaching 300dpi. One has to believe they're itching to be the first to accomplish this on the desktop, though of course they're limited by what the display manufacturers can currently produce. What if the next "professional Mac" is a slightly more expandable iMac with an integrated 4K resolution display? It's only a matter of time before Apple brings the high-DPI concept to the desktop, of course - it's just a question of how exactly they'll target it, and whether or not it will be part of an expandable "pro" machine that many of us are hoping for.

Tuesday, February 5, 2013

Plus / Minus

We'll start with the "plus" - keeping it somewhat positive in 2013!

Plus Of The Week: Join.me

A few years ago, it seems like there was no drop-dead easy way to share your screen with a friend or coworker unless both of you were on a Mac and could use iChat's excellent screen-sharing feature. Services like LogMeIn required the installation of software; alternatives like VNC or Windows Remote Assistance were firewall-unfriendly.

Today, though, there are quite a few drop-dead easy alternatives that run inside a browser. Join.me, from LogMeIn, is one of them. About the only downside is that the person on the other end needs to have Flash enabled in their browser. There has to be something out there that functions in "HTML5-only" mode if Flash isn't installed, right?

Minus Of The Week: No SFTP in Windows Server 2012

It's kind of hard to believe that it's 2012 and Microsoft still ships a server version of Windows without SFTP, or some kind of substitute for it. (And no, FTP isn't a substitute)

There are third-party implementations, but they tend to be spendy and/or bereft of any user community, which makes me awfully wary of them.

You can allow SSH/SFTP access via Cygwin - which is free, free, free - but in my experience there's no way to selectively chroot accounts on an account-by-account basis. Which means that you can either lock all users in a single home directory, but you can't do it for some accounts and not others, so you're kind of out of luck if you want to give full access to admins and restricted access to other users. It's entirely possible, of course, that I'm mistaken on this. Drop me a line and correct me.

Sunday, February 3, 2013

I Know It's 2013 But Seriously: Office 2011 For OSX

I like Office 2010 on Windows. I like the Ribbon interface. Really, I do. As much as I'm a Mac guy for many things, I think that the Ribbon interface, when done well, is a great use of space and is far preferable to lots of tiny menus, nested three or four deep.

I certainly like it better than the iWork (Pages, Numbers, and Keynote) interface on OSX, with its tons of floating toolbars. You can't just drag a Pages window around, nooooo - you must also drag three or four separate windows at times. I assume that OSX will eventually get a version of iWork that carries over many of the lessons learned from creating iWork for iOS, but who knows?

Anyway. Here's what spawned this post.

What was Microsoft's OSX team thinking when they designed Office 2011 for OSX? Seriously, this is just horrible. It looks like somebody from 1995 traveled forward in time to 2010, had sixty seconds to memorize what OSX looked like, and then was transported back to 1995 whereupon he feverishly worked to recreate that look in an early version of Visual Basic.

There are extra bevels, some kind of bizarro tabbed interface, and the whole thing is a jumbled mix of flat icons and pseudo-3d-gradiant-having buttons. Why? Why? Dear God.

Office2011 OSX