Vad du behöver veta för att arbeta som programmerare. Vad en programmerare måste kunna för att få jobb inom finans

Hur blir man programmerare? Vad behöver du lära dig? Svaret verkar enkelt: gå till universitetet så lär de dig där. Men om du frågar vilken programmerare som helst kommer han att säga att det de lär ut där, även om det ibland kan vara intressant, nästan är värdelöst och har väldigt lite gemensamt med verkligt arbete.

Programmering är något som läskunnighet

Vårt yrke är ett av de svåraste, men det roligaste är att det i sig är ganska enkelt. Det studeras till och med lugnt i skolan. För att skriva ett enkelt program i Pascal behöver en elev bara känna till ett tiotal operatorer (det finns bara femton av dem) och flera input/output, matematiska och strängfunktioner.

Dessa operatorer är som bokstäverna i alfabetet, och inmatnings-/utdatafunktionerna Läs () och Skriv () är som de första orden "mamma" och "pappa", med vilka ett barn börjar förstå världen.

Ändå, precis som det finns vanliga människor som kan läsa och ibland skriva något, och det finns professionella författare som behärskar pennan, så finns det idag datoranvändare och det finns programmerare. Och enligt min mening är det mycket svårare att vara programmerare än författare. Vi har alltid snäva deadlines, vi måste ta hänsyn till kraven från nyckfulla användare och övervinna de begränsade kapaciteterna hos långsamma datorer, vi måste göra gränssnittet så enkelt och bekvämt som möjligt, dokumentera allt väl så att användarna inte går vilse, och försök att slutföra allt utan fel, och även tänka i förväg på hur programmet kommer att utvecklas i framtiden, och se till att ny funktionalitet lätt kan läggas till och att den är begriplig och förutsägbar. Samtidigt måste själva programmet vara skrivet i samma stil, så att andra programmerare sedan kan lista ut det efter dig och fortsätta arbeta.

För författare är allt mycket, mycket enklare. Tvärtom välkomnar de det till och med när författaren har sin egen stil, och handlingen är förvirrande och oförutsägbar.

Det enda vi kan jämföra med programmerare är skaparna av tv-serier, som i huvudsak också skriver ett program, bara för skådespelare. Manusförfattare, som vi, arbetar som ett team, de har också deadlines, releaser, de måste också tänka igenom intrigen i sina huvuden och till och med lägga ner möjligheten att ändra handlingen i framtiden, lägga till nya karaktärer eller återuppliva de äldre.

Men det finns en betydande skillnad: författarna kan inte längre skriva om handlingen i det filmade avsnittet. I bästa fall, om tittaren har missförstått något, kommer de att förtydliga det i nästa avsnitt.

Vi, programmerare, måste hela tiden gå tillbaka till den gamla koden och ändra något i den. Föreställ dig en tjock roman som du har skrivit i tio år och du måste skriva om varje kapitel om och om igen, förvandla det till en thriller. Föreställ dig nu att du har flyttat till ett annat projekt och nu måste du göra detsamma med en text som du aldrig har sett förut, och den skrevs av flera författare, var och en av dem har sin egen stil, och dessutom har de alla redan lämnade projektet.

Därför är det relativt enkelt att lära sig programmera, men för att göra det professionellt måste du göra ett enormt arbete. Författare börjar med små noveller, behärskar gradvis alla stilistiska anordningar, berikar sitt tal och läser mycket själva. På samma sätt måste programmerare programmera mycket och finslipa sina kunskaper. Och fan, det är väldigt svårt! Och hela tiden - i år, decennier - måste du förbättra dig. Det är ett långt maraton, fullt av både törnen och glädje. Varken monetär eller någon annan motivation hjälper dig - bara ditt eget intresse i frågan.

Jag träffade killar som memorerade programmering, läste till och med några böcker inom det här området och började söka arbete, men samtidigt skrev de inte ett enda eget program. Kan du tänka dig en författare som, efter att ha knappt behärskat läskunnighet och inte skrivit en enda berättelse, redan vill få jobb på redaktionen? Han vet inte ens om han kommer att gilla den här aktiviteten och om han kommer att kunna nå framgång, men han räknar redan sin lön! Ändå hittar många sådana blivande programmerare fortfarande arbete. De utför det dåligt, men det finns alltid en rad uppgifter där hög kvalitet inte är så viktigt.

Gradvis utvecklade programmerare sin egen professionella vokabulär. De kallar processen att skriva ett program för kodning, och människor som på något sätt bara behärskar detta kallas nedsättande kodare. De kan skriva något åt ​​dig för att få det att fungera, men då blir det extremt svårt och obehagligt att förbättra och förbättra ett sådant program, vanligtvis är det lättare att skriva om det. Kodarna själva kallar sig utvecklare och med tiden, efter att ha fått erfarenhet, börjar många kalla sig mjukvaruingenjörer.

Ok, om programmering är "som läskunnighet", vad mer behöver du veta och kunna göra för att bli en "författare"?

Gradvis, från en mängd olika discipliner, teknologier och färdigheter, kristalliserades allmänna och repetitiva, vilket i praktiken visade sig vara det mest användbara för programmerare. Tyvärr är detta inte heller konstant. Till exempel, för trettio år sedan, krävde de flesta programmerare kunskap om elektronik, signalbehandling och maskinkod för processorinstruktioner (assembler).

Idag kan du ganska framgångsrikt klara av arbete utan denna kunskap, och jag blev till och med chockad när jag en gång träffade en senior utvecklare som bara vagt förstod hur en processor fungerar. Men under dessa trettio år dök Internet upp, och programmen blev enorma i storlek och mycket komplexa. Och många andra färdigheter och kunskaper har tillkommit, som är helt oumbärliga idag: flexibla utvecklingsprocesser, objektorienterade och funktionella programmeringsparadigm, bygga skalbara, högbelastnings- och feltoleranta system, och du behöver också kunna läsa och arbeta med gammal kod, använd versionskontrollsystem. Du kan inte klara dig utan en sådan obligatorisk färdighet som förmågan att söka på Internet, som helt enkelt inte fanns tidigare.

Allt detta går utöver själva programmeringen och behöver på ett vänskapligt sätt en egen, separat term. Personligen, för större tydlighet, kallar jag det "programmering" - det är som Software Engineering, men en bredare term som täcker det som är viktigt för oss: utvecklingsprocesser; förmågan att programmera din hjärna för att till exempel "komma in i flödet"; förmågan att arbeta i ett team eller skriva ett CV – i allmänhet allt vi gör.

Grundläggande programmering

