Jurnalul lui viczam

Ma tenteaza sa incep sa scriu un jurnal despre cum lucrez si la ce lucrez. Un fel de blog, dar care sa fie mai mult centrat pe schimbat idei, decat pe monolog.
E o initiativa pe care as recomanda-o si altora, in special celor care sunt la inceput pe drum si au nevoie de ajutor.

Nu am gasit o reteta perfecta, dimpotriva, nu sunt nici pe departe atat de productiv pe cat mi-as dori si nu am un workflow tocmai eficient, dar tocmai d’asta vreau sa si scriu: poate mai sunt alte persoane care se confrunta cu probleme asemanatoare si vor sa schimbam idei.

Ca o scurta introducere, sunt developer de cativa ani buni, timp petrecut in mare parte cu JavaScript (mai recent si cu TypeScript). Am facut PHP primii 3-4-5 ani cu Zend Framework si Symfony. Am trecut la JavaScript pe front end (Backbone.js, Ember.js), apoi node.js, angular (1.3 - 1.5) si react. Am cochetat putin si cu Ruby si RoR (o perioada de cateva luni).
Pentru ca nu gaseam un framework la fel de solid ca Symfony, am ajuns sa imi scriu propriul framework, dupa care am gasit ceea ce aveam nevoie :slight_smile:
Am lucrat pentru cateva agentii web din Romania, pentru cateva companii din afara (SUA, Germania) mai mici sau mai mari. Proiectele au avut in general o complexitate medie (detalii cu alta ocazie).

De peste un an mi-am dat demisia vrand sa lucrez la proiecte proprii. Pentru ca m-am tot razgandit si renuntam la jumatatea drumului, n-am facut mare lucru exceptand https://hartaambroziei.ro care aborda o problema care ma afecta direct.

De vreo 2 saptamani am inceput sa ma concentrez pe react-native unde intentionez sa fac niste proiecte despre care voi scrie pe viitor.

Urmeaza sa impartasesc informatii despre felul in care lucrez, cum lucrez, la ce lucrez, ce cred ca sunt practici bune (sau cel putin au mers pentru mine). Din nou, nu detin niciun adevar absolut si nici nu caut razboaie de genul “ciocanul pe care il folosesc eu e cel mai tare, al tau e o prostie”.

Disclaimer: sunt web developer si voi vorbi doar prin prisma asta.

4 Likes

Incep prin a explica cum abordez eu invatarea unui subiect nou, fie ca e vorba de un limbaj nou de programare, framework sau chiar librarie (biblioteca).

Sa zicem ca vrei sa inveti laravel (despre care nu stiu foarte multe, intrucat nu l-am folosit niciodata).

Intai ma uit sa vad ce carti populare gasesc pe subiect. Am grija sa fie cat mai apropiate de versiunea curenta.

Exista cateva librarii online pe care le prefer: https://www.packtpub.com/, https://www.manning.com/, https://www.oreilly.com/, http://www.informit.com/, https://pragprog.com/. Dar asta nu inseamna ca aici voi gasi cele mai bune carti.

Caut si pe amazon.com la categoria “Books” si incerc diverse tipuri de sortari (Featured, Publication Date).

