Pe scurt, la ce ma ajuta diversele domenii/materii atunci cand dezvolt un produs software:
Algorithms- Sa invat cum sa rezolv probleme (matematice)*, si cum pot imbina solutii mai mici pentru a rezolva o problema mai complexa.
- Sa identific sabloane in rezolvarea diverselor probleme.
- *algebra liniara, statistica
Computational Complexity Theory
- Sa pot evalua cum va face sistemul fata daca am mai multe date de intrare. Daca de maine am de procesat de 100x mai multe date decat azi, va merge la fel de repede/va necesita la fel de multa memorie, de 100x mai greu sau de 1 milion de ori mai greu?
- Sa-mi pot da seama daca exista metode mai eficiente de a rezolva o problema. Exista categorii de probleme (unele chiar banale, la prima vedere) pentru care nu se cunosc rezolvari precise eficiente.
Data Structures
- Sa organizez eficient datele pentru a satisface cerintele. Am de cautat foarte des o carte intr-o biblioteca de 1 milion de bucati? Nu mi-e totuna sa compar mereu titlul de cautat cu fiecare din cele 1 milion de bucati sau sa efectuez doar 20 de comparatii sau chiar doar una singura.
Languages & Compilers
- Sa inteleg ce e un limbaj de programare.
- Sa inteleg ce se intampla din momentul in care scriu codul, pana cand vad rezultatele pe ecran.
- Sa invat sa scriu un compilator pentru un limbaj specific care mi-ar fi mai mult de ajutor intr-un anumit domeniu decat unul de uz general.
Imperative Languages (C, C++, C#, Java, ...)
- Sa exprim pas cu pas, ce trebuie sa faca sistemul.
Procedural Languages (C, ...)
- Sa impart codul in mai multe parti, reutilizabile.
Object Oriented Languages (Java, C#, C++, ...)
- Sa abstractizez mai bine codul, ascunzand detalii de implementare si permitand inlocuirea partilor.
Functional Languages (Haskell, ...)
- Sa exprim intr-un mod declarativ ce trebuie sa faca sistemul.
- Sa inteleg avantajele si dezavantajele structurilor de date immutable.
- Sa inteleg avantajele si dezavantajele functiilor fara efecte secundare.
Compiled Languages (C, C++, Java, C#, ...)
- Sa gestionez procesul de compilare, mai ales al unui proiect mai mare.
- Sa gestionez managementul si versionarea dependintelor.
Interpreted Languages (Python, Javascript, ...)
- Sa profit de faptul ca pot porni mai rapid o aplicatie dupa ce efectuez o schimbare.
Strongly Typed Languages
- Sa profit de ajutorul compilatorului in detectia unor greseli (chiar si la nivel de unitati de masura).
Loosely Typed Languages
- Sa scriu mai repede un prototip.
Debugging
- Sa inteleg, pas cu pas, ce se petrece la executia programului.
- Sa identific cat mai usor probleme.
Operating Systems
- Sa stiu ce-mi permite sistemul de operare sa fac.
- Sa stiu ce-mi poate oferi sistemul de operare pe tava astfel incat sa-mi fie mai usor sa dezvolt ceva anume.
- Sa stiu care sunt avantajele si dezavantajele alegerii unui anumit sistem de operare. (fara a ne limita la unul singur)
Networking
- Sa inteleg cum functioneaza retelele/internetul.
- Sa stiu cum sa dezvolt aplicatii ce folosesc eficient retele/internetul.
Concurrency
- Sa gestionez aplicatia intr-un sistem multi-tasking cum sunt mai toate din ziua de azi.
- Sa inteleg ce probleme pot aparea intr-un astfel de sistem.
Parallel Programming
- Sa profit de faptul ca procesoarele pot executa cod in paralel.
Distributed Programming
- Sa coordonez mai multe sisteme ce pot conlucra pentru a rezolva o problema.
Software Engineering
- Sa-mi organizez munca.
- Sa scriu cod in echipa.
- Sa scriu cod ce e mai usor de extins in timp decat de rescris in intregime.
- Sa testez cod.
- Sa identific & minimizez numarul de probleme dinainte de a livra produsul.
- Sa diagnostichez cat mai usor probleme aparute dupa ce am livrat produsul.
Software Architecture
- Sa gasesc solutii potrivite functie de cerintele analizate.
- Sa gasesc moduri de a interactiona cu alte sisteme existente.
Relational Databases
- Sa inteleg cum pot organiza datele intr-un mod relational.
- Sa inteleg avantajele (ACID) oferite de bazele de date relationale.
- Sa inteleg limitarile unui baze de date relationale.
Non-relational Databases
- Sa inteleg cum pot persista datele intr-un mod mai simplu/eficient pentru problema in cauza, daca n-am nevoie de tot ce ofera o baza de date relationale.
Command Line Tools
- Sa rezolv mai repede unele categorii de probleme, din linia de comanda.
- Sa gandesc unele solutii in termeni de streaming a datelor.
Requirements Engineering (to be determined)
Business Engineering (to be determined)
12/02/2018 completari: Algorithms, Operating Systems,
12/02/2018 mentionari: Requirements Engineering, Business Engineering
Edited by MarianG, 12 February 2018 - 17:09.