Në ditët e mia të para si studente e parë, takova një shok klase, i cili pohoi se mund të kodonte në çdo gjuhë programimi që mund të përmendja. I habitur, unë sfidova "po ajo gjuhë ezoterike e palexueshme ku një pjesë e vogël e komandave thjesht simulojnë një makinë Turing!" Ai u përgjigj në mënyrë të thatë: “po quhet trushqitje; Unë e di trukun”.

Unë kam qenë i trullosur. Nuk ishte mashtrim, ai mund të kodonte në mënyrë legjitime në çdo gjuhë pas një rifreskimi të shkurtër të parëndësishëm. Si mund të dijë një fëmijë 18 vjeçar çdo gjuhë?

Ndërsa jam ende i impresionuar nga bëma e tij, nuk jam aq i habitur. Pasi mësova vetë disa gjuhë të tjera, kuptova se të gjitha ishin më pak të ndryshme nga sa kisha parashikuar. Pas disa studimeve të tjera, fillova të vlerësoj disa nga modelet themelore të teorisë së llogaritjes dhe gjuhës së programimit që i bëjnë shumicën e gjuhëve të duken si versione të ndryshme të të njëjtave ide themelore. Këto ditë këshilla ime standarde për studentët është "qëllimi për të mësuar çdo gjuhë".

Duke qenë se po i afrohemi vitit të ri dhe njerëzit do të kenë vendimet e vitit të ri për të mësuar Go ose Rust apo diçka tjetër, unë dua të inkurajoj zgjidhjen alternative: synoni të mësoni çdo gjuhë! Shpresojmë se ky artikull do t'ju ndihmojë në rrugën tuaj!

Mohim përgjegjësie :)

  • Kjo nuk ka të bëjë në fakt për t'u bërë kompetent me 500+ gjuhë. Ka të bëjë me të kuptuarit e paradigmave të përbashkëta dhe modeleve të zbatimit, në mënyrë që të jesh me besim agnostik gjuhësor
  • Ky është një udhëtim i gjatë. Ju mund të bëni shumë përparim në një vit, por në varësi të nivelit tuaj aktual mund të duhen dhjetë të tjera
  • Disa koncepte mund të mos duken të rëndësishme për një kohë, rrokullisni me të
  • Në varësi të punës dhe/ose qëllimeve tuaja, kjo mund të mos ju ndihmojë me punën dhe/ose qëllimet tuaja!

Pse ta bëj?

Nëse e shihni veten si leximin dhe shkrimin e programeve kompjuterike për pjesën më të madhe të karrierës suaj, i detyroheni vetes që të jeni përgjithësisht të njohur me gjuhët:

  • Edhe pa i zgjedhur vetë gjuhët tuaja, ka të ngjarë të përfundoni duke përdorur një numër të madh të tyre
  • Duke pasur parasysh zgjedhjen, aftësia për të zgjedhur mjetin e duhur për punën do t'ju bëjë më efektiv
  • Ndërsa popullariteti i gjuhëve po zbehet, ju do të keni një zgjedhje më të gjerë të punëve, kompanive dhe projekteve nëse nuk jeni të kufizuar nga zgjedhja e gjuhës
  • Shumë projekte me ndikim të lartë kërkojnë njohuri themelore të përpiluesve dhe gjuhëve, nga zbatimet dhe bibliotekat e gjuhëve për qëllime të përgjithshme deri te DSL-të, bazat e të dhënave, shfletuesit, IDE-të, mjetet e analizës statike dhe më shumë.

Për mua, pika e fundit është më e rëndësishmja. "Ras Bodik do ta theksonte këtë" kur i bind studentët e tij në Berkeley për rëndësinë e kursit të tij përpilues:

Mos u bëni programues të pllakës së kazanit. Në vend të kësaj, ndërtoni mjete për përdoruesit dhe programuesit e tjerë. Merrni shënim historik të industrisë së tekstilit dhe çelikut: dëshironi të ndërtoni makineri dhe vegla, apo dëshironi t'i përdorni ato makineri?

Hapi zero: mos e quani veten një dev nga Rails (etj).

Ky hap është i lehtë, por i rëndësishëm. Ndërsa ju duhet të jeni krenarë për veten për zotërimin e një gjuhe ose teknologjie, vetë-identifikimi si specialist në çdo gjuhë krijon një pengesë mendore për të përqafuar një tjetër. Quajeni veten një inxhinier softuerësh dhe përpiquni të përmbushni atë titull pavarësisht nga konteksti.

Alex Gaynor e do Python aq sa të ketë shërbyer në bordin e fondacionit të tij dhe ka kontribuar me pjesë të mëdha të Django dhe PyPy, por kjo nuk e pengoi atë të "toleronte Classic ASP për disa vjet" për të ndihmuar USDS. Ai e quan veten një inxhinier softuerësh, dhe po ashtu edhe ju.

