Wat een beginnende programmeur zou moeten kunnen. Welke taal, technologie en richting je moet kiezen

12 dingen die je helpen bij je studie en werk. We hebben voor u een tiental van de beste antwoorden van Stackexchange geselecteerd op de vraag “Wat moet een programmeur weten?”

Als je net begint met coderen, heb je je dit waarschijnlijk al meer dan eens afgevraagd vereist niveau kennis. We hebben geprobeerd de beste antwoorden van Stackexchange voor u te verzamelen die u zullen helpen beslissen basisset. De selectie is universeel en is niet afhankelijk van de taal, ontwikkelomgeving of besturingssysteem waarin je werkt.

Elke programmeur zou moeten weten:

1. Algemene concepten en wat ze betekenen. Bijvoorbeeld ontwerppatronen, bruikbaarheid, testen, stapelen, enz.
2. Heb inzicht in OOP.
3. Wees goed in minstens één taal. Niets bovennatuurlijks, gewoon variabelen, methoden, enz. kunnen initialiseren. Vanaf nu kun je snel leren.
4. Hoe je de code van iemand anders leest.
5. Studeer de hele tijd. Leer informatie correct te consumeren. Boeken, internet, wat dan ook.
6. Versiebeheersystemen. Niet alles is nodig, het belangrijkste is om de basisprincipes van elk te kennen.
7. Wanneer moet je om hulp vragen en wanneer niet?
8. Welk probleem moet worden opgelost? Heel vaak besteden programmeurs grote hoeveelheid tijd voor kleinigheden.
9. Vergeet soms trots en geef fouten toe zonder ze persoonlijk op te vatten.
10. Hoe je kunt denken als een gebruiker, en niet alleen als een techneut-programmeur. Het is belangrijk om te begrijpen dat mensen uw software gebruiken, dus u moet ze blij willen maken.
11. Hoe je kunt ontspannen. Rust is de sleutel tot productief werk. Wilskracht en koffie zijn niet genoeg.
12. Hoe te werken in een team. Een succesvolle programmeercarrière is voor de helft afhankelijk van het werken met mensen.

Het spreekt voor zich dat de selectie slechts een korte selectie is van alles wat je nog moet leren, daarom adviseren wij je om niet te stoppen en niet bang te zijn voor het onbekende. Ontdek altijd nieuwe talen, los nieuwe problemen op en wees niet bang als het in eerste instantie niet lukt. Programmeur zijn betekent altijd op de hoogte zijn van de nieuwste trends en op de hoogte blijven van nieuwe industriële technologieën. Verbeter en verleg dus de grenzen van uw kennis en vaardigheden.

Wil je meer ontvangen interessante materialen met bezorging?

De specifieke kenmerken van kennis en vaardigheden worden uiteraard grotendeels bepaald door het gebied waarin iemand werkt. Sommigen schrijven applicaties voor tablets, anderen ontwikkelen website-engines, weer anderen ontwikkelen speelgoed, enz. Maar toch zijn er enkele vaardigheden die voor elke programmeur nuttig zijn.

Wees op eerste voet met de computer

Dit is de eenvoudigste en meest fundamentele vaardigheid die inherent is aan elke programmeur. Het zorgt voor een grote interesse in computertechnologie, wat op zijn beurt aanleiding geeft tot bepaalde vragen voor de toekomstige specialist: om te beginnen: hoe installeer ik Windows? Hoe vind en hack je een modespeeltje? Wat is BIOS, hosting, systeemkernel, OOP? - en daar gaan we...

Dan beginnen je familieleden, vrienden, vriendinnen, vriendinnen van meisjes aan je te trekken, zeggen ze, installeer het programma, maak het systeem schoon van virussen, herschik Windows, enz. In eerste instantie vind je het zelfs leuk: het is fijn om je op één gebied competent te voelen of een ander. Maar dan rijst er een logische vraag: waarom zouden we er niet geld mee gaan verdienen? Natuurlijk is er enige terughoudendheid om geld van vrienden aan te nemen, maar het verkopen van je kennis en enthousiasme aan een serieus bedrijf is een heel reëel idee. Je kiest deze of gene programmeertaal, begint te leren en voelt je weer een complete noob.

Waar is dit allemaal voor? En aan het feit dat de wereld van de informatietechnologie een wereld van speelgoed is waar je mee zou willen spelen. Het begint allemaal met interesse in dit ‘speelgoed’. Als hij er niet is, is er geen programmeur.

Engels

Je kunt niet zonder Engels. Om een ​​programmeertaal te leren, zul je veel literatuur, videotutorials en documentatie moeten doorzoeken. Bijna alle (99%) primaire bronnen zijn in het Engels geschreven. Als je het niet weet, wordt het scala aan te bestuderen materialen aanzienlijk kleiner. Dienovereenkomstig zal de snelheid van het leren van een programmeertaal aanzienlijk afnemen.

Bovendien moet u Engels kennen om de syntaxis van de taal te begrijpen en om met succes een interview af te leggen.

