iOS development... how do I get even better?
January 6, 2014 2:41 PM   Subscribe

I always see developers such as @rpetrich and @winocm making iOS jailbreak tweaks and things of a really high caliber of development. Just looking at some of their code and it's lower level complexity makes me feel intimidated and makes me feel like I'm just not good enough.

How much am I really supposed to know in terms of development and where do people even learn about these in-depth concepts? I know you can read about them, but some things you just don't know that you don't know.

It's really a matter of motivation for me in response to possible application to real personal and work projects. I don't want to learn anything useless and then there's so much information out there, sometimes I think even too much to the point where it's suffocating.
posted by antgly to Technology (13 answers total) 8 users marked this as a favorite
Practice, practice, practice.

Want to learn about low-level stuff? Do low level stuff. And suck at it for a while, and then realize a few years later that you're getting sort of OK at it, and then realize a decade later that you're actually pretty good. It helps to have colleagues to work with because your good qualities rub off on one another. I am fairly decent at C++ now because I worked with a guy who was very interested in writing C++ code in a C++-y way. Hence, forced practice with C++'s notions of inheritance and templates and the other things that C++ does that aren't like C.

I've been writing software for something like 17 years now and there's only a few areas that'd I'd publicly admit to being pretty good at them.

What is it you want to do? How experienced are you now?
posted by tylerkaraszewski at 2:47 PM on January 6, 2014

Do you have an advanced degree in CS/EE? The programmers that I work with that have that deep, low level knowledge almost invariably do.
posted by rockindata at 2:48 PM on January 6, 2014

Also, it's not particularly useful to compare yourself to superstars. If we were talking about running instead of programming, you might be reading Usain Bolt's twitter feed and thinking, "How come I'm not as good as him?" Well, partly it's because he has dedicated his whole life and all of his free time to training to be the best runner possible. If you want to be the best, you'll have to do that too. But partly, it's because he's Usain Bolt. He has a natural aptitude for running that most people don't. Even if you put in the same hours and practice that he does, you probably won't be as good as him. You might be very, very good, even in the top 3-5% of runners. But you probably won't be the big superstar that is easy to find in the media.
posted by tylerkaraszewski at 2:54 PM on January 6, 2014 [2 favorites]

Response by poster: @rockindata Due to family circumstances, I haven't had the real opportunity to get through a degree, though I currently am in college and have to work full time because I really have no choice, leaving me to study part time.

@tylerkaraszewsku I really want to know iOS development and general development concepts like the back of my hand. I would really need some questions (a list?) to know just how good or bad I may or may not be.
posted by antgly at 2:59 PM on January 6, 2014

You don't know what the useless things are, unfortunately. What might be a generally useless API could be the specific optimal one for your need. Nobody can anticipate these things for you, either.

If you're still new to an environment, take in everything you can, solve problems as best you can, and eventually you'll find yourself focusing on particular things that solve your problems or just seem more natural to you.

Knowledge isn't something you have to ration. Fortunately.
posted by ardgedee at 2:59 PM on January 6, 2014

iOS is iOS — the best you can do here is focus on the APIs that you use for your projects or areas of interest. If that's your interest, just work on projects that use those APIs. If you want to learn algorithms — computer science — pick a project you're interested in doing that makes use of them. For instance, is there a game you'd like to make for the iPhone or iPad? Game development, in particular, can make use of a lot of deeper, algorithm-focused programming concepts when improving on performance for routines for collision, rendering, data handling, etc. that are found in higher-level APIs like Sprite Kit or cocos2d.
posted by Blazecock Pileon at 3:04 PM on January 6, 2014

If you "really want to know iOS development and general development concepts like the back of my hand", the only way to do that is to dive in and do it. As tylerkaraszewski says, do it, suck at it, and get better at it. There are no shortcuts; you gotta put in the work. And with something like coding and/or app development, it's a lot of work that you can't slack off on, because it's constantly evolving.

A way to start finding a path might be to say to yourself "these are the top three things I want to learn/do/build/study in the next year", and devote as much time as you can to those three things. Repeat as one of the three falls off your list.

