În acest interviu, vorbesc cu liderul dezvoltatorului iOS, Nick Lockwood, despre contribuțiile sale sursă deschisă, fluxul de lucru al acestuia și resursele educaționale pe care le-a găsit utile în mastering SDK.
Nick Lockwood este un dezvoltator de lider iOS și autor al multor proiecte populare de open source, inclusiv iCarousel, iRate și FXBlurView.
Nick a scris recent cartea iOS Core Animation: Tehnici avansate, publicată de Addison-Wesley, și am furnizat un extras din capitolul 5 alături de această postare.
Am luat prima carte de programare când aveam 12 ani. Nu-mi amintesc exact numele cărții - ceva de genul "Programare de bază pe BBC Micro" - dar a fost un moment crucial în viața mea.
Am studiat ingineria electronică și apoi informatica la universitate. Primul a fost interesant, dar nu foarte relevant pentru cariera mea viitoare; Acesta din urmă mi-a învățat fundamentele structurilor și algoritmilor de date, care s-au dovedit a fi destul de utile.
După absolvire am creat compania Charcoal Design, vânzând jocuri simple și utilități Mac scrise în REALbasic. Asta nu a făcut cu adevărat niciun ban, așa că am făcut niște dezvoltări de web independenți pentru a le face să se întâlnească.
Primul meu job real a fost ca un dezvoltator web front-end, care inițial nu părea să aibă prea mult de-a face cu programarea, până când JavaScript a venit într-adevăr de vârstă, iar dezvoltarea web-ului front-end a devenit o disciplină de inginerie software adecvată, fiind despre cei care știau cele mai ezoterice bug-uri IE 6 CSS.
Am văzut că iPhone avea să aibă un impact profund asupra webului mobil atunci când a fost lansat pentru prima oară, dar nu prea cred prea mult. În Marea Britanie, practic nimeni nu a cumpărat primul gen iPhone - a fost prea scump și am avut deja telefoane destul de bune (și mult mai mici).
Asta sa schimbat peste noapte când iPhone 3G a fost expediat. Am primit primul meu iPhone în iulie 2008. Și am cumpărat începutul dezvoltării iPhone 2, așa că am putut învăța să o programez. Am avut deja o discuție cu Obiectiv-C pe Mac, așa că am învățat destul de repede. Am scris Rainbow Blocks ca o aplicație HTML5 care rulează într-un ecran complet UIWebView (eram încă mai confortabil cu jQuery decât UIKit la acel moment) și l-am lansat ca open source.
Apoi am luat o pauză norocoasă deoarece compania pe care o lucrez a avut ocazia să construiască o aplicație pentru iPhone pentru unul dintre clienții noștri, și ca singura cu experiență pe iPhone, mi-a dat-o să construiesc. De atunci am fost un dezvoltator de iOS cu normă întreagă. De asemenea, am rescris Rainbow Blocks ca aplicație nativă cu sursă închisă.
Ca mulți programatori, am un defect de caracter care mă face să încerc întotdeauna să rezolv cazul general în loc de cerința specifică. Acest lucru mă face să abandonez aproape fiecare proiect pe care-l încep, pentru că mă împotmol în încercarea de a rezolva o problemă care este doar tangențială legată de sarcina de lucru.
Ca mulți programatori, am un defect de caracter care mă face să încerc întotdeauna să rezolv cazul general în loc de cerința specifică.
Hard disk-ul meu este plin cu proiecte pe jumătate terminate (sau abia demarate) care ar fi fost următorul mare lucru, dar nu vor vedea niciodată lumina zilei. Dar am constatat că sursa deschisă este un antidot al acestei probleme. Dacă scoatem acele bucăți utile de cod, le documentăm și le lipim pe Github, atunci eu încă pot salva ceva valoros din ideile mele abandonate.
De asemenea, treptat, deoarece am construit o bibliotecă de componente reutilizabile, am descoperit că aplicațiile de construire au devenit ca și asamblarea cărămizilor lego. În loc de "Asta va fi prea complicat", găsesc că pot răspunde majorității solicitărilor de funcții cu "Aha! Am o bibliotecă pentru asta".
Așa cum am construit o bibliotecă de componente reutilizabile, am descoperit că aplicațiile de construcție au devenit asemănătoare cu asamblarea cărămizilor lego.
În ceea ce privește motivul pentru care le împărtășesc? Nu este un act de filantropie. Obțin un avantaj personal imens de a face acest lucru, atât în ceea ce privește feedback-ul real (rapoarte de bug-uri, soluții și solicitări de tragere), cât și recunoaștere. Sursa mea deschisă este o vitrină pentru serviciile mele ca dezvoltator.
Simt o presiune foarte mare pentru a-mi menține proiectele, dar m-am așteptat la asta - este o parte din motivul pentru care i-am eliberat în primul rând. Nu sunt foarte bun la motivația de sine și lucrez mai bine când sunt sub o presiune externă, prin eliberarea de cod comunității știu că mă vor conduce să-l îmbunătățesc.
Cea mai dificilă parte este să știi când să spui "nu" funcțiilor și să tragi cererile. Este dificil atunci când cineva a petrecut mai multe ore adăugând ceva la unul din libs-ul meu pentru a spune "mulțumesc, dar nu mulțumesc", dar trebuie să o fac pentru a evita interceptarea caracteristicilor care face biblioteca mai rău în ansamblu.
Am trimis câteva dintre ele pe site-uri cum ar fi CocoaControls sau Binpress și le-am oferit ca răspunsuri la întrebările legate de stack overflow cum ar fi "Cum pot face un control ca coverflow" sau "Cum pot solicita utilizatorilor să evalueze aplicația mea". iCarousel a câștigat concursul de dezvoltare mobilă Binpress în 2011, ceea ce a contribuit probabil puțin la popularitatea sa.
Aceste zile am postat de cele mai multe ori un mesaj "priveste ceea ce am facut" pe Twitter si las-o sa creasca de acolo.
Niciodata nu am facut nimic cu Core Animation inainte de iCarousel. A fost un fel de proiect "Hello World" pentru cadrul Core Animation. Asta a fost în 2011, totuși - am făcut destul de mult cu ea de atunci!
Cartea nu a fost ideea mea; Pearson sa apropiat de mine și mi-a spus că fac o nouă serie de programare mobilă digitală și mi-a întrebat dacă aș fi interesat să scriu despre Core Animation. Se pare că ar putea fi distractiv, așa că am spus bine.
Deoarece UIKit este atât de puternic, o mulțime de dezvoltatori obține un pic confortabil în limitele sale și nu se aventurează dincolo de ea. Cred că există o concepție greșită că, dacă vrei să faci ceva fantezist ca interfețele 3D sau efectele de mascare, atunci trebuie să renunți să faci totul cu OpenGL.
Cred că există o concepție greșită că, dacă vrei să faci ceva fantezist ca interfețele 3D sau efectele de mascare, atunci trebuie să renunți să faci totul cu OpenGL.
Multe dintre soluțiile de tip cover-up care existau înainte de iCarousel au fost scrise direct în OpenGL. A fost un lucru obișnuit pe care oamenii l-au vrut să o facă, dar mulți dezvoltatori pur și simplu nu au nicio idee că Core Animation chiar există sau că este un API simplu, de nivel înalt care poate face cu ușurință aceste efecte fără a fi nevoie să lucreze la nivel de vârfuri și shadere.
Mulți dezvoltatori pur și simplu nu au nici o idee că Core Animation chiar există sau că este un API simplu, de nivel înalt care poate face acest tip de efecte cu ușurință fără a fi nevoie să lucreze la nivelul vârfurilor și shaders.
Celălalt lucru pe care am vrut să-l adresez cu cartea mea a fost performanța. Performanța este atât de ușor de greșit atunci când aveți de-a face cu o mulțime de imagini sau desen vectorial. Am văzut numeroase aplicații care jignesc și s-ar putea săriți deoarece dezvoltatorii nu înțeleg cum să folosească puterea firelor și GPU-ul. O bună înțelegere a modului în care Core Animation funcționează este crucială pentru a obține o performanță bună dintr-o aplicație.
Este destinat cititorilor intermediari, dar nu preia nicio preștiință a Core Animation.
Da, absolut. De fapt, unul dintre motivele pentru care am fost atât de dornic să o fac a fost din cauza oportunității de învățare. Niciodată nu înțelegi cu adevărat ceva până nu încerci să-l explici altcuiva. Am găsit multe proprietăți și caracteristici noi, în timp ce cercetăm cartea, precum și clarificăm multe dintre concepțiile mele greșite. A trebuit să rescriu capitolul 8 de mai multe ori pentru că atunci când am scris exemplele am constatat că animațiile nu au funcționat așa cum am crezut că au făcut (în ciuda faptului că le-aș folosi de ani de zile).
De fapt, sunt destul de conservatoare atunci când vine vorba de utilizarea de instrumente de productivitate. Am încercat o mulțime de lucruri, dar rareori rămân cu ei.
Eu furnizez Podspecs pentru majoritatea bibliotecilor mele, dar nu le folosesc de fapt. Acest lucru se datorează în principal faptului că urăsc bibliotecile statice - ori de câte ori este posibil să importesc direct fișierele sursă, astfel încât să pot urmări problemele din interiorul componentelor terților și să fac corecții sau îmbunătățiri.
Ori de câte ori este posibil, importesc direct fișierele sursă, astfel încât să pot detecta probleme în componentele terță parte și să fac corecții sau îmbunătățiri.
În afară de Xcode, folosesc doar Tower (pentru că suportul Xcode's git este fragil și nu-mi place să folosesc linia de comandă), Photoshop (pentru că nu am încredere în designeri pentru a tăia activele), Resizer (pentru conversia loturilor Retina la standard def atunci când sunt prea leneș să le reproiectăm) și SubEthaEdit (deoarece Xcode are reguli de indentare ciudate pentru fișierele sursă non-obj-C).
De fapt, eu folosesc rareori biblioteci din terțe părți. 90% din libs-urile pe care le folosesc sunt ale mele, iar dacă găsesc că sunt foarte dependent de un lib 3rd party, de obicei îmi dau propria versiune.
Admir cu adevarat munca lui Mattt Thomson, dar nu am obiceiul de a folosi AFNetworking pentru fiecare task de acces la fisierele de retea. Descărcarea unui fișier asincron pe o coadă de fundal are nevoie de o singură linie de cod. Există cu siguranță mult mai mult pentru a interacționa cu serviciile web, dar mai ales este extrem de specific pentru serviciul în cauză. Încă nu am găsit nici o bibliotecă de rețea terță parte care să ofere un beneficiu substanțial pentru rularea unei serii de rețele personalizate, dar poate că doar eu sunt.
Am folosit Mantle în ultima vreme și îmi place modul în care se ocupă de cartografierea proprietăților JSON, dar l-am înfășurat în ceva similar cu biblioteca mea BaseModel pentru a reduce placa de bază pentru a specifica căile de fișiere pentru persistență etc..
Nu pot sa ma gandesc la multe biblioteci de terte parti, pe care le-am folosit pe mai multe proiecte (SDWebImage, poate), dar am o gramada de proprii libs pe care le folosesc in aproape fiecare aplicatie pe care o scriu (StandardPaths, ViewUtils, BaseModel, AutoCoding).
Asta-i ceva de care mă întreb foarte mult. Aș recomanda cu siguranță
Început iOS 6 Development (cea mai recentă ediție a cărții de la care am învățat) și iOS 6: Împingerea limitelor. Este, de asemenea, merită vizionat cât mai multe clipuri oficiale WWDC posibil. Site-ul lui NSHipster al lui Matt Thomson merită cu siguranță să citească. Există multe alte resurse bune acolo. Cacao cu dragoste, Cacao este prietena mea, Cocoanetics, Ray Wanderlich, și blogul lui Mike Ash sunt toate în valoare de verificare. Cu toate acestea, am tendința de a folosi Twitter mai mult decât orice sursă singură pentru a rămâne pe lângă lucruri.