Jag hade mycket tur för nästan så snart jag blev intresserad av programmering läste jag en fantastisk bok - "Perfekt kod". Det slog mig i och med att det inte var en bok om något programmeringsspråk eller teknik, som allt annat jag stött på tidigare, utan en bok om själva programmeringen som sådan. Detta är förmodligen den första boken som försökte fylla de luckor som lämnats genom att läsa algoritmläroböcker, tekniska manualer och dokumentation.

Och hon direkt börjar med metaforer som hjälper till att mer exakt förmedla kärnan i vårt arbete. Du har redan lärt dig om den litterära metaforen, när programmering jämförs med att skriva, men det finns också en populär metafor som jämför programmering med att bygga hus, eller till och med skapa flygplan.

Det är ingen slump att hon vann undersökningen "Om du kunde gå tillbaka i tiden när du fortfarande var en ny utvecklare, vilken bok om programmering skulle du råda dig själv att läsa?"

Sedan dök andra bra böcker om programmering upp:

Och många andra värdiga, men i allmänhet täcker de djupare vissa områden.

Faktum är att hela den här alkemin med programmering faktiskt består av sådana saker som vi jobbar med hela tiden och behöver förstås:

  • Grunderna i datorteknik: grunderna i boolesk algebra, binära och sextonradiga talsystem.
  • Datorstruktur: processor, RAM, stack, hårddisk, grafikkort, buss, kringutrustning (d.v.s. tangentbord, mus).
  • Processor assembler och C - du måste också kunna dem åtminstone lite.
  • Egentligen grundläggande läskunnighet: syntax, hur man deklarerar en variabel, en funktion, hur man skriver en villkorlig if-sats, operatorprioritet, hur man organiserar en loop, hur man tar emot input från användaren och hur man matar ut den. Strukturerad programmering - hur man skriver utan goto, med loopar och rekursion. Det är verkligen lätt att lära sig femton operatörer. Nästan alla programmeringsspråk som används idag ärvs från C (C++, Java, C#, PHP, JavaScript), så det finns inget behov av att lära sig om dem. Därför spelar det förresten ingen roll vilket av dessa språk du börjar lära dig med.
  • Algoritmisering: linjär brute force-sökning, binär sökning, bubbelsortering, snabbsortering, etc. Uppskattning av komplexiteten hos algoritmer.
  • Datastrukturer: strängar, kö, stack, enkel- och dubbellänkade lista, arrayer, etc.
  • Nedbrytning, abstraktion och programdesign: objektorienterad programmering, SOLID, designmönster, UML-diagram.
  • Grunderna i funktionell programmering: hur man skriver utan destruktiva uppdrag och loopar, arbeta med samlingar i en funktionell stil.
  • Kunskap om plattformen, bibliotek, teknologier: Java Core, arbeta med filer, arbeta med nätverket, arbeta med arrayer, strängar och samlingar, arbeta med minne och skräpinsamling. Det finns tjocka böcker om allt detta från skaparna av tekniken själva (till exempel "Effektiv Java").
  • Nätverksstandarder och protokoll: TCP, UDP, HTTP, HTML, XML, JSON, MIME, RFC.
  • Förmåga att skriva ren kod: hur man namnger variabler och klasser korrekt, hur man formaterar kod, hur man skriver kommentarer korrekt (mer exakt, hur man inte skriver dem :-)). Förståelse kommer efter att ha läst boken Clean Code.
  • Förmåga att arbeta med kod: refactoring (Fowlers bok), IDE snabbtangenter för refactoring, förmåga att läsa och underhålla gammal kod.
  • Ingenjörspraxis: enhetstester, extrem programmering (XP), kontinuerlig integration, versionskontrollsystem (Git, SVN).
  • Projektledning och processorganisation: Waterfall, Agile, SCRUM, Kanban, buggspårare, tidsuppskattning för en uppgift.
  • Mjuka färdigheter: förmågan att kommunicera med kunden och komma överens i ett team, övervinna bristande motivation, välja prioriteringar.
  • Databaser: SQL, relations-, dokument- och graforienterade databaser, ACID, CAP-sats, frågeoptimering.
  • Operativsystem: Linux, installera och konfigurera program på det, kommandorad.
  • Skalning och hög belastning, övervakning, loggning, feltolerans.
  • Kryptografi, skydd mot attacker.
  • Användbarhet, kravsamling.
  • Kunskaper i engelska, förmåga att skriva dokumentation tydligt och koncist.
  • Förmågan att korrekt formulera frågor och självständigt hitta svar på dem.
  • Förmågan att lära och ständigt förbättra dig själv.
  • Förmågan att lära andra, förklara tydligt och till och med tala till allmänheten på konferenser...
  • och samtidigt inte bli galen.

Som du kan se kan den här listan fortsätta, men du måste förstå huvudsaken: programmering i sig är bara lite. Nästan alla andra färdigheter är helt enkelt omöjliga att lära sig. Du kan bara komma till dem genom lång erfarenhet och konstant läsning av de rätta böckerna som hjälper dig att tänka om.

Den här texten dök upp som ett svar på standardreaktionen från "riktiga programmerare" som svar på mina ord om att jag är en 1C-programmerare. "Ah-ah, 1c-nick, vilken typ av programmerare är du, en manusförfattare i bästa fall. Du gräver i din bokföring och anser dig av någon anledning vara programmerare. Vet en riktig programmerare hur mycket allt du borde veta?"

När jag med intresse frågar vad exakt en RIKTIG PROGRAMMER bör veta, får jag vanligtvis som svar några specifika problem för just den programmerare som jag pratar med just nu. Dessutom presenteras de nästan som den sanna essensen av all programmering som sådan. Tja, något som - "Om du inte vet hur man använder semaforer i Delphi, är du inte en programmerare." Eller - "om du inte vet hur hashtabeller fungerar, är du inte en programmerare." Jag tröttnade på det här, jag letade igenom Internet och bestämde mig för att i ett inlägg samla allt som en RIKTIG PROGRAMMERINGSMAKER borde veta, enligt REAL PROGRAMMERS själva. Lista uppdelad efter kunskapssektion under snittet

MATEMATIK

Numeriska metoder, dikotomi/Newtons metod, inter- och extrapolation, splines, Gauss/Jacobi/Seidel-metoden, QR- och LU-nedbrytning, SVD, minsta kvadratmetod, Runge-Kutta-metoder, Adams-metoden, Newton-Cotes-formler, Ritz-metoden, Bubnov metod -Galerkin, ändlig skillnad/elementmetod, FFT/STFT, konvergens och stabilitet, l-bfgs och andra kvasi-Newtonmetoder, adagrad, PARAFAC, kasuar, inre punktmetoder, variationsmetoder för Bayesiansk inferens, nesterov, automatisk differentiering, alternerande minsta kvadrater, vad varje datavetare borde veta om flyttalsaritmetik av Goldberg, Nocedal & Wright/Boyd & Vandenberghe