Conversatieniveau en luistervaardigheid van het Engels zijn extra bonussen. De uitdrukking ‘Engels kennen’ betekent dat je het zogenaamde ‘technische Engels’ kent. Dat wil zeggen dat u gespecialiseerde artikelen en documentatie moet begrijpen, en dit is verre van hetzelfde als 'live' communicatie met buitenlanders.

Wiskunde

Wiskunde is niet zo eenvoudig als het leren van Engels. Het zou juister zijn om te zeggen dat logisch en abstract denken behoorlijk zou moeten zijn hoog niveau. Wiskunde aan een universiteit of school ontwikkelt de genoemde vaardigheden, dus wiskundeonderwijs is een groot pluspunt. Maar toch zijn er veel programmeurs die geen wiskundige opleiding hebben genoten. Er zijn zelfs mensen die dat niet hebben hoger onderwijs helemaal niet. Dit suggereert dat logica en abstract denken niet alleen met wiskundige constructies kunnen worden ontwikkeld.

Er zijn natuurlijk gebieden van programmeren waar je specifieke formules moet kennen, maar ten eerste niet overal, en ten tweede kun je er gaandeweg kennis mee maken en gespecialiseerde formules kunnen hierbij helpen. wiskunde programma's. Natuurkunde en wiskunde zijn vooral handig als je computerspellen van hoge kwaliteit wilt maken.

Gezelligheid

Gezelligheid is een van de belangrijkste eigenschappen van een goede programmeur. Feit is dat de meeste serieuze projecten in een team worden geschreven - dit is zowel handiger als sneller. Als je voor een min of meer serieus ‘kantoor’ wilt werken, moet je met mensen kunnen communiceren, onderhandelen, discussiëren en overeenstemming bereiken. Je zult ook moeten kunnen opschieten met je superieuren, die soms beter verstand hebben van programmeren dan jij, en soms helemaal niets van deze kwestie begrijpen.

Er bestaat een bepaalde mythe die zegt dat kluizenaar en isolatie een integraal onderdeel zijn van de aard van een programmeur. Voor het grootste deel zijn programmeurs zeer interessante en sociale mensen. En hermitisme is een bepaald beeld dat inherent is aan alle genieën, ongeacht hun beroep, of het nu programmeur, taalkundige, arts, enz. is.

flexibele geest

Intelligentie zelf (het vermogen om met de nodige kennis te opereren) is niet voldoende; het moet flexibel zijn. Een flexibele geest impliceert het vermogen om te leren (kennis aanvullen, verouderde informatie vervangen door nieuwe). Er zijn mensen die slim lijken, maar erg conservatief zijn. Ze hebben goed logisch denken, spreken duidelijk en consistent, maar helaas kunnen ze niets nieuws leren. Maar er is het tegenovergestelde: het hoofd is erg nieuwsgierig, het is in alles geïnteresseerd, alles is nodig, maar het hoofd is een puinhoop, dat wil zeggen dat het niet alle verzamelde informatie in een samenhangende positie kan verbinden of structureren.

Er is altijd een leercurve bij programmeren. De belangrijkste en moeilijkste test voor de vaardigheden van een beginner is het leren van de eerste programmeertaal. Het zal later gemakkelijker zijn, maar u moet niet vergeten dat u zich tijdens de behandeling volledig moet ontspannen professionele activiteit zal nooit slagen.

Het werk van zo'n specialist is een combinatie van puur technische handelingen verschillende talen programmeer- en creatief werk om de functionaliteit van het uiteindelijke softwareproduct te optimaliseren. Een specialist houdt zich bezig met het ontwerpen, creëren van een programma-algoritme, het schrijven van de code ervan en het testen ervan op functionaliteit.

Vereiste professionele vaardigheden en kennis

Al het bovenstaande is te leren. Ja, je moet je voortdurend ontwikkelen, maar de basisvaardigheden op het gebied van coderen kunnen in slechts een paar jaar studie in een goed ontworpen onderwijsprogramma tot in de perfectie worden ontwikkeld.

Een andere vraag is wat je moet weten om programmeur te worden. Hier is het onmogelijk om in 2 tot 5 jaar uit te groeien tot een professional als je je gespecialiseerde opleiding volgt minimale instelling schoolkennis. Omdat je je rivalen een stap voor wilt zijn en vanaf het begin van je carrière een voorsprong wilt behalen, zou elke (toekomstige) programmeur het vak moeten beginnen beheersen met een uitstekende basis:

  • in de wiskunde (hier – logica, waarschijnlijkheidstheorie);
  • natuurkunde;
  • computertechnologie;
  • Engels, Russisch.

Wat moet een programmeur weten om in de toekomst te kunnen werken (carrière, salaris, reputatie)? Je hebt een diepgaand inzicht nodig in de architectuur van de softwareomgeving waarin je gaat werken, de principes van coderen en kennis van de eenvoudigste methoden voor het maken van programma's.