Hapi i parë: shkoni meta

Ekziston një shaka e vjetër për një fizikan të aplikuar që e gjen veten në një konferencë të teorisë së fijeve. Duke iu kthyer një fizikani teorik, ai pyet "ee, si arrini të mendoni për gjërat në 11 dimensione?" Fizikani teorik përgjigjet "kjo është e lehtë, ne thjesht imazhojmë dimensionet N dhe zëvendësojmë 11 për N".

Programuesit e fortë përdorin të njëjtin truk. Ju mund ta shihni Go si një gjuhë të re dhe sfiduese; programuesit e fortë e shohin atë si një gjuhë të përpiluar të shtypur statikisht me grumbullimin e mbeturinave dhe konkurencën e stilit CSP. Swift është i ri dhe i dizajnuar me kujdes, por një programues i fortë mund ta marrë atë lehtësisht: është thjesht një gjuhë e përpiluar për qëllime të përgjithshme me veçori të orientuara nga objekti, si protokollet, të zbatuara me LLVM.

Niveli meta i gjuhëve është klasa universitare e përpiluesve. Fatkeqësisht, emri është mashtrues për dy arsye: së pari, klasa nuk ka të bëjë rreptësisht me mekanikën e përpiluesve; qëllimi i tij kryesor për shumicën e studentëve është të kuptojnë thellësisht gjuhët. Së dyti, disa njerëz i shohin "dinamik" dhe "të përpiluar" si të kundërta, kështu që supozoni se një klasë përpiluesish nuk do t'i mësojë ata për implementimet e gjuhëve të tyre të preferuara dinamike… kjo nuk është e vërtetë, ka një sasi të madhe mbivendosjeje, dhe shumica e përpiluesve kurset përfshijnë një seksion mbi bajtkodet dhe makinat virtuale. Por emri "përpilues" në përgjithësi ka ngecur.

Për ata që nuk patën kurrë mundësinë për të ndjekur një kurs përpilues, ka disa libra të shkëlqyer dhe kurse online në dispozicion. Në veçanti do të sugjeroja kursin e Alex Aiken i cili më parë ishte i disponueshëm në Coursera dhe tani në platformën MOOC të Stanford, Lagunita. CS164 i Berkeley është gjithashtu një opsion i mirë… për fat të keq Berkeley ka ndaluar publikimin e videove nga sesionet më të reja, por "sesioni i Ras Bodik 2012" është ende i disponueshëm.

Teksti kanonik në përpiluesit është Përpiluesit: Parimet, teknikat dhe mjetet, i quajtur zakonisht "Libri i Dragoit". Si të gjitha tekstet kanonike, ai ka si fansa të tërbuar, ashtu edhe kritikues të zhytur në mendime; Pikëpamja ime e përgjithshme është se është libri më i mirë i vetëm, por prisni që ta mbuloni atë në disa kalime në karrierën tuaj. Myles i pëlqen veçanërisht Modelet e zbatimit të gjuhës nga Terence Parr. Është shkruar më drejtpërdrejt për inxhinierin praktikues të softuerit që synon të punojë në projekte të vogla gjuhësore si DSL-të, kështu që mund ta gjeni më të arritshëm se Libri i Dragoit si ndalesa e parë.

Për ata që ndodhen në San Francisko që preferojnë më shumë mësime praktike, mund të jeni të interesuar në "kursin e gjuhëve, përpiluesve dhe përkthyesve" të Bradfield.

Hapi i dytë: zgjidhni gjuhët arketipale

Me një bazë të mirë teorike, do të jetë më e lehtë për të marrë gjuhë të reja, por jo aq e lehtë sa për të dalë dhe për të mësuar mbi 500 prej tyre. Truku tani do të jetë identifikimi dhe mësimi i gjuhëve që janë arketip i ideve të fuqishme dhe paradigmave të përbashkëta në të gjitha të tjerat. Me një përzgjedhje të mirë, duhet të jetë e parëndësishme që më pas të trekëndosh drejt gjuhëve të reja.

Peter Norvig bën sugjerimin e tij se cilat janë paradigmat e rëndësishme, si dhe gjuhët e tyre arketipale:

Mësoni të paktën një gjysmë duzinë gjuhë programimi. Përfshi një gjuhë që thekson abstraksionet e klasave (si Java ose C++), një që thekson abstraksionin funksional (si Lisp ose ML ose Haskell), një gjuhë që mbështet abstraksionin sintaksor (si Lisp), një që mbështet specifikimet deklarative (si modelet Prolog ose C++) , dhe një që thekson paralelizmin (si Clojure ose Go).

Kjo është një pikënisje e shkëlqyer për mendimin tim, por ju mund të dëshironi të shkoni pak më tej për të mbuluar një fushë më të gjerë.