Algoritmer, Knuth-Graham-Patashnik/Zorich/Winberg, Spivak/Dummit-Foote, matematisk analys, linjär algebra, komplex analys, funktionsanalys, differentialgeometri, talteori, differentialekvationer/integralekvationer/variationskalkyl/optimal kontroll, generering funktioner , serier, kombinatorik, sannolikhetsteori/matematisk statistik/slumpmässiga processer/köteori, Markov-kedjor, integraltransformer (Fourier, Laplace, Wavelet), NZQRCHOS, matematiska paket (Mathematica, Maple), kategoriteori

Informationsteori, komprimering, Huffman, RLE, BWT, LZ, felkorrigeringskoder, förlustkompression (bilder, ljud, video), informationsentropi, Shannons formel, Kolmogorov-komplexitet, maximalt entropiproblem, kullback-leibler-divergens, elias/shannon- Elias kodning

Diskret matematik, K2, Posts teorem, kretsar, finita tillståndsmaskiner (DFA och NDKA), Kalashnikov automatgevär, cellulära automater

Kryptografi, Schneier/Yashchenko, Kerkhoffs princip, symmetrisk (DES, AES), asymmetrisk (RSA), PRNG-kvalitet, Diffie-Hellman-algoritm, elliptiska kurvor, hashing (MD5, SHA, CRCn), DHT, kryptografisk styrka, kryptoattacker ( grandmaster attack) , WEP/WPA/WPA2 och attacker mot dem, digital signatur och certifikat, PKI, HTTPS/SSL, nollkunskapssäkring, tröskelschema, murmurhash/cityhash, DKIM

Kvantberäkning, Shors algoritm, kvantkryptografi

ALLMÄNNA GRUNDLÄGGANDE FÖR PROGRAMMERING

Multithreading, matfilosofier, dödläge/livelock/racetillstånd/svält, atomicitet, processorlåsinstruktioner, minnesmodell/barriär/beställning, CAS eller LL/SC, vänta/lås/hinderfritt, ABA-problem, skriva låsfria behållare, spin-lock, TLS/per-tråd data, Amdahls lag, OpenMP, MPI, map-reduce, kritisk sektion/mutex/semafor/villkorsvariabel, WaitForSingleObject/WaitForMultipleObjec ts, grön tråd/coroutine, pthreads, future/deferred/promise, skådespelare modell, parameterserver, RDD (sedda i gnistor), skyfall SGD, vänta-fri, stackful vs stackless

Beräkningsbarhet, Turingmaskin, Markovs normala algoritmer, Postmaskin, Diofantiska ekvationer av Matiyasevich, Church lambda-funktioner, delvis rekursiva Kleene-funktioner, Sheinfinkel-kombinatorisk programmering, Brainfuck, ekvivalens av Turing-mossar, stopp- och självtillämpningsproblem, räknebar uppsättning av en räknebarhet funktioner, RAM-maskin, Tarski-algoritm, SAT/SMT-lösare, teori om formella system, interaktiva bevis, Lewin-Cook-satsen, 3SAT, PSPACE = NPSPACE,

Algoritmer och kombinatorisk optimering, Cormen/Skiena/Sedgwick/Knuth/Aho-Hopcroft-Ulman/Papadimitriou/Shriver-Goldberg/Prep Arata-Shamos/e-maxx.ru, datastrukturer, algoritmer, komplexitet, Landau-symbolism, Buzzys,orem kompromiss mellan tid och rum, komplexitetsklasser, NP-kompletta problem, KMP, grafer och träd, flöden i nätverk, Kirchhoff-matris, sökträd (särskilt RB-träd och B-träd), ocklusionsdetektering, heap, hashtabeller och ideal hash, Petri-nät, rysk bondealgoritm, Karatsuba-metoden och Winograd-Strassen matrismultiplikation, sortering, giriga algoritmer och matroider, dynamisk programmering, linjär programmering, diff-algoritmer, randomiserade algoritmer och fuzzy sökalgoritmer, pseudoslumptal, fuzzy tree logic (gusfield logic, gusfield, strängjustering), motivsökning, skanningslinje, cache oblivious, trattsortering, VEB-layout, rotoptimering, algoritmer för dynamiska grafer, beräkningsmodeller (RAM-maskin/pekarmaskin/beslutsträd etc.) , algoritmer i minneshierarkier/ strömmande algoritmer, bearbetning av tid framåt, räckvidd och rangordning, LSM-träd, buffrade a-b-träd, tokuträd, beständiga strukturer, kortfattade strukturer, förluststrukturer (bloom/bloomier filter, hash-tabeller med falska positiva), lokalitetskänslig hashing, space -tidsavvägning i hashtabeller, schemaläggningsstrategier

Maskininlärning, Tibshirani/Bishop, tillvägagångssätt för AI-modellering, omskolning/korsvalidering, Bayesianska nätverk, neurala nätverk, Kohonen-nätverk, Begränsad Boltzmann-maskin, gradientnedstigning/backeklättring, stokastisk optimering (Monte Carlo-metoden, glödgningsmetod, genetiska algoritmer, myralgoritmer ), SVM, gradientförstärkning, klusteranalys, huvudkomponentmetod, LSH, förstärkningsinlärning, MDP, informationsinhämtning/datautvinning/naturligt språkbearbetning, datorseende, Szeliski, OpenCV, bildbehandling, OCR, Sobelfilter, Haarkaskad , Viola-Jones ramverk, SURF, introduktion till synens psykofysiologi, IPython/pandas/scikit-learn, (ME)HMM, CRF, label bias problem, stacked NN, LeToR, faktoriseringsmaskiner, autoencoders, RNN/CNN, separata uppgifter är bättre istället för NLP (språkmodellering, samreferensdetektering, textchunking, POS-taggning, probabilistisk analys, statistisk maskinöversättning, felstavningskorrigering, frågesvar, NER, samlokaliseringsdetektering, textsammanfattning, taligenkänning, faktaextraktion, sentimentanalys ), effektiv softmax-beräkning, funktionsteknik/val, kvalitetsuppskattning, Manning/Jurafsky/McCallum/Koehn, latenta ämnen (LDA, kinesisk restaurang, pLSI), parallella koordinater, vowpal wabbit, NLTK, strukturerad inlärning, EM-algoritm, kontrastiv divergens, optimal hjärnkirurgi, trosutbredning, semi-övervakad inlärning, induktiv vs transduktiv inlärning, kärntrick, diskriminerande/generativa par (sedda av Ng & Jordan), sekvens till sekvensinlärning, packning, social grafanalys, rekommendationssystem/samarbetsfiltrering, multimodalt lärande