Je moet veel weten: programmeerstandaarden, het concept van taakontwerp, methodologie voor het testen van bronnen. Hoe dieper een student zich verdiept in de basisprincipes van de wiskunde (analyse, grafieken), hoe sterker zijn positie, hoe breder het arsenaal aan gebruikte hulpmiddelen.

Extra vaardigheden die je competitief maken op de arbeidsmarkt

Welke vaardigheden zullen je helpen om snel de prestigieuze arbeidsmarkt te veroveren?

  • Het vermogen om in teamverband te werken voor een IT-specialist is 50% van het succes van zijn ontwikkeling op welk gebied dan ook (verschillende netwerkarchitecturen, programmeertalen).
  • Doorzettingsvermogen, doorzettingsvermogen, onvermogen om op te geven.
  • Een analytische mentaliteit + kritisch denken stellen u in staat a priori onmogelijke taken terzijde te schuiven. Het vermogen om de klant tijd te besparen is het belangrijkste voordeel van een professional.
  • Een algoritmische aanpak (systematisch karakter) helpt je sneller succes te behalen.
  • De eigenaardigheid van het beroep - werken in voorwaardelijke isolatie van de samenleving - bepaalt enkele gewoonten van de programmeur, wat in de toekomst zijn effectiviteit kan verminderen. Daarom zijn positieve communicatieve vaardigheden en het vermogen om uw ideeën te presenteren, de gewoonte om op de hoogte te blijven van populaire algoritmen en diensten ook nuttige vaardigheden.

Wat een beginner moet weten

Het werk van een programmeur is een non-stop evolutie van kennis. Het theoretische en praktische platform wordt gevormd tijdens de training, maar het vormingsproces eindigt daar niet - verschillende kennis moet worden bijgewerkt met verdieping in smalle gebieden. Maar betekent dit dat het onmogelijk is om met een minimum aan kennis en vaardigheden te beginnen? Voor een beginner is een goed CV voldoende:

  • vaardigheden in het schrijven van programma's in 2-3 populaire talen (Python, JavaScript, HTML worden als optimaal beschouwd voor een beginner);
  • kennis en begrip van algoritmen, databases, programmeerpatronen;
  • raamwerken bestuderen (softwareomgeving voor verschillende besturingssystemen - Windows, iOS).
10 maart 2016 om 09:56

Wat een programmeur moet kunnen om een ​​baan in de financiële wereld te krijgen

  • ITI Capital-blog,
  • Website ontwikkeling

In onze blog over Habré schrijven we veel over technologieën die in de financiële wereld worden gebruikt. Beurzen maken tegenwoordig gebruik van de meest geavanceerde software en hardware, zowel om de handelsinfrastructuur zelf op te bouwen als om online handelssystemen te creëren.

Tegenwoordig zijn er veel vraag naar wiskundigen, natuurkundigen en programmeurs. Mensen die in staat zijn handelsalgoritmen te creëren en daarop hoogwaardige software te maken. Veel programmeurs willen op hun beurt graag de financiële sector uitproberen; deze kan een aantrekkelijke combinatie bieden van interessante taken en hoge salarissen.

Vandaag zullen we het hebben over welke vaardigheden je nodig hebt om een ​​baan te krijgen bij een HFT-bedrijf, investeringsbank, hedgefonds of beursvennootschap. Bij de voorbereiding van het onderwerp is gebruik gemaakt van materialen van websites en quantstart.com.

Talen

Een van de populairste programmeertalen in de financiële wereld is al jaren C. Je moet het niet alleen kennen om oudere code te ondersteunen, maar ook om het werk met API's in elektronische handelssystemen te organiseren en gegevens uit te wisselen met providers.

C++ wordt de “hoofdtaal van Wall Street” genoemd omdat snelheid het allerbelangrijkste is voor handelssystemen. Hoe goed doordacht en gedebugd een handelsprogramma ook mag zijn, als het op een gegeven moment extra milliseconden besteedt aan “garbage collection”, kan dit tot ernstige verliezen leiden. Hetzelfde geldt voor de uitwisselingsinfrastructuur: allerlei soorten datatransmissiegateways en “connectoren” voor verschillende systemen.

Als gevolg hiervan zijn C++-programmeurs veelgevraagd bij bedrijven in de financiële sector - ook op de beurzen zelf. En deze situatie zal voortduren lange jaren vooruit - iemand moet de huidige infrastructuur onderhouden.

Voor een van onze eerdere materialen spraken we met een Russische expert in het creëren van handelssystemen, die, in situaties waarin maximale snelheid nodig is, de volgende technologieën gebruikt:

C++ en pure C zijn zeer geschikt voor deze taken. Dat komt ook voor snelle robots zijn bijna in assembleertaal gemaakt - hier is het de moeite waard om de mechanismen te noemen voor het direct lezen en schrijven van gegevens in het geheugen van een netwerkkaart, het omzeilen van standaardmechanismen voor het werken via stuurprogramma's, en het werken met "supersnelle programmeerbare hardware" zoals FPGA .

