Category Archives: development

Team of Stars or a Star Team

One of the more exciting experiences I can think of as a manager is the opportunity to build a new team. Besides the chance to face new challenges, it has this feeling of going back to school after the summer vacation, with new books, new equipment and the feeling that you can be the best at what you do (well, now that you have new pencils!). In reality, though, recruiting in general and creating a team from scratch (or almost scratch) specifically is a very challenging task, and mistakes in that process could have a major impact later.

Even before you begin recruiting, you need to come up with a job description – besides being the baseline for the expectation setting between you and the candidates, the job description also serves as an initial sieve for the incoming flow of CVs. Set the requirements too high, and you may be losing good candidates (either because they feel intimidated or because they don’t meet a requirement you may be willing to compromise on – if you knew they were great in all the other stuff), but set them too low and you may be swamped with irrelevant CVs and spend most of your valuable time talking to the ‘wrong’ people. In order to understand where the bar should be set, I think there’s an important question you need to ask yourself – are you looking for a team of stars, or are you aiming to create a star team?

I think the answer is not trivial. Moreover, there are probably points in time where you’d be leaning towards recruiting stars and other times where you’ll be recruiting people to build a ‘star team’ (where no one in the team is necessarily a ‘star’ on his own).

For example, in a startup environment, probably in the early stages, where the team is very small, technological excellence is in many cases key for success and certain superb aspects of the product might be the difference between success and failure, you may want to have the star people who will be able to solely solve in innovative methods any given problem and make this one great feature which will make your product more attractive than the competition.

I think that once the team grows it both becomes harder to maintain an all-star team (there is more maintenance that needs to be done and less innovative work, there are increasing amounts of bugs that need to be solved, there’s more documentation to be created, and so on), and delivering quality software based on the customers requests, on time, is at least as important as innovation. The ability to share tasks, knowledge and ownership of a large codebase becomes critical to the team’s functionality. At this point you’ll still want to hire excellent engineers, but I believe you’ll want those who will appreciate the chance of being a part of something great, knowing that the fact that they belong to a star team actually makes them better engineers in the long run, giving them the chance to become that star engineer in (hopefully) their own startup in the future.

I enjoy working with smart people, as it gives me the chance to keep learning every day. I enjoy it less when the brilliant people I came to work with turn out to be brilliant jerks . I don’t think it’s an easy decision when you need to choose between a brilliant jerk and ‘just’ a great engineer. It becomes even harder when the brilliant guy, who already knows every bit and byte in your code has a negative effect on the entire team. If you want a great team, I doubt there’s room for that kind.

My bottom line is probably obvious by now – I believe in synergy, in potential and in giving the right people the chance to grow. I’ll take that star team, thank you.

iPhone development – continued..

So, last time I wrote about what you need to get started with iPhone development. I thought now would be a good time to talk about stuff I encountered along the way, which I guess almost anyone developing for iPhone would encounter eventually.

This time, let me focus on memory management. Objective-C uses reference counting for its memory management, and the version running on the iPhone does not have garbage collection (yes, this is so 90s..). Anyway, this forces the developer to actually think about what is being allocated, when and where. Apple has a guide about Objective-C memory management in its developers’ resources, begin by reading it.. Assuming it’s clear enough, the next thing to do is to actually check your program for leaks (if you’re a beginner, there are leaks – trust me..). Luckily, Apple provides a tool along with its SDK called Leaks (here’s one place where they didn’t think they need to be original..), which tracks your program in runtime (on the actual device, actually, which is pretty cool and also recommended, as the device behaves differently than the simulator in some aspects, and memory is one of those..) and marks places with leaks. The tool is very nice, but in my opinion not the friendliest tool for beginners. One downside is – it can only detect flows you actually went through (obviously), and it’s sometimes hard to determine what’s the actual source of the leak. Still, if there’s a leak during runtime and yo u passed through the leaking flow, this is your best chance to catch it.