Apoi caut carti si pe twitter (https://twitter.com/search?q=laravel%20book), pentru ca stiu ca sunt si publisheri independenti care scriu carti bune.

Imi aleg un maxim de 5 carti (cele mai recente si mai populare) pe care le cumpar. In perioada in care eram la inceput si nu eram obisnuit sa dau banii pe carti, le mai si cautam pe diverse siteuri (da, se pot gasi si asa), insa e pacat cand stii cat efort a depus autorul.

Dupa carti, urmeaza video tutoriale. Aici am cateva subscriptions (egghead), dar mai cumpar si de pe udemy (aproape mereu la pretul ”real” - adica $10 - $15). Mai stiu si de https://www.pluralsight.com/ unde am avut subscription o perioada, dar la care am renuntat.

Merita ca atunci cand cumperi carti sa mai cauti si coupon codes pe google (“packpub coupon code”). Daca nu iti permiti vreo carte din diverse motive, da-mi un PM si iti spun de 2 site-uri unde le poti cauta, desi as prefera sa nu o faci.

Apoi caut sa vad cine sunt cele mai influente persoane din comunitatea respectiva si le urmaresc pe twitter si github. Pe twitter e relativ simplu sa ii gasesti, plus ca odata ce incepi sa ii urmaresti pe cativa, vei gasi mai multi din graf. Daca au newsletters, ma abonez la ele.

Apoi trec la github, unde caut cele mai populare repositories din ecosystems (core libraries, extensii, exemple de proiecte etc.). Pe astea le notez undeva sau le dau star.

Mereu citesc documentatia oficiala, citesc exemple de cod, le incerc, ma uit la proiectele populare cum sunt scrise, la github issues.

Dintre cartile alese, incerc sa citesc macar una cap-coada, apoi pe celelalte le “frunzaresc” (am zeci de carti necitite :slight_smile: ).

O practica pe care nu am incercat-o personal, dar am vazut-o functionand e sa stai pe langa cineva care stapaneste tehnologia respectiva (un fel de pair programming).

Alte idei?

poti sa dai exemple de niste carti relevante care chiar te-au ajutat sa inveti ceva in programare (orice, mai putin subiecte evergreen ca altgoritmica and stuff)?
mie mi se pare ca in ziua de azi daca a trecut suficient timp incat sa apara o carte buna despre un subiect… probabil esti prea tarziu pentru directia respectiva.
acum… e posibil sa fie obisnuinta si lipsa mea de rabdare, dar mi se pare mult mai eficient sa construiesti efectiv un proiect demo / test folosind documentatia oficiala completata cu resurse gen tutoriale punctuale.

Da, categoric: PHP in Action e printre primele. Acum, bineinteles, e outdated, dar atunci cand cartea a fost publicata, php era folosit in mare parte procedural. Tin minte ca mi-a placut foarte mult.

In general citesc carti specializate pe anumite subiecte si iti dau dreptate. Cand mai ma intreaba cineva cum sa invete react, mereu ii spun sa citeasca documentatia oficiala care este cea mai up to date, dar si foarte bine scrisa (e valabil pentru multe alte libraries).

O alta carte buna citita recent e Mastering TypeScript 3, iar pentru react stiu ca am citit acum cativa ani Fullstack React (deja outdated).
Pentru GraphQL de ex sunt cateva carti bunicele (documentia oficial e cam incompleta), iar pentru Node.js cred ca inca e de actualitate asta.

Majoritatea cartilor din genul asta au un lifespan scurt (cativa ani) in care au sens, dar asta nu inseamna ca nu merita citite unele.

In ceea ce priveste carti fundamentale care sa fie “evergreen”, se gasesc multe articole pe net (https://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read, https://simpleprogrammer.com/best-programming-books-2019/).

1 Like

De astazi o sa lucrez cate putin la o aplicatie care are ca scop incurajarea oamenilor sa planteze copaci.

Ideea este relativ simpla: marchezi o noua plantare pe harta adaugand locatia, specia de copac si o poza (selfie?). Stiu ca exista actiuni colective si poate astea merita promovate mai mult, dar si actiunile individuale au o importanta considerabila.

Ca tech stack voi folosi:

  • node.js cu MongoDB si nest.js
  • GraphQL
  • react-native pentru ca va fi o aplicatie de mobil.

Intentionez sa postez pe aici pe masura ce progresez si voi anunta odata ce am ceva gata.

Daca aveti idei despre cum pot face din asta ceva care sa aiba un real folos si care sa motiveze oamenii sa acorde mai multa importanta plantarii, atunci nu le tineti pentru voi :slight_smile:

Ca features care cred ca vor fi integrate:

  • un top al personelor cu cele mai multe plantari
  • indicatii despre cum se face o plantare (poate un tutorial video)
  • calculare amprenta de carbon in contrast cu necesarul de arbori
  • incurajare actiuni de grup prin care provoci alte persoane sa ti se alature

Alte idei?

1 Like

Sa-i putem da likuri la cel care planteaza copacii si comenturi si o funcrtie “buymeacoffee” :smiley: :smiley: ca sa-l motivezi si mai tare

1 Like

As vrea sa evit sa manageuiesc plati / donatii de orice fel, dar ramane de vazut.
Am vazut ca exista deja organizatii pe care le poti plati sa planteze pentru tine, desi le privesc cu un oarecare scepticism.

Cu un pic de intarziere, cu privire la o metoda de a invata orice, asa cum o descrie John Sonmez in Soft Skills: The Software Developer’s Life Manual e cam asa (din memorie):

  • cauti resurse
  • faci un plan pe baza subiectelor abordate in resursele gasite
  • filtrezi resursele si tii doa pe cele care au referinte bune si te invata ce vrei
  • incepi prin a invata minimul pentru un subiect, suficient ca sa poti face ceva singur
  • ca urmare te izbesti de probleme, ai intrebari, stii ce intrebari sa pui si te intorci la resurse ca sa adancesti subiectul
  • repeti procesul
  • explici altora ce ai invatat printr-un blog, video, etc, ca sa vezi si ce gauri au ramas in cunostintele tale si sa iti fixezi mai bine informatia
    Ar trebui sa fie 10 pasi, deci sigur am uitat eu ceva, dar gasesti in carte.

“Ai invatat un lucru nou cand stii sa il explici in termeni simpli” (some guy)

1 Like

Da, cam asa procedez si eu.

Cu ani buni in urma faceam greseala (pe care inca o mai fac uneori) sa citesc mult fara sa aplic nimic, dar e extrem de importanta partea asta practica.

Alta parte importanta din punctul meu de vedere este sa iti iei notite (chiar daca nu crezi ca vei reveni la ele). Pentru asta am incercat mai multe variante: google docs, github gists sau un github repo, evernote (l-am folosit cativa ani) si am ramas intr-un final la notion. Linkul catre notion e un link de referral, iar daca il veti folosi pentru signup veti primi $10 credit (eu primesc $5).
Notion e clar superior lui evernote si cam oricarei aplicatii de note-taking si pe langa faptul ca poti folosi kanban boards, to do lists, tabele, calendare etc, imi place care un suport excelent pentru code si syntax highlighting (marele minus al lui evernote).

Nu uita ca atunci cand iti scrii notitele sa nu iei code snippets cu copy-paste, ci incearca sa le scrii tu.

1 Like

marcarea locurilor unde se poate planta / unde e nevoie de copaci.
ca idee… nu prea poti planta copaci asa de capul tau oriunde si oricum.

2 Likes

De acord. De aceea si spuneam ca focusul va fi pe actiuni colective, organizate, dar asta nu inseamna ca nu vor fi binevenite si actiunile individuale, pe terenuri proprii.

Dar tot ca idee, macar sa se ajunga la “problema” plantarii absurde de sute de mii de copaci in locuri nepermise. Cred ca e cea mai mica grija intr-o tara in care se intampla defrisari masive.

Ieri am petrecut cateva ore pe setarea unei fundatii pentru API. Practic am extras dintr-un boilerplate propriu (care avea si niste chestii specifice) ce aveam nevoie:

  • un modul de autentificare cu JWT, social login (doar google si facebook) si mai multe resolvere necesare (CRUD, sign in, sign up, password recovery etc)
  • un modul pentru un commenting system asemanatoar cu cel pe care il am pe hartaambroziei.ro
  • file storage (upload prin GraphQL si stocare doar pe disk deocamdata)
  • image manipulation cu sharp
  • mailing
  • sentry integration.

Desi nest.js ofera o integrare cu mongoose, nu am folosit-o. Mongoose a ramas mult in urma din pacate si e un exemplu de pachet bun care si-a pierdut din stralucire odata cu leadershipul (Guillermo Rauch).
Asa ca am preferat sa imi fac propriul modul pt a lucra cu MongoDB in nest.js cu un focus pe aggregation framework si care ofera:

  • repositories cu CRUD, hooks (before / after), validation cu class-validator, joins (lookup) + altele
  • behaviors (withLogging, withSoftDelete, withTimestamps)
  • interceptor pentru transactions
  • un mod simplu de a create DataLoaders pentru entitatile definite
  • o abstractizare a aggregation framework prin care devine usor sa folosesti chained method calls, sa faci joins (lookups) intre colectii, sa folosesti change streams + altele
  • un CRUD service al carui scop principal este sa faciliteze construirea de resolvere care sa adere https://github.com/opencrud/opencrud
  • ResourceResolver - clasa pe care o poti folosi pentru a crea full-featured CRUD resolvers in doar cateva linii de cod
  • seeding si migrations

Asa ca azi am create f rapid un modul specific pentru business logic legat de proiect prin care deja am CRUD operations pentru trees :slight_smile:

Ca exemplu, cam asa arata o parte din TreeResolver:

@UseFilters(GqlSentryFilter)
@Resolver(() => Tree)
export default class TreeResolver {
  constructor(
    @InjectRepository(Tree)
    private readonly treeRepository: Repository<Tree>,
    private readonly treeCRUDService: TreeCRUDService,
  ) {}

  @Roles(Role.Admin)
  @UseGuards(GqlAuthGuard, RolesGuard)
  @Query(() => [Tree])
  findManyTrees(
    @Args() { limit, offset }: PaginationArgs,
    @Args({
      name: 'orderBy',
      nullable: true,
      type: () => [SortItem],
      defaultValue: [{ field: 'createdAt', order: 'ASC' }],
    })
    orderBy: SortItem[],
    @Args({
      name: 'where',
      nullable: true,
      type: () => TreeWhereInput,
      defaultValue: {},
    })
    where?: TreeWhereInput,
  ): Promise<Tree[]> {
    return this.treeCRUDService.findMany({
      where,
      limit,
      offset,
      orderBy,
    });
  }

  @UseGuards(GqlAuthGuard)
  @Mutation(() => Tree)
  async addTree(
    @Args('input', CreateTreeFromInputPipe) input: CreateTreeInput
  ): Promise<Tree> {
    return this.treeRepository.insertOne(input);
  }
}