Volgens de maker van de QuantStart-bron en professionele handelaar Michael Hulls-Moore, kan een senior programmeur met 5-7 jaar ervaring in C++ tegenwoordig £500-700 per dag verdienen in Londen. IN Russische bedrijven Er is ook veel vraag naar C++-specialisten. Bovendien voelen dergelijke ontwikkelaars zich vaak aangetrokken tot professionele handelaren die een succesvolle handelsstrategie kunnen creëren, maar hulp nodig hebben van iemand die deze kan programmeren.

Ook C# en Java worden al geruime tijd door diverse financiële instellingen gebruikt. Voornamelijk door grote banken vanwege hun handelsinfrastructuur. Deze talen worden gebruikt om front-end interfaces te creëren en data te verwerken.

Op de Russische financiële markt worden specialisten die C++ en C# kennen zeer gewaardeerd. In onze blog spraken we eerder over hoe hij dankzij deze tools werk kon vinden bij financiële bedrijven en vervolgens zijn eigen handelssystemen begon te creëren. Dit is wat de held van het materiaal programmeurs adviseerde die graag een baan in de financiële wereld willen krijgen om in de toekomst te studeren:

Voor degenen die aan hun reis in de handel beginnen of op de een of andere manier geïnteresseerd zijn in dit gebied, zou ik adviseren hun aandacht te richten op platforms en talen op hoog niveau, zoals .NET en Java. Dit laatste is erg populair op de westerse aandelenmarkten; we hebben er tot nu toe minder, maar er zijn goede vooruitzichten voor een bredere verspreiding van deze taal. Dit betekent dat Java-programmeurs veelgevraagd zullen zijn bij financiële bedrijven, fondsen en makelaars. Toch is .NET een redelijk gesloten platform, en dat is ook zo hele lijn beperkingen. Het is niet erg geschikt voor low-latency- en HFT-handel.

Maar zowel in .NET als Java kun je vrij snel complete softwareproducten maken. Het grootste nadeel is dat ze niet de snelste zijn (als microseconden tellen).


Scripttalen als Python, MATLAB en R worden vaak gebruikt om quantummodellen te prototypen bij hedgefondsen en quantumhandelsunits bij banken.

Quanttraders en ontwikkelaars van financiële applicaties schrijven de code voor hun prototypes vaak in scripttalen. Deze prototypes worden vervolgens met behulp van snellere talen als C++ beschreven door ontwikkelaars die hierin gespecialiseerd zijn.

Client-server-systemen

Handelssystemen zijn per definitie gedistribueerd. Bijna alle bedrijven, van kleine bedrijven tot grote investeringsbanken, bouwen hun systemen met behulp van TCP-protocollen en UDP - soms is snelheid in de handel belangrijker dan het garanderen van de levering van gegevens.

Daarom moeten ontwikkelaars van handelsapplicaties een goed begrip hebben van de C-socketklassen: socket(), bind(), poll() en select(). Je hoeft er bijna nooit rechtstreeks mee te werken, omdat er al veel kant-en-klare bibliotheken voor zijn, maar het is gewoon nodig om te begrijpen hoe de interactie ermee werkt.

Bovendien is het voor ontwikkelaars van financiële software een pluspunt om de protocollen voor gegevensoverdracht op dit gebied te kennen, zoals , .

Stromen

Creatie client-server systemen en multithreaded programmeren in de financiële sector gaan hand in hand. Dit alles impliceert bijvoorbeeld het schrijven van een standaard TCP-server, een load-balancing-server, a hoge performantie- een ontwikkelaar die software wil maken voor een financieel bedrijf moet dit kunnen. Het is ook een goed idee om te begrijpen wat de klassen pthreads(), fork() en mutexes zijn, en wat het idee van een semafoor in het algemeen is. Als u Java gebruikt, moet u ook de synchronisatiemethoden begrijpen die voor deze taal bestaan.

Database

Financiële systemen zijn gebaseerd op databases, dus ontwikkelaars hebben diepgaande kennis van SQL nodig. Kennis van eenvoudige selectieverklaringen zal niet voldoende zijn - tijdens het werk zul je vaak moeten sleutelen aan het maken van opslagprocedures, het omgaan met indexen, enz. Bovendien moet u het verschil begrijpen tussen vergrendelingen op tabelniveau, paginaniveau en rijniveau.

UNIX
Handelssystemen gebruiken doorgaans een UNIX-platform (vaak Solaris en Linux). In de regel worden handelsterminals met grafische interfaces gemaakt voor Windows, terwijl UNIX wordt gebruikt om de ‘motor’ van handelssoftware te ontwikkelen.

Dit betekent dat ontwikkelaars eenvoudigweg moeten begrijpen wat de commando's tail, sed, grep, awk, tr en top zijn. Nog beter is het als de specialist weet hoe hij met vi, vim of emacs moet werken en niet bang is voor problemen veroorzaakt door een onjuiste $LD_LIBRARY_PATH configuratie.

Vaardigheden voor het opsporen van fouten