One downside I didn’t mention about the Leaks tool and which is not that obvious, is that even when you find a leak, it’s not always obvious why are things behaving the way they are. It so happens that I found a great tool which does static analysis for Objective-C code, and the best thing about it is that when it finds bugs (memory leaks are bugs, duh..), it also explains why is that a bug. The tool is called Clang Static Analyzer and it’s pretty straight forward to use – you download it, extract it, and then use two simple commands:

/path/to/clang/installation/scan-build xcodebuild

(This should be executed in your program’s home directory).

Then, once this is done, a report will be generated and the last line in the verbose output of the build will have the report name, then simply execute>

/path/to/clang/installation/scan-view <report name>

Which will open a browser window with your report, links to the source files and cool embedded explanations. Once you do the fixes, execute the scan again and check there are no more errors.. note that the default behavior if there are no errors is not to generate a report at all..

So, that’s it for now. More on the fun in iPhone development next time..

iPhone development – the beginning

A while back, I assumed responsibility for an initiative which includes iPhone development. Having had to bootstrap the project, I went through the various stages of learning, technology choices, getting the right material and establishing the basic methodologies for developing mobile applications, specifically on iPhone, in a company. I will try to describe in this post some of the more interesting issues I encountered during the beginning of the development, hopefully it would save someone some time.

Let’s begin – just to make it clear, you better have a Mac to develop for iPhone. There are Hackintosh solutions with questionable legality, there are Terminal Server solutions (like Aqua Connect), and if your iPhone is jail-broken, you can even use it as the development platform (again, not an Apple legitimate method), but the best experience for the developer and probably the only Apple approved way of doing iPhone development.

So, after having a Mac around, the first thing someone beginning to develop on the iPhone platform should probably do is to register with the Apple Developer Connection. In addition to the basic resources you need, and assuming you plan to publish your stuff on the App Store (there are other, at the moment not ‘legitimate’, options to publish your application, I will not discuss them here), this is where you’ll get you certificates and keys to test your application on your device. Developing using the iPhone simulator is free, but deploying on an actual device will require you to pay, currently it’s $99 yearly subscription. If you plan to have a team of developers, choose the Team option (costs the same..), and if you’re a company, note that you’ll have to prove it (by sending Apple the relevant documents), this, too, will cost $99 per developer. The Enterprise registration is for development of Enterprise applications (not to be published on the App Store).

Once you’re done with that, you can start reading the relevant manuals, there’s a pretty good Objective-C (the language you use to develop on iPhone..) guide there, there are some other guides online (line here), and I personally recommend having a physical book around (Programming in Objective-C 2.0 is the one we’re using, and I think it’s very good). Having done most of my programming in other languages, I found some ‘weird’ aspects in Objective-C, but that’ll probably have to wait for another post.

Now that the basics are established, I found a great way to get acquainted with iPhone development is the Stanford online course. Although it doesn’t cover iPhone OS 3.0, in my opinion it’s a great starting point. I think it’s important to get to know the tools and the environment, maybe create a simple app (or try to) before going through the course (it’s probably the equivalent of doing the exercises given throughout the semester), but it really allows the beginner developer to close some holes which are hard to close when you’re just going through documents and online tutorials which, in many cases, have varying levels of assumptions on the knowledge of the reader. This course aims for beginners and tries to makes sure everyone knows their stuff by the end of it, regardless of their original background.

In addition to the Stanford course, again I found a physical book very helpful, and the best one I found is Beginning iPhone 3 Development, which both includes changes from iPhone OS 3.0 (complementing the Stanford stuff), and has some very common and good examples for iPhone applications.

Ok.. That’s the beginning. Right after that comes the part where you actually do stuff and hit some walls. I’ll try to describe some of the walls I hit and how I got around, over, under or through them in future posts (promises, promises..).

Update: I found this list of online resources from StackOverflow which looks very helpful..