New book
Engineering Software with Coding Agents is out
A method for letting a coding agent act in your repository while you keep the chain of responsibility, from ticket to production. Read the free sample on desktop or on your phone.
Latest from Salari
New articles, book releases and practical guidance, with the latest work first.
New book
A method for letting a coding agent act in your repository while you keep the chain of responsibility, from ticket to production. Read the free sample on desktop or on your phone.
New edition
Version 2.1 has 30 chapters and 46 figures, with a new free sample. It comes with the Engineering Companion: four PDF volumes with 30 worksheets, 6 game-day exercises, 16 templates and worked solutions.
New book
A field guide to leading outcomes you have no authority to command. Three moves, Surface, Shift and Secure, across 20 chapters and 16 templates.
New book
Architecture, reliability and evolution for mobile systems: 61 chapters plus appendices A to I on which boundary is worth its cost and how to change a live app without losing control.
New
iOS and Android interview practice books with a practice dashboard. Answer, inspect what was missing, correct it, then answer again under a changed constraint.
Book launch
A final review for senior Android loops, with 160 answer cards, exact spoken wording, traps, interviewer pushes and recovery lines.
New
Most essays now have an audio edition. Start from any article and continue through the playlist.
New assessment
A few questions about your platform, your timeline and what is weakest right now. You get one focused next step, not a reading list.
New free guide
The five stages where a mobile job search breaks, and which one is costing you. A short PDF guide from the hiring side, free.
New tool
Build and tailor a CV, match it to a job, create a cover letter and LinkedIn headline, review readiness and export the finished PDF.
Book launch
A production SwiftUI book about performance, Swift 6 concurrency, state, UIKit migration, tests and CI, taught through failures you can reproduce.
Mobile system design
The migrated app opens from its icon and handles links while it runs. Then a link arrives while the process is stopped and the app shows its home screen. The cause is one omitted line, and the test that catches it.
Mobile system design
The AGP 9 migration looked finished when Gradle help succeeded. Then the verification command asked for testReleaseUnitTest and Gradle could not find it. A small fixture shows the setting behind it and what to verify.
Mobile system design
On Android 17, an app targeting API 37 can reach the cloud while every local socket fails. A seven-scenario test separates app guards from OS enforcement and shows what each result proves.
Staff engineering
Staff Android work means owning build speed, app health and device fragmentation, and making thirty engineers faster.
Engineering Interviews
Every senior mobile candidate knows STAR. Most still give answers that cannot be scored, because the situation is long, the action is "we" and the result is "it shipped". A weak and a senior answer to the same migration story, the follow-ups that come next, and the "we" versus "I" trap, from the hiring side.
SwiftUI
Most SwiftUI state bugs come from ownership, not from wrappers: a value with two owners, a binding nobody needed, a store everything reads. The wrappers, the Observation framework and the environment, explained by who owns what.
Mobile system design
"Design a short video feed" sounds like a ranking question. On mobile it is a resource question: how many videos you prepare, how many players exist, what the cache throws away, and what the phone does when it gets hot. A worked answer from the hiring side.
Mobile system design
"The app is eventually consistent" describes no app. Each field gets its own choice: strong, provisional, eventual or human. Then come the parts users notice: what the screen shows while data converges, how an optimistic change rolls back, and which edit wins. Last write wins, hybrid logical clocks and CRDTs, with what each costs, for iOS and Android.
SwiftUI
A team decision, not a style preference. Since Observation, both sides render efficiently; what still separates TCA and MVVM is who may mutate state, how effects are represented, what a test has to prove, and what the team pays to learn, upgrade and one day leave the library.
Mobile system design
Most ADR templates were written for servers, where a bad decision can be redeployed away. Mobile decisions live on in installed builds. A copyable ADR template with a versions-in-the-wild section, three complete mobile examples, revisit triggers that name evidence, where the records live, and how they keep a decision closed.
Mobile system design
In an app that already has two good native codebases, Kotlin Multiplatform is a boundary: which rules become one implementation, who owns them on iOS, and what evidence stops the expansion.
Mobile system design
Most lists of the best software architecture books are written for backend systems. A mobile app adds clients you cannot recall, versions that stay installed for years and releases that wait for review. A reading list grouped by the problem you have, with what each book is for, where it stops on mobile, and which ones are mine.
Technical leadership
Most lists of the best books for tech leads and staff engineers rank the same titles and stop. This one groups eleven books by the problem you have this quarter: the role is unclear, you are choosing a track, you are right and nothing moves, teams keep colliding, or the hard part is the system itself. For each, who it is for and what it leaves out. Three are mine, and I say so where they appear.
Technical leadership
"We need a sprint for tech debt" is usually right about the code and usually unfunded. A debt case gets funded when it names the decision and the one person who owns the capacity, prices the debt as interest and principal in units your tools already record, and speaks in what that person is scored on. A one-page template you can copy, a filled example, and what to do with a partial yes or a no.
Mobile system design
A product manager asks for sync every fifteen minutes in the background. Neither platform will give it to you. Promise something else: work the user did is never lost, data is current when the app opens, and the screen says how old it is. What iOS and Android guarantee, checked against their documentation, and a design that survives process death and deferral.
Mobile system design
A BFF is usually sold as a way to turn many calls per screen into one. The harder half is organisational: someone has to own and run it, and every app version you shipped pins its contract. When a backend for frontend pays off, who owns it, how to change it safely, and when not to build one.
Technical leadership
Most status updates report effort and a colour, and the colour is a mood. A status update template for tech leads where green has to be earned: status definitions tied to evidence, an end-to-end path test behind every green, four lines that carry the week, and how to report bad news while it is still a planning input.
Staff engineering
Most comparisons say staff means bigger scope and more influence. From the hiring side the difference is narrower and easier to test: a senior engineer moves the problem, a staff engineer moves the decision around it. What changes in scope, decisions, influence and evidence, how interview loops and promotion committees read it, and the senior-plus trap.
Mobile system design
Server-driven UI does not remove the release problem. It moves it into a schema that every supported app version has to keep rendering. What it buys, what it costs, where it fits, and the rules that keep it from turning into a language.
Staff engineering
The usual 30/60/90 template plans activities. A staff role is judged on decisions. A week-by-week plan for a new staff engineer: map the hidden decisions and power, pick one stuck outcome, run Surface, Shift and Secure on it, and leave evidence a reviewer can open.
Technical leadership
Most design docs describe a solution well and still fail, because nobody named who decides, the objection arrived in the meeting, and nothing said what would reopen the call. A complete design doc template you can copy, what each section is for, how a staff engineer gets it approved, and when a short ADR does the job instead.
Technical leadership
The tech lead owns decisions about the system. The engineering manager owns decisions about people and capacity. Most comparisons stop there. This one, from the hiring side, adds what each role is evaluated on, the exact place a tech lead's authority stops, how to choose between the two paths, and what interviewers ask each.
SwiftUI
Most SwiftUI migrations measure progress in screens converted. The ones that hold measure it in boundaries: a stable entry contract, one owner for state, one authority for navigation, a rollback that is a flag and not a revert. A strategy for a large UIKit app that keeps shipping.
Mobile system design
A mobile release train is a schedule plus a set of decision rights: who cuts, who may board late, who calls go or no-go, who can stop it at night. How to set the cadence, run the cut-off, ship a hotfix while a train is in flight, and measure the train itself.
Technical leadership
The transition from senior developer to tech lead is not more of the same work. Your name goes on an outcome that depends on teams you do not manage, and being right stops being enough. What changes, a first 90 days built from that, the tech lead responsibilities that are evaluated, and the mistakes that keep strong engineers stuck.
Mobile system design
Most sync decisions start with a comparison table of products. The table is the last step. Before it come three decisions no product makes for you: what the app promises offline, who owns the truth for each kind of data, and which conflicts a machine may settle. A vendor-neutral guide for iOS and Android teams, with a build-or-adopt rule.
Engineering Interviews
Most lists of tech lead interview questions stop at the question. The loop does not. Eleven questions a tech lead round asks, what each one is scoring, the weak answer and the strong one side by side, and the follow-up that checks whether the strong one was yours.
Mobile system design
"We should rewrite the app" is usually said in a planning meeting by someone who is tired of the old code, and decided by someone who cannot see it. How to make the case either way: what a rewrite hides, which unit you are really changing, the evidence to gather first, the conditions that stop the work, and how to put it to a manager who wants a clean slate.
Mobile system design
Apple's phased release and Google Play's staged rollout both stop the spread of a build, and neither takes it back. What each store documents, what pausing and halting reach, why a crash-free number at 1 percent proves little, and how to write the halt rule before day one.
Mobile system design
The support window for old app versions is read off the tail of your own adoption curve, written down as two floors, and owned by a named person. Plus what a forced update cannot fix.
Technical leadership
Disagree and commit is usually taught as a meeting habit. For engineers, the commit half happens later, in pull requests, review comments and status reports. When to disagree, how to record the disagreement, what commit obliges you to do, the reopen criteria that keep the door open, and the risks you should never commit to.
Staff engineering
The review that decides your level is mostly over before you walk into it. What a calibration committee can read, the evidence ledger that turns staff work into proof while it is happening, and the one field that keeps a promotion packet from reading as inflation.
Architecture
On a server, cleaning up a feature flag is one motion. On a phone it is three, on three clocks, and the last one belongs to the installed fleet. Expiry by job, the order that survives old binaries, and how to price the flags you already have.
Mobile system design
Modularisation is usually sold as the cure for a slow build. A module is a rule the team pays for every week, in build configuration, review, navigation and onboarding. When a boundary earns that cost, when it does not, and how to tell you have gone too far, for iOS and Android.
Mobile system design
A remote kill switch is the one control you still hold after a binary is installed. How to design it so it works on the day you need it: what off means, safe defaults, caching, independence, reach, audit and drills.
Technical leadership
"There is no way we hit that date" is usually true, and it usually fails. A tech lead rarely owns the decision to drop a project or move a date. What you own is making the trade visible: whose call it is, the promise hiding inside the date, three options with one recommended, and the words that hand the choice back.
Technical leadership
Most escalations that go wrong were right to happen and wrong in the way they were fired: too late, too loud, to an audience instead of an owner. How to escalate as a tech lead: find the decision first, name the threshold before you need it, and send a brief the owner can decide without reconstructing the conflict.
Mobile system design
"Which architecture would you choose?" sounds like a pattern quiz. It is scored on whether you name the pressure before the pattern, and whether you know what each pattern costs to leave. A worked answer from the hiring side, for iOS and Android.
Mobile system design
"How would you migrate this app's architecture without stopping the release train?" is a question about the months between two diagrams, not about the destination. A worked answer from the hiring side, for iOS and Android alike.
Engineering Interviews
"Tell me about a time you influenced a decision without authority" is scored on whether you found the decision under the problem, moved it before the room and kept it closed afterwards. Persuasion is the smaller part. The structure, the follow-ups and the recovery lines, from the hiring side.
Technical leadership
Every team is green, and the feature has never once worked end to end. False green is rarely a lie. It is the truth from the wrong instrument. What a tech lead changes, the sentence that goes to the sponsor, and what an interviewer listens for when they ask how you know a project is on track.
Mobile system design
On Android the round is decided by one question: what does the green check promise when the process dies a second later? A worked answer for an offline field inspection app, minute by minute, with the follow-ups interviewers use.
Mobile system design
"Design Uber" is scored on one question: what does the driver's pin mean when it is 21 seconds old? A worked iOS answer, minute by minute, with the follow-ups interviewers use.
Mobile system design
"Design offline sync for a notes app" is decided by one question: two devices edited the same thing while apart, and both synced. Which one wins, and who decided? A worked answer from the hiring side, for iOS and Android alike.
Mobile system design
"Design the image loading for a scrolling feed" sounds like a library question. It is a memory question: what an image costs once it is decoded, who still wants it, and what you give back when the system asks. A worked answer from the hiring side, for iOS and Android.
Engineering Interviews
Merge intervals is the algorithm question that keeps arriving dressed as a calendar. A worked answer from the hiring side: what to ask first, the brute force, the insight, the code in Swift and Kotlin, and the follow-ups that separate levels.
Engineering Interviews
"Tell me about the worst bug you shipped" is scored on what you did between the first signal and the last change, on a platform where you cannot take a binary back. The structure, the follow-ups and the recovery lines, from the hiring side.
Engineering Interviews
Your first answer rarely decides a senior Android interview. The follow-up does. Five follow-ups, the answer that loses the point, the one that earns it, and what to say when you wobble.
Engineering Interviews
Your first answer rarely decides a senior iOS interview. The follow-up does. Five follow-ups, the answer that loses the point, the one that earns it, and what to say when you wobble.
Engineering Interviews
The iOS coding interview is rarely a puzzle. It is a small app task under a clock, and the score comes from how you build it, not whether it compiles on the first try. The five common tasks, what gets scored in each, and what to say when it breaks.
Engineering Interviews
Ten coroutines and Flow questions senior Android loops ask, what each one tests, the follow-up that decides the score, and four short bugs worth practising until you can fix them out loud.
An optimised profile is one a recruiter can find and a hiring manager can place at the right level in under a minute. Most engineer profiles fail the second test, not the first.
A headline has two jobs: come back in a recruiter's search and place you at the right level in one line. These examples are organised by level and platform, and each one says why it works.
Resume
Staff is not Senior with more technologies. A Staff resume has to show decisions that changed how other teams work, and most Staff candidates bury exactly that under a list of features.
Resume
There is no universal definition of Principal. There is a common thread: your decisions set the technical direction for more than one team, and the resume has to prove that without a list of titles doing the work.
Visibility
An engineer's brand is what a stranger can verify about your judgement before they talk to you. Most engineers have the work and none of the evidence.
Visibility
A portfolio website does one job: let a stranger verify your work in a minute. Most engineer portfolios are built to impress a designer and forget to prove anything to an engineer.
Mobile system design
The round is scored on the decisions, not the diagram. A worked answer for an offline-capable messaging app on iOS, minute by minute, with the follow-ups interviewers use and how the Android answer differs.
Swift concurrency
Swift 6 can prove that some code is safe from data races. That does not mean reference counting suddenly becomes non-atomic.
Swift concurrency
Swift cancellation is cooperative. Cancelling the task that is waiting does not automatically cancel the separate task it is waiting on.
Swift concurrency
Actor isolation is a concurrency guarantee. ARC is a lifetime mechanism. Treating one as a complete proof about the other is where the mental model starts to drift.
Job search
I posted a fake dream job to thin out the wrong connections. Requests went up, CVs arrived, and people tagged friends under the post explaining there was no job.
SwiftUI
Three failures that appear after the happy path: stale results, slow "lazy" lists, and state ownership that no longer scales.
SwiftUI
I ran into a typography inconsistency in a production SwiftUI interface, then reduced it to a reproducible case to understand what minimumScaleFactor was trading away.
Engineering Interviews
Interview preparation gets worse when everything looks important. The closer the interview gets, the more your calendar should force you to cut.
Engineering Interviews
Watching someone code can make you feel ready. Live coding exposes the gap between recognition, retrieval, and making your judgement visible under pressure.
Engineering Interviews
AI can produce a polished assessment. The harder part starts when a Senior engineer asks why the code exists and whether you own the decisions behind it.
Interviews
The code is only one part of a live round. The interviewer is also recording how you frame, choose, verify and recover while the screen is shared.
Interviews
The framework answer is only the surface. Senior judgement appears where JavaScript, native work and product constraints meet.
Interviews
The tool is not the decision. Senior test engineering begins with what failure costs, what evidence is trustworthy and who owns the response.
Architecture
A security requirement becomes useful when a team can observe the behaviour, test the boundary and know who owns failure.
Staff engineering
The platform changes. The staff transition does not: your work must improve decisions beyond the feature and beyond your own presence.
Career strategy
The most common reason capable engineers stall has nothing to do with code. It is how much coordination work lands on other people after you have finished.
Interviews
Two answers to the same Android question, both correct, scored completely differently. What senior loops are measuring once you clear the knowledge bar.
Featured book
Train for senior iOS live coding, code review and mobile system design rounds with worked problems and full mock interviews.
Book launch
A practical working laboratory for evolving, migrating, releasing and operating iOS and Android systems.
Career growth
The bridge from senior mobile engineer to Staff, covering systems thinking, architecture and technical influence.
Featured book
Fix the resume, LinkedIn and outreach signals that stop capable engineers from reaching interviews.
Fast track
A focused final review for the day before an iOS interview, built around concise answers and senior judgement.
Featured book
The complete iOS interview preparation system, from Swift fundamentals through senior architecture and leadership rounds.
Android interviews
Prepare for senior Android interviews across Kotlin, Compose, architecture, system design and production judgement.
Career strategy
After the loop, interviewers write notes and meet to decide your level. After the offer, your one written reply sets what you accept. How to feed the first and write the second.
Swift concurrency
Four Swift concurrency bugs that survive code review at good companies: actor reentrancy, leaked tasks, ignored cancellation, and the onAppear trap. With fixes.
Architecture
Why offline, device constraints, sync, app lifecycle and platform boundaries change the interview and the architecture.
Performance
A practical look at the client-side bottlenecks that make mobile apps feel slow after the backend has already done its job.
Architecture
A practical review framework for mobile architecture decisions: constraints, reversibility, ownership, migration and production proof.
Interviewing
The strongest candidates do not just answer the question. They show how they think about production risk, tradeoffs and recovery.
Career growth
How to turn mobile engineering work into evidence of scope, judgement and impact without exaggerating.
SwiftUI
Why production SwiftUI architecture is less about folder names and more about ownership, identity, effects and boundaries.
Staff engineering
The staff role means owning scope and decision quality across teams, and making other engineers more effective.
Swift concurrency
A senior interview map for async/await, actors, cancellation, task lifetime, Sendable and the bugs hidden around awaits.
AI
How to think about on-device AI, LLM features, privacy, latency, fallback behaviour and user trust in mobile apps.
Technical leadership
Good code review is a system for quality, ownership, mentoring and risk control.
Freelancing
Why independent mobile architecture work depends on clear problems, scoped offers, proof and delivery boundaries.