In een carrière als programmeur in financiële organisaties zal de mogelijkheid om kernbestanden te analyseren met behulp van dbx of gdb nuttig zijn. Een dergelijke behoefte komt niet vaak voor, maar als het toch gebeurt, is het beter om alles zelf te kunnen doen.

Conclusie

De aandelenmarkt is een uiterst hightech industrie die zich actief ontwikkelt, wat het werken op dit gebied zeer aantrekkelijk maakt voor IT-professionals die hun vaardigheden willen ontwikkelen. Tegelijkertijd, om deel te nemen interessante projecten het is helemaal niet nodig dat een ingenieur naar het buitenland gaat - nieuwe technologieën worden actief geïntroduceerd in Rusland beurs. In een van onze eerdere materialen hadden we het over de creatie van de SmartX-terminal en het Matrix-makelaardijhandelssysteem, waaraan u kunt deelnemen.

Tot slot nog één advies: maak je niet al te veel zorgen over het kennen van de innerlijke werking van handelsprocessen en financiële concepten. Dit kan uiteraard een bijkomend voordeel zijn, maar het gebrek aan economische kennis en kennis zal waarschijnlijk geen belemmering vormen voor een goede programmeur een baan vinden bij een financieel bedrijf.

P.S. Aan het ITinvest-ontwikkelteam voor project Werk boven

Deze tekst verscheen als reactie op de standaardreactie van “echte programmeurs” op mijn woorden dat ik een 1C-programmeur ben. "Ah-ah, 1c-nick, wat voor soort programmeur ben jij, op zijn best een scriptschrijver. Je verdiept je in je boekhouding en beschouwt jezelf om de een of andere reden als een echte programmeur, die weet hoeveel alles je moet weten?"

Als ik met belangstelling vraag wat een ECHTE PROGRAMMEERDER precies zou moeten weten, krijg ik meestal als antwoord een aantal specifieke problemen van de specifieke programmeur met wie ik op dat moment praat. Bovendien worden ze bijna gepresenteerd als de ware essentie van alle programmering als zodanig. Nou ja, zoiets als: "Als je niet weet hoe je semaforen in Delphi moet gebruiken, ben je geen programmeur." Of - "als je niet weet hoe hashtabellen werken, ben je geen programmeur." Ik werd dit beu, ik struinde het internet af en besloot in één post alles te verzamelen wat een ECHTE PROGRAMMEERDER zou moeten weten, volgens de ECHTE PROGRAMMEERDERS zelf. Lijst opgesplitst per kennissectie onder de snit

WISKUNDE

Numerieke methoden, dichotomie/Newton's methode, inter- en extrapolatie, splines, Gauss/Jacobi/Seidel-methode, QR- en LU-decompositie, SVD, kleinste kwadratenmethode, Runge-Kutta-methoden, Adams-methode, Newton-Cotes-formules, Ritz-methode, Bubnov methode -Galerkin, eindige verschil/elementenmethode, FFT/STFT, convergentie en stabiliteit, l-bfgs en andere quasi-Newton-methoden, adagrad, PARAFAC, kasuaris, interne puntmethoden, variatiemethoden voor Bayesiaanse inferentie, nesterov, automatische differentiatie, afwisselend kleinste kwadraten, wat elke computerwetenschapper zou moeten weten over drijvende-kommaberekeningen door Goldberg, Nocedal & Wright/Boyd & Vandenberghe

Algoritmen, Knut-Graham-Patashnik/Zorich/Winberg, Spivak/Dummit-Foote, wiskundige analyse, lineaire algebra, complexe analyse, functionele analyse, differentiële meetkunde, getaltheorie, differentiaalvergelijkingen/integrale vergelijkingen/variatierekening/optimale controle, genererende functies, reeksen, combinatoriek, waarschijnlijkheidstheorie/wiskundige statistiek/willekeurige processen/wachtrijtheorie, Markovketens , integrale transformaties (Fourier, Laplace, Wavelet), NZQRCHOS, wiskundige pakketten (Mathematica, Maple), categorietheorie

Informatietheorie, compressie, Huffman, RLE, BWT, LZ, foutcorrectiecodes, compressie met verlies (afbeeldingen, audio, video), informatie-entropie, de formule van Shannon, Kolmogorov-complexiteit, probleem van maximale entropie, divergentie van Kullback-Leibler, elias/shannon-Elias codering

Discrete wiskunde, K2, stelling van Post, circuits, eindige-toestandsmachines (DFA en NDKA), Kalashnikov-aanvalsgeweer, cellulaire automaten

Cryptografie, Schneier/Yashchenko, Kerkhoffs-principe, symmetrisch (DES, AES), asymmetrisch (RSA), PRNG-kwaliteit, Diffie-Hellman-algoritme, elliptische curven, hashing (MD5, SHA, CRCn), DHT, cryptografische sterkte, crypto-aanvallen ( grandmaster-aanval), WEP/WPA/WPA2 en aanvallen daarop, digitale handtekening en certificaten, PKI, HTTPS/SSL, zero-knowledge proof, drempelschema, murmurhash/cityhash, DKIM