I don't want to learn anything useless

If you take the time to learn something, it's not useless. Whether you use the thing or not, there are invariably things you pick up along the way to that thing that will be of use to you in something else.
posted by pdb at 3:06 PM on January 6, 2014 [1 favorite]

Adding an anecdote to reinforce my earlier comment:

I, once, back when I was just starting out, was asked to write a web server that could perform a specific task. Well, this was probably the first real web server I had written, and I realized it needed to be able to handle multiple simultaneous requests, and the best way I knew of to do that was to use threads. One thread per connection. And I wrote it that way. And I showed it to my new manager. And he said, "Wait? What? Did you use one thread per connection? That can't scale, we may need to have thousands of simultaneous connections. Do you know about 'select'?"

No, I did not know about 'select'. And so I looked it up. And I rewrote the server using select (or poll, or one of those things, I don't remember). And ever since then, I have not written network applications with a new thread per connection. I have used various other I/O multiplexing mechanisms since then, more recently things like Boost ASIO. And this, along with many other similar incidents, is how I went from being not-so-good to better-than-I-was.
posted by tylerkaraszewski at 3:10 PM on January 6, 2014 [1 favorite]

In particular, data collections and selectors that operate on them hide away a lot of implementation details. Is that data structure using a linked list? A red-black tree? A lot of these aspects are hidden away when you use higher-level APIs so that you don't have to worry about them. But if you're interested, then you could use C to learn data structures, pointer arithmetic, memory management and re-implement your own. It's a good way to not only learn what lies underneath all the NS* classes you will otherwise use, but what their memory and performance characteristics are. You can take those lessons learned and apply them to other languages fairly quickly, once you know that language's particular syntax. Other languages like Java and C++ hide a lot of details behind abstraction, just as Objective-C does. Without learning assembly, learning C is probably the best way to get "close to the iron".
posted by Blazecock Pileon at 3:21 PM on January 6, 2014 [1 favorite]

Software is a really big subject. Being able to reverse engineer something and create a jailbreak is one skill. Being able to write a buttery-smooth UI that just feels perfect is another. Some people might be good at both, but there is nothing wrong with focusing on one, or the other, or something else all together.

I wouldn't call myself a developer, but when necessary, I've written code, debugged and fixed code, hacked in new features, etc, and I do some hobby development. I think it can be really easy to get sucked in to learning "the best way," to do things, when what's really best is to build stuff that does something useful, learn what you need to to get there, and then learn to make it better.
posted by Good Brain at 12:35 AM on January 7, 2014 [1 favorite]

From my experience working in the community of people who develop tweaks/extensions for jailbroken devices (such as @rpetrich) and jailbreaks and low-level operating system code (such as @winocm):

It really helps to know other developers who can work on problems with you, trade advice with you, brainstorm with you, and give you hints when you get stuck. People who develop for jailbroken devices mostly don't operate in a vacuum - they make friends with each other on IRC and Twitter, and they teach each other and help each other.

So I'd suggest working on finding other developers to collaborate with and chat with, especially people who are slightly more experienced. You might find this by helping other people in a development-oriented IRC channel or forum, contributing to an open source project, taking a class or workshop of some kind, joining a local hackerspace, or something else that I haven't thought of.
posted by dreamyshade at 1:34 AM on January 7, 2014 [1 favorite]

I agree with Blazecock - C is about as low level as you can go if you are a mere mortal. But you need to ask yourself why you would want to? If you want to become an uber-hacker, then yes it's a good idea, but give yourself a decade.

However, if you want a job as an app programmer, then learn Cocoa and ObjectiveC and Apple's APIs inside out. There's nothing wrong with that at all. You'll have a very well paid job. But there's always someone who will be better than you.
posted by derbs at 2:20 AM on January 7, 2014

I don't want to learn anything useless

That's why you're not good enough.
posted by flabdablet at 6:08 AM on January 7, 2014 [1 favorite]

« Older Help me learn how to do grown-up lady hair   |   What is this strange contraption that was attached... Newer »
This thread is closed to new comments.