Skip to content
Sep 9 10

Tech Sector Unemployment Rate

by Topper

The New York Times published the article “Once a Dynamo, the Tech Sector Is Slow to Hire.”

The piece comes across a little “woe is me.” Which I find strange. The tech industry that I know and love isn’t hurting at all. However, as the article states, the mediocre development jobs and the grunt work is being shipped overseas. That’s good for America and American developers.

This particular paragraph in the article kind of sums it up (I think):

Ms. Mann said, that an employer has sent her job abroad since she received her master’s in computer science more than two decades ago; the last time was in 2001. This week she starts a yearlong program to upgrade her programming skills, paid for by a federal program that assists workers who have been displaced by international trade.

The tech industry is so wide open for positions right now. Companies are scrambling to find the best talent and it’s incredibly difficult to find excellent developers. Software development also has vastly greater resources available to the self starter than many other industries.

All it takes to become an excellent developer is to decide on something to learn, and go learn it. You probably don’t even have to buy a book. In general, the communities are very supportive of “newbs” and there are tons of open source projects that you could work on to provide you with “something real.”

In any industry, if you “show up for your job, work a little, and then leave” you will probably be out of a job. There are hungry, passionate people all over the world that want your job. The good news is that if you care about what you do, constantly learn, and adapt then it will be impossible to ship your job overseas.

All it takes is to love your job. Do that – and I bet you keep it.

Also: read Linchpin

Aug 16 10

The secret to happy employees

by Topper

The secret to happy employees isn’t a secret. Let them be creative, own their destiny and do great things. The money is ancillary. Create an environment where they can ship.

Aug 4 10

Meetings

by Topper

I’ve hated meetings for a long time. At my first “real” job at a medium sized company (1200 in the us) I became known as “the guy that hates meetings.” Since then I do my best to actively avoid almost all of them. However, lately I think I’ve realized the ones I like.

Meetings are for brain storming and/or getting to know someone (or a group of people).

Anything else and you should strongly consider why you just spent all that money to have a meeting.

Anyone else have any other ideas for good meetings? In this context I’m not considering a conference or a talk a meeting.

Aug 1 10

Agile?

by Topper

I don’t think your team needs to subscribe to any sort of project management framework. You’re all adults. You should work however best works for you.

However, if your immediate team is bigger than 10-15 people and/or doesn’t involve UI and business people, or you use gantt charts, or you don’t actively work with people from all disciplines…

You’re probably doing it wrong.

Unless of course your company only involves yourself.

Jun 10 10

Review: Byline app for iPhone

by Topper

The Byline reader for iPhone is awesome. It syncs your google reader account into an offline cache that is simply perfect for the subway. I am currently using the new free version which is ad supported. The ads are unobtrusive and the app just seems to work.

I did have one problem that after reading several articles I would keep getting a white screen. I have hundreds of feeds with thousands of articles and interrupted a sync – so maybe that was the cause.

The app is so good I missed two subway stops on the way to work. Woops! But I recommend anyone who has an iPhone and a Google Reader account to get this app.

I am in no way affiliated with the Byline team.

Jun 3 10

Path to Pretty

by Topper

I’ve been thinking a lot about my pragmatic approach to programming (sorry to steal from very great books).

I’ve never been the zealot that makes sure all code is perfect before shipping. I also recognize the tremendous value that aesthetic code brings (that’s why I’m a ruby guy). However, the important part of writing code is getting it out to the users. Those users might be your fellow coworkers (if you’re doing something back-endy) or they might be consumers.

My code will not matter unless someone is using it. So I get it out quickly.

That being said, I’ve seen us cut corners too many times and it always comes back to haunt. It costs hours and hours cost dollars. Bad code is not good for anybody.

My users will suffer from bad code because I won’t be able to react to their needs in a timely manner.

I think I have been intuitively following a pattern now for a while that seems to work out. I’ve been calling it “Path to Pretty” in my head.

It’s ok to ship code that I would consider lacking if the intent and next steps for improvement are clear.

By clear I mean that I must be able to go back in 2 months, look at the code and intuitively see what I was trying to do. If it’s not fully optimized or there are 20 extra lines, so be it.

As long as there is a clear path to pretty I now consider my code shippable.

Footnote: I’m sure I’m not the first person to do this and there’s probably some other name for this technique. This article was mostly for my own selfish benefit.

May 27 10

Zookeeper – Distributed cluster software

by Topper

I read this article about Apache Zookeeper at Igvita and was intrigued.

I started looking around for ruby libraries, but nothing was as mature as I would like. I forked a branch on github and chugged along on getting the jruby and c versions to work with the same api.