Kwantumcomputers, Shor's algoritme, kwantumcryptografie

ALGEMENE BASIS VAN PROGRAMMERING

Multithreading, eetfilosofen, impasse/livelock/raceconditie/uithongering, atomiciteit,es, geheugenmodel/barrière/bestelling, CAS of LL/SC, wachten/vergrendelen/obstructievrij, ABA-probleem, vergrendelende containers schrijven, spin-lock, TLS/per-thread data, Amdahl's wet, OpenMP, MPI, map-reduce, kritische sectie/mutex/semafoor/condition variabele, WaitForSingleObject/WaitForMultipleObject ts, groene draad/coroutine, pthreads, toekomst/uitgesteld/belofte, actormodel, parameterserver, RDD (zoals te zien in vonken), stortbui SGD, wachtvrij, stapelbaar versus stapelloos

Berekenbaarheid, Turing-machine, normale Markov-algoritmen, Post-machine, Diophantische vergelijkingen van Matiyasevich, Kerk-lambda-functies, gedeeltelijk recursieve Kleene-functies, Sheinfinkel combinatorisch programmeren, Brainfuck, gelijkwaardigheid van Turing-moerassen, probleem met stoppen en zelf-toepasbaarheid, telbaarheid van een reeks berekenbare functies, RAM-machine, Tarski-algoritme, SAT/SMT-oplossers, theorie van formele systemen, interactieve bewijzen, Lewin-Cook-stelling, 3SAT, PSPACE = NPSPACE,

Algoritmen en combinatorische optimalisatie, Cormen/Skiena/Sedgwick/Knuth/Aho-Hopcroft-Ulman/Papadimitriou/Shriver-Goldberg/Prep Arata-Shamos/e-maxx.ru, datastructuren, algoritmen, complexiteit, Landau-symboliek, Acra's stelling Buzzy, tijd-ruimte-tradeoff, complexiteitsklassen, NP-complete problemen, KMP, grafieken en bomen, stromen in netwerken, Kirchhoff-matrix, zoekbomen (vooral RB-boom en B-boom), occlusiedetectie, heap, hash-tabellen en ideale hash, Petri-netten, Russisch boerenalgoritme, Karatsuba-methode en Winograd-Strassen-matrixvermenigvuldiging, sorteren, hebzuchtige algoritmen en matroids, dynamisch programmeren, lineair programmeren, diff-algoritmen, gerandomiseerde algoritmen en fuzzy zoekalgoritmen, pseudo-willekeurige getallen, fuzzy logica, gusfield (achtervoegselboom, stringuitlijning), motief zoeken, scanlijn, cache vergeetachtig, trechtersortering, VEB-lay-out, rootoptimalisatie, algoritmen voor dynamische grafieken, rekenmodellen (RAM-machine/pointermachine/beslisbomen, enz.), algoritmen in geheugenhiërarchieën/ streaming-algoritmen, time forward-verwerking, bereik en rang, LSM-bomen, gebufferde a-b-bomen, toku-bomen, persistente structuren, beknopte structuren, verliesgevende structuren (bloom/bloomier-filter, hash-tabellen met valse positieven), plaatsgevoelige hashing, ruimte -tijdafweging in hashtabellen, planningsstrategieën

Machine learning, Tibshirani/Bishop, benaderingen van AI-modellering, herscholing/kruisvalidatie, Bayesiaanse netwerken, neurale netwerken, Kohonen-netwerken, Restricted Boltzmann-machine, gradiëntafdaling/heuvelklimmen, stochastische optimalisatie (Monte Carlo-methode, gloeimethode, genetische algoritmen, ant-algoritmen), SVM, gradiëntversterking, clusteranalyse, hoofdcomponentenmethode, LSH, versterkend leren, MDP, ophalen van informatie/datamining/natuurlijke taalverwerking, computervisie, Szeliski, OpenCV, beeldverwerking, OCR, Sobel-filters, Haarcascade , Viola-Jones framework, SURF, introductie tot de psychofysiologie van het gezichtsvermogen, IPython/pandas/scikit-learn, (ME)HMM, CRF, label bias problem, stacked NN, LeToR, factorisatiemachines, autoencoders, RNN/CNN, aparte taken zijn beter in plaats van NLP (taalmodellering, co-referentiedetectie, tekst chunking, POS-tagging, probabilistische parsing, statistische machinevertaling, spelfoutcorrectie, beantwoorden van vragen, NER, collocatiedetectie, tekstsamenvatting, spraakherkenning, feitenextractie, sentimentanalyse ), efficiënte softmax-berekening, functie-engineering/selectie, kwaliteitsschatting, Manning/Jurafsky/McCallum/Koehn, latente onderwerpen (LDA, Chinees restaurant, pLSI), parallelle coördinaten, vowpal wabbit, NLTK, gestructureerd leren, EM-algoritme, contrastieve divergentie, optimale hersenchirurgie, verspreiding van overtuigingen, semi-gecontroleerd leren, inductief versus transductief leren, kerneltruc, discriminerende/generatieve paren (zoals gezien door Ng & Jordan), leren van reeks tot reeks, bagging, analyse van sociale grafieken, aanbevelingssystemen/collaboratieve filtering, multimodaal leren

