Java ja IDE R/Python jaoks

Original: http://brenocon.com/blog/

16. juunil 2015

Brendan O’Connor

(Mõned näpunäited Java kasutamise kohta, kui olete R või Python, mõned mõtted tarkvaraplatvormide kohta ja andmetöötlus-või-mida-me helistame nüüd-nüüd.)

Enamik minu uurimistöö nendel päevadel kasutab Python, R või Java. See on kohutav, et nii paljud inimesed kasutavad Python ja R, sest nende peamine keeled nüüd; see on nii parem kui halb vanasti, kui inimesed liigne Java lihtsalt sellepärast, et see, mida nad õppinud oma intro Arvutiteadus muidugi. Python/R on parem palju asju. Aga kiire, koostatud, staatiline keeled on ikka oluline[1] ja Java ikka tundub olevat väga hea platvormiülene lähenemisviisi selle[2] või vähemalt, et see on kasulik teada, kuidas jukerdama koos  CoreNLP  või  Mallet. Ma arvan, et undergradis hoidisin oma Arvutiteadus-professorite ees häirivat, et peame lõpetama Java-i kasutamise ja tegema kõik Python, kuid ma arvan, et meil on vastupidine probleem – ma olen kohtunud paljude hiljuti inimestega, kes teevad palju programmeerimisi ilma tavapärase Arvutiteadus koolituseta (nt loodusteadused, sotsiaalteadused, statistika, humanitaarteadused jne), kes vajavad Java-i omandamist, kuid leiavad selle üsna erinevaks kui kergeid keeli, mida nad esimest korda õppisid. Ma ei tea, mis on selle üldsuse keele jaoks hea üldine tutvustamine, kuid siin on natuke teavet selliste arendusvahendite kohta, mis lihtsustavad seda.

Erinevalt R-st või Python on Java-i puhul väga raske lihtsalt tekstiredaktori abil programmeerida. Peate importima tonni pakette, et midagi põhjalikku teha, ja kõigi jaoks mõeldud nimed on pikad ja hõlpsasti valedeklappidega, mis on eriti halb, sest see võtab midagi muud rida koodi. Kuigi on oluline õppida Java-vormingus Java-i koostamise ja käivitamise põhipunktid (vähemalt sellepärast, et peate seda mõista serveri Java käivitamisel), on ainus hea võimalus kirjutada Java reaalajas IDE-ga. See on keerukam kui tekstiredaktor, kuid kui saate põhitõdesid, on see enamiku asjade jaoks palju produktiivsem. Paljuski Java on aegunud, masendav keeles, kuid Java pluss IDE on tegelikult päris hea.

Kaks kõige populaarsem IDES tunduvad olevat Eclipse ja IntelliJ. Olen märganud tõesti hea Java programmeerijad eelistavad sageli IntelliJ. See on ilmselt parem. Ma kasutan Eclipse ainult sellepärast, et ma õppinud seda kaua aega tagasi. Nad mõlemad vabad.

Ilmne asju IDE annab teile kuuluvad asjad nagu enesesisendus öelda meetod nimed konkreetse objekti või koheselt nõrgeneva valesti muutuja nimed. Aga kõige kasulikum ja alahinnatud omadused, mis minu arvates on mõeldud koodi navigatsiooni ja ümbertöötamine. Ma tunnen nagu ma sai mitu korda tootlikumad kui ma õppinud, kuidas neid kasutada.

Näiteks:

  1. Mine määratluse (Eclipse nimi: “Open deklaratsioon”). Hoia “Command”, siis kõik funktsiooni nimed, klassi nimede ja muutujanimedel saavad rõhutab. Võite klõpsata üks navigeerimiseks, kus see on deklareeritud. See on tõesti kasulik jälgida meetod kõned. Sa põhimõtteliselt on pärast tee oma programmi võtaks käivitamisel. Võite isegi liikuda arvesse koodi iga raamatukogu või standard raamatukogu.
  2. Tagasi: see on tööriistaribal nuppu. Kui olete liikunud deklaratsiooni, kasutage seda, et minna tagasi sinna, kus sa olid enne. See võimaldab teil teha asju nagu minna meetod lihtsalt kiiresti värskendada oma mälu selle kohta, mis toimub, või äkki minna klassi meeles pidada, milliseid asju on see, siis pärast teise minna kohe tagasi, mida sa olid kallal. See võimaldab teil tõhusalt tegelema palju keerukamaks pidamata seda kõike oma peas korraga.

(Käskluse võti on mõeldud Macile Eclipse’iga, sellel on samaväärsed ka Linuxi ja Windowsi ning teiste IDE-dega).

Nende kahe käsklusega saate oma koodi ja teiste inimeste koodi liikuda, nagu see on veebibrauser. Kiirklahvide lubamine muudab selle töö veelgi paremaks. Siis võite vajutada kiirklahvi, et navigeerida kursori all olevale funktsioonile ja vajutada teist, et minna tagasi, kus sa olid. Ma arvan, et nende kahe käsuga ei ole vaikimisi otseteid olemas; tasub neid ise lisada (eelistustes). Ma viitan neile tegelikult nii nagu Chrome’i või Safari, kasutades käsku- [ja käsku-] vastavalt tagasi ja avatud deklaratsiooni. Ma kasutan neid pidevalt kirjutamisel Java koodi.

