We Need To Raise The Bar On Software Development
3 Sep 2016: Have reworded some of the questions after noticing I had to followup with an explanation. Have also added 15 more that IMO an experienced iOS developer should know.
Been heavily involved in the hiring process, evaluating CVs, asking technical questions, creating coding exercises, interviewed developers.
In the past, I used to teach object oriented programming in Java. Mainly to University students who were struggling in class and wanted some outside help. What I found as the main reason people were failing was they didn’t have a solid understanding of the basic principles of software engineering.
In the last 2 permanent job roles, in my long career, I have been heavily involved in the hiring process. Writing job descriptions, evaluating CVs, screening candidates by asking technical questions, going through coding exercises, interviewing developers for both cultural and technical fit.
You know something isn’t right when out of tens of CVs, only a handful pass the screening phase and a low single digit get an offer. It’s a funnel, a heartbreaking one.
The screening phase is really just a list of straight forward technical questions that you would expect everyone applying for the role to know. Contractors with £500 day rates, people looking for a permanent role, “juniors”.
For iOS, there are questions like this one:
Q: What does ARC stand for, how does it work and what are the benefits of using it?
A: Automatic Reference Counting. It works by inserting “retain” and “release” calls to objects, at compile time, where required with the benefit of “knowing” things like scope and usage. Effectively, it provides memory management for the trivial cases.
and another one:
Q: What is a retain cycle? How would you avoid it?
A: A retain cycle occurs when two instances have a “strong” reference to each other. You can avoid it by declaring one as “weak”.
To be clear. These questions are meant to be answered briefly, be complete and precise enough to demonstrate basic understanding. They are not in depth, not tricky, not to have a debate and definitely don’t prove much on senior status. Listening to how an answer is formulated says a lot about a canidate’s understanding, knowledge and confidence.
By asking questions on the fundamentals, it is easy to tell when people have a fixed, narrow understanding of these. A typical answer that keeps coming up when asking “Where would you use a protocol?” is “In a table view.”. (thinking of its datasource)
We all have our own share of responsibility for this.
As a manager, for asking your development team “to go faster” and “get things done”. Measure how long software delivery takes. Identify where and why you are wasting time; restructure. Give your developers room to breath, support them to grow professionally. You need to let them take their time to read that chapter in the book, to watch that conference talk, to practice what they know. Factor that in the time it takes to deliver software.
As a digital agency, for not educating your customer on technical debt, not managing expectations, risk and priorities. At least deliver quality software. Don’t just please the customer for the paycheque.
As an experienced developer, for not providing estimates, speaking up on technical debt, raising awareness on how to deliver quality software. You need to let your manager know how long implementing that requirement will take to get it done. That includes testing; and documentation; and every other business requirement. i.e. localisation, accessibility support. If you don’t have the faintest idea, ask for time to do your research.
As a teacher/mentor/knowledge bearer, for showing lack of responsibility, being careless, skipping over the details, not dedicating time to address questions. Explain the “why” and show the “how”. Spend the time and effort to properly explain. Develop people’s critical thinking. Teach them how to think for themselves.
Finally you, the developer, study, practice, challenge, repeat. Read books, attend courses. Get structured, formal education. Watch a talk on the subject. Preferably from the source. For iOS, that’s WWDC. Use ASCIIwwdc to search.
Read blogs, watch talks and keep an eye for references, bibliography, solid arguments. Mike Ash, nsconf, NSScotland, NSSpain, iosdevweekly
Follow subject experts on Twitter. Ask your team to code review.
Be critical! challenge! ask questions, compare and contract your own understanding.
A final year student from @univofstandrews impressed me the most with his iOS skills at @milkroundabout. Be curious, read up and write code!
In my opinion, here are 25 questions you need to know.
- What does ARC stand for, how does it work and what are the benefits of using it?
- What is a retain cycle? How would you avoid it?
- What is a weak and what is a strong reference?
- What would you use an enum for?
- What is a protocol useful for?
- What is a protocol extension useful for?
- What is the delegate pattern? Give an example.
- What is a block?
- How can blocks create a retain cycle? How do you avoid it?
- What would you use a NSNotification for?
- What are the basic navigation concepts in iOS? Can you describe where you would use each?
- What is a UIViewController responsible for? How would you typically implement one?
- What is an IBOutlet and an IBAction?
- Why is a UITableView good at displaying a long list of items?
- What is auto-layout? Where does it help?
- What is a storyboard? What is a xib? Where would you use each?
- Under what scenario would you choose a xib over code or vice versa?
- What is a file’s owner?
- What is a unit test?
- What is a precondition, a postcondition, an assertion?
- What are the four most common HTTP verbs related to a RESTful web service?
- Give a brief description of what a RESTful webservice is.
- What is JSON?
- How do you know that a network request was successful?
- What is a network timeout?
- What do you have to be mindful of when testing an asynchronous network call?
- What is the risk in blocking the main thread when performing a lengthy operation such as network access or a heavy computation?
- What is the difference between a NSOperationQueue and a dispatch_queue? Describe a scenario where you would use each.
- What is the difference between dispatch_async and dispatch_sync? Describe a scenario where you would use each.
- What are dispatch_group(s) useful for? Describe a scenario where you would use them.
- What is a ”Zombie object”? How would you use it?
- What is a memory leak?
- What is unbounded memory growth?
- What is an autorelease pool? Describe a scenario where you would use one.
- Given that an app uses a lot of memory, give some general advice on how to bring overall usage down.
- What are the risks associated with high memory usage?
- What is a memory warning? How would you typically handle it?
- How would you deal with a sudden spike in memory usage?
- What are the risks of a high CPU usage?
- How would you deal with bursts in CPU usage?