ALGEMENE PRINCIPES VOOR HET SCHRIJVEN VAN PROGRAMMA'S

Architectuur en codestijl, McConnell/Fowler/Leblanc/Gamma/Alexandre Rescu-Sutter/Butch, defensieve programmering, patronen, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, codemetrieken, oom Bob

Ontwikkelmethodieken, Waterval/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE

Ontwikkeltools, IDE, IntelliSense, debuggers (VS/Olly/WinDbg/kdb/gdb) en tracers (strace/ltrace), DWARF debug-informatieformaat, disassemblers en decompilers (IDA/HexRays/Reflector), versiecontrolesystemen (SVN, GIT ), merge/branch/trunk, bestands- en branch-naamgevingssystemen, continue integratie, ant, codedekking, statische analyse (lint, cppcheck), dynamische analyse (valgrind, fuzzing), softwareverificatie en -validatie (Frama-C, RAISE (RSL ), Coq), profilering, bugtrackers, codedocumentatie, build-systemen (CMake), pakketbeheerders (NuGet)

Frameworks, Qt, moc en meta-informatie, slot-signaalconcept, Summerfield-Blanchette/Schlee, PoCo, industriële bibliotheken: GMP, i18n, lapack, fftw, pcre

GUI-ontwerp en informatiepresentatie, Raskin/Tufty, bruikbaarheid, basisprincipes van ontwerp en typografie, Fitts' wet, basisprincipes van lay-out, LaTeX, algoritmen voor datavisualisatie (zoals te zien in d3), subpixelweergave

Testen, unit-testen, functioneel, belasting, integratietesten, UI-testen, mocks/stubs/spies, armatuur, geuren en testpatronen (Osherove/Meszaros)

PROGRAMMEERTALEN

Algemeen begrip van programmeertalen, grammatica's, Chomsky-hiërarchie, Myhill-Nerowd-stelling, pomplemma en Ogden's lemma, Kleene-algebra, NDKA → DKA, algoritmisch onbeslisbare problemen in formele talen, Dragonbook, Friedl, regexps en hun complexiteit, PCRE, BNF, Boost .Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, statische codeanalyse, compilatie/decompilatie/obfuscatie/deobfuscatie, Clang/LLVM/XMLVM /Emscripten , GCCXML, OpenC++, virtuele machines bouwen, JiT/AoT/GC, DSL/DSEL, vervanging op de stapel, typecontrole/type-inferentie-algoritmen, CYK-parser, geavanceerd compilerontwerp en implementatie door Muchnick

Assembleertaal, Zubkov/Hyde/Drepper/Kaspersky/Fog/Abrash, x86, FPU/MMX/SSEn/AVX, AT&T en Intel-syntaxis, masm32, macro's, stack, heap/heap managers, oproepconventies, hex-codes, representatie van machinegegevens , IEEE754, kleine/grote endian, SIMD, hardware-uitzonderingen, interrupts, virtueel geheugen, omkeren, stapel- en heapverstoring, retourgeoriënteerd programmeren, alfanumerieke shellcode, L1/L2/RAM/paginafout en hun timing, ARM-assembleertaal

C++, standaard, Comeau, 1TBS, Stroustrap/D&E/Josattis/Vanderwood, Dewhurst/Meyers/Sutter, RAII/copy-and-swap/exception-safety, regel van vijf, Alexandrescu/Abrahams-Gurtovoy, type wissen, CRTP, NVI , SFINAE, Koenig lookup, Duff's device, Boost, Sick-Lumsdain/Karlsson, TR on C++ performance, Stepanov test, forwarding problem/move semantiek, SPECS, GotW, Meyer's singleton, cppgm

C++-compilers, kenmerken van de standaardimplementatie, implementatiebeperkingen, intrinsieke kenmerken, verschillen standaard bibliotheken(containers, rand), ABI, implementatie van virtuele functies, virtuele overerving, uitzonderingen, RTTI, switch, verwijzingen naar functies en methoden; optimalisaties, kopieerelisie (RVO, NRVO), grootte van op verschillende platforms, compiler- en omgevingsdefinities, __declspec, compiler-switches, optimalisatie op lege basis, statische en dynamische koppeling, mangelen, gedistribueerde compilatie, voorgecompileerde header, enkele compilatie-eenheid, (strikt) aliasing/restrict, inline/_forceinline, vluchtige, snelle berekening van wiskundige functies met behulp van bithacks, linkers & loaders door Levine

Applicatieprogrammering, C#/F#, Shildt/Troelsen/Richter, generieke geneesmiddelen, opbrengst, linq/plinq, reflectie, AST, WCF, WinForms/WPF/Silverlight, AOP, loggingframeworks, .NET-assemblage, Scala, Horstmann/Odersky, patroonmatching , macro's/quasi-aanhalingstekens