ALLMÄNNA PRINCIPER FÖR SKRIVPROGRAM

Arkitektur och kodstil, McConnell/Fowler/Leblanc/Gamma/Alexandre Rescu-Sutter/Butch, defensiv programmering, mönster, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, kodmått, farbror Guppa

Utvecklingsmetoder, Vattenfall/RUP/Agil/Scrum/Kanban/XP, TDD/BDD, CASE

Utvecklingsverktyg, IDE, IntelliSense, debuggers (VS/Olly/WinDbg/kdb/gdb) och spårare (strace/ltrace), DWARF felsökningsinformationsformat, disassemblers och dekompilatorer (IDA/HexRays/Reflector), versionskontrollsystem (SVN, GIT ), sammanfoga/gren/trunk, fil- och filialnamnsystem, kontinuerlig integration, ant, kodtäckning, statisk analys (lint, cppcheck), dynamisk analys (valgrind, fuzzing), mjukvaruverifiering och validering (Frama-C, RAISE ( RSL) ), Coq), profilering, buggspårare, koddokumentation, byggsystem (CMake), pakethanterare (NuGet)

Ramar, Qt, moc och meta-information, slot-signal koncept, Summerfield-Blanchette/Schlee, PoCo, industriella bibliotek: GMP, i18n, lapack, fftw, pcre

GUI design och informationspresentation, Raskin/Tufty, användbarhet, design och typografi grunderna, Fitts' lag, layout basics, LaTeX, datavisualiseringsalgoritmer (som ses i d3), subpixel rendering

Testning, enhetstester, funktionell, belastning, integrationstestning, UI-testning, hånar/stubbar/spioner, fixturer, lukter och testmönster (Osherove/Meszaros)

PROGRAMMERINGSSPRÅK

Allmän förståelse för programmeringsspråk, grammatik, Chomsky-hierarki, Myhill-Nerowd-satsen, pumpande lemma och Ogdens lemma, Kleene algebra, NDKA → DKA, algoritmiskt oavgjorda problem i formella språk, Dragonbook, Friedl, regexps och deras komplexitet, PCRE, BNF, Boost .Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, statisk kodanalys, kompilering/dekompilering/obfuskering/deobfuskation, Clang/LLVM/XMLVM /Emscripten , GCCXML, OpenC++, bygga virtuella maskiner, JiT/AoT/GC, DSL/DSEL, on-stack-ersättning, typkontroll/typinferensalgoritmer, CYK-parser, avancerad kompilatordesign och implementering av Muchnick

Assembly språk, Zubkov/Hyde/Drepper/Kaspersky/Fog/Abrash, x86, FPU/MMX/SSEn/AVX, AT&T och Intel-syntax, masm32, makron, stack, heap/heap-hanterare, anropskonventioner, hex-koder, maskindatarepresentation , IEEE754, little/big endian, SIMD, hårdvaruundantag, avbrott, virtuellt minne, reversering, stack- och heapavbrott, returorienterad programmering, alfanumerisk skalkod, L1/L2/RAM/sidafel och deras timing, ARM-sammansättningsspråk

C++, standard, Comeau, 1TBS, Stroustrap/D&E/Josattis/Vanderwood, Dewhurst/Meyers/Sutter, RAII/copy-and-swap/exception-safety, regel om fem, Alexandrescu/Abrahams-Gurtovoy, typradering, CRTP, NVI , SFINAE, Koenig lookup, Duff's device, Boost, Sick-Lumsdain/Karlsson, TR på C++ prestanda, Stepanov test, forwarding problem/move semantics, SPECS, GotW, Meyer's singleton, cppgm

C++-kompilatorer, funktioner för implementeringen av standarden, implementeringsbegränsningar, inneboende, skillnader mellan standardbibliotek (behållare, rand), ABI, implementering av virtuella funktioner, virtuellt arv, undantag, RTTI, switch, pekare till funktioner och metoder; optimeringar, copy elision (RVO, NRVO), storlek på olika plattformar, kompilator- och miljödefinitioner, __declspec, kompilatorväxlar, tombasoptimering, statisk och dynamisk länkning, mangling, distribuerad kompilering, förkompilerad header, enkel kompileringsenhet, (strikt) aliasing/restrict, inline/_forceinline, volatile, snabb beräkning av matematiska funktioner med hjälp av bithacks, linkers & loaders av Levine

Applikationsprogrammering, C#/F#, Shildt/Troelsen/Richter, generika, avkastning, linq/plinq, reflektion, AST, WCF, WinForms/WPF/Silverlight, AOP, loggningsramverk, .NET-montering, Scala, Horstmann/Odersky, mönstermatchning , makron/kvasicitat

Funktionell programmering, Haskell/Ocaml/Scheme/Alice eller Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Harrison-Field, HOF (karta/vik/filter), Hindley-Milner-typsystem, monader, typklasser, ADT, beroende typer, lättja/energi, logikprogrammering (Prolog eller Mercury), konkurrenskraftig programmering (Erlang eller Oz)

Webbprogrammerings- och skriptspråk, Flanagan/Zend PHP5-certifieringskurs + studieguide, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine eller Propel/CodeIgniter eller Symphony eller Yii, Python/Django/Twisted , Ruby/RoR, ASP.NET MV*, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, OOP i JavaScript, HTML5, CSS3/tabell- och blocklayout, RSS, canvas/WebGL, Ajax/WebSockets, frågor om säkerhet (XSS, SQL-injektion, CSRF), högbelastning, C10k-problem, SWIG, CDN, shadow DOM, webbläsaregenskaper, budgivning/handel i realtid, avvikelsedetektering, ensidig appararkitektur, webbsökarenhet, webb/social graf random walk , asm .js och kompilering i js, v8/spidermonkey internals, PaaS/IaaS, SPDY

DATABAS

Databaser/distribuerade system, Gruber/Datum, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, lagrade procedurer, utlösare, Codd/A-algebra, handledning D, normala formulär, optimering och fråga exekvering, indexdatastrukturer, transaktioner och ACID, Brewers CAP-teorem, graf-DB, dokumentlager, brett kolumnlager, nyckel-värdelagring, distribuerade systemteori, CRDT, nätdelningsproblem, konsensusprotokoll, sharding/replikeringsteori, ORM (C++ ODB), ERD, OLAP, semantisk webb, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, reasoner, DBpedia, big table/hbase vs. dynamodb/cassandra/riak, 2/3PC, chubby/zoo keeper, ledareval (paxos/flotte), hdfs/gfs/glusterfs, dedupliceringsproblem, kausalitetsdetektering (vektorklocka/stämplar), R/W kvorum, lastbalansering, enhet sökmotorindex, event sourcing, CRDT, protokolldesign och kommunikationsprinciper, ur evolutionens synvinkel, utbyggbarhet, tillförlitlighet, design av programgränssnitt (API)