Së pari, unë do të sugjeroja të mësoni C sa më shpejt që të jetë e mundur. Është kaq e përhapur dhe me ndikim, për mirë ose për keq, sa do ta bëjë shumë më të lehtë mësimin e gjuhëve të tjera në listën tuaj (veçanërisht C++, në Norvig). Më shumë arsyetim këtu, këshilla për vetë-mësim këtu.

Unë do të rekomandoja gjithashtu të mësoni një gjuhë asambleje, MIPS për rrugën më të lehtë ose x86 për më praktike. Kjo ndoshta do t'ju mësojë më shumë për arkitekturën e kompjuterit sesa gjuhët, por gjithashtu ofron një emërues më të ulët të përbashkët, kur arsyetoni për zbatimin e gjuhës. Ndoshta një ditë do të rekomandoj përfaqësimin e ndërmjetëm LLVM në vend të kësaj.

Norvig rekomandon të mësoni një gjuhë deklarative, por unë do të isha më specifik dhe do të thoja të mësoni një gjuhë programimi logjik. Ky mund të jetë Prolog siç sugjeron ai, ose miniKanren nëpërmjet librit Skema e arsyetuar.

Sipas mendimit tim, një zgjedhje e shkëlqyeshme për kërkesën e "paralelizmit" të Norvig është CUDA. Ky është paralelizëm në një shkallë shumë më dramatike sesa CPU-ja juaj me 4 bërthama dhe ju ekspozon ndaj arkitekturës së re dhe interesante të GPU-së tuaj, duke u rritur në rëndësi duke pasur parasysh përdorimin e saj në mësimin e makinerive. Megjithatë, kjo ka mësime të ndryshme për të mësuar sesa gjuhët që theksojnë konkurrencën, kështu që Go, Clojure ose Erlang mund të jenë ende një bast i mirë.

Programimi i bazuar në grup është një tjetër paradigmë shumë e fuqishme. Norvig mund ta ketë lënë jashtë duke qenë se ka gjetur shumicën e zbatimit të tij në fusha shumë sasiore, por mendoj se është interesant edhe për programuesit jo sasiorë, si një shembull i një grupi primitivesh të ndryshëm në mënyrë dramatike. APL/J/K/Q janë gjuhë arketipale të pakëndshme në këtë kategori, megjithëse Matlab/oktava mund të jetë më e aksesueshme.

Jo mjaft paradigmë, por ia vlen të njiheni me një grusht gjuhësh me qëllim të ngushtë, nëse asgjë tjetër për të kuptuar se shkrimi i një gjuhe me qëllim të ngushtë mund të jetë një zgjidhje e mirë për një problem një ditë. Frink është një i preferuar personal, AWK është një shembull tjetër.

Është e vështirë të ndalosh këtu! Disa do të këmbëngulnin se Forth është thelbësor për të kuptuar gjuhët e bazuara në rafte; Unë personalisht ndjej se kemi ekspozim të mjaftueshëm ndaj gjuhëve të bazuara në rafte përmes makinave virtuale të bazuara në stek në gjuhët dinamike. Të tjerët do të më thonë se më ka munguar diçka tjetër. Kjo nuk është një listë përfundimtare! Shpresojmë se do t'ju fillojë.

Hapi i tretë: praktikë

Është e lehtë të bësh një listë të gjuhëve të synuara, por do të duhet më shumë punë për të ndërtuar njohuritë tuaja me to. Nëse jeni me fat, do të mund të përdorni disa prej tyre për punën ose projektet tuaja. Për të tjerët, për mendimin tim, ju duhet të kombinoni studimin dhe praktikën e qëllimshme. Pa studim, përparimi do të jetë i ngadaltë; pa praktikë, kuptimi juaj ka më pak gjasa të qëndrojë.

Një mënyrë e mirë për të filluar t'i afroheni një gjuhe të re është të lexoni hyrjet përkatëse në "Hyperpolyglot" dhe "Mëso X në minuta Y". Këto do të prezantojnë disa nga idetë kryesore të gjuhës si dhe do të fillojnë të heqin pengesën sintaksore. Nëse tashmë keni një gjuhë në të njëjtën familje nën brezin tuaj, krahasimi krah për krah i Hyperpolyglot mund të shkojë çuditërisht larg.

Një ushtrim tjetër i vlefshëm është kërkimi i arsyetimit të dizajnit për gjuhën. Kjo do ta bëjë më të lehtë për të parë qëllimin e synuar të gjuhës dhe do t'ju japë një motiv shtesë për ta mësuar atë. Për shembull, nëse jeni të kujdesshëm për të mësuar C++ ose skeptik ndaj vendimeve të Bjarne-it, duhet patjetër të lexoni librin e tij historik Dizajni dhe Evolucioni i C++. Ka burime të ngjashme motivuese për shumicën e gjuhëve.