Functioneel programmeren, Haskell/Ocaml/Scheme/Alice of Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Harrison-Field, HOF (map/fold/filter), Hindley-Milner-type systeem, monaden, typeklassen, ADT, afhankelijk typen, luiheid/energie, logisch programmeren (Prolog of Mercury), competitief programmeren (Erlang of Oz)

Webprogrammeer- en scripttalen, Flanagan/Zend PHP5-certificeringscursus + studiegids, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine of Propel/CodeIgniter of Symphony of Yii, Python/Django/Twisted, Ruby/RoR, ASP.NET MV*, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, OOP in JavaScript, HTML5, CSS3/tabel- en blokindeling, RSS, canvas/WebGL, Ajax/WebSockets, vragenbeveiliging (XSS, SQL-injectie, CSRF), highload, C10k-probleem, SWIG, CDN, schaduw-DOM, browser-eigenaardigheden, realtime bieden/handelen, detectie van afwijkingen, architectuur van apps met één pagina, webcrawlerapparaat, willekeurige wandeling op web/sociale grafieken, asm .js en compilatie in js, v8/spidermonkey internals, PaaS/IaaS, SPDY

DATABANK

Databases/gedistribueerde systemen, Gruber/Datum, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, opgeslagen procedures, triggers, Codd/A Algebra, Tutorial D, normale formulieren, optimalisatie en query uitvoering, indexdatastructuren, transacties en ACID, Brewer's CAP-stelling, grafiek DB, documentopslag, brede kolomopslag, sleutelwaardeopslag, gedistribueerde systeemtheorie, CRDT, net split-probleem, consensusprotocollen, sharding/replicatietheorie, ORM (C++ ODB), ERD, OLAP, semantisch web, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, redeneerapparaat, DBpedia, grote tafel/hbase vs. dynamodb/cassandra/riak, 2/3PC, chubby/dierentuinier, leiderverkiezing (paxos/raft), hdfs/gfs/glusterfs, deduplicatieprobleem, detectie van causaliteit (vectorklok/stempels), R/W-quorum, taakverdeling, apparaat indexen van zoekmachines, eventsourcing, CRDT, protocolontwerp en communicatieprincipes, vanuit het oogpunt van evolutie, uitbreidbaarheid, betrouwbaarheid, ontwerp van programma-interfaces (API's)

BESTURINGSSYSTEMEN

Besturingssystemen, Silberschatz/Richter/Solomon-Russinovich/R obachevsky/Vakhalia/Stevens/Tanenbaum/Lov e/Linux Kernel Internals, geheugenmanager, heapmanager en zijn apparaat (LAL/LFH/slab), apparaatmanager, procesmanager, context switch, echte en beschermde modus, uitvoerbare bestanden (PE/ELF/Mach), kernelobjecten, debug-mechanismen (strace/ptrace/dtrace/pydbg, Debug API) en minidumps, bash, netwerkstack en krachtige servers, netgraph, CR0, IPC, venstersubsysteem, beveiligingssysteem: ACE/ACL en toegangsrechten, virtualisatietechnologieën, RTOS (QNX), driverprogrammering, IRQL, IRP, bestandssystemen, BigTable, NDIS/miniport/FS-drivers/filterdriver, Mm-, Io- , Ldr-functies, DKOM en rootkits, GDT/IDT/SDT, Windows/Linux/BSD-kernels, POSIX, TRIM

Formaten, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode, single-byte-coderingen/UTF-8/UTF-16/UCS-2/UTF-32, lengteproblemen en vergelijking van Unicode-strings, base64, markdown

Componentgebaseerde modellen, Rogerson/Tavares, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, appartementen, monikers, MIDL, XPCOM, CORBA, TAO, D-Bus

Netwerk, Stevens, OSI-model/internetmodel, Ethernet, TCP/IP, TCP-venster, Nagle-algoritme, sockets, Protocolbuffers/Thrift/Avro/ASN.1, AMQP, ICMP, routing/BGP/OSPF, ARP, Mitnik-aanval, syn flood, HTTP/FTP, P2P/DHT, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth/GPS, ACE, Wireshark

HARDWARE

Hardware, Horowitz-Hill/Titze-Schenk, halfgeleiderelektronica/spintronica/fotonica, transistor, trigger, circuitontwerp, microcode, processortechnologie, logische synthese, statische timinganalyse, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, apparaatgeheugen (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomie (ID), Princeton en Harvard-aanpak, processorarchitecturen, x86-architecturen, VID/PID

Processors, pipelining, hyper-threading, Tomasulo-algoritme, speculatieve uitvoering, statische/dynamische vertakkingsvoorspelling, prefetching, meervoudige associatieve cache, cachelijn/cache-missing, klokcycli, beveiligingsringen, geheugen in multiprocessorsystemen (SMP/NUMA), timinggeheugen , Intel-optimalisatiehandleidingen, prestatietellers
___________________________________

Welnu, is het indrukwekkend? Ik vraag me af of er tenminste ÉÉN PERSOON in de wereld is die dit echt allemaal weet?