Zookeeper exposes a super simple API, but with that simple stuff you can build a lot of complex cluster logic.
[ruby]
zk = ZooKeeper.new(“localhost:2181”, :watcher => :default) #this will handle events using my built-in event handler
zk2 = ZooKeeper.new(“localhost:2181”, :watcher => false) #this one won’t receive watch events

zk.watcher.register(“/mypath”) do |event, zookeeper_client|
$stderr.puts(“got an event on: #{event.path}”)
end

zk.exists?(“/mypath”, :watch => true) # returns nil, but sets up the app to watch for the existence of /mypath
zk2.create(“/mypath”, “my data up to 1mb”, :mode => :ephemeral)
# create modes can be any of
# :persistent_sequential, :ephemeral_sequential, :persistent, :ephemeral

# now the registered watcher will fire (at least within a few 100 miliseconds)
# because we set that node to be :ephemeral – when zk2 closes its connection, the “/mypath” will go away
# but watches are one-time firing only – so we need to set it up again
zk.exists?(“/mypath”, :watch => true) #returns true

zk2.close! #or delete or whatever

# the watcher fires again and
zk.exists?(“/mypath”) #returns false
[/ruby]

A limited api of create, delete, get, set, watch lets you do some really advanced things around a cluster.

Examples

I added some abstractions based on the Zookeeper recipes.

Locks

[ruby]
#these 2 clients could be on totally separate boxes, different processes, whatever
zk = ZooKeeper.new(“localhost:2181”, :watcher => :default)
zk2 = ZooKeeper.new(“localhost:2181”, :watcher => :default)

lock1 = zk.locker(“/mypath”)
lock1.lock #true

lock2 = zk2.locker(“/mypath”)
lock2.lock #false

lock1.unlock #true
lock2.lock #true

# locks are also released on a client close/crash
lock1.lock #false
zk2.close!
lock1.lock #true
[/ruby]

Message Queues

I also implemented a simple message queue on top of zookeeper. However, because of the way the zookeeper “children” calls are made (returning all children), I wouldn’t recommend using this for queues where pending messages will reach into the thousands.

[ruby]
client1 = ZooKeeper.new(“localhost:2181”, :watcher => :default)
client2 = ZooKeeper.new(“localhost:2181”, :watcher => :default)

publisher = client1.queue(“myqueue”)
receiver = client2.queue(“myqueue”)

receiver.subscribe do |title, data|
# data will be whatever was published, title will be the node name
# for the message

$stderr.puts “got a message with: #{data}”

# having a true state from the block will mark the message as ‘answered’
# sending back a false will requeue

true
end
[/ruby]

More…

There’s a ton you can do with this thing (priority queues, meta data store, etc). I think it’s a nice addition to the ruby toolset.

May 5 10

WebSockets

by Topper

I’ve been thinking a lot lately that websockets are going to fundamentally change the architecture of the web. It lets you think about backend architecture in a whole new light. Projects like Nanite, EventMachine, Mongo, Redis… I think these are the future. I even question the utility of rails in a client-side-app-always-connected world.

I’m just pondering now… trying to flesh out what I think is going to happen and how we can embrace it sooner.

TO COME:
Events: Modern JavaScript architecture is actually pretty powerful, how can we take the “bolted on functionality” approach to servers.
Messages: They’re kinda like events right?
Request/Response Cycle: it’s probably dead?

Apr 26 10

New Facebook Javascript API

by Topper

UPDATE:
http://developers.facebook.com/docs/reference/javascript/FB.login
Only allowed to prompt for permissions due to a user action. Which is shitty, but I should have seen is documented.


UPDATE:
If you are seeing a repeating error in Safari and Chrome – it’s ok. It’s an ignorable error. If you can’t use login or prompt for permissions – it’s probably because (as stated above) those have to come from a click, double click, etc… some sort of user interaction.

I love the *looks* of the new Facebook javascript API. It’s got one major flaw though. It doesn’t work in Safari or Chrome. I have an app setup to use http://localhost:7000/ as the connect url and everything works *great* in Firefox. Things even work mostly ok in safari or chrome… but as soon as you try to launch the permissions dialog box you get the browser cycling through “unsafe javascript attempt to access frame with URL.”

Best part about this whole thing is: the facebook developer forums throw the *same* error.

Also, when I try to create an account on the forums (not using facebook connect) I get a “cannot connect to socket” error.

I guess I go back to their older clunkier API? Seems to be a number of complaints but no answers from Facebook.

Mar 1 10

What the world needs now is Croons, sweet Croons

by Topper

Looks like we just did a big publicity push for Croon My Tune. Everybody should go check it out.

http://croonmytune.com

or read about it here: http://jumpcanopy.com/?p=21