OPERATIVSYSTEM

Operativsystem, Silberschatz/Richter/Solomon-Russinovich/R obachevsky/Vakhalia/Stevens/Tanenbaum/Lov e/Linux Kernel Internals, minneshanterare, heap manager och dess enhet (LAL/LFH/slab), enhetshanterare, processhanterare, sammanhang switch, verkligt och skyddat läge, körbara filer (PE/ELF/Mach), kärnobjekt, felsökningsmekanismer (strace/ptrace/dtrace/pydbg, Debug API) och minidumps, bash, nätverksstack och högpresterande servrar, netgraph, CR0, IPC , fönsterdelsystem, säkerhetssystem: ACE/ACL och åtkomsträttigheter, virtualiseringsteknologier, RTOS (QNX), drivrutinsprogrammering, IRQL, IRP, filsystem, BigTable, NDIS/miniport/FS-drivrutiner/filterdrivrutin, Mm-, Io- , Ldr-funktioner, DKOM och rootkits, GDT/IDT/SDT, Windows/Linux/BSD-kärnor, POSIX, TRIM

Format, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OG/WebM, SVG, Unicode, single-byte-kodningar/UTF-8/UTF-16/UCS-2/UTF-32, längdproblem och jämförelse av Unicode-strängar, base64, markdown

Komponentbaserade modeller, Rogerson/Tavares, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, lägenheter, moniker, MIDL, XPCOM, CORBA, TAO, D-Bus

Nätverk, Stevens, OSI-modell/Internetmodell, Ethernet, TCP/IP, TCP-fönster, Nagle-algoritm, sockets, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, routing/BGP/OSPF, ARP, Mitnik attack, 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

HÅRDVARA