Pas kësaj, mund të ketë kuptim ose të lexoni një libër referencë ose të hidheni drejtpërdrejt në zgjidhjen e disa problemeve të vogla.

Është e vështirë të bëhen rekomandime të përgjithshme për librat e referencës, por unë do të thoja të kërkoni librat më të vjetër, më kanonikë që synojnë programuesit me përvojë të rinj në atë gjuhë të veçantë. Këta libra do të kenë kritikues, por librat e vjetër priren të jenë më të mirë në përcjelljen e ideve të rëndësishme dhe vendimet e dizajnit pas një gjuhe, dhe më shpesh shkruhen nga projektuesit dhe zbatuesit kryesorë të saj, ndërsa librat më të rinj priren të fokusohen në aplikacione ose të optimizohen për qasje.

Mënyra më e shpejtë për të përhapur një gjuhë të re, sipas mendimit tim, është të gjesh një sërë problemesh të vogladhe t'i zgjidhësh ato në mënyrë progresive. Exercism.io është një burim i mirë dhe madje mund të ketë një grup testesh për problemet në gjuhën që synoni. Problemet e vogla përshtaten lehtësisht rreth punës dhe projekteve të tjera, mund të kalibrohen në nivelin tuaj të vështirësisë dhe në total mund të mbulojnë pjesën më të madhe të sipërfaqes së gjuhës, duke hequr pengesën e njohjes së sintaksës.

Pasi të ndiheni të njohur me idetë kryesore dhe rehat me sintaksën, unë do t'ju sugjeroja të gjenit një projekt më të madh, por veçanërisht atë për të cilin ishte menduar gjuha. Nëse është një gjuhë sistemesh si C ose Go, mund të dëshironi të shkruani një mjet të linjës komanduese që krijon shumë syscalls, nëse C++ atëherë ndoshta një raytracer, nëse një gjuhë skriptimi si Python ose ruby, atëherë një problem algoritmik jo-kritik i performancës si p.sh. një AI tic-tac-toe, e kështu me radhë.

Vazhdoni te kerkoni

Duke pasur parasysh numrin e gjuhëve në botë dhe përdorimin e vazhdueshëm të gjuhëve të vjetra si C, është e lehtë të konkludohet se ne kemi shpikur tashmë të gjitha gjuhët që na duhen. Kjo është një përgjigje shumë shtrënguese.

Ekziston një hendek i madh midis asaj që ne dimë të jetë e llogaritshme dhe asaj që kemi arritur deri tani për të udhëzuar kompjuterët të bëjnë. Kjo nuk është për shkak të mungesës së burimeve: midis ligjit të Moore dhe aksesit në rritje të burimeve cloud, ne kemi llogaritje të mjaftueshme për të bërë punë shumë më të sofistikuara dhe me ndikim sesa po bëjmë aktualisht. Problemi duhet të jetë në ndërfaqet tona, duke qenë gjuhët dhe mjetet tona për t'i përdorur ato.

Gerald Jay Sussman e bën këtë në fjalimin e tij të jashtëzakonshëm "Ne vërtet nuk dimë si të llogarisim". Ai përdor një gjuhë ekzistuese (dhe të vjetër!) në shembujt e tij, kështu që mund të argumentojë se mjetet tona nuk janë problemi. Por për çfarëdo arsye, mjetet tona aktuale nuk na kanë mundësuar të adresojmë mundësinë që ai nxjerr në pah për llogaritjen në mënyrë dramatike më efektive.

Një nga shumë kufijtë interesantë tani është "Chris Granger, duke punuar në Evën". Ai nuk u përpoq të shkruante një gjuhë aq sa një mjet për të menduar në shkallën e tabelës. Gjuha ka përfunduar të jetë një komponent kritik dhe i lidhur ngushtë i platformës; gjuhët janë kaq të rëndësishme për aftësinë tonë për të shfrytëzuar kompjuterët, saqë kjo nuk është befasi.

Pavarësisht nëse on not Eve bëhet platforma tjetër e madhe e programimit, mjetet e të menduarit me në qendër gjuhën do të jenë pjesë e së ardhmes sonë, të paktën nëse shpresojmë të shfrytëzojmë të gjitha llogaritjet që kemi tani në dispozicion. Ashtu si Ras Bodik, unë do t'ju inkurajoja të jeni pjesë e kësaj lëvizjeje, të mësoni gjuhë në vend të një gjuhë dhe të përdorni të kuptuarit tuaj themelor për të bërë punë me ndikim të lartë.

Të interesuar të zhytesh më thellë? Ne zhvillojmë një "kurs të gjuhëve, përpiluesve dhe përkthyesve" në Bradfield, çdo disa muaj.