Kuid see on vaid üks navigatsioonisuund. Teil on võimalik edasi liikuda ka teistes suundades:

  • Vaata kõiki viiteid (Eclipse: paremklõps, “Viited” või Cmd-Shift-G). Sa tugineda seda funktsiooni nime koodi. Siis saad noteerimine külgriba kõik kohad, mis kutsuvad selle funktsiooni ja võite klõpsata neid minna neile. Erinevalt läheb deklaratsiooni, see võimaldab teil minna tagasi hüpoteetilise pinu. See on nagu saaksid navigeerida kõik sissetulev lingid, nagu kõik “tsiteeritud” Google Scholar. Ja see on kasulik muutujate ja klasside liiga. Tuginedes selle eri asju oma koodi, saate kiiresti saada vähe ego-võrgu pilte oma Codebase sõltuvust graafik. See mitte ainult aitab teil jälgida sätestatakse vead, kuid aitab teil aru saada, kuidas Refactor või ümber oma koodi.

Samuti on palju muid kasulikke navigeerimisfunktsioone, näiteks klassi navigeerimine, tippides selle nime eesliite; ja paljud teised IDE funktsioonid ka. Erinevad inimesed kalduvad kasutama erinevaid, nii et tasub vaadata, mida erinevad inimesed kasutavad.

Lõpuks peale navigatsiooni, väga kasulik funktsioon on ümber ümbertöötamine: mistahes muutuja või funktsiooni või klassi saab ümber ja kõik viited sellele saavad ümber ka. Kuna nimed on päris oluline mõistmine, see tegelikult on palju lihtsam kirjutada esimese projekti kood, sest sa ei pea muretsema nime kohe esimesel proovida. Kui ma kirjutada suure Python programmid, leian ma pean kulutama palju aega mõelda läbi struktuuri ja nimetades nii et ma ei lootusetult segi ennast hiljem. Seal on ka liikuda ümbertöötamine, kus saab liikuda funktsioonide vahel faile.

Navigation ja ümbertöötamine ei ole lihtsalt asju Java; nad olulisemaid asju, mida tahan teha mis tahes keeles. Kindlasti on IDES ja toimetaja pluginad kerge keeles ning mis toetavad neid asju suuremal või vähemal määral (nt  RStudio,  PyCharmSyntastic…). Ja ilma IDE tugi on Unix-y alternatiive nagu CTags, perl -pigrepjne Vajad peas, kuid nende täpsus võrreldes semantika hoolid sageli on väiksem kui 100%, mis muudab kuidas neid kasutada.

Java ja IDE-stiilis arendus mõnes mõttes tundub peaaegu tagasiulatuvalt. Minule vähemalt on nad seotud suure programmitööga, suuremahulise bürokraatiaga tarkvaratehnika lähenemisega, mis tundub kaugel arvutusanalüüside või stardikarakteristiku kergekaalulise arendamise vajadustest. Ja nad kindlasti ei tegele mõne olulise arenguprobleemiga, millega seisavad silmitsi teadusliku programmitööga, näiteks sõltuvuste haldamine põimitud koodide/andmete torujuhtmete jaoks või andmete/algoritmide visualiseerimine, mis on tehtud samaaegselt koodi väljatöötamisega. Kuid need tööriistad on endiselt kõige tõhusamad suure hulga probleemide jaoks, nii et tasub hästi teha, kui kavatsete neid üldse teha.

[1]: uskumatult pikk ja keeruline arutelu on suunatud paljudes teistes kohtades, kuid minu enda töös on vaja kergekaalulisi staatilisi keeli (1) algoritme, mis vajavad suuremat kiirust, eriti need, mis sisaldavad graafe või keelelist struktuuri või näidet/optimeerida üle miljoneid andmebaasipunkte; (2) suuremad programmid, ütlevad rohkem kui paar tuhat koodiliini, mis on siis, kui dünaamiline kirjutamine muutub segaseks, kui staatiline kirjutamine ja abstraktsioonid hakkavad maksma; (3) mitmete autorite kood või see, mis arendab või kasutab mittriviaalsete API-dega raamatukogusid; teoreetiliselt dünaamilised tüübid on head, kui kõik on kommunikatsiooni- ja dokumentatsioonis väga head, kuid praktikas on selgelt väljendatud liidesed palju lihtsamaks. Kui ükski (1-3) ei ole tõsi, siis arvan, et Python või R on eelistatud.

[2]: siin on pikk loend ja see sõltub teie kriteeriumidest. Selles suhtes sarnaneb Scala Java-ga. Peamine võrdlus on C ja C++, millel on mõnevõrra kiire edastus Java-i puhul (umbes sama lihtsate numbriliste silmuste jaoks, kuid BLAS/LAPACK ja muu madala tasemega tugi), on paremad mälu kasutamiseks ja võivad otse integreerige oma lemmik produktiivsema kõrgema keelega (nt Python, R või Matlab). Kuid C/C++ ja kergekaalu keele vaheline seos on tülikas. Cython ja Rcpp teevad seda paremaks – ja eriti hea, kui soovite olla seotud kas Python või R-ga, kuid nad on ikka veel ebamugavad, aeglustavad sind ja tutvustavad uusi vigu. (Julia on parem lähenemisviis, kuna see lihtsalt kõrvaldab selle dikotoomia, kuid on veel küps.) C/C++ nõrkused võrreldes Java-ga hõlmavad mittemetermineetilisi krahhivigu (mälumudeli tõttu), kõrge kontseptuaalse keerukuse kasutamine paremate C++ funktsioonide, raiskad ehitamise probleemid ja puuduvad head IDEd. Päeva lõpus leian, et Java on tavaliselt Java-s suurem kui C/C++, kuigi Cython või Rcppi hübriidid saavad sarnaste tulemustega. Need peamised kriteeriumid mõnevõrra eeldavad Linuxi või Maci platvormi; Microsoft Windowsi inimesed on mujal maailmas, kus on olemas suurepärane C++ IDE ja saadaval on C#, mis on (enamasti?) parem kui Java. Kuid minu töö/teadusmaailmas kasutavad väga vähe inimesi Windowsis ja see on olnud juba aastaid, paremaks või halvemaks.