Hårdvara, Horowitz-Hill/Titze-Schenk, halvledarelektronik/spintronik/fotonik, transistor, trigger, kretsdesign, mikrokod, processorteknologi, logiksyntes, statisk timinganalys, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, enhetsminne (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynns taxonomi (ID), Princeton och Harvard-metoden, processorarkitekturer, x86-arkitekturer, VID/PID

Processorer, pipelining, hyper-threading, Tomasulo-algoritm, spekulativ exekvering, statisk/dynamisk grenprediktion, förhämtning, multipel associativ cache, cachelinje/cachemiss, klockcykler, skyddsringar, minne i multiprocessorsystem (SMP/NUMA), timingminne , intel-optimeringsmanualer, prestandaräknare
___________________________________

Tja, är det imponerande jag undrar om det finns åtminstone EN PERSON i världen som verkligen kan allt detta?

Vi välkomnar alla läsare och blivande programmerare som är fulla av ambition och strävar efter att lära sig nya saker! Det är ingen överdrift att säga att programmerare är efterfrågade nu mer än någonsin.

Varje dag behöver blomstrande företag erfarna yrkesmän som är flytande i ett brett utbud av program och är flytande i en mängd olika programmeringsspråk.

Som regel är deras löner flera tusen dollar i månaden, och det är långt ifrån gränsen. Vad behöver du göra för att bli en riktig specialist inom programmeringsspråk och tjäna enorma pengar? Nu ska vi försöka svara på denna fråga.

Studera, plugga och plugga igen!

En född programmerare måste älska det han gör. Det betyder att han alltid måste sträva efter något mer för att få tillgång till ännu större kunskap och möjligheter.

Om du känner Pascal väl och tror att detta är tillräckligt för att välkända företag ska uppmärksamma dig, så har du fel. Även om du kan JavaScript, ett av de mest populära språken idag, kommer ingen att prata med dig.

Vad kan vi säga om kunskapen om vissa Pascal. När allt kommer omkring, om en situation uppstår som kräver ett icke-standardiserat tillvägagångssätt för att lösa ett visst problem, kommer bara kunskap om andra moderna programmeringsspråk att göra det möjligt att göra den önskade verkligheten.

"Så du måste kunna nästan alla programmeringsspråk, vilket kommer att kräva mycket tid och ansträngning! Finns det något sätt att komma runt detta?

Tyvärr inte. En sann programmeringsexpert kan bara vara någon som är flytande i alla befintliga språk och kan utföra samma uppgift med olika metoder.

Sådana programmerare är nu guld värda, så för ett utvecklande företag kommer det att vara en stor framgång att hitta en sådan person som kommer att kunna skriva optimerad kod på kortast möjliga tid och som är redo att hantera eventuella misslyckanden i hans arbete.

Med tanke på att modern teknik utvecklas i en otrolig hastighet, ställs varje programmerare inför allt större krav och önskemål för sitt arbete. Om du inte hänger med i den nuvarande rytmen, kommer dina drömmar om ett förstklassigt jobb med en enorm lön troligen att förbli drömmar.

Var ska jag börja?

Det första att notera är kärleken till programmering. Om du vill bli en bra programmerare, lär dig att älska det du gör. Det andra som också är viktigt är uthållighet och bra stresstålighet.

Även den mest kvalificerade specialisten kan stöta på buggar som fortfarande behöver identifieras och sedan fixas så snabbt som möjligt. Detta kan ta kolossal tid och nerver, så du måste alltid vara beredd på sådana situationer.

Och, naturligtvis, börja utveckla din talang med enkla, men samtidigt mycket effektiva kurser. Det finns ganska många av dem, så du kan välja de som verkar mest effektiva för dig.

Så, vad hjälper dig att bli en unik och lovande programmerare:
Välj det första programmeringsspråket som intresserar dig mest. Det kan vara enkelt, men att förstå dess grunder kommer att hjälpa dig att enkelt bemästra andra språk i framtiden, som i sin tur kommer att vara mer avancerade.

Ta de nödvändiga datavetenskapliga kurserna, inklusive Coursera och Udacity. De är välkända i programmeringskretsar och har redan kunnat hjälpa tusentals unga och ambitiösa nybörjare. Allt presenteras på ett tydligt språk, så det kommer inte att finnas några svårigheter att bemästra dem.

Kodtestning. Ju snabbare du behärskar detta och omsätter det i praktiken, desto lättare blir det att förstå grunderna i många programmeringsspråk.

Testa dig själv hela tiden för att förstärka nytt material. Tro inte att det här är slöseri med tid. Många års erfarenhet visar att den inhämtade kunskapen inte alltid är lätt att implementera i praktiken. Det är möjligt att du under övningsprocessen kommer att upptäcka helt andra sätt att lösa vissa problem, vilket sparar mycket tid och gör koden mycket enklare än ursprungligen planerat.

Börja skapa din webbplats. Du kan börja med en enkel kod som kommer att ansvara för en liten del av sajten, och sedan kan du fortsätta att organisera arbetet på en hel server. Det blir mycket bättre om du arbetar med dessa uppgifter i ett team av programmerare som du.

Fördela ansvar mellan dig och bestäm deadlines för att slutföra alla tilldelade uppgifter. Detta gör att du inte bara kan lära dig att arbeta harmoniskt i ett team, utan också att lära dig värdefull erfarenhet av varandra.

Ta en aktiv del i oberoende projekt av andra programmerare och dela med dem den erfarenhet som du redan har kunnat samla i dina egna projekt. Övervaka deras arbete och glöm inte att stödja dem i svåra tider.

Avslutningsvis skulle jag vilja säga att det inte är så svårt att bli programmerare som det verkar vid första anblicken. Kärlek till ditt arbete, kontinuerlig förbättring av dig själv och dina färdigheter, såväl som deras framgångsrika tillämpning i praktiken - detta är den huvudsakliga grunden som alla nybörjare kommer att behöva.

Vissa människor drömmer bara om det söta livet för en framgångsrik programmerare, vissa tror att inte alla kan göra detta, och vissa börjar helt enkelt i det små och stiger sedan snabbt. Medan vissa kommer att rycka av sig det, kommer du redan att känna till några av grunderna.

Och efter en månad kommer du att kunna göra vad andra tror är omöjligt, så om du verkligen är full av lust att behärska programmeringsspråk och bli en av de bästa specialisterna inom detta område, då är det dags att lägga allt åt sidan och börja fördjupa dig i det!

Du bör börja din väg till en karriär som programmerare genom att svara på frågan, behöver du programmering överhuvudtaget? Denna fråga gäller inte dig som studerar eller har studerat inom en specialitet nära programmering. Om du var bättre på matte i skolan än humaniora, om du gillar att spendera mycket tid vid datorn, om du vill lära dig något nytt, då är programmering något för dig.

Var ska man starta

Det finns flera alternativ för utveckling av händelser, som ett resultat av vilket en person blir en programmerare. Den första är föräldrar-programmerare som lärde sina barn allt. Dessa barn behöver inte ens gå på universitetet. Det andra alternativet är programmerarens fashionabla yrke. Efter skolan var vi tvungna att välja var vi skulle gå för att studera, och vi valde det fashionabla området IT, som vi verkade gilla. Och det sista alternativet är en hobby som har vuxit till arbete.

Om inget av ovanstående hände dig, har du fyra alternativ att välja på:

  • Självutbildning. Detta alternativ kan användas antingen självständigt eller i kombination med andra metoder. Internet är fullt av applikationer som hjälper dig att lära dig olika programmeringsspråk och teknologier. Men detta är den svåraste vägen för nybörjare.
  • universitet. Om du går ut skolan och vill bli programmerare, gå då till universitetet. Om inte för kunskap, så för skorpan. Det kan fungera som en bonus när du söker jobb. Även om du också kommer att få lite kunskap. Men glöm inte att utbilda dig själv. Att välja ett universitet bör hanteras mycket ansvarsfullt. Studera utbildningsprogrammen noggrant och välj de bästa tekniska universiteten.
  • Mentor. Det kommer att vara väldigt bra om du hittar en person som går med på att hjälpa dig och peka dig i rätt riktning. Han kommer att föreslå lämpliga böcker och resurser, kontrollera din kod och ge användbara råd. Vi har förresten redan skrivit om var du kan hitta en mentor. Du kan leta efter en mentor bland bekanta programmerare, på IT-fester och konferenser, på onlineforum och så vidare.
  • Specialiserade praktiska kurser. Försök att leta efter kurser i din stad som lär dig något programmeringsspråk eller teknologi. Jag blev positivt överraskad av antalet sådana kurser i Kiev, inklusive gratis och med efterföljande anställning.

Vilket språk, teknik och riktning man ska välja

När du blir programmerare kommer du efter ett eller två år att vara fri att välja vilket språk du vill. Men när man väljer ett första programmeringsspråk bör en nybörjare överväga följande kriterier:

  • Tillgänglighet av lediga jobb på marknaden. Det slutliga målet med denna väg är att hitta ett jobb som programmerare. Och detta kommer att bli svårt att göra om ingen söker utvecklare i ditt programmeringsspråk på arbetsmarknaden. Kolla jobbsajter, se vem som är mest eftertraktad, skriv ner ett dussin språk. Och gå vidare till nästa kriterium.
  • Låg instegsnivå. Om du måste spendera lång tid på att lära dig ett språk kan det avskräcka dig från att programmera överhuvudtaget. Läs om språken du valde ovan. Gå igenom litteraturen du behöver läsa för att lära dig dessa språk. Och välj de som beskrivs som lätta, eller som verkade lätta för dig. Sådana språk kan vara PHP, Ruby, Python.
  • Spänningen i processen. Om du inte tycker om att skriva kod på ditt valda språk, kommer du inte att njuta av processen, ditt arbete eller ditt liv. Behöver du det? Gör rätt val.

Du måste också bestämma riktningen för programmeringen. Mobil, desktop, spel, webb, lågnivåprogrammering och så vidare. De mest populära och relativt enkla branscherna är utveckling för webb-, mobil- och stationära klienter. Ett språk kan vara lämpligt för varje riktning och inte ett annat alls. Det vill säga när man väljer ett programmeringsspråk är det också värt att utgå från denna faktor.

Hur som helst, lär dig webbteknik. Detta är ett märkningsspråk, stilar och som kommer att göra din sida dynamisk. Nästa steg är att lära sig ett språk på serversidan (Python, PHP, Ruby och andra) och webbramverk som är lämpliga för det. Studera databaserna: nästan varje ledig programmerare nämner detta.

Hur man får första erfarenhet

Utan erfarenhet får du inget jobb. Utan arbete får du ingen erfarenhet. En ond cirkel av det verkliga livet. Men det är okej, vi kommer ur det.

Först, vänta inte tills du har läst varje bok på ditt valda programmeringsspråk. Börja skriva dina första rader kod efter det andra kapitlet i boken. Slutför alla uppgifter från böckerna, skriv om exemplen, förstå dem. Komplicera exemplen och uppgifterna från böcker med dina egna idéer. Skapa dina egna uppgifter för det material du har täckt. Lös dessa problem.

För det andra måste du hitta dina första projekt. Detta är förmodligen det svåraste alternativet, men det fungerar. Du måste leta efter beställningar själv, uppfylla dem och bry dig om betalning. För en nybörjare är detta extremt svårt, men då kommer alla andra alternativ att verka som en piece of cake. Genomförda projekt kan registreras som erfarenhet och visas för din framtida arbetsgivare. Riktiga projekt är ett stort plus på ditt CV.

Om du kan engelska är det bättre att registrera dig på engelskspråkiga börser. Marknaden är större där. Om du inte kan engelska, lär dig det. Under tiden är ryskspråkiga frilansutbyten tillgängliga för dig. Leta efter små projekt som ligger på eller strax över din kompetensnivå. Sök ett par dussin av dessa jobb. Och gör dig redo att ta emot ett hav av avslag. Men om en eller två ansökningar kommer igenom har du en chans att få verklig erfarenhet.

Ett annat bra alternativ för att få verklig upplevelse är öppen källkod. Sådana projekt behöver alltid nya människor, även nybörjare. Du kan söka efter buggar i projektet eller titta i buggspåraren och föreslå metoder för att lösa dem. Du kan enkelt hitta sådana projekt på GitHub eller . Ställ gärna frågor där.

Det fjärde alternativet för att få erfarenhet är att hjälpa andra programmerare. Be dem lämna över små, enkla uppgifter till dig. Om något inte fungerar har du alltid någon att vända dig till. Och samtidigt kommer du att delta i ett riktigt projekt.

Det sista sättet är dina egna projekt, olika hackathons eller att arbeta i en coworking space. Det är svårt att starta egna projekt på egen hand; det är bättre att leta efter bekanta eller vänner.

Varför välja Python

Låt oss prata lite mer om att välja ditt första programmeringsspråk. Det första språket ska vara enkelt och populärt på marknaden. Ett sådant språk är Pytonorm. Jag rekommenderar starkt att du väljer det som ditt första programmeringsspråk.

Python-programkoden är läsbar. Du behöver inte ens vara programmerare för att få en grundläggande förståelse för vad som händer i ett program. På grund av Pythons okomplicerade syntax kommer det att ta dig mindre tid att skriva ett program än till exempel i Java. En enorm databas med bibliotek som kommer att spara dig mycket ansträngning, nerver och tid. Python är ett språk på hög nivå. Det betyder att du inte behöver tänka för mycket på minnesceller och vad du ska placera där. Python är ett allmänt språk. Och det är så enkelt att även barn kan lära sig det.

I rättvisans namn är det värt att nämna andra programmeringsspråk. Java kan vara ett bra val för en nybörjare. Detta språk är mer populärt än Python, men också lite mer komplext. Men utvecklingsverktygen är mycket bättre utvecklade. Man behöver bara jämföra Eclipse och IDLE. Efter Java blir det lättare för dig att gå vidare till att arbeta med lågnivåprogrammeringsspråk.

PHP- ett annat mycket populärt språk. Och jag tror att det är ännu enklare än Python. Det är väldigt lätt att hitta en mentor eller en lösning på ett problem på forumet. Detta beror på att det finns ett stort antal PHP-programmerare på olika nivåer i världen. Det finns ingen normal import i PHP, det finns många alternativ för att lösa samma problem. Och detta komplicerar inlärningen. Och PHP är designat exklusivt för webben.

språk C Och C# mycket svårt för en nybörjare. Rubin- ett bra val som andraspråk, men inte ett förstaspråk. JavaScript- ett väldigt enkelt språk, men det lär dig inget bra. Men uppgiften för det första programmeringsspråket är fortfarande att lära dig något korrekt, att ställa in någon form av logik.

Är engelska viktig?

Viktig! Vet inte? Lära. Vet du? Förbättra. Lär dig att läsa, skriva, lyssna och prata engelska. Fokus på teknisk litteratur. Lyssna på engelskspråkiga poddar. Läs engelskspråkiga läroböcker i programmering.

Vad du behöver veta förutom programmeringsspråket

Naturligtvis, förutom programmeringsspråket och engelska, behöver du kunna något annat. Men vad beror på vilken riktning du väljer. En webbprogrammerare måste kunna HTML, CSS, JavaScript. En stationär programmerare lär ut operativsystemets API:er och olika ramverk. En mobilapplikationsutvecklare lär sig ramverk för Android, iOS eller Windows Phone.

Alla behöver lära sig algoritmer. Testa att gå en kurs i Coursera eller hitta en bok om algoritmer som passar dig. Dessutom behöver du känna till en av databaserna, programmeringsmönstren och datastrukturerna. Det är också värt att kolla in kodlager. Åtminstone med en. Kunskaper i versionskontrollsystem krävs. Välj Git, det är det mest populära. Du behöver känna till verktygen du arbetar med, operativsystemet och utvecklingsmiljön. Och den huvudsakliga färdigheten hos en programmerare är att kunna Google. Du kommer inte att leva utan detta.

Sista stegen

Du måste förbereda ett CV. Inte bara ett CV, utan en . Du ska inte skriva där, men du behöver inte heller vara tyst om dina kunskaper. När du väl har blivit inbjuden till en intervju måste du förbereda dig för den. Gå igenom materialet som finns på ditt CV. Du måste vara säker på din kunskap. Titta igenom de projekt du har arbetat med, tänk på de tekniker du har använt. Och framåt – till en ljus framtid med ett nytt yrke som programmerare.

10 mars 2016 kl. 09:56

Vad en programmerare måste kunna för att få jobb inom finans

  • ITI Capital företagsblogg,
  • Webbplatsutveckling

I vår blogg på Habré skriver vi mycket om teknologier som används inom ekonomi. Börser använder idag den mest avancerade mjukvaran och hårdvaran – både för att bygga själva handelsinfrastrukturen och för att skapa handelssystem online.

Idag är matematiker, fysiker och programmerare efterfrågade här. Människor som kan skapa handelsalgoritmer och göra högkvalitativ programvara baserad på dem. Många programmerare vill i sin tur prova sig fram inom finansbranschen – den kan erbjuda en attraktiv kombination av intressanta arbetsuppgifter och höga löner.

Idag ska vi prata om vilka färdigheter du behöver ha för att få jobb på en HFT-firma, investmentbank, hedgefond eller mäklarfirma. När ämnet förbereddes användes material från webbplatser och quantstart.com.

språk

Ett av de mest populära programmeringsspråken inom finans under många år har varit C. Du måste kunna det inte bara för att stödja äldre kod, utan också för att organisera arbetet med API:er i elektroniska handelssystem och utbyta data med leverantörer.

C++ kallas för "huvudspråket på Wall Street" eftersom det viktigaste för handelssystem är hastighet. Oavsett hur genomtänkt och felsökt ett handelsprogram kan vara, om det någon gång spenderar extra millisekunder på "sopsamling", kan detta leda till allvarliga förluster. Detsamma gäller för utbytesinfrastrukturen - alla typer av dataöverföringsgateways och "anslutningar" till olika system.

Som ett resultat är C++-programmerare efterfrågade i företag inom finanssektorn – inklusive på börserna själva. Och den här situationen kommer att fortsätta i många år framöver - någon behöver underhålla den nuvarande infrastrukturen.

För ett av våra tidigare material pratade vi med en rysk expert på att skapa handelssystem, som, i situationer där maximal hastighet behövs, använder följande teknologier:

C++ och ren C är mycket lämpliga för dessa uppgifter. Det händer också att snabba robotar skapas nästan i assemblerspråk - här är det värt att nämna mekanismerna för att direkt läsa och skriva data i ett nätverkskorts minne, förbi standardmekanismer för att arbeta. genom drivrutiner, samt arbeta med "supersnabb programmerbar hårdvara" som FPGA.

Enligt skaparen av QuantStart-resursen och professionella handlaren Michael Hulls-Moore, kan idag en senior programmerare med 5-7 års erfarenhet av C++ tjäna £500-700 per dag i London. C++-specialister är också mycket efterfrågade i ryska företag. Dessutom lockas sådana utvecklare ofta till professionella handlare som kan skapa en framgångsrik handelsstrategi, men som behöver hjälp från någon som kan programmera den.

C# och Java har också använts av olika finansiella institutioner under ganska lång tid. Främst av stora banker för deras handelsinfrastruktur. Dessa språk används för att skapa front-end-gränssnitt och bearbeta data.

På den ryska finansmarknaden värderas specialister som kan C++ och C# högt - i vår blogg pratade vi tidigare om hur han tack vare dessa verktyg kunde hitta arbete i finansiella företag och sedan började skapa sina egna handelssystem. Detta är vad materialets hjälte rådde programmerare som skulle vilja få ett jobb inom finans att studera i framtiden:

För dem som börjar sin resa inom handel eller på något sätt är intresserade av detta område, skulle jag råda att rikta uppmärksamheten mot högnivåplattformar och språk som .NET och Java. Det sistnämnda är mycket populärt på västerländska aktiemarknader vi har mindre än så länge, men det finns goda utsikter för en bredare spridning av detta språk. Det innebär att Java-programmerare kommer att bli efterfrågade i finansiella företag, fonder och mäklare. Ändå är .NET en ganska sluten plattform, som också har ett antal begränsningar. Det är inte särskilt lämpligt för handel med låg latens och HFT.

Men i både .NET och Java kan du skapa kompletta mjukvaruprodukter ganska snabbt. Den största nackdelen är att de inte är de snabbaste (om mikrosekunder räknas).


Skriptspråk som Python, MATLAB och R används ofta för att prototyper av kvantmodeller hos hedgefonder och kvanthandelsenheter på banker.

Quanthandlare och finansiella applikationsutvecklare skriver ofta koden för sina prototyper på skriptspråk. Dessa prototyper beskrivs sedan med snabbare språk som C++ av utvecklare som är specialiserade på detta.

Klient-serversystem

Handelssystem är per definition distribuerade. Nästan alla företag, från små företag till stora investeringsbanker, bygger sina system med hjälp av TCP- och UDP-protokoll - ibland i handeln är hastighet viktigare än att garantera dataleverans.

Därför måste utvecklare av handelsapplikationer ha en god förståelse för C-socketklasserna: socket(), bind(), poll() och select(). Du behöver nästan aldrig arbeta med dem direkt, eftersom det redan finns många färdiga bibliotek för detta, men det är helt enkelt nödvändigt att förstå hur interaktion med dem fungerar.

Dessutom, för utvecklare av finansiell programvara, är det ett plus att känna till de dataöverföringsprotokoll som används inom detta område, såsom , .

Strömmar

Att skapa klient-serversystem och flertrådsprogrammering inom finanssektorn går hand i hand. Allt detta innebär till exempel att skriva en standard TCP-server, en lastbalanseringsserver, en högpresterande server - en utvecklare som vill skapa mjukvara för ett finansiellt företag måste kunna göra detta. Det är också en bra idé att förstå vad pthreads(), fork(), mutexes-klasserna är och idén med en semafor i allmänhet. Om du använder Java måste du också förstå de synkroniseringsmetoder som finns för detta språk.

Databas

Finansiella system är baserade på databaser, så utvecklare behöver djup kunskap om SQL. Kunskap om enkla urvalsoperatörer kommer inte att räcka - ganska ofta under arbetet måste du mixtra med att skapa lagringsprocedurer, hantera index etc. Dessutom måste du förstå skillnaden mellan lås på tabellnivå, sidnivå och radnivå.

UNIX
Handelssystem använder vanligtvis en UNIX-plattform (ofta Solaris och Linux). Som regel skapas handelsterminaler med grafiska gränssnitt för Windows, medan UNIX används för att utveckla "motorn" för handelsmjukvara.

Detta innebär att utvecklare helt enkelt behöver förstå vad tail, sed, grep, awk, tr och top kommandon är. Det är ännu bättre om specialisten vet hur man arbetar med antingen vi, vim eller emacs och inte är rädd för problem som orsakas av felaktig $LD_LIBRARY_PATH-konfiguration.

Felsökningsförmåga

I en karriär som programmerare i finansiella organisationer kommer förmågan att analysera kärnfiler med hjälp av dbx eller gdb vara användbar. Ett sådant behov uppstår sällan, men om det händer är det bättre att kunna göra allt själv.

Slutsats

Aktiemarknaden är en extremt högteknologisk bransch som aktivt utvecklas, vilket gör att arbeta inom detta område mycket attraktivt för IT-proffs som vill utveckla sin kompetens. Samtidigt, för att delta i intressanta projekt, behöver en ingenjör inte nödvändigtvis åka utomlands - ny teknik introduceras aktivt på den ryska aktiemarknaden. I ett av våra tidigare material pratade vi om skapandet av SmartX-terminalen och Matrix-mäklarhandelssystemet, i vilket du kan delta i utvecklingen.

Sammanfattningsvis, ytterligare ett råd: oroa dig inte för mycket om att känna till de inre funktionerna i handelsprocesser och finansiella koncept. Naturligtvis kan detta vara en ytterligare fördel, men bristen på ekonomisk kunskap och kunskap kommer sannolikt inte att hindra en bra programmerare från att hitta ett jobb i ett finansiellt företag.

P.S. Till ITinvests utvecklingsteam för projektarbete på